본문 바로가기
CS

프로세스, 스레드 (심화/면접 편)

by Hoody Coder 2024. 7. 31.

최근에 다시 면접을 보고 있다. 
그런데 생각보다 많은곳에서 프로세스와, 스레드에 대한 기술질문이 많다는 것을 인지하게되어

 

프로그램, 프로세스, 스레드 (개념편)

최근과 같은 비동기의 시대에 프로세스, 스레드, 프로그램이 동작 방식에 대한 부분은 기술면접에서 자주 등장한다. 이번 글에서는 프로그램, 프로세스, 스레드에 대한 개념적인 부분을 알아보

michael-cho.tistory.com

 

위에서 했던 것보다 조금더 자세하게 프로세스와 스레드에 대해서 작성해보려고 한다.
당장 면접을 봐야하는 상황이라면 가장 하단의 프로세스/스레드 요약본을 참고하길 바란다 

 

왜 면접에서 많이 질문하는 것일까?

  라는 측면에서 생각해봤을때, 위에서 작성한 내용 이상의 지식이 필요했다.
관련하여 가장 많이 받은 질문은 다음과 같았다.

Q1. " 프로세스와 스레드의 차이를 이야기해 보세요"
Q2. "프로세스와 스레드의 적합한 활용 예시는 뭘까요?"

하나씩 살펴보자

Q1. " 프로세스와 스레드의 차이를 이야기해 보세요"

이에 대한 대답은 기억이 어디까지 나느냐에따라 간단한 버전과 상세한 버전으로 나누어진다.
잊지 말아야할 핵심 키워드는 "메모리의 공유 여부" 이다. 
서로 다른 프로세스는 메모리공유가 불가능하지만, 서로다른 스레드는 메모리를 공유할 수 있다. 보다 저 자세히 알기 위해선
프로세스와 스레드의 작동방식에 대한 이해가 필요하다. 

출처: https://velog.io/@narangke3/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

프로세스는 정적인 코드가 메모리에 올라갈 때 시스템 자원을 할당 받는다. 이때 OS(운영체제)는 프로세스마다 각각 독립된 메모리 영역을 할당해준다. 독립된 메모리 영역을 할등해주므로, 프로세스는 다른 프로세스의 변수나 자료에 접근할수가 없는 것이다. 

하지만 스레드는 이와 다르다. 스레드는 프로세스가 할당받은 메모리 영역 내에서 Stack으로 할당된 메모리영역은 따로 분배받지만, 나머지 Code, Data, Heap 부분의 메모리 영역은 공유하게 된다. 즉 개별적인 스레드는 고유한 Stack을 가지고 있지만, Heap 메모리는 서로 읽고 쓸 수 있는 환경이므로, "스레드는 메모리를 서로 공유할 수 있다" 라고 말할수  있게 된다. 

Q. 그럼 메모리를 공유할 수 있다는 것은 무슨 의미일까?

https://velog.io/@verdfg/24.-Day-35-%EB%A6%AC%EB%88%85%EC%8A%A4-Raspberry-Pi-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%93%B0%EB%A0%88%EB%93%9C

 

프로세스는 독립적이기 때문에 하나의 프로세스가 오류가 발생해도, 다른프로세스에 영향을 주지 않는다. 인터넷창과 게임창을 켜놓고 플레이 할때, 게임이 에러가 나더라도, 인터넷창까지 영향을 주지않는걸 생각해보면된다. 
하지만 스레드는 다르다. 메모리 Code, Data, Heap 메모리 영역을 공유하기때문에 하나의 스레드에서 오류가 발생한다면, 같은 프로세스내의 다른 스레드가 모두 강제로 종료된다. 

Q2. "프로세스와 스레드의 적합한 활용 예시는 뭘까요?"

