Search
💾

[OS] Process 2

참고 강의
contents

Thread(Lightweight Process)

: 프로세스 내부의 CPU 수행 단위가 여러개 있는 경우
: 프로세스 안에 CPU 수행 단위만 여러개를 두는 것
같은 일을 하는 프로세스마다 주소공간이 만들어져서 메모리가 낭비된다.
같은 일을 하는 프로세스를 여러개 올리고 싶다면 주소 공간 하나만 만들어두고 각 프로세스마다 다른 부분의 코드를 실행할 수 있게 해주면 된다.
Thread의 구성(CPU 수행 부분)
  Thread마다 별도로 실행되어야 하는 부분
Program Counter
Register set
Stack Space
Thread가 공유하는 부분(= task)
Code Section
Data Section
OS Resources
  프로세스는 하나기 때문에 프로세스 상태, 프로세스 내부 자원들 Thread 간 공유
→ 별도로 가지는 건 CPU 수행과 관련된 정보(PC, Register, Stack)
  Thread 여러 개, Task 한 개
프로세스가 하나기 때문에 PCB는 하나만 만들어진다.
code, data, files들은 공유하고, CPU Related한 정보들은 각각 가지고 있다.

Thread의 장점

응답성
다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting)상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(Running)되어 빠른 처리를 할 수 있다.
ex. 하나의 스레드가 웹 페이지의 이미지를 불러오는 동안에 해당 스레드를 blocked시키지 않고 또 다른 스레드가 이미 읽어온 텍스트라도 display해줌. 답답함이 덜하다. 빠른 응답성 제공
자원 공유
동일한 일을 하는 프로그램들을 별도의 프로세스로 만들기 보다는 하나의 프로세스로 만들고 그 안에 CPU 수행 단위만 여러개를 두게 된다면 각종 자원은 Thread들이 공유하기 때문에 자원을 효율적으로 사용할 수 있게 된다.
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
자원을 절약 → 같은 일하는 프로세스를 여러개 만들어두면 별도의 코드, 데이터, 스택을 가지고 가기 때문에 메모리 낭비가 심하다.
하나의 프로세스안에 Thread만 여러개 두게 된다면 성능 향상, 자원 절약 효과가 생김
프로세스 내 스레드 간 통신은 메모리와 파일을 공유하기 때문에 커널의 개입이 필요없음
경제성
프로세스를 하나 만드는 건 오버헤드가 크지만 쓰레드를 하나 만드는건 오버 헤드가 크지 않다.
문맥 교환은 오버헤드가 크지만 쓰레드간의 CPU Switching은 동일한 공간을 사용하고 있기 때문에 대부분의 문맥은 그대로 사용하고 있어서 오버 헤드가 크지 않다.
ex. Solaris 운영체제안에서는 각각의 Overhead가 30배, 5배나 된다.
Multiprocessor 아키텍쳐의 활용
CPU가 여러개 있는 환경에서 Thread를 여러 개 뒀을 때 얻을 수 있는 장점
각각의 Thread가 서로 다른 CPU에서 병렬적으로 일을 할 수 있다. → 결과를 더 빨리 얻을 수 있음
스레드를 사용하면 병렬성을 높일 수 있다.
독립적인 연산을 할 때, 서로 다른 CPU에서 실행하고서 합쳐주면 결과가 더 빨리 나오게 된다.
병렬적으로 실행되기 때문에 결과가 빨리 나온다.
스레드의 상태와 동기화

Thread를 구현할 수 있는 방법

운영체제 Kernel의 지원을 받는 Thread : Kernel Threads(= Kernel level Thread)
Thread가 여러 개 있다는 사실을 운영체제가 알고 있음.
하나의 Thread에서 다른 Thread로 CPU가 넘어가는 걸 Kernel이 CPU 스케줄링하듯 넘겨준다.
다중처리 환경일 경우 한 프로세스 내의 다수 스레드는 각각 처리기를 할당받아 병렬 실행이 가능
한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭이 가능
같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입이 필요(모드 스위칭)
커널 레벨 스레드를 사용하게 된다면 스레드가 대기 중인 시간대에 다른 스레드를 실행할 수 있어서 중복된 만큼 전체 일의 종료 시간이 앞당겨진다.
Example
Windows 95/98/NT
Solaris
Digital UNIX, Mach
library 형태로 구현 : User Threads(= User level Thread)
프로세스 안에 Thread가 여러개 있다는 사실을 운영체제가 모름.
User 프로그램이 라이브러리의 지원을 받아서 스스로 Thread를 관리한다.
스레드 라이브러리가 어디서부터 실행해야하는지 알려준다.
스레드 간 스위칭은 라이브러리에 있는 스위칭 프로그램에 의해 결정되기 때문에 운영체제가 정한 스케줄링에 따를 필요가 없다. → 독자적인 스케줄링 사용 가능, 어떤 운영체제에서도 운영 가능
특정 스레드의 실행에서 대기는 자신이 소속된 프로세스의 대기를 초래한다.
실행 중이었던 스레드는 스레드 라이브러리에 의해 실행으로 계속 간주되고 있다가 나중에 CPU가 다시 프로세스로 할당되었을 때 계속 실행해 나갈 수 있도록 해준다.
ex. 스레드 실행 중, Time Interrupt가 날 경우 커널이 프로세스 Switching를 수행. 당시 실행 중이던 스레드 역시 실행 상태로 유지되다가 해당 프로세스가 CPU를 다시 받게 되면 다시 실행.
커널이 볼 때는 일반적인 프로세스로 보이는데 내부에서 CPU 수행단위를 여러개 둬서 관리 → 구현상의 제약은 존재
단점
특정 스레드의 대기가 자신이 소속된 프로세스 내의 모든 스레드들의 대기를 초래
CPU가 프로세스 단위로 할당되기 때문에 다중처리 환경이 주어진다해도 스레드 단위의 다중처리가 되지 못한다는 점 → 병렬적으로 실행 불가능
Example
POSIX Pthreads
Mach C-threads
Solaris threads
Real-time threads
Real-time 기능을 하는 Thread