1 minute read

멀티 프로세스 대신 멀티 스레드를 사용하는 이유

간단히 말하면 하나의 프로그램안에서 여러 작업을 해결하기 위함.

1. 자원의 효율성 증대

멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있음.

  • 프로세스 간의 Context Switching시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 오버헤드가 큼

  • 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 됨

2. 처리 비용 감소 및 응답 시간 단축

또한 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어듬

  • 스레드는 Stack 영역을 제외한 모든 메모리를 공유함

프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠름

  • Context Switching시 스레드는 Stack 영역만 처리하기 때문 (Stack 빼고 다 공유해서 바꿀 필요가 없음)

3. 주의 사항

동기화 문제가 남아있음

  • 스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 함께 상용할 때 충돌이 발생할 수 있다.

그렇기 때문에 잘못사용하면 변수에 의도치않은 결과가 생길수있고, 프로그램에 이상이 생긴다.

Thread-safe

멀티스레드 환경에서 여러 스레드가 동시에 하나의 객체 및 변수(공유 자원)에 접근할 때, 의도한 대로 동작하는 것을 말함

Thread-safe하기 위해서는 공유 자원에 접근하는 임계영역(critical section)을 동기화 기법으로 제어해줘야 한다

  • 이를 상호배제 라고 함

  • 동기화 기법으로는 뮤텍스와 세마포어가 있음

Reentrant

Reentrant는 재진입성이라는 의미로, 어떤 함수가 Reentrant하다는 것은 여러 스레드가 동시에 접근해도 언제나 같은 실행 결과를 보장한다는 의미

  • 이를 만족하기 위해서 해당 서브루틴에서는 공유자원을 사용하지 않으면 된다.

출처 : https://github.com/WeareSoft/tech-interview/blob/master/contents/os.md#%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8C%80%EC%8B%A0-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

Categories:

Updated: