본문 바로가기
컴퓨터 공학/운영체제

Chapter 3. 프로세스 - 1부

by 조엘 2020. 9. 17.

안녕하세요 조엘입니다! 운영체제 3단원에 대해 공부해 보았습니다.

Abraham Silberschatz의 Operating System Concepts 10th edition과 학부 수업을 듣고 정리한 내용입니다. 오개념이 있다면 알려주세요~~

1,2부로 나뉘어 있습니다!

 

<프로세스 개념>

프로세스란 실행 중인 프로그램이다. 프로세스의 현재 활동 상태는 프로그램 카운터의 값, 프로세서 레지스터의 내용으로 나타나게 된다. 

*프로그램: 디스크에 저장된 실행파일로, 수동적인 존재

*프로세스: 다음에 실행할 명령어를 지정하는 프로그램 카운터가 있고, 관련 자원의 집합을 가진 능동적인 존재

*프로그램 카운터(PC): 다음에 실행할 명령어의 주소

 

프로세스의 메모리 배치는 다음과 같다. 

스택 섹션: 함수 호출시 임시 데이터 저장장소(함수 매개변수, 복귀 주소, 지역 변수)

 

힙 섹션: 프로그램 실행 중 동적 할당되는 메모리

 

데이터 섹션: 전역 변수 저장

 

텍스트 섹션: 실행 코드 저장

 

 

 

 

<프로세스 상태>

Process Life Cycle

프로세스는 5가지 중 한 가지의 상태를 갖는다. 

New: 프로세스가 생성 중이다. 

Ready: 프로세스가 처리기에 할당되기를 기다린다. 

Running: 프로세스의 명령어가 실행 중이다. 

Waiting: 프로세스가 어떤 이벤트(I/O, 신호의 수신)이 일어나기를 기다린다. 

Terminated: 프로세스가 종료된다. 

 

<프로세스 제어블록>

각 프로세스는 운영체제에서 프로세스 제어블록(PCB)에 의해 표현된다. PCB에는 약간의 회계 데이터와 함께, 프로세스가 시작/재시작 할 때 필요한 데이터를 저장하게 된다. PCB에는 다음과 같은 정보를 저장한다. 

 

프로그램 카운터: 다음에 실행할 명령어의 주소

CPU 레지스터들: 컴퓨터 구조에 따라 다양하지만, 누산기/인덱스 레지스터/스택 레지스터/범용 레지스터/상태코드 정보가 포함이 된다. 해당 프로세스가 다시 스케줄 될 떄 올바르게 실행하기 위해서 인터럽트 시 필수로 저장해야 한다. 

메모리 관리 정보: Base 레지스터와 Limit 레지스터의 값, 페이지 테이블, 세그먼트 테이블 등의 정보를 포함한다. 

회계 정보: CPU 사용시간, 경과된 실시간, 계정 번호, 잡 또는 프로세스 번호 등을 포함한다.

I/O 상태 정보: 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다. 

 

 

 

<프로세스 스케줄링>

프로세스 스케줄러는 각 코어에서 실행 가능한 프로세스 중 하나를 선택해 실행한다. 

프로세스는 준비 큐에 들어가 Ready 상태로 CPU에서 실행되기를 기다린다. CPU에서 실행 중, 인터럽트 등이 발생하면 프로세스는 대기 큐에 들어가 I/O완료와 같은 특정 이벤트가 발생하기를 기다리게 된다. 해당 요청이 완료된 이후에는 프로세스가 준비 큐에 놓여 다시 CPU에서 실행되기를 기다린다. 

 

프로세스 스케줄링은 다음과 같은 큐잉 다이어그램으로 표현 가능하다. 

 

큐잉 다이어그램

추가적으로 Swapping이라는 방식도 존재하는데 이는 메모리에 프로세스가 너무 많아서, 잠시 메모리에서 프로세스를 제거해 Disk에 저장을 해 놓는 방식이다. (나중에 쓰이겠지 하면서...)

 

현재 메모리에 있는 프로세스의 수를 다중 프로그래밍 정도(Degree of multiprogramming)라고 한다. Swapping을 통해 다중 프로그래밍 정도를 줄일 수 있다. 

 

<문맥 교환(Context Switch)>

Context: 해당 프로세스의 CPU 레지스터의 값, 상태, 메모리 관리 정보 등을 포함한다. 

