OS(5) - Thread
OS 관련 포스팅
- OS(1) - Introduction
- OS(2) - Interrupt-Based System
- OS(3) - Process Management
- OS(4) - CPU Scheduling
- OS(5) - Thread
- OS(6) - Classical Synchronization Problems
- OS(7) - Deadlock
- OS(8) - Monitor
- OS(9) - Midterm
- OS(10) - Main Memory Management
- OS(11) - Contiguous Memory Allocation
Thread
- 하나의 프로그램은 하나의 흐름/맥이 있음(single thread)
- 여러 흐름/맥이 있다면(multi threads)
Multithreads
- 한 프로그램에 둘 이상의 흐름/맥이 있는 경우
- 짧은 시간 간격으로 흐름이 switching됨
→ 여러 흐름/맥이 동시에 실행되는 것 같음(concurrent)
cf.) simultaneous - 실제로 동시에 여러 thread가 실행됨(불가능)
Thread vs. Process
- 하나의 process에는 하나 이상의 thread가 존재(multi-thread program)
- 하나의 program은 code, data, stack으로 구성됨
- thread는 process의 메모리 공간(code, data) 및 자원(file, I/O)을 공유
- 개별적인 program counter(PC), stack pointer(SP), registers, stack은 비공유
- thread가 switching 될 때마다 PC, SP, registers값 모두 변화되므로 공유하지 않음
- 함수 호출시, stack에 return address, parameter 등을 저장함
- 현대의 context switching 단위는 process가 아닌 thread!
java.lang.Thread
- JAVA의 thread는 java.lang package 안에 있음
- Thread.run() : thread가 시작되면 run() 메서드가 실행됨
- run() 메서드를 override
class MyThread extends Thread { public void run() { // code } }
Process Synchronization(프로세스 동기화)
- 엄밀히 말하면 현대 OS는 context switching의 단위가 thread이므로 ‘thread synchronization’이 맞음
- 일반적으로, main memory에 올라간 process간에는 어떤 식으로든 영향을 주고 받음(cooperating process)
- 하나의 데이터베이스와 같은 공통된 자원(common resources)에 서로 접근하려 하기때문에 영향을 주고 받게 됨
Bank Account Problem
- parent는 deposit(입금), child는 withdraw(출금)을 진행
- common variable인 balance(잔액)에 대해 동시 update가 발생함
- 코드를 읽어가다가 context switching이 일어날 경우, balance에 오류가 생김
- high level language는 기계어(assembly어)로 변환되는 과정을 거침
- 한 줄의 코드가 여러 줄의 기계어로 번역될 때 context switching 일어나면 잘못된 결과가 발생
- common variable update 진행 중에는 context switching 일어나면 안 됨
→ common variable에 대해 한번에 하나의 thread만 update
→ Critical-Section Problem (임계 구역 문제)
Critical-Section Problem
- Critical-Section (C.S.)
→ multiple thread로 구성된 system
→ common variable changing이 일어날 수 있는 구간 - 해결
→ Mutual exclusion (상호 배타): 하나의 thread만 진입
→ Progress (진행): 유한 시간 내에 C.S.에 누가 먼저 진입할 지 결정
→ Bounded waiting (유한 대기): 유한 시간 내에 C.S.에 진입할 기회가 생김
Synchronization Tools
- Semaphores (세마포): 가장 전통적인 동기화 도구
- Monitor (모니터): java에서 사용
Semaphore
- 네덜란드의 Edsger Kijkstra가 제안
- 정수형 변수와 두 개의 동작(P, V)으로 구성
- 네덜란드어(Proberen, Verhogen)를 영어로 변환
- P: acquire()
- V: release()
class Semaphore { int value; Semaphore(int value) { // code } void acquire() { value--; if (value < 0) { add this process/thread to list; block; } } void release() { value++; if (value <= 0) { remove a process P from list; wakeup P; } } }
- 정수형 변수: number of permits
- acquire()
→ 정수값이 1감소
→ 감소된 정수값이 0보다 작으면 호출한 process/thread를 queue안에 넣음
(block상태(= ready queue에 못 감))
→ interrupted exception발생(try~catch) - release()
→ 정수값이 1증가
→ 증가된 정수값이 0보다 작거나 같으면(= queue에 block된 thread 존재) 호출한 process/thread를 queue에서 꺼냄(wake up)
일반적 사용(1): Mutual exclusion
-
number of permits = 1
→ C.S.에 하나의 process/thread만 들임acquire(); Critical-Section release();
일반적 사용(2): Ordering
-
number of permits = 1
p1 p2 acquire(); S1; S2; release();