CS/운영체제

CH3) Process

코딩하는 포메라니안 2021. 9. 5. 00:01

1. Process란?

1. process의 개념

: 프로그램이 메모리에 올라가서 수행 중인 상태, 프로그램의 instance

 

 

2. process가 필요한 이유

진행되는 상태를 표현해야 한다.

다른 프로세스들과 번갈아가면서 진행시키기 때문에 상태를 저장해놔야지 다시 수행할 수 있다.

 

Process가 저장하는 대표적인 정보는 다음과 같다.

1) Current instruction(PC) = 다음에 수행해야 하는 instruction의 위치

2) Register 값

3) (가상)메모리 값

4) Parent info = 자신을 생성한 parent를 가리키는 포인터

 

 

 

2. Process의 가상 메모리

1. 가상 메모리의 개념

- 사용할 수 있는 공간이 4GB가 있다고 하면, 그중 극히 일부만 사용한다.

- 프로그래머가 편의상 4GB 있다고 생각하고 만들면, 사용되는 것만 OS가 실제 공간에 맵핑해준다.

- 서로 다른 process의 경우, 사용하는 데이터의 가상 메모리 주소는 같을 수 있다.

 

 

2. process 가상 메모리 구조

- 가상 메모리의 제일 위에 있는 1GB는 kernel 공간

          - 실제 메모리의 하단과 연결되어 있다.

          - interrupt의 발생으로 kernel모드일 때 접근 가능한 곳

 

*OS 전용 프로세스는 없다. 하나의 프로세스가 interrupt가 발생하면 kernel mode(OS)로 변환되어 실행되고 다시 user mode로 돌아가는 것

 

 

 

3. Process State

- 정하기 나름, 아래는 예시

 

 

 

 

4. Process Control Block (PCB)

- kernel 내에서 process를 표현하는 데이터 구조

- process state, PC, registers 등

 

 

 

5. Threads

- linux의 경우 scheduling의 대상이 되는 객체

- process 간에는 메모리가 철저히 분리되어 있는 반면에 thread끼리는 메모리를 공유한다.

 

 

 

6. Process Scheduling

- CPU가 다음에 무엇을 실행할지 결정하는 것

 

1. Time Sharing

: 특정 시간마다 interrupt를 일으켜서 동작 process를 바꾼다(Context Switch).

*multiprogramming : 메모리 위에 여러 프로그램이 올라갈 수 있는 것

*multitasking (=time sharing) : 여러 프로그램이 동시에 실행되거나 그렇게 보이는 것

 

 

2. Scheduling queue

*FIFO가 아니고, 정한 기준에 따라 중간에 위치한 데이터도 꺼냄

 

1) job queue (=job pool)

- 프로그램 상태로 job scheduling을 기다리는 queue

*job scheduling : 프로그램을 메모리에 올리기

 

2) Ready queue

- 바로 실행 가능한 process가 대기

- process scheduling을 기다리는 queue

 

3) Device queue (= wait queue, I/O queue)

- device마다 자신의 queue를 가진다.

 

 

 

7. Scheduler

- OS에 있는 하나의 함수로, 다음에 돌릴 PCB 포인터 값을 반환

 

1. Scheduler 분류

1) Long-term scheduler = job scheduler

- job을 수행할 공간이 생기면 job queue에서 메모리에 올리는 것

 

2) Short-term scheduler = CPU scheduler

- ready queue에서 짧은 간격으로 계속 process를 선택하며 번갈아 실행

 

 

2. process 종류

1) I/O-bound

- 계산을 잘 안 하고 data 이동이 주된 일

2) CPU-bound

- 계산을 많이 해야하는 일

=> 두 종류를 적절히 섞어서 선택함으로써 disk와 CPU를 골고루 쓰도록 한다.

 

 

 

8. Process 작동 과정

1. 생성

- 무조건 Parent process가 Child process를 생성한다.

- init process (root) : 모든 process의 parent process

*fork() system call : parent process를 복제해서 두 프로세스가 동시에 진행, return value

=> child는 parent의 pc까지 복제하여 실행하던 위치 다음 줄부터 이어서 진행한다.

*exec() system call : 새 프로그램으로 메모리가 완전히 바뀐다. return X

 

 

2. Resource 할당

- CPU-시간, memory-공간을 할당하는 것

- parent의 resource를 child에게 나눠주어 사용한다.

 

 

3. process 종료

1) exit() system call : return status value, resource release, 프로그램의 끝에 자동 호출

2) parent가 child를 강제 종료

          - child process가 더 이상 필요 없을 때

          - parent가 죽으면 OS가 child를 다 종료시킨다.

3) zombie

- process가 끝났는데 parent process가 wait를 부르지 않아서 OS가 return값을 계속 갖고 있다.

- 해결책 : init process가 주기적으로 wait을 해서 받아치운다.

 

 

4. Communication

1) Interprocess communication (IPC)

- 하나의 server내에서 프로세스 간에 통신

- shared memory

- message passing

 

2) Remote Procedure Calls (RPC)

- client program에서 원격에 있는 특정 함수를 껍데기 함수를 통해 부른다.

*껍데기 함수란 다른 컴퓨터의 특정 함수를 부르기 위한 내 컴퓨터에 있는 네트워킹 코드를 비유적으로 표현한 것이다.

- 상대방 컴퓨터에 있는 함수를 부르면 네트워크를 통해 결과를 받아온다. 

 

 

 

9. Pipe

1. Ordinary Pipe (= Pipe)

- 한 방향

- parent와 child 관계에서만 통신

- process가 죽으면 죽는다.

- pipe(int fd[2])를 통해 번호 두 개를 받아 파이프를 생성한 후, fork()를 하고 parent와 child 서로 다른 번호를 사용

 

 

2. Named Pipe (FIFO)

- 양 방향

- parent-child 관계가 아니어도 가능하지만, 한 기계 내에 있는 프로세스 간에만 가능

- process가 죽어도 사라지지 않는다.

- mkfifo() system call

 

 

'CS > 운영체제' 카테고리의 다른 글

CH4) Threads  (0) 2021.09.12
CH2) Operating System Structure  (0) 2021.09.01
CH1) Introduction  (0) 2021.08.31