무지목록 스레드와 프로세스란

나의 무지함을 오늘도 깨달았다. Foundation 면접에 Foundation을 준비를 안해간 것이 가장 큰 오류였다. 총 3가지 정도 장렬히 박살났는데 2가지는 모르겠습니다.로 답변했고 1가지는 지나고나니 헛소리를 했다는 것을 알았다. 박살났다. 면접은 면접으로 실력을 쌓는다는 것을 다시 한 번 느꼈다. 분명 다 본 것들이었는데 면접에서 질문으로 나오고 답변을 하려고 하니 제대로된 답변도 안나오고 기억도 나지 않았다. 오늘의 기억을 양분삼아 다음 면접때 도움이 되길.

쓰레드와 프로세스는 무엇인가?

프로세스는?

운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스(process)라고 부른다. 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데 이것이 프로세스이다. 각 프로세스는 별도의 주소 공간에서 실행되고 프로세스끼리 자원을 공유하지 않는다.

스레드란?

할당 받은 자원을 이용하는 실행의 단위이다. 프로세스 내에 여러개 생길 수 있다. 하나의 스레드는 하나의 코드 실행 흐름이다. 한 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다. 스레드는 프로세스 내에서 스택만 따로 할당받고 코드, 데이터, 힙 영역은 공유한다.

멀티 프로세스와 멀티 스레드

멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이다.

멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 따라서 하나의 프로세스에서 오류가 발생해도 다른 프로세스에게 영향을 미치지 않는다. 하지만 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하고 작업량이 많을수록 오버헤드가 발생하고 Context Switching으로 인한 성능 저하가 우려된다.

멀티 스레드는 시스템의 자원과 처리 비용이 감소되어 실행 속도가 상승된다. 스레드는 자원(Code, Data, Heap)을 공유하고 Stack영역만 처리하면 되기 때문에 Context Switching이 빠르다. 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에게 영향을 미치게 된다. 스레드가 개별로 유기적으로 움직이고 있기 때문에 프로그램 테스트, 디버깅이 어렵다. 너무 많은 스레드 사용은 오버헤드를 발생한다.

자원을 효율적으로 사용하고 처리 비용이 감소하면 응답 시간을 단축하기 위해 멀티 프로세스보다는 멀티 스레드를 사용한다. 하지만 동기화 문제에 신경을 써야한다.

멀티 스레드를 사용하는 곳?

  • 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하는 곳에 사용
  • UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용
  • 다수 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용

멀티 스레드를 사용할 때 주의해야할 사항은?

스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제에 신경을 써야 한다.


스레드와 프로세스에 대해 알아봤다. 면접 시 모르겠는 것은 즉각 모르겠다고 사실대로 말하는게 훨씬 나은거 같다. 해당 질문에 어렴풋이 주어들은 것을 짜집기해서 말했는데 지금 글을 정리하며 회고해보니 정말 헛소리를 했다. 심지어 스레드와 프로세스의 특징?을 반대로 말했다. 뒤이어 이어진 꼬리 질문들이 어떻게 활용하면 내 잘못된 답변을 바로잡을 수 있는 힌트였는데 전혀 몰랐다. 결국 잘 모르겠다로 답변을 마무리했었는데, 차라리 처음에 모르겠다고 하는게 나았을거 같다.

results matching ""

    No results matching ""