쓰레드 (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()
프로세스가 해야하는 일
- CPU 스케쥴링
- 스레드와 프로세스의 동기화
프로세스의 동기화
프로세스 싱크로나이제이션 == 스레드 싱크로나이제이션
- 독립적인 프로세스 vs 서로 협력하는 프로세스
- 프로세스가 다른 프로세스에게 영향을 주거나 받는 경우를
cooperating process
라고 한다. - 프로세스간 통신 : 전자우편, 파일 전송(FTP)
- 서로 영향을 주고 받는 프로세스 간에 순서를 잘 정해서 데이터에 일관성이 유지되도록 하는 것
-
기차표를 예약할 때, 수강신청을 할 때
- 은행계좌 문제
같은 계좌에 자녀와 부모가 동시에 접근할 때, (concurrent)
입출금에 대한 지연 시간 문제 발생 -> 공통변수에 대한 동시 업데이트 문제
솔루션 : 한번에 한 스레드만 업데이트하도록 만든다. => 임계구역 문제
임계구역 문제 (The Critical Section Problem)
- Critical Section (임계구역)
멀티스레드로 이루어져있는 시스템에서, 각각의 스레드는 어떤 코드의 영역을 가지고 있다. 이것이 임계구역이다.
여러개의 스레드의 임계구역에서 공통으로 사용하는 변수, 테이블 등의 것들을 임계구역 문제라고 한다.
- 해결
- Mutation exclusion (상호배타) : 오직 한 스레드만 임계구역 문제 부분에 진입시키도록 한다.
- Progress condition (진행조건) : 진입 결정은 유한 시간 내에 이루어져야한다.
- Bounded waiting (유한대기) : 어느 스레드라도 유한 시간 내에 임계구역에 들어갈 수 있다.
OS가 프로세스 관리를 할 때, 해결해주어야하는 이슈
- 임계구역 문제 해결
- 프로세스 실행 순서 제어
- Busy wait 등 비효율성 제거
동기화 도구
- 세마포어
- 모니터
세마포어
동기화 문제를 해결하기 위한 소프트웨어 도구이다. 어떤 시그널은 보내는 것
- 동작
- P : test => acquire()
- V : increment => release()
어떤 스레드나 프로세스가 aquire를 호출했을 때, 정수 값을 1 감소시키고, 해당 if문의 조건을 충족시킬 경우, 세마포어의 큐 안에 해당 스레드를 집어넣어놓는다.(Block 상태가 된다.)
release를 호출하면, 큐에서 갇혀있는 스레드를 빼내온다.(Wakeup) 그리고 다시 CPU에 올라가기 위한 readyQ에 들어가게 된다.
- 일반적 사용
상호배타 목적으로 사용한다.
세마포어에는 정수값을 하나 가진다. 어떤 프로세스가 들어와서 세마포어의 aquire()를 호출하면, 정수값을 1 감소시키고, 해당 감소된 값이 세마포어의 if문을 충족시키면, 세마포어의 큐에 갇히게 된다.(Block 상태가 된다.)
한 프로세스(스레드)가 들어가면, 다른 프로세스가 들어갈 수 없도록 상호배타적으로 돌아가게 해주는 것이다.