본문 바로가기

Computer Science/OS

스레드의 개념과 상태 변화

스레드도 상태를 변화합니다.

위는 프로세스b가 수행중입니다.

스레드가 원래 병렬 수행이 가능합니다.

 

프로세스b가 실행상태일 때 

스레드 1개만 실행상태가 됩니다.

 

왜 1개밖에 안될까요? 다른 스레드가 실행중이기 때문입니다.

 

(c)만약 프로세스b가 시간을 다쓴다면 cpu를 뺏길 것입니다.

그럼 프로세스b는 준비상태로 가고

스레드들은 실행하지 않고 얼음이 되어버립니다.

실행 상태로 되어있지만 사실 얼어있습니다.

 

만약 프로세스b가 실행상태로 가면 스레드2가 얼음땡해서 실행을 할것입니다.

 

(b)스레드2가 io를 요청하면

스레드2는 얼고

프로세스b가 blocked 상태가 됩니다.(= 스레드들도 얼음이 됩니다.)

 

i/o가 완료되면 ready상태로 갈것이데 그래도 얼음이 될 것입니다.

 

(d)스레드2가 실행중인데 스레드1에게 요청을 한것입니다.

스레드1이 실행상태가 되고 스레드2가 blocked상태가 됩니다.

 

 

 

스레드의 상태 변화

2번 예시는 위 그림에서 (d)와 같습니다.

 

 

 

스레드 제어 블록TCB, Thread Control Block

스레드 컨트롤 블록에 내용을 봐봅시다.

 

실행 상태는 왜 가지고 있어야 할까요? 왔다 갔따 해야하니깐? 스레드가 바뀌면 스레드의 상태를 보존해야 합니다.

사용하던 cpu의 레지스터같은 거를 메모리에 저장해야 합니다.

 

스레드가 생기면 TCB가 메모리에 생겨야 합니다.

 

다음 TCB를 가리키는 포인터도 이어야 합니다.

 

스케줄링 하려면 반드시 큐가 필요합니다.

준비상태에 둘려면 준비상태에 대한 큐가필요하고

대기상태에 둘려면 대기상태에 대한 큐가 필요합니다.

 

그 스케줄링 큐에 포인터를 가지고 있어야 합니다.

 

 

 

스레드 제어 블록TCB, Thread Control Block - Single-Threaded Process

싱글 스레드 프로세스

cpu에 프로세스가 1개밖에 없을 때입니다.

평범한 프로세스 입니다.

 

커널 영역과 유저 영역이 분리되어 있습니다.

cpu에 상태 레지스터는 커널모드에서 실행되는 건지 유지모드에서 실행되는지 알려주는 1비트가 있습니다.

 

왜 PCB는 커널영역에 있을까요? 운영체제가 관리해야하기 때문에 커널영역에 있습니다.

(스케쥴러로 관리하기 위해 커널영역에 있는거 같습니다.)

 

만약 문맥교환이 일어나면 cpu 의 내용은 어디로 갈까요? CPU registers storage로 갈것입니다.

 

 

스레드의 상태는 준비, 실행, 대기가 있습니다.

 

TCB안에 스택 포인터가 왜 있어야 할까요? 스레드가 함수 호출할 때 저장하는 곳이 스택입니다. 

실행흐름을 저장하는데 스레드마다 자기 스택이 있어야 합니다.

실행흐름을 가지고 있는 스택 에 대한 포인터를 가지고 있어야 합니다.

 

스레드 제어 블록TCB, Thread Control Block - 사용자 수준 스레드 ( User-level thread) 구현

한 프로세스 안에 4개의 스레드가 있습니다.

 

각 스레드마다 스택이 있습니다.

 

메모리는 커널영역유저영역이 있습니다.

 

유저영역에 text, data, stack, heap 영역이 있습니다.

스레드를 구현하고 관리하는 것이 유저영역에 heap에서 합니다.

즉, 유저가 관리할 수 있습니다.

 

 

스레드 제어 블록TCB, Thread Control Block - 커널 수준 스레드 (Kernel-level thread) 구현

