Jun 개발노트

운영체제 04

2020-01-27

운영체제 4

1. 쓰레드

  1. 프로그램 내부의 흐름, 맥 : 쓰레드

  2. 쓰레드가 빠른 시간 간격으로 스위칭 된다. => 쓰레드가 동시에 실행되는 것처럼 보인다.

    • 한 프로세스에는 기본 1개의 쓰레드 - 단일 쓰레드 (single thread) 프로그램
    • 한 프로세스에 여러 개의 쓰레드 - 다중 쓰레드 (multi-thread) 프로그램
    • concurrent(동시에 실행됨) vs simultaneous(어느 한순간 여러가지 일이 일어남) concurrent vs simultaneous
    • 브라우져(동시성) - 화면 출력하는 쓰레드 + 데이터를 읽어오는 쓰레드
    • 워드(동시성) - 화면 출력하는 쓰레드 + 키보드 입력 받는 쓰레드 + 철자/문법 오류 확인 쓰레드
  3. 운영체제 발전에 따라 Context Switch단위가 프로세스 -> 쓰레드

  4. 쓰레드 구조

    • 프로세스의 메모리 공간 공유 (code, data)
    • 프로세스의 자원 공유 (file, i/o, …)
    • 비공유: 개별적인 PC, SP, registers, stack
    • 하나의 프로그램은 code, data, stack 3가지로 구성되있다.(컴퓨터 구조)
  5. 자바 쓰레드

    • 모든 프로그램은 처음부터 1개의 쓰레드를 갖고 있다.
    • 쓰레드를 새로 만드는 것이 아니라 쓰레드를 원래 쓰레드를 포크해서 실행시키는것
    • 주요 메소드(java.lang.Thread)
      • public void run() // 새로운 맥이 흐르는 곳 (치환)
      • void start() // 쓰레드 시작 요청
      • void join() // 쓰레드가 마치기를 기다림
      • static void sleep() // 쓰레드
  6. 프로세스 동기화

    • Independent : 독립적인 프로세스의 형태. 다른 프로세스에 영향을 주지 않는다.
    • Cooperating : 협력적인 프로세스의 형태. 다른 프로세스에 영향을 준다.
      • 프로세스간 통신 : 전자 우편, 파일 전송
      • 프로세스 간 자원공유(메모리 상의 자료들, 데이터베이스) : 명절 기차표 예약, 대학 온라인 수강 신청, 실시간 주식 거래
    • Cooperaing관계에서 공유된 자원이 consistency하게 유지 되게 만드는것(은행 계좌 문제!!!)
    • 입출금 동작에서 공통변수에 대한 동시 업데이트를 하면 원하지 않는 값 도출(-값) => 임계구역 문제
  7. 임계구역 문제

    • 어디서 발생할까 ? 멀티쓰레드로 이루어진 시스템
    • 정의 : 공통의 변수, DB, file을 변하게 하는 쓰레드를 임계구역이라고 한다.
    • 해결책
      • Mutual exclusion (상호배타): 공통변수에 오직 한 쓰레드만 진입
      • Progress (진행): 누구 들어갈지는 죽기전에는 꼭 결정남
      • Bounded waiting (유한대기):얼마나 기달릴지는 죽기전에는 꼭 결정남
  8. 프로세스/쓰레드 동기화할때 전제 조건

    • 임계구역 문제 해결
    • 프로세스 실행 순서 제어
  9. 결론

    • OS가 하는일 중 프로세스 관리는 CPU 스케줄링과 동기화가 있는데, 중요하다.
      1. 프로세스 관리
        • cpu 스케줄링 : 라운드 로빈, 우선순위
        • 동기화
      2. 메인 메모리 관리
      3. 파일 시스템
      4. 입출력

2. 동기화 도구

  1. 세마포
    • 정의 : 동기화 문제 해결을 위한 소프트 웨어 도구
    • 구조 : 정수형 변수 + 두개의 동작 (P, V) + 큐
    • 동작 : P : acquire(), V : release()
    • 동작원리
      • 하나의 자원에 하나의 쓰레드만 사용될 수 있게 들어갈때 acquire(), 나갈때 release()해주면 된다.
      • 예) IO 순서 : readyQueue -> CPU -> IO queue -> IO -> readyQueue -> CPU -> Terminate
      • 세마포도 IO처럼 큐를 가지고 있으며, 제한조건 충족하면를 통해 세마포 큐에 넣어줘 해당 쓰레드가 못하게 막는다.
      • 만약 은행문제에서 잔액이 0보다 작으면 잔액을 세마포 큐로 넣어서 더 이상 인출을 못하게 한다
      • 만약 잔액이 0이라면 세마포 큐에 Dequeue를 해서 잔액을 사용할수 있게 메모리에 올려준다.
      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;
          }
      }
      
    • 목적
      • Mutual exclusion : acquire(),release()를 이용하여 공통된 자원에서 하나의 쓰레드만 작동하게 한다.