Threads

주리링·2021년 8월 11일
0

운영체제

목록 보기
4/7
post-thumbnail

21-1학기 운영체제에 대해서 배운 내용들을 상기하고 기록하기 위해 글을 쓰려고 합니다.
4장에서는 3장에서 배운 Process와 비교해여 Thread에 대해서 알아보려고 합니다!

Process vs Thread

process의 구성요소인 PCB,code,data,stack중 실행할 때 code는 거의 변하지 않고 전역 변수와 같은 data는 값만 변하고, 지역 변수와 같은 stack은 변한다.
실행 할 때, 변하는 값을 가지는 Thread를 실행의 단위로 사용하여 하나의 process당 여러개의 thread(Multitreading)를 가진다면 병렬적으로 실행을 할 수 있다.

Process

process는 자원 할당의 단위로, process image를 유지하며 virtual address space(code, data)를 가진다.

Thread

thread는 실행의 단위로, excution stack과 지역 변수를 저장하는 static storage를 가지며 memory와 resource는 share하며 실행된다.

Single Threaded and Multithreaded process models


지금까지 배운 single-thread process model과 multithread process model을 비교하여 살펴보자.
여기서 User Address Space는 code+data이다.
실행할 때마다 변화하는 stack은 thread마다 가지며, pcb에서 process identification은 process와 관련된 것은 pcb에 thread와 관련된 것은 tcb에 있다.
processor state information은 실행과 관련이 있으므로 tcb에 있다.
process control information은 자원과 관련된 것은 pcb, 실행과 관련된 것은 tcb에 있다.

Benefits of Threads

process가 있음에도 thread가 사용되는 이유는 시간이 적게 걸리기 때문이다.
process보다 thread를 생성하고, 종료하고, 스위칭하는데 더 적은 시간이 걸린다.
또한 같은 process내에서 memory와 file들 share하므로 kernel의 도움없이 communication이 가능하다는 장점도 있다.

Thread Level

thread를 관리하는 level에 따라 다르게 볼 수 있다.

User-Level Threads


모든 thread를 user space의 threads library에서 관리한다.
그러므로 thread switching을 할 때 user mode로 실행된다.

a->b

I/O때문에 OS가 process를 Block시킨 상태이다.
thread의 상태가 변화하지 않은 이유는 OS가 block시킬 때 mode가 kerner mode이기 때문이다.

a->c

time out되어서 OS가 process B를 ready queue로 보낸 상태이다.
thread의 상태가 변화하지 않은 이유는 OS가 block시킬 때 mode가 kerner mode이기 때문이다.

a->d

thread2에서 event를 요청해서 block된 후 thread1이 실행중인 상태이다.
mode는 user mode이다.

Kernel-Level Threads


thread를 kernel에서 관리한다.
그러므로 thread switching을 할 때 kernel mode로 실행된다.

ULT와 비교한 KLT의 Advantages

OS를 process로 볼 때 kernel level에서도 multithread 사용이 가능하다-> os의 성능이 더 좋아진다.
만약 어떤 프로세스의 thread중 하나가 block되었다면 kernel이 이 프로세스의 다른 thread를 실행시킬 수 있다.

ULT와 비교한 KLT의 Disadvantages

thread switching을 할 때 kernel모드로 실행된다. -> 효율이 떨어진다.

Conbined Approaches for Threads


thread의 생성은 user space에서 하나, user space와 kernel space에서 모두 thread를 관리한다.

실제 프로그램을 통해서 더 자세하게 알아보자!

Windows

Windows는 multithread를 가지며 process와 thread object 모두 synchronization capabilithes를 가진다.
또한 최소한의 kernel만 남겨두고 나머지는 process인 Microkernel을 사용한다.

Windows Thread Object


standby상태는 Running상태의 thread 다음으로 실행시킬 thread의 상태이다.
Running상태에서 time out이 되면 우선순위가 높은 thread에게 cpu를 빼았기고 Ready상태가 된다.
Running상태에서 Waiting상태가 될 때, Suspend는 hard disk로의 이동이 아니라 다른 thread들이 동기화를 목적으로 하여 이 thread를 잠시 쉬게 하는 것이다.
또한 Waiting상태에서 모든 thread가 blocked/suspend될 수 있고 그렇다면 process가 blocked/suspend 될 수 있다.
이 때 thread의 waiting상태가 끝났을 때, process가 main memory에 있다면 Ready상태가 되고, hard disk에 있다면 Transition상태가 된다.

Solaris

Solaris의 Process는 user's address space,stack,pcb를 포함한다.
process안에 모든 것이 다 있는 Traditional Unix에서 발전한 형태로, Light Weight Process를 가진다.
Solaris는 Conbined Approaches for Threads이다.
ULTL이 Lightweight 프로세스랑 thread 연결시킨다.
또한 kernel thread와 연결(mapping)한다. ⇒Lightweight processes는 kernel level Thread다!

Solaris Thread States


IDLE상태는 LWP와 연결되지 않은 Thread를 의미한다.
mapping이 되며 RUN상태가 된다.
ONPROC상태는 running상태이다.
ONPROC상태에서 interrupt가 발생했는데 지금 실행중인 process를 중단한 상태가 아닐 때, PINNED상태가 된다.
그리고 interrupt처리 후 다시 실행시켜도 문제가 없을 때 다시 ONPROC상태가 되고 cache와 관련이 있다.

Linux

process(task)는 task struck data구조를 가진다.
Linux에서는 thread와 process를 구분하지않고 task라고 부른다.
ult는 klt로 mapping된다.
새로운 process가 생성되는 방법은 2가지인데, 첫번째는 다른 process를 copy한다.
두번째는 다른 process와 user address space와 pcb(자원과 관련된) resource를 share하며, tcb와 stack만 다르게 가지는 process를 생성하는 것이다.

Linux Process/Thread Model


Uninterruptible상태와 interruptible상태는 모두 block상태와 비슷한데, Uninterruptible상태는 요청한 event가 오지 않으면 ready상태가 되지 않고, interruptible상태는 요청한 event가 아니더라도 signal이 오면 ready상태가 된다.

profile
코딩하는 감자

0개의 댓글