Post

[운영체제-양희재 교수님]10강 쓰레드와 프로세스 동기화

경성대학교 양희재 교수님의 운영체제 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)
      		// 코드
      	}
      }
    
  • 예제) AB를 동시에 화면에 출력하기

    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개의 쓰레드

프로세스 동기화

  • 엄밀히 말해 현대에는 쓰레드를 스위칭하므로 “Thread synchronization”가 더 맞다.
  • Processes(Thread도 마찬가지)
    • Independent vs. Cooperating
      • 프로세스 간 독립적으로 작동하는가 vs. 다른 프로세스의 영향을 받는가
    • Cooperating process
      • one that can affect or be affected by other processes executed in the system
      • 프로세스 간 통신 예시) 전자우편, 파일 전송
      • 프로세스 간 자원 공유 예시) 명절 기차표 예약, 대학 온라인 수강 신청, 실시간 주식거래
        • 자원 ⇒ 메모리상의 자료들, 데이터베이스 등
  • 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.