1. 프로세스란?
- 수행 중인 프로그램
- 커널에 등록되어 있다는 것을 모두 합친 뜻
- 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재
- 시스템의 입장에서 일거리 하나하나 = 프로세스
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고있는데, 실제로는 스레드 단위로 스케줄링
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불림.
1.1. 프로세스 제어 블록 PCB (Process Control Block) 란?
- 프로세스 제어 블록(PCB)은 운영체제가 프로세스를 관리하기 위해 필요한 정보들을 담고있는 자료구조(데이터구조)
- PCB의 주요 역할 = 수행 프로세스를 인터럽트한 후, 나중에 그 인터럽트가 발생되지 않은 것처럼 프로세스 수행을 재개할 수 있도록 충분한 정보를 유지하는 것
- PCB는 각 프로세스마다 유지되며, 해당 프로세스의 상태 정보와 제어 정보를 저장
- 프로세스가 생성되면 운영체제는 PCB를 할당하고, 프로세스가 종료되면 해당 PCB를 해제한다.
- 프로그램이 실행되면 프로세스의 정보를 저장하는 별도의 공간이 따로 생기게 됨
- 운영체제의 커널(Kernel) 또한 하나의 프로그램이므로, 프로세스와 같이 정보를 저장할 수 있는 공간(stack, data, heap ...)이 생긴다.
- 이때, 커널의 데이터(Data) 영역에서는 각종 자원을 관리하기 위해서 PCB라는 공간을 둔다.
- PCB에 대한 작업은 매우 빈번해서, 기본적으로 메모리에 저장시킴
- 어떤 정보들을 저장하나?
- 프로세스 번호(PID), 프로세스 상태, 프로세스 우선순위(스케줄링할 때 사용), 프로그램 카운터 값, 메모리 포인터, 문맥 데이터, 할당받은 자원들에 대한 목록, 계정 정보(CPU 사용한 시간 등의 정보), 입출력 정보 등등
- 대부분의 OS에 들어가는 PCB이지만 OS에 따라 첨삭 가능
- 어떤 정보들을 저장하나?
- 운영체제가 프로세스를 관리한다는 것 == 해당 PCB에 대한 다양한 행동을 한다는 것
+ 스케줄링? (다음 장에서 더 자세한 설명…)
CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개면?
-> CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다.
스케줄링(Scheduling)
- CPU 할당 순서 및 방법을 결정하는 일. (어떤 프로세스를 running 상태로 보낼까?)
- 일정한 기준 : scheduling algorithm 을 통해서.
1.2. 프로세스 상태와 변화
- 생성(Create) 상태
- 사용자가 요청한 작업이 커널에 등록
- PCB가 만들어져 프로세스가 만들어진 다음, 준비나 보류 준비 상태로 되기 위해 잠시 거치는 상태
- OS는 프로세스를 생성한 후 메모리 공간을 검사해서
- if 충분한공간 ⇒ 메모리 할당하며 준비상태로 바꿈
- else ⇒ 보류 준비 상태로
- 준비(Ready) 상태
- CPU를 할당받기 위해 기다리고 있는 상태
- CPU만 주어지면 바로 실행할 준비가 되어있는 상태
- in 다중 프로그래밍 시스템 → 준비 상태의 여러 프로세스들은 메모리에 적재되어 있으며, CPU를 할당받기를 기다리고 있음
- 이들을 위해 큐(또는 리스트)가 사용됨
- 순서에 따라 CPU를 할당받으면 실행 상태가 되는데, 이때 순서를 정하는 것을 CPU 스케줄링이라 부름
- 실행(Running) 상태
- CPU를 할당받아 실행 중인 상태 (= 코드를 실행하는 상태)
- 이때 CPU를 할당 하는 것을 디스패치(Dispatch)라 부름
- in 단일 CPU 시스템 → 오직 한 개의 프로세스만이 CPU를 사용할 수 있기 때문에, 한 프로세스만이 실행상태에 있을 수 있음
- ↔ 여러 개의 CPU가 있는 시스템 → 동시에 여러 개의 프로세스가 실행 상태에 있을 수 있음 == 다중처리
- 실행 상태의 프로세스는 CPU 스케줄링 정책에 의해, CPU를 뺏길 수 있으며, 그러면 준비 상태로 바뀌게 됨
- 시간 할당량(Time Quantum)이 소진되어 뺏길 때 == 시간 종료(Timeout) ⇒ 이 경우도 인터럽트가 동원되어 처리될 것임
- 실행 상태의 프로세스가 입출력이 필요해서 시스템 호출을 하면, I/O 처리의 종료를 기다리며 대기 상태로 바뀌게 됨, CPU는 바로 준비 상태의 프로세스들 중에서 하나를 선택해 실행해 줄 것임
- CPU를 할당받아 실행 중인 상태 (= 코드를 실행하는 상태)
- 대기(Blocked) 상태
- 프로세스를 처리중에 대기해야 하는 이벤트가 발생해서 프로세스가 잠시 멈춘 상태
- 프로세스가 실행되다가 I/O 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고, 요청한 일이 완료되기를 기다리며 대기하는 상태
- 얘도 관리를 위해 큐(또는 리스트)가 사용됨
- 요청한 일이 완료되면, 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐에 들어감
- 완료됨은 인터럽트가 알려줌
- 이 상태에서는 CPU를 사용하지 않음. 특정 자원을 사용할 수 있을 때까지 실행을 멈추고, 다시 대기열(Ready Queue)로 들어가게 되며, 프로세스 처리 가능 상태가 되면 실행 상태로 변경
- 보류 준비(Suspended Ready) 상태, 보류 대기(Suspended Blocked) 상태
- in 생성 상태 , 프로세스의 메모리 공간 검사해서
- if 충분 → 준비상태 / else → 보류준비상태
- 보류 상태는 메모리에 올라와있지 않음
- 종료(Terminated) 상태
- 프로세스가 종료될 때 잠시 거치는 상태
- 모든 자원들이 회수되고 PCB만 커널에 남아있는 상태
- 운영체제가 시스템에 남겨져 있는 이 프로세스의 흔적들을 최종 정리 후 PCB를 삭제하면 프로세스가 완전히 사라지게 됨
- 할당된 자원이 해제되고, 프로세스의 메모리 공간은 운영체제에 반환됨
- 활성(Active) 상태
- 실행될 프로그램과 데이터 등을 위해 메모리 공간의 일정량을 부여받았음을 의미
- 다중 프로그래밍(의 개수 또는 정도)에 포함되는 프로세스들인거임
- 보류(Suspension) 상태
- 메모리가 부족하거나 다른 이유로 시스템은 활성 상태의 프로세스로부터 메모리를 회수하는 경우
- Swapping == 메모리와 디스크 사이의 입출력
- 프로세스가 메모리 공간을 뺏기고 디스크로 나가야 하는 것 ⇒ Swapped Out
- 나중에 다시 메모리로 들어오면 ⇒ Swapped In
- 보류 상태의 필요
- 일차적인 이유 : 메모리 공간의 확보
- 다른 이유? : 실행되는 프로세스의 현재 결과가 바라던 것이 아닌 오류가 보일 때, 시스템에 위해를 가할 수 있는 수상한 행동을 보일 때, 주기적인 일이라서 다음 주기의 실행 때까지 메모리를 회수해도 문제되지 않을 때 등
5.1. 보류 준비 상태
- 생성된 프로세스가 바로 메모리를 받지 못할 때, 준비 또는 실행 상태에서 메모리를 잃게 될 때 필요함
- 실행 상태의 프로세스가 CPU를 반납하면서 준비 상태로 바뀔 때 메모리 공간까지 잃어야 하는 경우라면 보류 준비 상태로 바뀌게(Suspended) 됨
- 구체적인 상황
- 충분한 메모리 공간의 확보를 위해 준비 상태의 프로세스를 보류시킬 수밖에 없는 경우
- 높은 우선순위의 보류 대기 상태 프로세스가 준비 상태가 되면서 실행 상태의 프로세스로부터 CPU를 뺏기는 경우 등
- 구체적인 상황
- 보류 준비 상태의 프로세스는 메모리의 여유가 생기거나, 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 보류 대기로 만듦
- 그리고 메모리 공간이 확보되면 준비 상태로 바뀌게(Resume) 됨
- 이때 스와핑이 있게 됨
5.2. 보류 대기 상태
- 대기 상태일 때 메모리 공간을 잃은 상태
- 준비 상태의 프로세스가 있었다고 하더라도 메모리의 여유 공간을 더 확보하기 위해서 보류 대기 상태가 되기도 함
- 특별한 경우가 아니면 입출력이나 기다리던 이벤트 종료시 보류 준비 상태가 됨
2. 문맥교환(Context Switching)
| Context
- 프로세스와 관련된 정보들의 집합
- process가 사용되고 있는 상태
- 이 상태는 모두 PCB에 저장되어 있다. 따라서, PCB 정보를 'context'라 함.
| Context switching
- 실행 중인 프로세스의 context를 저장하고, 앞으로 실행할 프로세스의 context를 복구하는 일 (커널의 개입으로 이루어짐)
- 하나의 프로세스가 CPU를 사용 중인 상태에서, 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)을 보관하고 새로운 프로세스의 상태를 적재하는 작업
- 현재 CPU를 사용중인 프로세스의 CPU 제어권이 다른 프로세스로 이양되는 과정
- Context switching이 자주 일어나게 되면, OS의 성능에 큰 영향을 준다 (CPU가 여러 프로세스들 자주 옮기면 안 좋음)
- 한 프로세스의 문맥은 그 프로세스의 PCB에 기록되어 있음
컴퓨터에는 여러 프로세스들이 실행되고 있습니다.
카카오톡을 켜놓고 유튜브로 노래를 들으면서 웹서핑을 하는 것은 사용자 입장에서 동시에 일어나는 일처럼 보이지만 실제로는 그렇지 않습니다.
각 프로세스가 일을 처리하기 위해서는 아주 짧은 시간에 CPU를 할당받아 일을 처리합니다.
위에서처럼 여러 프로세스가 존재하는 경우, 각 프로세스는 CPU를 차지하기 위해 서로 경쟁하며 아주 짧은 시간 동안 CPU의 제어권이 바뀝니다.
현재 프로세스 A가 CPU를 사용하고 있는 상황에서, CPU 사용시간이 끝나 다음 프로세스에게 CPU를 넘겨주어야 합니다.
스케줄링 알고리즘에 의해 다음 CPU를 받을 프로세스 B가 선택되었으며, 타이머 인터럽트가 발생해 CPU의 제어권을 운영체제에게 넘어가게 됩니다.
이 과정에서 운영체제는 타이머 인터럽트 처리 루틴으로 가서, 직전까지 수행중이던 프로세스 A의 문맥(프로그램 카운터 등)을 자신의 PCB에 저장하고 프로세스 B는 예전에 저장했던 자신의 문맥을 PCB로부터 실제 하드웨어로 복원 시키는 과정을 거치게 됩니다.
또한 프로세스가 봉쇄 상태인 경우에도 문맥교환이 발생하는데,
프로세스가 CPU를 사용하다 I/O 작업을 하게 되는 경우 CPU를 사용하지 않게 됩니다.
이런 경우 CPU낭비가 되기 때문에 다른 프로세스에게 CPU를 이양 합니다.
| Context switch Overhead
- context switchin에 소요되는 비용
- 문맥교환에 필요한 시간, 메모리 등
- 불필요한 context switching을 줄이는 것이 컴퓨터 성능 향상을 위해 중요함 → 이를 해결하기 위한 방법으로 스레드(Thread) 사용 등이 있음
문맥교환이 아닌 경우
프로세스가 실행 상태일 때,
시스템 콜이나 인터럽트가 발생하면 CPU의 제어권이 운영체제에게로 넘어와 원래 실행중이던 프로세스의 업무를 잠시 멈추고 운영 체제 커널의 코드가 실행됩니다.
이 경우에 CPU의 실행 위치 등 프로세스의 문맥 중 일부를 PCB에 저장하게 되지만, 이러한 과정을 문맥 교환이라고 하지 않습니다.
이는 하나의 프로세스가 사용자 모드에서 실행되다가 커널모드로 실행 모드만 바뀌는 것일 뿐, CPU를 점유하는 프로세스가 다른 사용자 프로세스로 변경되는 과정이 아니기 때문입니다.
즉, 사용자 모드에서 커널 모드로 바뀌어 시스템 콜이나 인터럽트 처리를 하고, 다시 동일한 프로세스의 사용자 모드로 되돌아와 이전에 수행하던 작업을 계속 수행할 뿐입니다.
이와 같은 모드 변경에 비해 문맥 교환에는 훨씬 많은 오버헤드가 발생합니다.
- 문맥 교환이 일어나는 경우
- 타이머 인터럽트가 발생
- 프로세스가 I/O 요청 시스템을 하여 봉쇄 상태에 들어가는 경우
그 밖의 인터럽트나 시스템 콜 발생시 : 문맥 교환이 일어나지 않고 모드만 변경
< 참고 >
- https://blockdmask.tistory.com/22https://velog.io/@combi_jihoon/운영체제-프로세스Process란https://dapsu-startup.tistory.com/entry/운영체제Operating-System-프로세스-관리https://kosaf04pyh.tistory.com/195
- https://j-su2.tistory.com/63
- https://louis-j.tistory.com/entry/운영체제OS-프로세스Process
- https://80000coding.oopy.io/f13cd958-6bc5-4f11-81a8-20e86761d800
- https://iingang.github.io/posts/OS-process/#프로세스-process-란
- https://jerryjerryjerry.tistory.com/178
'전공수업' 카테고리의 다른 글
[클라우드시스템 - 모두를 위한 클라우드 컴퓨팅] 연습문제 풀이 Ch.3 - HTC (0) | 2024.12.01 |
---|---|
[클라우드시스템 - 모두를 위한 클라우드 컴퓨팅] 연습문제 풀이 Ch.2 - 클라우드컴퓨팅 역사와 모델 (0) | 2024.11.30 |
[클라우드시스템 -모두를 위한 클라우드 컴퓨팅] 연습문제 풀이 Ch.1 - 클라우드 컴퓨팅 개념 (0) | 2024.11.29 |
[운영체제] 실시간 스케줄링, EDF deadline 겹칠 때 (0) | 2024.04.30 |
[운영체제] 부팅, 레지스터, Instruction, 인터럽트 (2) | 2024.04.03 |