※ 전남대학교 박태준 교수님의 운영체제 강의를 듣고, 정리한 내용입니다.
멀티쓰레드와 fork() 와 exec()
만약 멀티쓰레드 환경에서 fork() 시스템콜을 실행한다면..
- 여러 쓰레드 중 한 쓰레드가 fork() 호출
- 새로운 프로세스는 fork() 를 호출한 쓰레드만 복제
- 한 쓰레드가 exec() 를 호출 → 프로세스 전체가 사라짐
그러면 fork() 가 모든 쓰레드를 복제한다면?
- 몇몇 시스템은 전체 쓰레드를 복제하는 fork() 도 지원함
하지만.. fork() 이후 exec() 를 호출하면 결국 모든 쓰레드를 복제할 이유가 없습니다.
( 왜냐하면 exec() 를 호출하면, 프로세스 자체가 바뀌어버리니 )
- fork() 이후 exec() 호출 → 모든 쓰레드를 복제할 이유 X
- fork() 이후 exec() 호출 X → 모든 쓰레드 복제에 의미 O
자원 동기화 문제 : Thread-Safe
하나의 자원에 대해 여러 쓰레드가 동시에 접근하게 되면, 공유자원이 훼손됩니다.
이 공유자원을 어떻게 하면 훼손하지 않고 프로그램을 실행시킬 수 있을지에 대한 개념이 Thread - Safe 개념입니다.
Thread - Safe 를 지키기 위해선..
- Re-entrancy
- 어떤 함수가 한 쓰레드에 의해 호출되어 실행 중일 때, 다른 쓰레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바르게 주어져야 함
- Thread - Local Storage
- 공유 자원의 사용을 최대한 줄여 각각의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막음
- 동기화 방법과 관련되어 있고, 공유상태를 피할 수 없을 때 사용
- Mutual Exclusion
- 공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제
- Atomic Operations
- 공유 자원에 접근할 때 원자 연산을 이용하거나
- 원자적으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현
쓰레드 정리
프로세스와 쓰레드
- 프로세스는 쓰레드들의 공유 공간
- 프로세스는 운영체제가 응용프로그램을 적재하는 단위이고, 쓰레드는 실행 단위
- PCB 에 저장된 정보는 환경 컨텍스트
- TCB 에 저장된 정보는 실행 컨텍스트
- 동일한 프로세스에 속한 쓰레드 스위칭이 다른 프로세스에 속한 쓰레드로의 스위칭보다 속도가 더 빠름
- 프로세스에 속한 모든 쓰레드 종료 → 프로세스 종료
쓰레드로 프로그램 작성시
- 병렬 실행 → 성능 ↑
- 우수한 응답성
- 한 쓰레드가 블록되어도 다른 쓰레드를 통해 사용자 인터페이스 가능
- 시스템 자원 사용의 효율성 ↑
- 쓰레드는 프로세스에 비해 생성 유지 시 메모리나 자원을 적게 사용
- 응용프로그램 구조의 단순화
- 응용프로그램을 작업 기준으로 여러 함수로 분할
- 각 함수별로 쓰레드를 만들어서 동시 실행 가능
- 작성이 쉽고 효율적인 통신