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 |