커널영역에 스레드를 구현하고 있습니다.

 

 

1번입니다.

 

2번은 커널 수준 스레드에 구현될 수 있습니다.

3번은 준비, 대기, 실행 상태 3개가 될 수 있습니다.

4번은 한 스레드는 한개의 TCB만 가질 수 있습니다.

 

 

스레드의 구현

스레드 라이브러리는 돌아가는 것이 커널영역에서 돌아갈까 유저영역에서 실행될까요? 남이 짜논 프로그램이니깐 유저영역에서 사용됩니다.

 

동그란게 프로세서 입니다.

 

다대다 매핑에서 사용자 스레드가 동시에 실행될 수 있는 것은 몇개 일까요? 커널 스레드가 2개이기 때문에 2개만 매핑이 될 수 있습니다.

그리고 커널 스레드는 1개의 프로세서만 있으니 1개만 실행가능합니다.

 

라이브러리는 유저영역에서 돌아갑니다.

 

(b)는 병렬 처리가 가능합니다.

(a)는 원천적으로 병렬처리가 불가능 합니다.

 

 

스레드의 구현 - 사용자 수준 스레드 구현

커널은 프로세스 테이블만 유지 = 사용자 수준 스레드 구현입니다.(스레드가 있는지 없는지 모릅니다.)

cpu가 여러개라도 병렬 처리가 불가능합니다.

 

 

스레드 제어블록유저영역의 프로세스 안에 있고

프로세스 제어블록커널영역에 존재합니다.

 

스레드 제어 블록은 항상 사용자 영역에 있어야 하는건 아닙니다.

 

 

사용자 수준 스레드를 구현하면 스케쥴링은 어떻게 되는 것인가?

커널 스레드는 1개밖에 없습니다.

 

유저모드에는 레디큐가 있고 1개만 실행할 수 있습니다.

 

1번 입니다.

유저영역에 있는 스레드 라이브러리를 사용해서 스케쥴링을 합니다.

 

2번은 

3번은 1:1인 커널 수준 스레드 구현을 해야합니다.

4번은 커널 내에 스레드가 있어야 합니다.

 

4번 입니다.

cpu가 아무리 많아도 병렬 수행할 수 없습니다.

 

1번은 유저영역과 커널영역에왔다 갔다 안해도됩니다.(장점)

2번은 다른 커널에서 돌리는 것입니다, 이식성은 높습니다. 스레드 라이브러리를 사용하는 것이 때문에 이식성이 높습니다.

3번은 커널을 많이 사용안하니 적을겁니다.

 

 

 

스레드의 구현 - 커널 수준 스레드 구현

우리가 쓰는 것 입니다.

 

프로세서를 각각 할당받을 수 있는 것

 

커널 수준 스레드 구현이라서 PCB와 TCB가 커널영역에 존재합니다.

사용자 스레드와 커널 스레드가 1:1 매핑이 되었습니다.

 

 

4번 입니다.

 

1번은 운영체제가 지원해야지 커널 수준 스레드를 구현할 수 있습니다.

2번은 커널 호출이 있습니다. 그래서 오버헤드가 있습니다.

3번은 유저영역은 자유롭습니다. 커널영역은 정해진 것만 가능합니다.

 

 

스레드의 구현 - 혼합형 스레드 구현

커널 스레드가 여러개기 때문에 하드웨어 한개를 할당할 수 있습니다.

 

커널 수준으로 구현할 때 1:1매핑을 해야하기 때문에 커널 스레드가 많아질 수 없습니다.

 

많아져도 됩니다. 

 

유연하게 매핑하면 됩니다.

 

꼬불꼬불한게 스레드 입니다.

 

스레드 라이브러리가 필요합니다.

유저 영역의 프로세스안 에 스레드의 관리가 필요합니다.

 

 

Two-level Model

혼합형과 비슷한 이야기 입니다.

 

누가 그걸 지원하느냐 를 알려줍니다.

 

결국 병렬 수행을 하려면 커널 수준의 스레드를 구현해야 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90