[OS] Thread

쓰레드 (Thread)

프로그램 내부의 흐름, 맥

다중 쓰레드 (Multithreads)

한 프로그램에 2개 이상의 쓰레드가 일하는 것을 말한다.

여러 쓰레드가 동시에 실행되는 것처럼 보이지만, 사실은 쓰레드는 빠른 시간 간격으로 지속적으로 스위칭되고 있는 것이다.

ex) web browser : 화면 출력하는 쓰레드 + 데이터 읽어오는 쓰레드

ex) word processor : 화면 출력하는 쓰레드 + 키보드 입력받는 쓰레드 + 철자/문법 오류 확인 쓰레드

  • 단일 쓰레드 프로그램 : 한 프로세스에 1개의 쓰레드
  • 다중 쓰레드 프로그램 : 한 프로세스에 여러 개의 쓰레드
  • 쓰레드 구조
    • 프로세스의 메모리 공간 공유
    • 프로세스의 자원 공유
    • 비공유 : 개별적인 PC, SP, registers, stack
  • 프로세스의 스위칭 vs 쓰레드의 스위칭

java.lang.Thread

자바에서 스레드 생성 방법

class MyThread extends Thread() {
    MyThread th = new MyTread();
    th.start();
    while (true) {
        System.out.println("A");
    }
}

Thread.run()

프로세스가 해야하는 일

  1. CPU 스케쥴링
  2. 스레드와 프로세스의 동기화

프로세스의 동기화

프로세스 싱크로나이제이션 == 스레드 싱크로나이제이션

  • 독립적인 프로세스 vs 서로 협력하는 프로세스
  • 프로세스가 다른 프로세스에게 영향을 주거나 받는 경우를 cooperating process라고 한다.
  • 프로세스간 통신 : 전자우편, 파일 전송(FTP)
  • 서로 영향을 주고 받는 프로세스 간에 순서를 잘 정해서 데이터에 일관성이 유지되도록 하는 것
  • 기차표를 예약할 때, 수강신청을 할 때

  • 은행계좌 문제

같은 계좌에 자녀와 부모가 동시에 접근할 때, (concurrent)

입출금에 대한 지연 시간 문제 발생 -> 공통변수에 대한 동시 업데이트 문제

솔루션 : 한번에 한 스레드만 업데이트하도록 만든다. => 임계구역 문제

임계구역 문제 (The Critical Section Problem)

  • Critical Section (임계구역)

멀티스레드로 이루어져있는 시스템에서, 각각의 스레드는 어떤 코드의 영역을 가지고 있다. 이것이 임계구역이다.

여러개의 스레드의 임계구역에서 공통으로 사용하는 변수, 테이블 등의 것들을 임계구역 문제라고 한다.

  • 해결
  1. Mutation exclusion (상호배타) : 오직 한 스레드만 임계구역 문제 부분에 진입시키도록 한다.
  2. Progress condition (진행조건) : 진입 결정은 유한 시간 내에 이루어져야한다.
  3. Bounded waiting (유한대기) : 어느 스레드라도 유한 시간 내에 임계구역에 들어갈 수 있다.

OS가 프로세스 관리를 할 때, 해결해주어야하는 이슈

  1. 임계구역 문제 해결
  2. 프로세스 실행 순서 제어
  3. Busy wait 등 비효율성 제거

동기화 도구

  1. 세마포어
  2. 모니터

세마포어

동기화 문제를 해결하기 위한 소프트웨어 도구이다. 어떤 시그널은 보내는 것

  • 동작
    • P : test => acquire()
    • V : increment => release()

어떤 스레드나 프로세스가 aquire를 호출했을 때, 정수 값을 1 감소시키고, 해당 if문의 조건을 충족시킬 경우, 세마포어의 큐 안에 해당 스레드를 집어넣어놓는다.(Block 상태가 된다.)

release를 호출하면, 큐에서 갇혀있는 스레드를 빼내온다.(Wakeup) 그리고 다시 CPU에 올라가기 위한 readyQ에 들어가게 된다.

  • 일반적 사용

상호배타 목적으로 사용한다.

세마포어에는 정수값을 하나 가진다. 어떤 프로세스가 들어와서 세마포어의 aquire()를 호출하면, 정수값을 1 감소시키고, 해당 감소된 값이 세마포어의 if문을 충족시키면, 세마포어의 큐에 갇히게 된다.(Block 상태가 된다.)

한 프로세스(스레드)가 들어가면, 다른 프로세스가 들어갈 수 없도록 상호배타적으로 돌아가게 해주는 것이다.