4 minute read

‘혼자 공부하는 컴퓨터구조+운영체제 - 강민철’ 책을 참고하여 작성한 포스트입니다.

프로세스(Process)

실행 중인 프로그램을 프로세스라고 부른다.
프로세스에는 포그라운드 프로세스(foreground process), 백그라운드 프로세스(background process)가 있다.
전자는 사용자가 보는 앞에서 실행되며, 후자는 반대다.
백그라운드 프로세스 중에서도 사용자와 직접 상호작용할 수 없는 프로세스를 데몬(deamon, 유닉스 체계) 혹은 서비스(service, 윈도우)라고 부른다.

프로세스 제어 블록(PCB)

  • CPU 자원은 한정되어 있으므로, 프로세스들은 차례대로 돌아가면서 한정된 시간만큼만 CPU를 이용한다.
  • 시간이 끝났음을 알리는 인터럽트(타이머 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
    • 타이버 인터럽트는 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트이다. 타입아웃 인터럽트라고도 부른다.
  • 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하는데, 이를 위해 프로세스 제어 블록(PCB, process control block) 을 이용한다.
  • PCB는 프로세스와 관련된 정보를 저장하는 자료 구조이며, 커널 영역에 생성된다.
  • 운영체제는 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단한다.
  • PCB는 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.

프로세스 ID(PID, Process ID)

  • PID는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다.
  • 같은 일을 수행하는 프로그램이어도 PID는 다르다.

레지스터 값

  • 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다.
  • PCB 안에는 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.

프로세스 상태

  • CPU를 사용하기 위해 기다리고 있는 상태인지, 아니면 CPU를 이용하고 있는 상태인지 등의 프로세스 상태 정보가 PCB에 저장된다.

CPU 스케줄링 정보

  • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보가 PCB에 기록된다.

메모리 관리 정보

  • PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 담긴다.
  • 베이스 레지스터, 한계 레지스터 값과 같은 정보들도 담기며, 페이지 테이블 정보도 담긴다.
    (나중에 추가 포스트)

사용한 파일과 입출력장치 목록

  • 프로세스가 실행 과정에서 특정 입출력장치나 파일을 이용하면 PCB에 해당 내용이 명시된다.
  • 즉, 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다.

문맥 교환

하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥(context) 이라고 한다.

  • 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다. PCB에 기록되는 정보들을 문맥이라 봐도 무방하다.

기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 **문맥 교환(context switching)** 이라고 한다.

  • 문맥 교환이 빠르게 일어나므로 프로세스들이 동시에 실행되는 것처럼 보인다.
  • 하지만 너무 자주 문맥 교환이 일어나면 오버헤드가 발생할 수 있기 때문에 자주 일어난다고 반드시 좋은 것은 아니다.

오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.
예를 들어 A라는 처리를 단순하게 실행한다면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 된다.

프로세스의 메모리 영역

하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

코드 영역(code segment)

  • 텍스트 영역(text segment)이라고도 불린다.
  • 실행하는 프로그램의 코드, 즉 기계어로 이루어진 명령어가 저장된다. 데이터가 아닌 CPU가 실행할 명령어가 담겨 있으므로 쓰기가 금지된 읽기 전용(read-only) 공간이다.

데이터 영역(data segment)

  • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간.
  • 리터럴, 전역 변수(global variable) 등이 저장된다.

코드 영역과 데이터 영역은 프로세스 실행동안 크기가 유지된다. 그래서 정적 할당 영역 이라고도 부른다.
반면 힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역이어서 동적 할당 영역 이라고도 부른다.

힙 영역(heap segment)

  • 프로그래머가 직접 할당할 수 있는 저장 공간.
  • 한번 할당하고 나면 언젠가는 해당 공간을 반환해야 한다.
  • 그렇지 않으면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래하며 이를 메모리 누수(memory leak) 라고 한다.

스택 영역(stack segment)

  • 데이터를 일시적으로 저장하는 공간이다.
  • 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수 등이 들어간다.
  • 현재 프로세스의 흐름을 저장한다고 볼 수 있다!
  • 스택의 용량은 윈도우 기준 1MB이나 컴파일러로 조정 가능하다.

일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.
그래야 데이터가 쌓여도 주소가 겹치지 않겠지

프로세스 상태

프로세스가 가질 수 있는 대표적인 상태는 1. 생성 상태, 2. 준비 상태, 3. 실행 상태, 4. 대기 상태, 5. 종료 상태 가 있다.

생성 상태(new)

  • 막 메모리에 적재되어 PCB를 할당받은 상태
  • 준비가 완료된 프로세스는 준비 상태가 되어 CPU의 할당을 기다린다.

준비 상태(ready)

  • CPU를 할당 받기를 기다리는 상태.
  • 준비 상태 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch) 라고 한다.

실행 상태(running)

  • CPU를 할당 받아 실행 중인 상태.
  • 일정 시간 동안만 CPU 사용 가능하다.
  • 할당된 시간을 모두 사용하면(타이머 인터럽트 발생) 준비 상태로 돌아간다.
  • 입출력 장치를 사용하여 작업을 기다려야 한다면 대기 상태가 된다.

대기 상태(blocked)

  • 특정 이벤트가 일어나길 기다리는 상태
  • 대부분은 입출력 작업을 기다린다.
  • 입출력 작업이 완료되면 다시 준비 상태로 들어간다.

종료 상태(terminated)

  • 프로세스가 종료된 상태.
  • 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

프로세스 상태 다이어그램 은 프로세스 상태를 도표로 정리한 것

프로세스 계층 구조

  • 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
  • 이 때 시스템 호출을 한 프로세스는 부모 프로세스(parent process), 새로 생성된 프로세스를 자식 프로세스(child process)라고 한다.
  • 서로 각기 다른 PID를 가진다. 자식 프로세스의 PCB에 부모 프로세스의 PID를 PPID(parent PID)로 기록하기도 한다.
  • 이렇게 생성되는 프로세스의 부모 자식 관계를 트리로 구조로 표현한 것을 프로세스 계층 구조 라고 한다.

프로세스 생성 기법

  • 자식 프로세스들은 복제와 옷 갈아입기 를 통해 실행된다.
  • 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고,
    • 복사된 자식 프로세스여도 PID 값이나 저장된 메모리 위치는 다르다.
  • 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 새로운 프로그램으로 교체한다.
  • forkexec은 프로세스 관리를 하는 시스템 호출 중 하나이다.
  • 만약 exec를 호출하지 않으면 부모와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.



프로세스는 실행 중인 프로그램이다.
운영체제는 PCB를 통해 여러 프로세스를 관리한다.
프로세스 간에 실행을 전환하는 것을 문맥 교환이라 한다.
프로세스 사용자 영역에는 코드, 데이터, 스택, 힙 영역으로 나누어 배치된다.
프로세스 상태에는 생성, 준비, 실행, 대기, 종료가 있다.
프로세스가 다른 프로세스를 생성한 경우 생성한 프로세스는 부모, 생성된 프로세스는 자식 프로세스이다.
운영체제는 프로세스가 프로세스를 낳는 프로세스 계층 구조로 프로세스들을 관리한다.


예제

c++로 프로세스를 다루는 예제 - 혼공컴운 깃헙

Leave a comment