스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 코드, 데이터, 스택, 힙을 스레드끼리 서로 공유, 그외의 영역은 각각 생성
-> 프로세스끼리는 각자 생성, 그 안에 멀티스레드가 코드,데이터,스택,힙을 공유하는 것
멀티스레딩
- 프로세스 내 작업을 여러개 스레드, 멀티스레드로 처리하는 기법
- 스레드끼리 서로 자원을 공유하여 효율성이 높다
- 동시성이라는 장점
ex) 웹 요청을 처리할 때 새 프로레스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비. 또한 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않고 빠른 처리가 가능
- 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에도 영향을 줄 수 있는 단점
ex) 멀티스레드 - 웹 브라우저 렌더러 프로세스(메인 스레드,워커 스레드, 컴포지터 스레드, 레스터 스레드 존재)
공유자원과 임계영역
공유자원
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리 파일, 데이터 등의 자원이나 변수 등을 의미
- 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 '경쟁상태(race condition)'라고 한다
-> 동시에 접근 시도 시 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태
ex) 프로세스A와 프로세스B가 동시에 접근하여 타이밍이 꼬여 결괏값이 200으로 출력되버린다
임계 영역
- 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역을 임계영역
임계 영역 해결방법
- 뮤텍스, 세마포어, 모니터(상호 배제, 한정 대기, 융통성이라는 조건 만족)
-> 이 방법에 토대가 되는 메커니즘이 잠금(lock)
: 화장실을 쓸때 문을 잠그면 다음 사람은 잠금이 풀려야 다음부터 사용가능
잠깐) 상호 배제 & 한정대기 & 융통성
상호 배제: 한 프로세스가 임계 영역애 들어갔을 때 다른 프로세스는 들어갈 수 없다
한정 대기: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다
융통성: 한 프로세스가 다른 프로세스의 일을 방해해서는 안된다
뮤텍스
- 리소스에 대한 접근을 동기화하는데 사용되는 잠금 메커니즘
- 공유 자원을 사용하기 전에 설정하고 사용한 후에 해체하는 잠금
- 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에는 접근 불가
- 뮤텍스는 하나의 상태(잠금 또는 잠금해제)만 가진다
세마포어
- 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘
- 일반화된 뮤텍스
- 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리
- 세마포어에는 조건 변수가 없다
- 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 정할 수 없다.
wait(): 자신의 차례가 올때까지 기다리는 함수
signal(): 다음 프로세스는 순서를 넘겨주는 함수
- 프로세스가 공유 자원에 접근
- 세마포어에서 wait()작업을 수행
- 프로세스가 자원을 해제
- 세마포어에서 signal()작업을 수행
바이너리 세마포어
- 0과 1의 두가지 값만 가질 수 있는 세마포어
-> 뮤텍스가 두가지 값만 가지는 바이너리 세마포어라고 할 수 있다
but, 뮤텍스는 리소스에 대한 접근을 기반, 세마포어는 신호를 기반
ex) 노래를 듣다가 전화가 오면 노래가 중단되고 통화 처리 작업을 하는 과정
카운팅 세마포어
- 여러개의 값을 가질 수 있는 세마포어
- 여러 자원에 대한 접근을 제어하는데 사용
모니터
- 둘 이상의 스레드나 포르세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공
- 모니터는 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리
- 모니터는 세마포어보다 구현하기 쉽다
- 상호 배제는 자동
교착상태(deadlock)
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
교착상태 원인
상호배제
- 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능
점유 대기
- 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
비선점
- 다른 프로세스의 자원을 강제적으로 가져올 수 없다
환형 대기
- 프로세스 A는 프로세스 B의 자원을 요구하고 프로세스 B는 프로세스 A의 자원을 요규하는 서로가 서로의 자원을 요구하는 상황
교착상태 해결방법
예방
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
회피
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스 당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘' 사용
은행원 알고리즘: 총 자원의 양과 현재 할당한 양을 기준으로 안정 또는 불안정 상태로 나누고 안전 상태로 가도록 자원을 할당하는 알고리즘
탐지
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한개씩 지운다
회복
- 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태 발생 시 사용자가 작업을 종료
CPU 스케줄링 알고리즘
- CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야 하는 일을 스레드 단위로 CPU에 할당
- 프로그램이 실행될 때는 CPU 스케줄링 알고리즘이 어떤 프로그램에 CPU 소유권을 줄 것인지 결정
-> 이 알고리즘은 CPU 이용률은 높게, 주어진 시간에 많은 일을 하게, 준비큐에 있는 프로세스는 적게, 응답 시간은 짧게 설정하는 것을 목표로 한다
비선점형 방식
-
프로세스가 스스로 CPU 소유권을 포기하는 방식
-
강제로 프로세스를 중지시키지 않는다 -> 컨텍스트 스위칭으로 인한 부하가 적다
FCFS(First Come, First Served)
-
가장 먼저 온 것을 가장 먼저 처리하는 알고리즘
-
길게 수행되는 프로세스 때문에 '준비 큐에서 오래 기다리는 현상' 발생하는 단점
SJF(Shortest Job First)
- 실행 시간이 가장 짧은 프로세스를 가장 먼저 실행하는 알고리즘
- 긴 시간을 가진 프로세스가 실행되지 않은 현상 발생 -> 평균 대기시간이 짧다
- 실제로는 실행 시간을 알 수 없기 때문에 과거의 실행했던 시간을 토대로 추측해서 사용
우선순위
- 기존 SJF 스케줄링의 실행되지 않는 현상을 보완하여 오래된 작업일 수록 '우선순위을 높이는 방법(aging)'을 사용
선점형 방식
- 현대 운영체제가 쓰는 방식
- 지금 사용하고 있는 프로세스를 알고리즘에 의해 중단시켜 버리고 강제로 다른 프로세스에 CPU 소유권을 할당하는 방식
라운드로빈(RR)
- 현대 컴퓨터가 쓰는 스케줄링인 우선순위 스케줄링의 일종
- 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝나지 않으면 다시 준비 큐의 뒤로 가는 알고리즘
SRF
- 중간에 더 짧은 작업이 들어오면 수행하던 프로세스를 중지하고 해당 프로세스를 수행하는 알고리즘 (<-> SJF는 기존 짧은 작업 모두 수행하고 그 다음 짧은 작업 수행)
다단계큐
- 우선순위에 따른 준비큐를 여러 개 사용하고 큐마다 라운드로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용하는 것
- 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지만 유연성이 떨어진다