1. 프로세스란?
- 실행중인 프로그램을 프로세스라고 한다.
- OS에서의 프로세스란 작업의 단위를 의미한다.
- 컴퓨터 구조상으로 보면 CPU는 Main Memory에 있는 프로세스만 fetch할 수 있기 때문에 프로그램을 실행하기 위해서는 먼저 Storage(HDD, SSD)에 저장되어 있는 프로그램을 Main memory로 가져와야한다. Fetch하기 전 Main memory에 담긴 프로그램의 실행 정보들을 프로세스라고 한다. 이때 OS는 프로세스를 관리하는 일을 한다
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 스케줄링의 대상이 되는 작업이라는 용어와 거의 같은 의미로 쓰인다.
Wikipedia
1-1. 프로그램? 프로세스?
프로그램이란
- 컴퓨터에서 어떤 작업을 위해 실행할 수 있는 정적인 상태의 파일
- 즉 우리가 이용하는 크롬, 한글, V3 이런 실행파일들은 전부 프로그램이다. 어떤 작업을 하기 위해 코드를 짜놓았지만 실행을 하지 않은 상태 Ex) Chrome.exe
프로세스란
- 프로그램을 실행시켰을 때 컴퓨터에서 실행되고 있는 동적인 상태의 프로그램.(Main memory에 적재 된 상태)
- 운영체제가 프로그램을 실행하는데 필요한 자원(Sourse)를 할당해줘서 실행되고 있는 프로그램
- 이때 Sourse라 함은 CPU time, memory, files, I/O devices를 할당받는다.
- 각각의 프로세스는 Code, Data, Heap, Stack의 구조로 되어있는 독립된 메모리 영역을 할당받는다. 그래서 서로 다른 프로세스끼리는 서로의 변수나 자료구조에 접근할 수 없다.
2. 프로세스의 구성(Memory layout)
프로세스가 운영체제로부터 메모리를 할당받게 되면 위와 같은 구조로 생성된다. 각 계층별 데이터를 주소가 낮은 순서대로 간단하게만 살펴보자.
Text section
- 코드를 실행하기 위해 저장돼 있는 영역. 함수나 반복문이 기계어로 번역되어 저장된다.
- 흔히 코드영역(Code Segment)라고도 한다.
Data section
- 전역으로 선언한 변수들이 Data section에 저장된다.
Heap section
- 메모리를 동적으로 할당했을 때 Heap에 저장된다. (C-malloc / CPP-new)
Stack section
- 함수 안에서 변수 선언, 지역변수를 선언하게 되면 Stack에 저장된다.
2. 프로세스 생명 주기(Process life cycle)
1. fork()라는 syscall을 통해 프로세스를 생성
2. ready queue에 진입해서 CPU할당 받기를 기다림
3. CPU 스케줄링을 통해 CPU를 할당해주게 되면 running 상태로 진입(dispatch)
4-1. process가 할당된 사용 시간을 넘게되면 다시 ready queue로 진입하여 CPU 재할당을 기다림(running > ready)
4-2. I/O(입출력) or Event가 생긴경우 Waiting queue로 넘어가서 대기 후 I/O(입출력) or Event가 종료되면 다시 Ready queue로 진입해서 CPU 재할당을 기다림(running > waiting > ready)
5. running 상태에서 프로세스가 끝날 경우 (c-exit, 함수의 return) terminated 상태로 진입하고 CPU가 할당해준 resourse를 회수함.(running > terminated)
Queueing diagram을 보면서 생명주기를 이해하면 이해가 더 쉬울 것이다.
3. Process Control Block(PCB) / 프로세스 제어 블록
Process Control Block이란 운영체제가 프로세스를 제어하기 위해 정보를 저장하는 구조체이다.
위에서 봤던 Process life cycle을 보면 프로세스의 상태는 계속 변하게 된다. 이때 CPU가 처리하던 프로세스를 다 못 끝냈을 경우 프로세스의 상태는 변하게 되고(Ex. running > ready), 해당 프로세스는 CPU를 반납해야한다. 이때 운영체제는 CPU가 해당 프로세스를 어디까지 진행했는지와 같은 정보를 PCB에 저장하는 것이다. Ready queue에 들어가면 다시 재할당을 받을 텐데 이전에 어디까지 진행했는지를 저장해 놓지 않으면 다시 처음부터 실행해야 하기 때문이다
4. Process Scheduling
스케줄링을 알아보기 전에 먼저 Multiprogramming과 Time sharing(시분할 시스템)에 대해 먼저 알아보자
Multiprogramming이란 CPU 사용량을 극대화 시키기 위해 사용하는 방식이다. CPU는 한번에 하나의 프로세스만 처리할 수 있다. 하지만 CPU의 처리속도는 프로세스가 자원을 이용하는 속도보다 훨씬 빠르다. 이 점을 이용해서 여러개의 프로세르를 동시에 올려 CPU가 입출력 작업의 종료를 대기하는 동안 다른 프로세스를 수행하는 것이다. 위의 waiting부분을 참고하면 될 것같다.
Time sharing이란 CPU를 여러개의 프로세스간 자주 바꿔줘서 실제로 사용자가 보기엔 동시에 실행되는 것처럼 보이게 하는 방법이다. Time sharing을 통해 동시에 실행되는 것처럼 보이지만 한 프로세스에 너무 많은 시간을 할당하게 되면 다른 작업들은 멈춘것 처럼 보이기 때문에 시간 분배를 잘 해야한다. 이 시간분배를 스케줄러를 통해 한다.
Scheduling은 위의 작업을 하기 위해 어떤 시점에 어떤 프로세스에게 자원을 할당할지 결정하는 동작기법이다.
5. Context switch
Process에서 Context란 프로세스가 어떤 상태인지를 의미한다. 하지만 프로세스가 어디까지 실행됐는지 어떤 상태인지를 PCB에 저장하기 때문에 프로세스의 context란 PCB라고 봐도 무방하다. 그래서 Context의 switch라는 것은 현재 프로세스가 사용하고 있는 CPU를 다른 프로세스에게 전달해주는 과정이다. 이 과정에서 현재 프로세스의 context를 저장하고 CPU를 넘겨받은 process의 PCB를 복원하는 과정을 Context switch라고 한다. 아래의 다이어그램과 함께 과정을 살펴보자
프로세스 P0와 P1이 문맥교환하는 Diagram이다.
1. P0실행 중 Interrupt or syscall 발생
2. P0실행 중단. PCB0에 상태를 저장 후 PCB1의 상태를 복원후 P1실행 (P0는 IDEL(유휴)상태 진입)
3. P1 실행 중 Interrupt or syscall 발생
4. P1 실행 중단. PCB1에 상태 저장 후 PCB0의 상태를 복원 후 P0실행 (P1는 IDEL(유휴)상태 진입)
*Context switching이 일어날 때 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소를 참조할 상황이 생기므로 context switching간 캐시클리어 과정을 겪게되고 이 사이에서 캐시 미스가 발생한다
CS 지식을 공부하고 기록하는 개인 공부 블로그입니다. 내용 중 틀린 부분 피드백 혹은 궁금한 점이 있으면 댓글로 남겨주시면 참고 및 답변 달아드리겠습니다🧐
'Computer Science > 운영체제' 카테고리의 다른 글
[OS/운영체제] Thread / 스레드 (1) | 2023.12.22 |
---|---|
[OS/운영체제] 동기 & 비동기 VS 블로킹 & 논블로킹 (1) | 2023.12.18 |
[OS/운영체제] IPC / Inter Process Communication (1) | 2023.12.18 |
[운영체제] Memory layout (0) | 2023.12.14 |
[운영체제] Interrupt란? (1) | 2023.11.12 |