Background
프로그램을 실행하면, 디스크에 있던 프로그램이 메모리에 적재되면서 프로세스가 생성됩니다.
프로세스는 전통적인 실행 및 스케줄링 단위로, 코드와 이를 실행하기 위해 필요한 메모리들이 하나로 묶여 구성됩니다. 이를 Process address space 라고 부르며, 각 프로세스는 독자적인 PCB와 PID를 가집니다.
그렇다면 Thread는 무엇이고, 왜 나왔을까요?
Thread는 프로세스의 단점을 보완하기 위해 등장하였습니다.
Multiprocess 환경 하에서 프로세스들끼리 자원을 공유하고 협력하여 작업을 수행하도록 하려면 어떻게 해야 할까요?
fork() 함수를 사용하여 여러개의 프로세스를 만들고 각각의 프로세스가 single execution path를 갖고 작업할 수 있도록 해야 합니다.
그러나, 프로세스가 생성될 때마다 매번 다음과 같은 정보들을 초기화 해주어야 합니다.
- Process Address Space
- Hardware execution state(PC, SP, registers)
- OS reouces(files)
- Accounting info ...
프로세스를 만들 때마다 모든 자료구조를 할당하고 초기화 해야 하기 때문에 시/공간적 비용이 많이 소요됩니다. 프로세스들을 스케줄링 하거나 IPC 하는 과정에서 커널의 개입이 빈번해지기 때문에 overhead도 증가합니다.
이러한 문제를 해결하기 위해 나온 개념이 thread이며, 초기의 thread는 프로세스를 가볍게 만들고자 만들어졌기 때문에 LWP(Light Weight Process) 로 불리었습니다.
Threads
Thread는 하나의 프로세스 내에서 여러개의 실행 path를 생성하여 multiprocess와 형태는 비슷하되 더 가볍게 실행시킬 수 있도록 고안된 방식입니다.
프로세스 대신 thread를 사용하게 되면, 스케줄링 하는 프로세스의 수가 줄어들기 때문에 한 프로세스가 다시 running 상태로 복귀하는 간격이 짧아집니다. IPC에서 발생하는 커널의 개입도 줄어들어 overhead도 적게 발생하게 됩니다.
Multithreaded process 에서의 Process address space
프로세스 내에서 thread들은 메모리를 공유하여 사용하기도 하고, 독립적으로 사용하기도 합니다.
Stack과 register은 thread 마다 독립적으로 사용하며, 이외는 프로세스 내에 있는 thread 끼리 공유하여 사용합니다.
- 공유되는 것: code(text segment), static data(data segment), heap(dynamically allocated mem)
- 독립적으로 사용되는 것: stack, registers(SP, PC)
User Threads와 Kernel Threads
User Threads
Mutithreaded의 개념을 라이브러리 형태로 구현하여 어플리케이션 단에서 여러개의 작업이 이루어질 수 있도록 하는 방식입니다.
Threads를 구현하던 초기 시절, 처음 부터 thread 관리 기능을 kernel에 넣는 것은 어려웠기 때문에, 이를 라이브러리 형태로 구현하여 사용하였습니다.
- 예시: POSIX Pthreads, Mach C-thread, Solaris threads
User Threads는 크기가 작고 속도가 빠르다는 장점이 있습니다. 그러나, OS(kernel)이 thread의 존재를 알지 못하기 때문에 발생하는 손실이 있을 수 있습니다. 예를 들어 A의 3번 thread가 I/O를 요청했을 경우, kernel은 프로세스 A의 PCB를 waiting queue에 넣습니다. 다른 thread들은 I/O를 대기할 필요가 없음에도 불구하고, kernel이 다른 thread의 존재를 모르기 때문에 같이 waiting queue에서 대기합니다.
Kernel Threads
Kernel 안에서 thread를 관리하고, 시스템콜을 통해 thread를 생성하는 방식입니다.
- 예시: Windows 95/98/NT/2000, Solaris, Tru64 UNIX, BeOS, Linux
Kernel이 개입하여 thread를 관리하는 만큼 안정성이 높습니다. 그러나, overhead가 발생하는 단점이 있습니다.
Threading Issues
Multithreaded로 동작하고 있는 프로세스 안에서 fork()와 exec()이 호출된 경우 두가지 해석이 가능합니다.
- fork()가 호출된 thread만 복제해라
- fork()가 호출된 프로세스와 동일한 자식 프로세스를 생성해라
이 두가지 해석에는 표준이 없고 혼선이 있을 수 있기 때문에, 암묵적으로 multithread 시스템에서는 fork()를 사용하지 않습니다.
'대딩 > 운영체제' 카테고리의 다른 글
스케줄링_알고리즘_FCFS, SJF, SRTF, Priority Scheduling (0) | 2022.05.11 |
---|---|
스케줄링_CPU Scheduling (0) | 2022.05.11 |
IPC(Inter Process Communication)_Message queue/Shared memory/Sockets (0) | 2022.05.11 |
시스템콜_fork(), exec(), exit() (0) | 2022.05.11 |
프로세스_Process, Process Address Space, PCB, MultiProcessing (0) | 2022.05.11 |
댓글