운영체제 4
1. 쓰레드
-
프로그램 내부의 흐름, 맥 : 쓰레드
-
쓰레드가 빠른 시간 간격으로 스위칭 된다. => 쓰레드가 동시에 실행되는 것처럼 보인다.
- 한 프로세스에는 기본 1개의 쓰레드 - 단일 쓰레드 (single thread) 프로그램
- 한 프로세스에 여러 개의 쓰레드 - 다중 쓰레드 (multi-thread) 프로그램
concurrent(동시에 실행됨) vs simultaneous(어느 한순간 여러가지 일이 일어남)
- 브라우져(동시성) - 화면 출력하는 쓰레드 + 데이터를 읽어오는 쓰레드
- 워드(동시성) - 화면 출력하는 쓰레드 + 키보드 입력 받는 쓰레드 + 철자/문법 오류 확인 쓰레드
-
운영체제 발전에 따라 Context Switch단위가 프로세스 -> 쓰레드
-
쓰레드 구조
- 프로세스의 메모리 공간 공유 (
code, data
) - 프로세스의 자원 공유 (file, i/o, …)
- 비공유: 개별적인 PC, SP, registers,
stack
- 하나의 프로그램은 code, data, stack 3가지로 구성되있다.(컴퓨터 구조)
- 프로세스의 메모리 공간 공유 (
-
자바 쓰레드
- 모든 프로그램은 처음부터 1개의 쓰레드를 갖고 있다.
- 쓰레드를 새로 만드는 것이 아니라 쓰레드를 원래 쓰레드를 포크해서 실행시키는것
- 주요 메소드(java.lang.Thread)
- public void run() // 새로운 맥이 흐르는 곳 (치환)
- void start() // 쓰레드 시작 요청
- void join() // 쓰레드가 마치기를 기다림
- static void sleep() // 쓰레드
-
프로세스 동기화
- Independent : 독립적인 프로세스의 형태. 다른 프로세스에 영향을 주지 않는다.
- Cooperating : 협력적인 프로세스의 형태. 다른 프로세스에 영향을 준다.
- 프로세스간 통신 : 전자 우편, 파일 전송
- 프로세스 간 자원공유(
메모리 상의 자료들, 데이터베이스
) : 명절 기차표 예약, 대학 온라인 수강 신청, 실시간 주식 거래
- Cooperaing관계에서 공유된 자원이 consistency하게 유지 되게 만드는것(은행 계좌 문제!!!)
- 입출금 동작에서 공통변수에 대한 동시 업데이트를 하면 원하지 않는 값 도출(-값) => 임계구역 문제
-
임계구역 문제
- 어디서 발생할까 ? 멀티쓰레드로 이루어진 시스템
- 정의 : 공통의 변수, DB, file을 변하게 하는 쓰레드를 임계구역이라고 한다.
- 해결책
- Mutual exclusion (상호배타): 공통변수에 오직 한 쓰레드만 진입
- Progress (진행): 누구 들어갈지는 죽기전에는 꼭 결정남
- Bounded waiting (유한대기):얼마나 기달릴지는 죽기전에는 꼭 결정남
-
프로세스/쓰레드 동기화할때 전제 조건
- 임계구역 문제 해결
- 프로세스 실행 순서 제어
-
결론
- OS가 하는일 중 프로세스 관리는 CPU 스케줄링과 동기화가 있는데, 중요하다.
- 프로세스 관리
- cpu 스케줄링 : 라운드 로빈, 우선순위
- 동기화
- 메인 메모리 관리
- 파일 시스템
- 입출력
- 프로세스 관리
- OS가 하는일 중 프로세스 관리는 CPU 스케줄링과 동기화가 있는데, 중요하다.
2. 동기화 도구
- 세마포
- 정의 : 동기화 문제 해결을 위한 소프트 웨어 도구
- 구조 : 정수형 변수 + 두개의 동작 (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()를 이용하여 공통된 자원에서 하나의 쓰레드만 작동하게 한다.