운영체제 OS

[운영체제/OS] 멀티스레드에서의 fork()와 exec(), Signal Handling

fork(), exec() 시스템콜

 

멀티 스레드 프로그램에서 프로세스를 복제/생성하는 fork() 시스템콜을 실행한다면 어떻게 될까??

메인의 하나만 복제해야할까, 아니면 모두 각각 복제해야할까?

 

몇몇 유닉스 시스템은 두가지 버전을 모두 지원한다.

 

exec()의 경우에는 기존 스레드들을 모두 무시하고, 새로운 프로그램으로 대체된다.

 

fork()이후 exec()를 호출하면, 모든 스레드를 복제할 이유가 없다.

fork() 이후 exec()가 호출되지 않는다면, 모든 스레드의 복제가 의미가 있다.

 

 

 

Signal Handling(시그널 처리)

 

Signal의 두 가지 유형:

-Synchronous signal: 어떤 사건을 처리하기 위해 발생 ex)불법적인 메모리 접근, 0으로 나누기 

-Asynchronous signal: 임의 시점에 발생. ex) interrupt(ctrl-C키), timer 만료

 

시그널은 전달되면 반드시 처리(handling)되어야 한다.

 

모든 시그널은 둘 중 하나의 핸들러에 의해 처리된다.

-default signal handler: 시그널마다 기본적 처리방법 정의

-user-defined signal handler: 사용자가 처리방법 정의

 

단일 스레드에서는 시그널이 프로세스 차원에서 처리되었는데,

멀티 스레드에선 상당히 복잡하다. 

-시그널 적용 스레드에게 전달

-모든 스레드에 전달

-몇몇 스레드에게만 선택적 전달

-특정 스레드가 모든 신호를 전달받도록 지정

중에서 선택한다.

 

Thread Cancellation(스레드 취소)

두 가지 방법:

-Asynchronous cancellation: 바로 종료

-Deferred cancellation: 작업 확인 마무리 후 종료

pthread_cancel(tid);

 

디폴트는 deferred다. 

취소는 스레드가 취소포인트에 다다라야지만 발생한다. 

 

 

Thread-Local Storage (TLS)

각 스레드가 자기 데이터의 복사본을 가진다.

스레드 생성 과정에 컨트롤이 안될 때 유용하다.

지역변수와는 다르다.

static data와 유사하다. (TLS는 각 스레드에 대해 독립적이다.)