<Process>
Job : 프로그램이 커널에 올라가기 전의 상태 (디스크에 있는 상태)
Process : 프로그램이 커널에 등록되어 실행되는 상태 (하나 이상의 스레드)
PCB(Process Control Block) : 프로세스의 관리에 필요한 정보 저장, 프로세스 생성할 때 생성.
(커널의 영역에 저장되어 있음)
<프로세스 상태>
Created : job을 커널에 등록해서 프로세스 생성, pcb 할당
Ready : 메모리 할당을 받고 cpu를 기다리고 있는 상태
Running : 프로세서를 할당받고 실행중인 상태 (interrupt나 time slice가 끝나면 교체 됨)
Asleep(blocked) : I.O나 다른 이벤트를 기다리고 있는 상태
Suspended Ready : 메모리를 뺏긴 ready 상태, swap device 에 memory image를 저장해둠
- swap-out : 메모리를 뺏길 때 swap device에 저장하는 과정
- swap-in : 메모리를 다시 얻어 swap device에서 복구 시키는 과정
Suspended Blocked : blocked상태에서 메모리를 뺏긴 상태
Terminated : 프로세스 종료되고 PCB정보만 남아있어 수집하는 상태
<인터럽트>
Interrupt : 외부에서 발생한 이벤트
1. 인터럽트 발생시 커널이 개입해서 running 상태의 process를 중단시킴 (cpu가 주기적으로 인터럽트 확인)
2. 원인 파악하고 인터럽트 서비스 할 것인지 결정.
3. 결정하면 interrupt 서비스 루틴에 대한 프로세스를 running(cpu) 에 올림
<Context Switching>
현재 프로세스의 Register context를 저장하고 복구하는 작업(context saving, context restoring)
<Thread>
Thread : 프로세스 내에서 실제로 작업을 수행하는 주체
제어 여러개 둘 수 있음 (multi-Thread), 자원 공유
cpu는 thread단위로 할당됨.
Thread 상태 : ready, run, blocked
(suspended는 process레벨로 이루어짐)
Multi-Thread : 코드 , 전역 데이터, 힙 영역은 공유하지만 스택, 지역데이터, 제어 정보(Program Counter 등)는 thread
마다 각각 갖고있음.
(multi) thread 장점 : - Context Switching overhead가 상대적으로 작게 발생함
- 멀티 프로세서 활용 가능(병렬 처리통한 성능 향상) (단 코어마다 다른 프로세스의 스레드 가능?)
(단 일반적 컴퓨터에서, 암달의 법칙에 의해 코어 4-5 개가 넘어가면 효율이 다시 떨어지기 시작)
- 커널 개입 없는 자원 공유
(process끼리는 system call을 이용해 통신하지만 , thread끼리는 그냥 통신 가능)
- 사용자 응답성 (일부 스레드 처리 지연돼도 다른 스레드 작업 유지 가능)
(ex - 게임할 때 마우스, 모니터 , 키보드)
사용자 수준 스레드 (User Thread) : 사용자 영역의 스레드 라이브러리로 구현(커널은 스레드의 존재 모름)
(하나의 스레드 중단되면(io대기), 통째로 중단됨)
커널 수준 스레드 (Kernel Thread) : 사용자가 수준에서 스레드 만들면 커널에서도 같이 1대1로 만듬(관리 커널)
(context switching 등 오버헤드 발생) (병행 수행 가능)
-> os는 혼합형 스레드로 사용자 수준 스레드와 커널 수준 스레드를 n:m으로 혼합해서 사용
(user thread를 만들고 필요하면 kernel thread로 매핑)
<스케줄링 (Scheduling)>
스케줄링 성능 지표 : 응답시간(response time) , 작업 처리량(throughput) ,자원 활용도(resource utilization)
Long-term Scheduling : kernel에 등록 할 작업을 결정 (time sharing 시스템에서는 상대적으로 덜 중요 )
Mid-term Scheduling : suspended 상태의 프로세스들에게 메모리를 할당해서 올려줌
Short-term Scheduling : ready 상태의 프로세스를 running으로 올려줌
FCFS (First Come First Service) : 먼저 온 프로세스 부터 차례대로 처리
RR (Round Robin) : time quantum시간 동안씩 돌아가면서 프로세스 실행
SPN (Shortest Process Next)(SJF) : 실행시간(burst time)이 작은 프로세스 먼저 실행
SRTN(Shortest Remaing Time Next) : 남은 시간이 더 적은 프로세스가 ready queue에 들어오면 선점됨
(SPN에 preemptive 방식이 적용된 것임)
HRRN(High Response Ratio Next) : SPN+(aging 기법) -> SPN의 Starvation 문제 해결
MLQ (Multi-level Queue) : ready queue를 여러개 둠 , queue마다 다른 스케줄링 기법 사용, 최초 queue할당 되면 변경x
MFQ (Multi-level Feedback Queue) : MLQ와 다르게 queue간 이동이 허용
<프로세스 동기화 (Synchronization)>
동기화 : 프로세스들이 서로 동작을 맞추는 것 ,정보 공유
Critical section : 공유 데이터를 접근하는 코드 영역
Race Condition : 실행 순서에 따라 결과가 달라지는 것
<상호배제 조건>
Mutual exclusion (상호배제) : 둘 이상의 프로세스가 동시에 진입하는 것을 막는 것
Progress (진행) : Critical section 에 아무도 없으면 진행되어야 한다.
( critical section안의 프로세스 외에 다른 프로세스가 진입을 방해하면 안됨)
Bounded waiting (한정 대기) : 프로세스의 critical section 진입은 일정 시간안에 허용되어야 함
<Mutual Exclusion Solution>
1. SW solution
Dekker's Algorithm, Peterson's Algorithm : 두 개의 프로세스 상호배제를 보장하는 알고리즘
Dijkstra's Algorithm : n개의 프로세스 상보배제를 보장하는 알고리즘
2. HW solution
TestAndSet (TAS) instruction : Test 와 Set을 하드웨어 적으로 한번에 수행시켜줌 (실행 중 interrupt 받지 않음)
(target변수를 true로 바꾸고 그 전값 반환)
(TAS활용 방법은 좋은데 여전히 busy waiting 문제 발생)
3. OS supported SW solution
Spinlock : P(S) -> key를 갖고 들어감 , V(S) -> 나올 때 반환 , ( S는 0이상), P V 는 OS에서 원자성 보장
->*멀티 프로세서 에서만 사용 가능 (P ,원자성 보장하는데서 돌며 기다리면 무한 반복)
- Busy waiting 문제 여전히 발생
Semaphore : -spinlock 처럼 정수형 변수 (뮤텍스는 값이 1인 세마포어,바이너리 세마포어)
- p(S) v(S), spinlock 과 같은 방식이지만 S변수 하나마다 ready queue 하나가 할당 됨.
(p or v 부분은 OS가 원자성 보장) (p들어갈 때 S-- 한다음 S가 0보다 작으면 queue에서 대기)
-** 대기할 때 ready queue에서 기다리기에 busy waiting 문제 해결
(기다려야 하는 프로세스는 block ( asleep) 상태가 됨
- 대기큐에서 아무나 깨우기에 여전히 starvation 발생
Eventcount/Sequencer : 은행처럼 번호표를 뽑고, 기다림, 자신의 차례가 오면 진입, 나갈 때 counter증가
(buxy waiting 해결, starvation 해결, semaphore보다 더 low-level control이 가능)
4. Language_level solution (high level solution) <사용하기 쉽게 지원><상호배제를 Language가 보장>
Monitor : 모니터에는 항상 하나의 프로세스만 진입가능, 생각대로 짜기 편함.
------------------------------------------------------------------------------
제일 간편 -> message passing (통신을 이용)
(send , receive)
<Deadlock>
Deadlock : 발생 가능성이 없는 이벤트를 계속 기다리는 프로세스가 있는 경우
<Deadlock 발생 필요 조건>
Exclusive use of resources - 자원 특성 (한번에 한 프로세스만 사용가능) -> 예방불가
Non-preemptible resources - 자원 특성 -> 예방 가능(비효율적)
Hold and wait -프로세스 특성 ->예방 가능 (비효율적)
Circular wait -프로세스 특성 ->예방 가능 (비효율적)
<Deadlock 해결 방법>
1. Deadlock Prevention (예방) : deadlock 발생 필요 조건 중 하나를 제거 ,애초에 deadlock이 발생할 수 없게 만듬.
(비현실적 이거나 비효율적임)
2. Deadlock avoidance (회피) : deadlock 발생 가능성이 있으면 자원 할당 요청 보류(회피)
(safe state를 유지하면서 자원을 빌려줌)
(deadlock 이 발생하지 않게 하는 길이 있으면 safe state)
- banker's algorithm (자원 종류 한개)
- Habermann's algorithm (banker'의 확장, 자원 종류 여러개)
<시스템 계속 감시 (계속 자원 준다고 치고 시뮬레이션 해봐야함) 비효율적>
3. Deadlock detection and recovery (탐지 및 복구) : deadlock 발생하면 회복
detection -> 남은 자원 다 할당해보고 지울 수 있는 프로세스 지워 나가기 (남은 process끼리 데드락 발생)
Resource Allocation Graph 사용 : Graph reduction 방식 사용하여 탐지 (edge를 지워가는 방식)
(edge 가 남으면 deadlock 존재)
recovery -> 프로세스 종료 , 자원 선점(해당 자원 갖고 있는 프로세스 종료)
(checkpoint 마다 context를 저장해두면 프로세스 종료시 Rollback으로 재실행 ->성능 향상)
<부가적인 내용>
-Signal -> interrupt 나 OS에서 발생하는 신호를 user level 에 보내줌 (user level에서 default 행동 대신 재정의 가능)
(프로세스는 ready에서 running이 될 때 (pending 이면서 nonblock인)signal을 처리하고 다시 하던 곳 부터 실행)
pending -> 아직 처리되지 않고 수신된 상태 ,
- process image ( segmentation하면 저것을 논리적으로 분할)
<mutex vs semaphore>
'CS(Computer Science) > 운영 체제' 카테고리의 다른 글
메모리 (Memory) (0) | 2020.09.19 |
---|---|
(시작 전에) 운영 체제 기본 (0) | 2020.09.16 |