CPU가 프로세스를 하나씩 실행하는데, 실행 과정 중 프로세스를 갈아 치우기 위해서는 문맥 교환을 해줘야한다. 과정은 다음과 같다. 

문맥 교환이 일어남 - 커널은 과거 프로세스의 문맥을 PCB에 저장한다 - 새로운 프로세스에 저장된 문맥을 복구한다. 

문맥 교환은 순수 오버헤드로, 이 기간 동안 시스템은 생산적인 일을 하지 못하게 된다. 

Context Switch 과정

 

<프로세스 생성>

프로세스가 실행되는 도중, 새로운 프로세스를 여러개 생성 할 수 있다. 

여기서 기존 프로세스는 부모 프로세스, 새롭게 생성된 프로세스를 자식 프로세스라고 한다. 

각 프로세스는 PID로 식별된다. PID가 1인 시스템 프로세스(init)가 모든 사용자 프로세스의 루트 부모역할을 하게 되며, 이는 시스템 부팅시 생성되는 첫 사용자 프로세스이다. 

 

<프로세스 생성 과정>

조금 더 상세하게 프로세스 생성 과정을 살펴보면 다음과 같다. 

자식 프로세스 역시 task를 수행하기 위해서는 자원(CPU시간, 메모리, I/O장치 등)이 필요하다. 

자식 프로세스는 이 자원을 OS로 부터 직접적으로 얻거나, 부모 프로세스가 가진 자원의 일부를 사용할 수 있다. 

부모 프로세스는 초기화 데이터를 자식 프로세스를 생성할 때 넘겨줄 수 있다. 

 

부모 프로세스가 새로운 자식 프로세스를 생성하고, 부모/자식 프로세스를 실행하는데엔 2가지 방법이 있다. 

  1. 부모는 자식과 병행하게 실행을 계속한다. 

  2. 부모는 일부/모든 자식이 실행을 종료할 때 까지 기다린다. 

 

자식 프로세스가 새로운 주소공간이 생기게 되면 2가지 방식으로 해당 주소공간이 활용될 수 있다. 

  1. 자식 프로세스는 부모의 복사본으로써, 부모와 같은 일을 수행할 수 있다. 

  2. 자식 프로세스가 자신의 주소공간에 새로운 프로그램을 적재할 수 있다. 

 

UNIX에서는 fork() 시스템 콜로 자식 프로세스를 생성할 수 있다. 

exec() 시스템 콜로 해당 프로세스의 주소공간에 새로운 프로그램으로 교체할 수 있다. 

wait() 시스템 콜로 부모 프로세스가 실행을 멈추고 자식 프로세스가 종료될 때 까지 기다릴 수 있다. 

 

<프로세스 종료 과정>

프로세스의 마지막 실행 문장을 끝내면, exit() 시스템 콜을 통해 운영체제에 자신의 삭제를 요청한다. (혹은 명시적으로 코드에서 exit() 시스템 콜을 통해 프로세스를 종료시킬 수도 있다.)

종료된 프로세스는 자신을 기다리고 있는 부모 프로세스가 있다면, 부모 프로세스에게 상태값을 반환하게 된다.

프로세스가 종료되면 자원은 OS가 되찾아 간다. 

 

부모 프로세스가 wait() 시스템 콜을 호출하기 전 자식 프로세스가 종료된다면, 해당 자식 프로세스는 좀비 프로세스라고 불리며, 부모 프로세스가 wait() 시스템 콜을 호출하면 정리하게 된다. 

 

근데 만약 부모 프로세스가 wait() 시스템 콜을 아예 호출하지 않은 상태에서 exit() 시스템 콜을 통해 종료된다면, 부모 프로세스를 잃은 자식 프로세스는 고아 프로세스로 불리게 된다. UNIX에서는 init 프로세스가 고아 프로세스의 새로운 부모가 되어 해당 고아 프로세스들을 정리하게 된다. 

Process 생성/종료 과정

 

내용이 많네요.... 2부에서 계속할게요!

반응형

'컴퓨터 공학 > 운영체제' 카테고리의 다른 글

Chapter 5. CPU 스케줄링 - 1부  (0) 2020.10.16
Chapter 4. 스레드와 병행성  (0) 2020.09.17
Chapter 3. 프로세스 - 2부  (0) 2020.09.17
Chapter 2. 운영체제 구조  (0) 2020.09.13
Chapter 1. Introduction  (0) 2020.09.10

댓글