4. The Abstraction: The Process

 

프로세스의 실행 과정

 

소스코드를 컴파일하면 실행파일exe이 나옴 >> 이 exe파일은 디스크에 code와 data부분으로 나눠져서 저장됨 >> 프로그램을 실행하면 디스크에서 메모리로 프로그램이 복사되고, 프로세서는 메모리의 명령어를 cpu의 레지스터로 복사하여 실행된다. 이렇게 프로세서는 주로 메모리와 레지스터로 구성된다.

 

 

프로세스를 쉽게 다룰 수 있게 해주는 api들이 있다. 그 중 새로운 프로세스를 만드는 api Create가 실행되는 과정에 대해 알아보자.

 

1. 디스크에 있던 프로그램 코드를 메모리(address sapce)에 복사한다.

2. 운영체제는 프로세스의 원활한 실행을 위해서 프로세스가 실행 될 때 stack을 할당해준다. 스택은 함수의 실행이 끝나면 소멸되는 지역변수, 함수의 입력값으로 들어오는 매개변수, 함수의 수행이 끝나고 나서 돌아가야 할 곳인 return address를 저장한다.

어떤 프로그램이 실행되면 운영체제는 제일 먼저 main함수를 호출한다. 위의 경우와 마찬가지로 main함수가 어떤 parameter를 입력받는다면 그 역시 미리 스택에 저장되어 있을 것이다.

3. 프로그램의 실행 중 malloc()을 사용하여 heap 영역 안에서 동적으로 메모리를 할당받는다. (메모리를 할당하여 시작주소를 반환)

4. 나머지 초기화 작업을 한다. ex) input / output

5. 운영체제가 어떤프로그램을 main함수를 호출하여 실행한다. 이전까지 cpu는 운영체제가 갖고있던 명령어를 수행하고 있던 것이다. 운영체제는 자신이 갖고있던 cpu에 대한 제어권을 프로세스에게 넘겨준다.

 

 

process는 running program을, processor는 cpu를 말한다. 여기서 프로세스는 실행 중인 프로그램임을 기억하자. 프로그램 자체는 디스크 상에 존재하는 명령어와 정적 데이터의 묶음 덩어리일 뿐, 운영체제가 실행하여 프로그램에 생명을 불어넣는 것이다.

우리는 이러한 여러개의 프로세스를 동시에 실행시키고 싶지만 cpu는 하나이기 때문에 하나의 프로세스만 실행이 가능하다. 비록 하나의 cpu만 존재하더라도 각각의 프로세스마다 자기만의 cpu를 갖고 있다는 환상을 심어주면 어떻게 될까? 이와 같은 행위를 가상화한다고 한다.

일반적인 가상화하는 방법은 하나의 프로세스를 아주 짧은 시간 실행 후 중단시키고 다른 프로세스를 실행하는 작업을 반복하면서 하나의 cpu로 여러 개의 가상 cpu가 존재하는 듯한 환상을 만들어 낸다. 이러한 방법을 시분할 (time sharing)이라 부른다. 하지만 cpu를 공유하기 때문에, 각 프로세스의 성능은 낮아진다.

운영체제는 위와 같은 세 가지 상태를 가질 수 있다. 처음에 프로세스가 만들어지면 그 프로세스는 ready상태를 갖게 되고 운영체제에 의해 선택되면 running이 된다. time sharing에 의해 다른 프로세서가 선택이 되면 다시 ready상태를 갖는다. 

프로세스를 실행하다가 I / O요청을 받게 되면 이러한 명령은 너무 느리기 때문에 명령이 수행될 때 까지 block상태를 갖게 된다. 해당 요청이 끝나면 다시 ready상태로 바뀐다. 

 

운영체제는 list 자료구조를 사용하여 여러가지 프로세스를 관리한다. 예를들어 ready상태를 갖는 프로세스들은 reday processes 리스트에 저장하고, blocked 상태를 갖는 프로세스들은 blocked processes 리스트에 저장한다.

이외에 PCB( Process Control Block )이라는 자료구조가 있다. 이곳에 각각의 프로세스의 모든 정보를 모두 저장한다. 프로세스의 이름이나 스택, 힙은 어느 주소에서 시작하는지 등이 있다.