시스템 프로그래밍/Operating Systems: Three Easy Pieces

4. The Abstraction: The Process

맛있는김치찜 2020. 10. 10. 23:53

개요

프로세스의 기본 개념에 대해 설명하는 파트이다.

'프로세스''돌아가고 있는 프로그램'으로서 요약할 수 있다.

여기에서 '프로세스'와 '프로그램'의 차이가 궁금할 수 있는데

'프로그램'실행하기 위한 명령어와 여러 데이터가 메모리상에 저장되어 있는 것이다.

이것이 CPU로 올라가고 실행되면 '프로세스'가 되는 것이다.

 

CPU는 한번에 하나의 프로세스만 처리할 수 있다.

이때 프로세스가 CPU를 사용하고 있다고 착각하게 'CPU를 가상화(CPU virtualization)' 하는 것이다. 

이를 위해서는 여러가지 방법이 있는데 가장 많이 쓰는 방법이 '짧은 단위 시간동안 CPU를 번갈아 사용하는 것(time sharing)'이다.

운영체제의 스케쥴링 정책은 여러 기준(나중에 배움)에 의해 어느 프로세스를 어느 시점에 실행할지를 결정하게 된다.

 

 

프로세스의 구성요소

프로세스는 메모리레지스터 요소로 나뉘어 질 수 있는데

1. 메모리는 기계어 명령어를 저장하고 있는 instruction부분과 데이터를 저장하는 data section부분으로 나뉘어지고

2. 레지스터는 현재 수행 위치를 알려주는 program counter(pc)와 프로세스가 사용하는 스택의 위치를 알려주는 stack pointer(sp), CPU가 처리하면서 사용하는 general purpose registers로 나뉘어진다.

 

 

프로세스 API

운영체제는 이 프로세스들을 컨트롤 할 수 있게 여러 API를 제공한다.

1. Create: 프로그램을 실행할 프로세스를 생성한다.

2. Destroy: 프로세스를 강제적으로 없앤다.

3. Wait: 실행 도중에 멈추고 다른 프로세스를 기다리는등 대기하게 한다.

4. Miscellaneous Control: 프로세스를 일시정지 시키고 다시 시작하게 한다. Destroy와 Wait과는 다른 API.

5. Status: 프로세스의 현재 상태를 알려준다.

 

 

프로세스의 생성

OS는 프로그램의 실행을 위해 다음과 같은 과정을 거친다.

1. 프로세스를 메모리에 load한다.

2. 프로그램의 stack을 할당한다.

3. 프로그램이 동적 할당등 상황에 사용할 heap을 할당한다.

4. I/O 설정 등 초기화 작업들을 한다.

5. 보통 main()함수로 불리는 entry point부터 프로그램을 실행한다.

 

 

프로세스의 상태

1. Running: CPU위에서 프로세스가 돌아가고 있는 상태(scheduled).

2. Ready: 돌아갈 준비가 되었지만 OS가 아직 스케쥴링 하지 않아 대기하고 있는 상태(descheduled).

3. Block: I/O작업 등의 이유로 CPU를 사용하지 않는 상태. 이때 OS는 이 프로세스를 CPU에서 내리고 다른 프로세스를 실행하게 된다.

 

 

프로세스 자료구조

OS는 프로세스를 관리하기 위해 process list같은 특별한 자료구조를 가지고 있다.

 

context 구조체가 있는데 이는 정지된 프로세스의 레지스터 상태를 저장하는 역할을 한다.

이후에 배울 context switing에서 그 과정을 볼 수 있을 것이다.

중간의 proc_state 열거형을 보면 위에서 살펴본 Running, Ready(여기서는 runnable), Block(여기서는 sleeping) 말고도 다른 상태들도 있는 것을 볼 수 있다.

이것을 통해 프로세스가 어떤 상태인지 살펴볼 수 있다.