OS
쓰레드와 프로세스의 차이
- 프로세스와 쓰레드는 서로 관계가 있으나 기본적으로는 다름
- 프로세스는 실행되고 있는 프로그램 개체
- 프로세스는 CPU 시간이나 메모리 등이 시스템 자원이 할당되는 독립적인 객체
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 할 수 없음
- 어떤 프로세스는 다른 프로세스의 자원을 접근하려면 프로세스 간 통신(IPC)을 사용하여야 함
- 프로세스간 통신 방법으로는 파이프나 파일, 소켓 등이 있음
- 쓰레드는 프로세스와 같은 스택 공간을 사용하며, 여러 쓰레드는 그 상태의 일부를 서로 공유
- 통상 같은 메모리를 읽고 쓰는 여러 프로세스를 생성 할 수 있음
- 프로세스가 다른 프로세스의 메모리를 읽고 쓰는 여러 프로세스를 생성 할 수 있음
- 프로세스가 다른 프로세스의 메모리를 직접적으로 접근할 수 없는 것과는 다름
- 각각의 쓰레드에는 별도의 레지스터와 스택이 배정
- 다른 쓰레드가 해당 스택 메모리를 읽고 쓰는 것은 허용
- 쓰레드는 프로세스의 특정한 수행 경로
- 한 쓰레드가 프로세스 자원을 변경하면, 다른 이웃 쓰레드도 그 변경 결과를 즉시 볼 수 있음
뮤텍스와 세마포어의 차이
- 뮤텍스(Mutex)
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것
- 상호배제라고도 하며, Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술
- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 synchronized 또는 lock을 사용
- 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음
- 세마포어(Semaphore)
- 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
- 리소스 상태를 나타내는 간단한 카운터로 생각할 수 있음
- 운영체제 또는 커널의 한 지정된 저장장치 내의 값
- 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용
- 유닉스 시스템 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화 시키는 기술
- 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있음
- 각 프로세스는 세마포어 값은 확인하고 변경할 수 있음
- 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있음
- 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 함
- 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야함
- 세마포어는 이진수 (0 또는 1)를 사용하거나, 또는 추가적인 값을 가질 수도 있음
- 차이
- 가장 큰 차이점은 관리하는 동기화 대상의 개수
- Mutex는 동기화 대상이 오직 하나뿐일 때, Semaphore는 동기화 대상이 하나 이상일 때 사용
- Semaphore는 Mutex가 될 수 있지만 Mutex는 Semaphore가 될 수 없음
- Mutex는 상태가 0, 1 두 개 뿐인 binary Semaphore
- Semaphore는 소유할 수 없는 반면, Mutex는 소유가 가능하며 소유주가 이에 대한 책임을 가짐
- Mutex 의 경우 상태가 두개 뿐인 lock 이므로 lock 을 가질 수 있음
- Mutex의 경우 Mutex를 소유하고 있는 스레드가 이 Mutex를 해제할 수 있음
- Semaphore의 경우 이러한 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있음
- Semaphore는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재하는 반면 Mutex는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 됨