/ OS

OS(5) - Thread

OS 관련 포스팅

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();