처음엔 구체적 사용예시에 대해 말해보라는 질문이었었는데, 딱 떠오르는 것이 없어서 당황했던 기억이 있다.
기억에 남으면서 딱 납득할만한 예제를 찾아봤을 때 아래처럼 이야기하면 좋을 것 같다. 
면접에서 딱 대답하기 위해 장점, 단점, 사용예시 순으로 정리해 보았다.

프로세스

장점

  • 안정성: 각 프로세스는 독립된 메모리 공간을 가지고 있어, 하나의 프로세스에서 오류가 발생해도, 다른 프로세스에는 영향을 주지않아 시스템의 안정성을 보장한다
  • 보안성 자원관리: 프로세스는 다른 프로세스에 접근할 수 없으므로, 보안성을 보장한다
  • 자원관리 : 프로세스는 독립 자원으로 운영되므로, 자원의 할당과 해제의 과정이 명확하다

단점

  • 자원 소모: 프로세스의 생성 관리 과정에서 OS자원을 많이 소모한다. 또한 프로세스 간의 컨텍스트 전환은 무겁고 상대적으로 시간이 많이 들기 때문에 오버헤드 비용의 소모가 크다 

사용 예시 

  • 웹 서버: 각 클라이언트 요청을 별도의 프로세스로 처리하여 독립성을 보장하고, 하나의 요청 처리 중 오류가 발생해도 다른 요청에는 영향을 미치지 않도록 한다.
  • 운영 체제의 핵심 서비스: 중요한 시스템 서비스나 데몬 프로세스는 독립적인 프로세스로 실행되어 안정성을 보장한다.
  • 데이터베이스 관리 시스템: 데이터베이스 서버는 각 클라이언트 연결을 독립된 프로세스로 처리하여 안정성과 성능을 보장한다.
    ex) 오라클 DMBS는 각 사용자 세션을 별도의 프로세스로 처리하여 동시에 여러사용자가 DB에 접근할 수 있는 것을 돕는다고 한다.

 

스레드

장점

  • 빠른 속도: 스레드간의 컨텍스트 전환은 상대적으로 가볍기 때문에 빠른 속도를 보장한다
  • 자원 관리: 스레드는 한 프로세스 내에서 자원을 공유하기 때문에 자원 사용의 효율성을 얻을 수 있다. 또한 같은 이유(메모리 공유) 에서 스레드간 빠른 통신과 데이터 교환 효과를 얻을 수 있다.

단점

  • 안전성 저하 : 하나의 스레드에서 에러가 발생하면, 동일 프로세스 내의 다른 스레드에도 영향을 주기 때문에 시스템 전체의 안정성의 영향을 준다. 
  • 보안성 저하 및 디버깅 이슈: 동일 메모리를 공유하기 때문에 잘못된 스레드 IO는 다른 스레드에도 영향을 미친다. 같은 이유에서 이슈가 발생했을때 스레드간 동기화 문제로 디버깅이 어렵다.

사용 예시 

  • GUI 애플리케이션: 사용자 인터페이스와 백그라운드 작업을 별도의 스레드로 분리하여 사용자 응답성을 높인다.
  • 실시간 게임: 게임 로직, 물리 엔진, 렌더링 등을 각각의 스레드로 나누어 실시간 성능을 보장한다.
  • 웹 서버의 요청 처리: 프로세스 대신 스레드를 사용하여 각 요청을 처리하여 메모리 사용을 최적화하고 빠른 전환을 보장한다.

 

이제 여기서 한단계 더 나아가면, 멀티프로세스와 멀티 스레드에 대한 부분으로 이어진다. 
이건 다음 게시글을 통해 작성해보도록 하겠다. 

 

멀티 프로세스/멀티 스레드, 동시성/병렬성

이제 멀티 프로세스와 멀티 스레드에 대해서 알아보자.이 개념을 이해하기전에 알아야하는 것은 동시성과 병렬성이다. 동시성과 병렬성동시성(concurrency)병렬성(parallelisim)단일 코어에서 여러개

michael-cho.tistory.com