봉황대 in CS

[Chapter 4. 스레드] 스레드와 관련된 문제들 본문

Computer Science & Engineering/Operating System

[Chapter 4. 스레드] 스레드와 관련된 문제들

등 긁는 봉황대 2022. 7. 15. 16:10

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

 

다중 스레드 프로그램 설계 시 발생하는 문제들이 있다.

여기서는 관련 여러 문제들과 각각에 대한 해결책을 소개한다.

 

fork() 및 exec() 시스템 호출

한 프로세스가 여러 스레드를 가지고 있는 상태라고 하자.

 

만약 그중 한 스레드가 프로세스를 생성하는 시스템 콜인 fork()를 호출하게 된다면

새로운 프로세스는 모든 스레드를 복제해야 할까, 아니면 해당 스레드 하나만 가지는 프로세스여야 할까??

 

fork() 뿐만 아니라 만약 exec() 시스템 콜이었다면 프로세스는 어떻게 조치를 취해야 할까??

 

1. exec() 시스템 호출의 경우

전체 프로세스 즉, 모든 스레드exec()의 매개변수로 지정된 프로그램이 대체한다.

 

2. fork() 시스템 호출의 경우

두 가지 버전의 fork()를 모두 제공할 수 있다. (모든 스레드를 복사 / fork()를 호출한 스레드만 복사)

 

이는 응용 프로그램의 선택에 따라, 그리고 상황에 따라 달려 있다.

     (1) fork()를 부르자마자 exec()를 부른다면 시스템 콜을 호출한 스레드만 복사

     (2) exec()를 부르지 않는다면 새 프로세스는 모든 스레드들을 복사

 

신호 처리 (Signal Handling)

우선 신호가 무엇인지에 대하여 알아보자.

 

신호UNIX에서 프로세스에게 어떠한 사건이 일어났음을 알려주기 위해 사용한다.

 

1. 신호는 특정 사건이 일어나야 생성된다.

2. 생성된 신호가 프로세스에게 전달되며,

3. 신호가 전달되면 그 신호는 반드시 처리되어야 한다.

 

(Windows에서는 신호를 명시적으로 지원하지 않으나,

비동기식 프로세저 호출(Asynchronous Procedure Calls, APC)을 통해 대리 실행(emulate)할 수 있다.

: 사용자 스레드들이 특정 사건의 발생을 전달받았을 때 호출될 함수를 지정 → 특정 스레드에게 전달)

 

신호는 동기식 신호와 비동기식 신호로 나뉠 수 있다.

 

동기식 신호

ex. 불법적인 메모리 접근, 0으로 나누기 등

실행 중인 프로그램이 해당 행동을 하였을 때 신호가 발생하며, 그 신호는 신호를 발생시킨 프로세스 자기 자신에게 전달된다. (동기식)

 

비동기식 신호

ex. control-C → 프로세스 강제 종료 요청, 타임 슬라이스 소진 등

실행 중인 프로세스의 외부로부터 발생된 신호이다. 프로세스는 해당 신호를 비동기식으로 전달받는다.

 


단일 스레드 프로그램에서 신호는 항상 프로세스에게 전달된다.

하지만 다중 스레드 프로그램에서는 신호가 발생하면 그것을 어느 스레드에게 전달해야 할까??

 

신호 전달에는 아래와 같은 선택지들이 존재한다.

 

1. 신호가 적용될 스레드에게 전달

2. 모든 스레드에게 전달

3. 몇몇 스레드들에게만 선택적으로 전달

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

 

동기식 신호일 경우에는 해당 신호를 발생시킨 스레드에게 전달되는 것으로 정해져 있지만

비동기식 신호일 경우에는 상황에 따라 달라진다. (control-C의 경우, 모든 스레드에게 전달되어야 함)

 

UNIX에서는 각 스레드에게 자신이 받아들일 신호와 봉쇄할 신호를 지정할 수 있는 선택권을 준다.

 

취소 (Cancellation)

스레드를 취소한다는 것은 해당 스레드가 끝나기 전에 그것을 강제 종료시키는 작업을 말한다.

이때 취소되어야 하는 스레드는 목적 스레드(target thread)라고 부른다.

 

스레드 취소 요청 시 해당 목적 스레드들에게 할당되었던 자원에 대하여 유의하여야 한다.

만약 목적 스레드에 공유 자원이 있었다면 이를 바로 강제 종료시켜서는 안 될 것이다.

 

목적 스레드를 취소하는 방식에는 두 가지가 존재한다.

 

비동기식 취소

한 스레드가 목적 스레드를 즉시 강제 종료시켜 버린다.

이는 필요한 시스템 자원을 전부 다 사용 가능한 상태로 만들지 못할 수 있기 때문에 권장하지 않는 방식이다.

 

지연 취소 (Deferred cancellation)

목적 스레드가 자신이 강제 종료되어야 할지를 주기적으로 점검한다.

스레드가 취소 가능한지 불가능한지를 결정할 수 있게 해주는 것이다.

 

스레드 국지 저장소 (Thread-Local Storage)

한 프로세스에 속한 스레드들은 해당 프로세스의 데이터를 모두 공유한다.

하지만 각 스레드가 자기만 액세스 할 수 있는 데이터를 가져야 할 수 있으며, 이 데이터들은 스레드 국지 저장소(TLS)라고 부른다.

 

Windows에서는 스레드 환경 블록(thread environment block, TEB)가 존재한다.
이는 사용자 모드에서 실행될 때 접근되는 사용자 공간 자료구조로,

스레드 식별자, 사용자 모드 스택 및 스레드 국지 저장소를 저장하기 위한 배열을 가지고 있다.

 

* ETHREAD(executive thread block) : 실행 스레드 블록

* KTHREAD(kernel thread block) : 커널 스레드 블록

 

경량 프로세스 (Light Weight Process, LWP)

다대다, 다대일 및 두 수준 모델에서 스레드 라이브러리와 커널이 통신을 하기 위해서

경랑 프로세스(LWP)라는 자료 구조를 사용자 스레드와 커널 스레드 사이에 둔다.

 

 

각 LWP는 하나의 커널 스레드에 부속되어 있고, 물리 처리기에서 스케줄을 하는 대상은 그 커널 스레드이다.

 

만약 한 커널 스레드가 봉쇄된다면 그에 부속되어 있는 LWP도 같이 봉쇄되고,

그것에 따라 LWP에 부속되어 있는 사용자 스레드도 봉쇄된다.

 

 

반응형
Comments