Thread

- "프로세스에서 CPU 수행에 대한 부분"(스레드)만 별도로 가지고 있다
- 동일한 프로그램을 여러개 띄우더라도 한개의 프로세스가 만들어진다.
- PCB에서 다른 부분은 share를 하고 PC의 값만 스레드 별로 가지고 있다.
- 동일한 프로세스 안에서 Thread1 → Thread2로 넘어가는 것은 Context Switch가 필요하지 않다.(효율적)
Thread의 구성
"A thread (or lightweight process) 는 CPU 수행의 기본 단위"
✨ Thread의 구성
✓ program counter
✓ register set
✓ stack space
✨ Thread가 동료 thread와 공유하는 부분(=task)
✓ code section
✓ data section
✓ OS resources
- 전통적인 개념의 heavyweight process는 하나의 thread를 가지고
있는 task로 볼 수 있다
스레드를 활용하면 얻는 장점
✨ 응답성(Responsiveness)
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.
✨ 리소스 공유(Resource Sharing)
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다
✨ 경제적(Economy)
- creating(Process를 만드는 것과 Thread를 만드는 것),
- CPU switching thread (rather than a process)
- Solaris OS의 경우 위 두 가지 overhead가 각각 30배, 5배
✨ 멀티프로세서 아키텍처 활용
- 다른 프로세서에서 각각의 스레드가 병렬적으로 사용
스레드 안전(Thread-Safety)
✨ 스레드 안전(Thread-Satety)
-
멀티 스레드 프로그래밍에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것을 말한다.
-
하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 옳바르게 나오는 것을 말한다.
-
Thread-sate하다라는 의미는 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과는 정합성이 보장될 수 있게 메모리 가시성이 확보된 상태이다.
스레드를 구현하는 방법
Kernel Threads
- 운영체제가 스레드가 여러 개인 것을 알고 있어서 스레드간의 CPU 교환을 ‘커널이’ CPU 스케줄링을 하듯이 관리한다.
User Threads
- 운영체제는 스레드가 여러 개인 것을 모르는 상태에서 사용자 프로그램이 라이브러리의 지원을 받아 스스로 여러 개의 스레드들을 관리한다.