프로세스 (Process)
프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와 작업이 진행된다는 의미이다. 흔히 프로그램이 실행되면 프로세스가 된다는 표현을 하는데 프로그램은 저장장치에 저장되어 있는 정적인 상태, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다.
즉, 프로그램이 실행되면 이것은 프로세스라고 불린다.
프로세스로의 전환
먼저 운영체제는 프로그램을 메모리의 적당한 위치로 가져오며 PCB(Process Control Block)라는 제어 블록을 생성한다. PCB에는 프로세스 실행에 필요한 여러가지 정보가 담겨있는데, 쉽게 이야기 하자면 프로세스는 요리를 만드는 과정이고 PCB는 요리를 만들 때 고려할 사항들을 적어놓은 주문서라고 볼 수 있다.
어떤 프로그램이 프로세스가 되었다는 것은 운영체제로부터 PCB를 받았다는 것을 의미한다.
프로세스의 5가지 상태
- New (생성) : 생성되었지만, 운영체제에 의해 수행 가능한 프로세스 풀로의 진입이 아직 허용되지 않은 프로세스
- Ready(준비) : 기회가 주어지면 수행될 준비가 되어 있는 프로세스
- Running(수행) : 현재 수행 중인 프로세스
- Blocked(블록/대기) : I/O 작업(입출력 연산)완료 등과 같은 이벤트가 발생할 때까지 수행될 수 없는 프로세스
- Exit(종료) : 프로세스 수행이 중지되거나, 어떤 이유로 중단되었기 때문에 프로세스 풀에서 방출된 프로세
디스패처(Dispatcher) 란 ?
디스패처란 프로세스(CPU)를 한 프로세스로부터 다른 프로세스로 교체해주는 프로그램이다.
쉽게 말해, 프로그램이 실행되다 중단되고 다음 프로그램을 실행하게 해주는 프로그램이라 볼 수 있다.
위 사진의 Ready --> Running 단계에서 스케줄러 또는 디스패처가 준비 상태에 있는 프로세스 중 하나를 선택해 실행하게 한다.
PCB(Process Control Block) 란 ?
프로세스 제어 블록(PCB)은 운영체제가 프로세스를 관리하기 위해 필요한 정보들을 담고 있는 자료구조이다.
PCB의 주요 역할은, 수행 프로세스를 인터럽트한 후 나중에 그 인터럽트가 발생되지 않은 것처럼 프로세스 수행을 재개할 수 있도록 충분한 정보를 유지하는 것이다.
즉, 이런 프로세스 정보를 담은 블럭들이 있어 스위칭이 되어도 기억하고 이어서 실행을 할 수 있다.
💡 프로세스 식별자(Process ID)
: 각 프로세스를 다른 모든 프로세스로부터 구별하게 해주는 유일한 식별자
💡 프로세스 상태(Process State)
: New, Ready , Running, Blocked, Exit의 프로세스 상태
💡 프로그램 카운터 (Program Counter)
:프로그램에서 다음에 수행될 명령어의 주소
💡 레지스터 저장 영역
: 누산기, CPU 레지스터, 범용 레지스터 등의 정보
💡 프로세서 스케줄링 정보
: 스케줄링 및 프로세스 우선순위
💡 메모리 포인터
: 프로세스와 연계된 프로그램 코드 및 데이터, 다른 프로세스들과 함께 공유되는 메모리 블록들에 대한 포인터
💡 메모리 관리 정보
: 프로세스 주소공간 정보 저장
💡 입출력 상태 정보
: 미해결 입출력 요청, 프로세스에 할당된 입출력 장치, 프로세스에 의해 사용중인 파일들의 리스트 등
💡 계정 정보
: 프로세서(CPU) 사용 시간, 실제 사용 기간, 계정 번호, 시간 제한
문맥 교환 (Context Switching)
문맥 교환(Context Switch)란 하나의 프로세스로부터 다른 프로세스로 CPU 제어권이 이양되는 과정을 뜻한다. 이러한 과정을 CPU 디스패치라고 하며 어떠한 프로세스가 CPU를 할당받고 실행되는 도중 인터럽트가 발생하면 CPU의 제어권은 운영체제로 넘어가게 되고 타이머 인터럽트 처리 루틴으로 가서 수행 중이던 프로세스의 문맥을 저장하고 새롭게 실행시킬 프로세스에게 CPU를 이양한다.
하나의 프로세스가 이미 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하기 위해 이전 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 적재하는 것이다.
예를 들어, 카카오톡을 켜놓고 유튜브로 노래를 들으면서 웹서핑을 하는 것은 사용자 입장에서 동시에 일어나는 일처럼 보이지만 실제로는 그렇지 않다.
현재 프로세스 A가 CPU를 사용하고 있는 상황에서 CPU 사용시간이 끝나, 다음 프로세스에게 CPU를 넘겨주어야 하는데 스케줄링 알고리즘에 의해 다음 CPU를 받을 프로세스 B가 선택되었고 , 타이머 인터럽트가 발생해 CPU 제어권이 운영체제 커널에 넘어가게 된다.
과정을 살펴보자.
Process P1이 실행되고 있을 때, 인터럽트 또는 시스템 콜이 발생한다.
그러면, PCB1에 P1 프로세스 정보를 저장하고, PCB2의 상태를 불러오며, 이후 Process P2를 실행한다.
그리고 또 인터럽트 또는 시스템 콜이 발생하면 PCB2의 상태를 저장하고 PCB1의 상태를 불러와 프로세스를 실행한다.
참고 자료
https://iingang.github.io/posts/OS-process/