[운영체제-양희재 교수님]10강 쓰레드와 프로세스 동기화
쓰레드(Thread)
- 쓰레드
- 프로그램 내부의 흐름, 맥
- 일반적으로 하나의 프로그램은 하나의 맥(쓰레드)이 있다.
Multithreads
- 다중 쓰레드(Multithreads)
- 한 프로그램에 2개 이상의 맥 존재
- 맥이 빠른 시간 간격으로 스위칭 되므로 여러 맥이 동시에 실행되는 것처럼 보임(concurrent)
- 실제로는 CPU가 하나이기 때문에 한순간에 하나의 쓰레드만 실행
- 참고) simultaneous ⇒ 실제로 동시에 작업하는 것을 지칭
- 예시
- Web browser = 화면을 출력하는 쓰레드 + 데이터를 읽어오는 쓰레드
- Word processor = 화면을 출력하는 쓰레드 + 키보드 입력을 받는 쓰레드 + 철자/문법 오류 확인 쓰레드
- 음악 연주기, 동영상 플레이어, Eclipse IDE 등 현대의 대부분의 프로그램은 다중 쓰레드
- 현대의 OS는 다중 쓰레드를 제공 ⇒ context switching의 단위는 프로세스가 아닌 쓰레드
- 이전) P1 → P2 → P3 → …
- 현대) P1의 T1 → P1의 T2 → P2의 T1 → P2의 T2 → P3의 T1 → …
Thread vs Process
- 한 프로세스에는 기본 1개의 쓰레드 존재
- 쓰레드가 하나인 프로그램 ⇒ 단일 쓰레드(single thread) 프로그램
- 한 프로세스에 여러 개의 쓰레드가 존재 가능
- 쓰레드가 여러 개인 프로그램 ⇒ 다중 쓰레드(multi-thread) 프로그램
- 쓰레드 구조
- 쓰레드는 프로세스의 메모리 공간(code, data) 공유
- 쓰레드는 프로세스의 자원(file, i/o 등) 공유
- 개별적인 PC, SP, registers, stack은 공유하지 않는다.
- 스택에는 다른 쓰레드와 공유하면 안 되는 함수의 return address나 parameter 등을 저장하므로 메모리 공간을 따로 사용한다.
- 프로세스의 스위칭 vs 쓰레드의 스위칭
- 현대의 OS는 쓰레드를 스위칭한다.
예제) 자바 쓰레드
- 자바에서 쓰레드는 객체다.
- 맥 만들기
java.lang.Thread
- 주요 메소드
public void run()
: 새로운 맥이 흐르는 곳 (치환)void start()
: 쓰레드 시작 요청void join()
: 쓰레드가 마치기를 기다림static void sleep()
: 쓰레드 잠자기
java.lang.Thread
Thread.run()
- 쓰레드가 시작되면
run()
메소드가 실행 ⇒run()
메소드를 치환해 사용하기 위해Thread
클래스의 하위 클래스를 만듦
1 2 3 4 5
class MyThread extends Thread { public void run() { // 치환(override) // 코드 } }
- 쓰레드가 시작되면
예제)
A
와B
를 동시에 화면에 출력하기1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
class Test { public static void main(String[] args) { MyThread th = new MyThread(); th.start(); while (true) System.out.print("A"); } } class MyThread extends Thread { public void run() { // 치환(override) while (true) System.out.print("B"); } } // A와 B가 섞여서 출력된다.
- 모든 프로그램은 처음부터 1개의 쓰레드(
main
)는 갖고 있다. main
+MyThread
⇒ 2개의 쓰레드
- 모든 프로그램은 처음부터 1개의 쓰레드(
프로세스 동기화
- 엄밀히 말해 현대에는 쓰레드를 스위칭하므로 “Thread synchronization”가 더 맞다.
- Processes(Thread도 마찬가지)
- Independent vs. Cooperating
- 프로세스 간 독립적으로 작동하는가 vs. 다른 프로세스의 영향을 받는가
- Cooperating process
- one that can affect or be affected by other processes executed in the system
- 프로세스 간 통신 예시) 전자우편, 파일 전송
- 프로세스 간 자원 공유 예시) 명절 기차표 예약, 대학 온라인 수강 신청, 실시간 주식거래
- 자원 ⇒ 메모리상의 자료들, 데이터베이스 등
- Independent vs. Cooperating
- Process Synchronization
- Concurrent access to shared data may result in data inconsistency
- 목적) Orderly execution of cooperating processes so that data consistency is maintained
BankAccount Problem
- 부모님은 은행 계좌에 입금하고 자녀는 출금하는 상황을 가정
- 문제) 공통 변수(common variable)에 대한 동시 업데이트(concurrent update)를 하여 잘못된 결괏값이 나온다.
- 이러한 문제를 임계구역 문제라 한다.
- 해결) 한 번에 한 쓰레드만 공통 변수를 업데이트하도록 해야 한다.
- 즉 공통 변수를 업데이트하는 동안 다른 쓰레드가 공통 변수를 또 업데이트 하지 않아야 한다.
- 공통 변수 업데이트는 atomic 해야 한다.
This post is licensed under CC BY 4.0 by the author.