Ch 4: The Abstraction: The Process

Process 는 운영체제가 유저들에게 제공하는 가장 기본적인 추상화 개념의 하나이다. 프로세스의 의미란 실행중인 프로그램을 말한다. 프로그램 자체는 디스크 안에서 무한정 대기하고 있지만 OS가 해당 명령을 읽어와서 실행하는 방식으로 프로세스를 실행한다. 우리가 사용하는 컴퓨터에는 무수히 많은 프로그램이 실행되고 있는데 어떻게 하나의 프로세서가 이를 가능하게 하는 것일까? 정답은 OS의 CPU의 가상화이다. 하나의 프로그램이 실행 중일 때는 다른 것을 멈추는 방식으로 번갈아 가며 프로그램을 진행시킨다. 이것을 우리는 Time Sharing 이라 부른다. CPU의 가상화를 위해 OS는 저레벨의 개념인 Mechanism 도 필요하고 high-level의 Policy 도 필요하다. 메커니즘의 좋은 예시는 추후에 배우게 될 context switching이다. 폴리시는 운영체제가 의도한 결정을 내리도록 하는 내제된 알고리즘이다. 어떤 프로그램을 실행할지 결정하는 것은 Scheduling policy에 의해 결정된다.

Ch 4.1: The Abstraction: Process

우리가 작동하고 있는 프로그램은 대부분 추상과 과정을 거쳐서 Process 로 탈바꿈 된다. 다른 의미에서 프로세스는 실행과정에서 다양한 것을 조합하여 만들어진 그 자체를 프로세스라고 표현하기도 한다. 그렇다면 프로세스는 어떻게 구성되어 있을까? 이를 이해하기 위해선** Machine State** 프로세스에 주목할 필요가 있다. 실행중에 어떤 내용을 읽고 업데이트를 할지 결정하는 단계이다. 이때 가장 중요한 부분은 당연하게도 Memory이다. 왜냐하면 명령은 메모리에 저장되어 있기 때문이다. 또한 프로그램을 실행함에 있어 지속적인 메모리 접근이 일어난다. 그 다음으로 중요한 것은 register이다, 이 중 Program CounterInstruction Pointer와 같은 특별한 reg가 존재한다. 마지막으로 중요한 것은 지속적인 I/O 접근을 통해 파일을 여닫을 수 있는 것이 필요하다.

Ch 4.2: Process API

API란 App과 OS간의 통신을 쉽게하는 연결 Interface이다. 그 목록에는

  • Create: 새로운 프로세스를 생성하는 것
  • Destroy: 실행 중인 프로세스를 삭제하는 것
  • Wait: 하나의 프로세스를 기다리는 것
  • Miscellaneous Control: 잠시 프로세스가 멈춰도록 하는 것
  • Status: 현재 프로세스의 상태를 나타내는 것

Ch 4.3 Process Creation: A Little More detail

어떻게 프로그램이 프로세스로 변환되는가는 아주 중요한 질문이다. 더 나아가서는 어떻게 OS는 프로그램을 실행시키는가. 프로그램을 실행하기 위해선** 1)** 우선 OS는 정적인 데이터나 코드를 메모리에 Load 해야한다. 초기 단계의 프로그램은 disk에 실행가능한 형태로 위치해 있다. 따라서 초기 실행 단계에는 OS가 해당 byte를 읽어와서 메모리에 올리는 것 까지 이다. 최신 OS는 필요할때만 원하는 프로세스를 불러오는 방식으로 작동한다. 이 단계에선 아직 프로그램을 실행하기에 앞서 OS가 사전작업을 해야한다 정도만 기억하자(Paging & Swapping). 프로그램을 실행하기 위해선 2)사전에 stack에 메모리를 할당해줘야 한다. 우리가 C 프로그램을 작성할때 사용하는 변수나, 함수 파라미터, 등의 정보가 여기에 일시적으로 저장된다. ie) argc, argv. 3)이 외에도 heap에 메모리를 할당하기도 한다. heap 메모리는 우리가 malloc을 사용하여 동적 할당된 메모리가 저장되는 곳이다. 이 밖에도 Linkedlist와 같은 자료구조를 제공하기 위해 사용한다. 4) I/O를 위한 사전 작업도 필요하다. 예를 들어 UNIX 운영체제에서 3가지의 file descriptor가 존재하는데 이는 각각 STDIN, STDOUT, STDERR를 위해 사용된다. 이 모든 과정이 끝나고 main()의 첫 지점으로 가게 되면 프로그램 실행의 모든 사전준비가 끝나고 이제 CPU의 영역으로 넘어가게 된다.

Ch 4.4 Process States

프로세스에는 3가지 상태가 존재한다.

  • Running: 실행 중인 프로세스는 running이라 표현되며 이때는 명령을 실행하고 있는 상태이다.
  • Ready: 실행하기 위해 준비된 상태이나 OS에 의해 멈춰있는 상태이다.
  • Blocked: 다른 일을 처리하고 있어 실행이 불가능한 상태이다 예시에는 I/O request를 처리 중인 프로세스가 있다

alt_text

해당 그래프를 보면 알 수 있듯이 프로세스는 Running과 Ready를 번갈아가며 실행된다. 이는 OS의 Scheduling에 의한 것이다.

alt_text

Ch 4.5 Data Structures

OS 또한 하나의 프로그램 이기에 중요한 DS를 내포하고 있다. 먼저 대기중인 프로세스와 실행중인 프로세스를 확인하기 위한 Process List가있다. 이 리스트 안에선 여러가지 내용을 track 하는데 메모리 크기 프로세스 id 등을 추적한다. 그 중 중요한 것은 register context 인데 context switching 이 발생할때 마다 그 때의 register를 여기에 기록해서 추후에 다시 불러와서 사용할 수 있도록 한다.

alt_text