04-CPU-Intro, 프로세서의 개념
# 시작하며
운영체제는 프로세스(process)라는 핵심적인 개념을 제공한다. 프로세스는 "실행 중인 프로그램"이라고 생각하면 쉽다. 프로그램과 프로세서는 명확히 구분된다. 프로그램은 생명이 없는, 디스크상에 존재하는 명령어와 데이터 묶음일뿐이다. 쉽게 생각하면 우리는 바탕화면에서 파일을 클릭하여 실행한다. 아직 바탕화면에 남아있는 순간은 프로그램이며, 이 프로그램이 실행되는 순간이 프로세서인 것이다. 운영체제는 이렇게 프로그램이 프로세서가 되기 위한 동작을 도와준다.
우리는 게임을 하면서 노래를 듣기도 하며, 코딩을 하면서 인터넷 검색도 한다. 하나 이상의 프로세서가 동작하고 있는 것이다. 이런 프로세서 말고도 우리가 모르는 수많은 프로세서들이 행해지고 있다. 컴퓨터는 동시에 여러 작업을 하는 것 처럼 보인다. 컴퓨터를 사용하는 우리는현재 사용가능한 CPU가 몇개가 있는지 궁금하지 않다. 그냥 실행만 하면 된다. CPU의 개수는 한정적이다. 그러나 CPU의 갯수보다 많은 프로그램을 실행시키는데 운영체제는 우리에게 하여금 무한개의 가까운 CPU가 존재하는 것같은 착각, 즉 환상을 만들어 낸다.
운영체제는 CPU를 가상화(Virtualization)을 하여 이러한 환상을 우리에게 제공한다. 이러한 가상화에는 시분할(time sharing)이라는 기법이 활용된다. 간단히 말해 한 프로세서가 자원을 사용하고 있으면, 다른 프로세서가 자원을 사용하는 기법이다.
그렇다면 이러한 시분할을 어떤 정책(policy)에 맞게 제공하냐에 따라서 성능이 좌우될 것이다.
# 프로세스의 개념
위에서 정리했던 바와 같이 실행중인 프로그램을 프로세스라고 칭한다 했다. 프로세스가 된다는 것은 여러 정보들이 메모리로 이동한다는 것이다. 이러한 명령어들을 실행시키기 위해 프로그램카운터(PC), 스택포인터, 프레임 포인터와 같은 레지스터가 존재한다.
# 프로세스 API
운영체제는 반드시 API로 제공해야하는 기본 기능이 존재한다.
- 생성
- 제거
- 대기
- 각종 제어
- 상태
# 프로그램이 어떻게 프로세스로 변형되는가?
메모리에 올라오기전 프로그램단계의 정보는 디스크(HDD or SDD)에 저장 돼 있다. 이 디스크에는 작성한 프로그램 코드와 정적데이터가 존재하는데 이러한 정보들을 메모리에 탑재시킨다. 메모리에는 프로세스마다의 공간이 있다고 생각하면 된다. 초기 운영체제에서는 디스크에존재하는 데이터들을 모두 메모리에 올렸지만, 현대 컴퓨터들은 프로그램의 용량이 너무나도 커지고 있기 때문에 필요할 때 필요한 부분만 올리도록 하는데, 이걸 알기 위해서는 페이징(Paging)과 스와핑(swapping)을 알아야 한다. 물론 뒷부분에서 알려준다!
운영체제는 메모리에 올라온 프로그램들의 값들을 용도에 맞게끔 사용하기 위해 공간을정리한다. 크게 코드/힙/스택 영역으로 나뉜다. 코드는 그냥 코드들이 올라오기 때문에 생략한다! PC는 이 코드의 주소들에 하나씩 접근하여 명령어를 수행하는 것이다.
### 스택
스택에는 지역 변수, 함수 인자, 리턴 주소등을 저장한다. 운영체제는 main() 함수의 인자인 argc와 argv를 활용하여 스택을 초기화 시킨다. 우리가 터미널에서 ./studyIsFun hello 10 와 같이 실행하면 이걸 인자로 받아서 사용할 수 있었는데 이러한 기능을 말하는 것이다.
### 힙
힙은 동적으로 할당된 데이터를 저장하기 위해 사용된다. malloc()을 호출하여 필요한 공간을 요청 free()로 반환한다.
또 운영체제는 입출력과 관계된 초기화 작업을 수행한다. 파일 디스크립터라는 표준입력(STDIN), 표준 출력(STDOUT), 표준 에러(STDERR)을 갖는다.
## 중간정리
코드와 정적 데이터를 메모리에 탑재 -> 스택과 힙을 생성 및 초기화 -> 입출력 셋업 을 마무리하면
프로그램 실행을 위한 준비를 마친다.
이제 main()을 실행하여 CPU를 새로 생성된 프로세스에게 넘기고 프로그램이 드디어 실행된다!
# 프로세스 상태
프로세스는 실행,준비,대기 3가지 상태로 정의 된다. 해당 개념은 I/O와 같은 interupt가 발생 시 동작을 알아내기 위해 중요하다. 작년에 시스템 소프트웨어교과를 수강하면서 꽤 애를 먹은 기억이 있다.
### 실행
프로세스가 실행중, 동작하는 프로세스의 명령어를 읽으며 실행 중
### 준비
실행할 준비는 돼 있지만 다른 프로세스를 실행하고 있는 등의 이유로 기다리고 있음, 자기의 순번(CPU를 할당)이 오면 즉시 실행 됨
### 대기(Blocked)
다른 사건을 기다리는 동안 중단시키는 중, 현재 상태에서는 순번이 와도 그 다음을 실행 할 수 없다. 예를 들면 디스크의 입출력을 요구하여, 그 결과를 사용해야 하는데 그 결과가 없기 때문에 실행할 수가 없기 때문이다. 이러한 입출력요청이 완료되면 Interupt신호를 보내고 Ready상태로 바뀌게 된다.
위 표에서처럼 두개의 프로세스가 동시 진행 되면 상태에 따라서 어떤 프로세스가 실행될지를 결정 할 수 있다. "대기"상태에서는 어떠한 작업도 할 수 없기 때문에 다음 프로세서에게 CPU을 넘기고, 대기에서 준비로 바뀌면 프로세서를 다시 돌려 받는다. 그러나 이러한 설명은 CPU를 어떻게 스케줄링할지에 따라서 결정 되는 것이다. 초록색 박스친 부분에서처럼 Process1의 실행이 모두 끝난후에 CPU를 돌려 받을 수 있고, 대기->준비 상태로 바뀐 7 시점에서 CPU를 돌려 받을 수 있다. 이러한 결정은 운영체제의 스케줄러에 의해 결정이 된다.
# 자료 구조
위와 같이 프로세스0 -> 프로세스1로 바뀌는 것을 "문맥 교환(context switching)"이라고 표현한다. 운영체제는 프로세스들을 스케줄하기 위해서는 어떤 프로세스가 준비(Ready)상태이고 대기(Blocked)인지 알아야 하기 때문에 프로세스 리스트(process list)와 같은 자료구조를 유지한다.
또한 프로세스 제어 블럭(Process Control Block == PCB)라 불리는 자료구조를 통해서 각 프로세스에 관한 정보를 저장한다. 이 정보에는 레지스터 값( PC, STACKPOINTER ... )들이 있을 것이다.
프로세스간의 문맥교환이 일어났을때, 이러한 PCB의 값을 통해 프로세스가 바뀐것처럼 보인다. 뭐 프로세스가 바뀐다는 표현이 사실은 현재 실행 중이던 PC값 stack pointer값 등등을 PCB에 저장시키고, 실행 할 프로세서의 PCB에 들어있는 값으로 현재 CPU의 레지스터들을 바꿔주는 것이다.
나는 지금 VM단원까지 공부를 마친 상태이지만 거기까지 공부하면서 느낀점은 컴퓨터를 만든 사람은 진짜 천재고, 컴퓨터는 사실 우리를 속이고 있다는 것이다..
'•Compter Science > Operating System' 카테고리의 다른 글
[OS/OSTEP] 08.CPU-sched-mlfq : 멀티 레벨 피드백 큐(MLFQ) #5 (0) | 2022.04.18 |
---|---|
[OS/OSTEP] 07.CPU-sched : CPU 스케줄링 정책(scheduling policy) #4 (0) | 2022.04.18 |
[OS/OSTEP] 06.CPU-mechanisms : 제한적 직접 실행 원리 #3 (0) | 2022.04.18 |
[OS/OSTEP] 05.CPU-API 프로세스 API #2 (0) | 2022.04.17 |
[OS/OSTEP] 운영체제 공부를 시작하며 #0 (0) | 2022.04.17 |