본문 바로가기

CS(Computer Science)/운영 체제

프로세스 (Process)

<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>

 

mygumi.tistory.com/114

goodmilktea.tistory.com/28

반응형

'CS(Computer Science) > 운영 체제' 카테고리의 다른 글

메모리 (Memory)  (0) 2020.09.19
(시작 전에) 운영 체제 기본  (0) 2020.09.16