프로세스는 능동, 프로그램은 수동
프로그램은 디스크 상에 존재하며 실행을 위한 명령어와 정적 데이터로 구성되어 있다.
이 명령어와 데이터 묶음을 읽고 실행하여 프로그램에 생명을 불어넣는 것이 운영체제의 역할이다.
적은 개수의 CPU밖에 없더라도, 운영체제는 어떻게 거의 무한대에 가까운 CPU가 있는듯한 환상을 만드는가
운영체제는 CPU를 가상화 하여 이러한 환상을 만들어낸다. 이를 시분할 이라고도 한다.
실제로 컴퓨터는 동시에 수십 수백 개의 프로세스를 실행한다.
메커니즘 VS 정책
운영체제에서 CPU 가상화를 잘 구현하기 위해선 저수준의 도구와 고차원의 지능이 필요하다.
저수준 도구를 "메커니즘" 이라 하며, 운영체제의 지능은 "정책"의 형태로 표현된다.
프로세스 생성방법
앞에서 프로그램은 수동적인 상태로 디스크에 존재한다 했다. 그렇다면 프로그램이 어떻게 프로세스로 바뀔까.
또한, 프로세스의 생성 과정은 어떻게 될까.
1) 운영체제는 디스크에 있는 프로그램의 코드와 static data 를 찾아 메모리에 있는 프로세스의 주소 공간에 load 한다.
프로그램은 디스크(요즘엔 플래시-기반의 SSD)에 실행 파일 형식으로 존재한다. 운영체제는 디스크에 접근해 해당 바이트를 읽어서 메모리의 어딘가에 저장해야 한다. 초기 운영체제는 프로그램 실행 전 코드와 데이터를 모두 메모리에 탑재했다. 그러나, 현대에 와서는 프로그램 실행에 필요한 부분만 메모리에 탑재할 수 있게 되었다. 이는 후에 배울 페이징과 스와핑 기법 덕분이다.
2) 일정량의 메모리를 프로그램의 스택에 할당한다.
3) 운영체제는 스택을 주어진 인자로 초기화한다. (특히, main() 함수의 인자인 argc 와 argv 벡터를 사용해 초기화한다.)
⭐️ 코드와 정적 데이터를 메모리에 탑재하고, 스택과 힙을 생성하고 초기화하고, 입출력 셋ᨦ과 관계된 다른 작업을 마치게 되면, 운영체제는 프로그램 실행을 위한 준비를 마치게 된다. 프로그램의 시작 지점 (entry point), 즉 main()에서부터 프로그램 실행을 시작하는 마지막 작업만이 남는다. main() 루틴으로 분기함으로써 (다음 장에서 이를 가능하게 하는 특수 기법을 설명할 것이다), 운영체제는 CPU를 새로 생성된 프로세스 에게 넘기게 되고 프로그램 실행이 시작된다.
프로세스가 무엇인지, 어떻게 생성되었는지 (대강이라도) 알게 되었으므로, 이제 프로세스의 상태에 대해 알아보자
프로세스 상태를 단순화하면 다음 세가지 상태 중 하나에 존재할 수 있다.
-> 프로세스는 준비 상태와 실행 상태를 운영체제의 정책에 따라 이동한다.
PCB (Process Control Block)
운영체제도 일종의 프로그램이다. 다른 프로그램들과 같이 다양한 정보를 유지하기 위한 자료구조를 가지고 있다. 프로세스 리스트가 그 중 첫번째이다.