3장 프로세스의 생성과 소멸



프로세스는 운영체제의 근간

다른 프로그램과 같이 자료구조 + 처리절차로 만들어짐


하드웨어를 직접 사용하는 프로그램(application) 작성시 비효율적

OS는 이런것을 해결하고 사용자가 편리하고 안전하게 프로그램을 개발하고 사용할수 있도록 함

사용자에게 편리하게 쓸수있는 인터페이스를 제공하는 소프트웨어로 생각할수 있다


OS는 application을 실행하기 위해 자원을 관리하고 제공한다

프로세서는 운영체제에 의해 여러개의 application 사이에서 스위칭되며 교대로 실행된다

프로세서가 여러개라면 여러개가 이것을 똑같이 실행한다. 각각 프로세서는 여러 application을 스위칭 해가면서 프로세서의 효율을 높이고 사용자에게 빠른 반응을 하도록 함

이렇게 함으로서 프로세스와 IO디바이스를 효율적으로 사용가능



프로세스 구성요소

1. 프로그램을 구성하는 코드 - 보통 프로그램이라 부르는 이미지

2. 이 프로세서, 코드를 실행하는데 필요한 상태들 - 프로세스로서 관리되어야 할 상태 데이터

이런것을 한꺼번에 모아서 자료구조로 만들게 된다.


실행되고 있는 프로세스는 다음과 같은 상태를 유지한다

identifier - 프로세스 구분

state - 프로세스의 상태

priority - 우선순위

PC 

memory pointers - 프로세스를 구성하는 메모리 덩어리가 어디있는지

context data - 앞서 이야기 함

IO status information - IO 상태가 어떤지, 대기하고 있는것은 어디에 대기하고 있는

accounting information
이런것은 자료구조의 process control block에 저장된다


이 PCB는 프로세스마다 하나씩 가지고 있게 된다

언제든 프로세스가 interrupt 되면 나중에 이 정보를 가지고 다시 필요한 리소스 상태를 복구해서 다시 시작하도록 해준다. 인터럽트가 발생하지 않았던 것처럼

프로그램 실행시 생성, 관리되다가 프로세스가 소멸시 없어짐

이 PCB저장한 공간은 다시 회수되어 다른 프로세스 생성시 사용

장부를 유지함으로서 여러 프로세스가 동시에 도는데 문제 없도록 하는 중요한 자료구조


디스패쳐 - 스위칭해주는 인터럽트 서비스 루틴이 돌면서

A 돌다가 중단 B 돌다가 중단 C 돌다가 중단 ... 중단은 타이머에 의해 interrupt 걸려서 처리가 되고, 돌아가면서 수행되는것처럼 여러 프로세스들을 실행시켜 준다.


 

Trace - instruction 의 sequence가 어떻게 돌아가는지 나열된것

어떻게 프로세서가 프로세스에 할당이 되는지 주소궤적을 보게 될것

dispatcher - 작은 프로그램이다, 프로세서를 프로세서간에 context switching 해주는 프로그램. 다른이름으로 short term scheduler



동시에 돌면서 cpu를 어떻게 차지하는지 보여주는 그림


프로세스는 기본적으로 두 상태를 왔다갔다 한다


생성된 프로세스들이 큐에 쌓여 있다가 dispatch 되고 다시 interrupt를 받으면

큐의 맨 뒤에 가서 기다리고 다음 대기하고 있던 프로세스가 프로세서를 할당받는 과정


프로세스를 생성하는 이유

새 job, 로그온, os 부팅시 각종 서비스를 만들기 위해서, shell이나 GUI에서 명령



우리가 사용하기 위해서 직접 생성하는 - os는 PCB를 만들고 큐에 집어넣게 된다.

프로세스는 그것을 생성하는 프로세스를 parent process

새로 생성된 프로세스를 child p~


프로그램에 HALT inst~ 또는 종료를 알리는 service call 을 부르도록 되어 있다

그러면 프로세스를 더이상 cpu에 할당하지 않고, PCB의 내용을 정리하고 좀비상태에 있다가 없어지게 된다.




(이벤트)io요청시, synchronization 또는 semaphore(결과 올때까지 기다려야함) 프로세스를 블럭 상태로 넣고 기다리도록 함

가장 기본 모델



ready 큐 - 실행할수 있는 프로세스들이 모인 큐

blocked 큐 - 이벤트를 기다리는 큐 (IO디바이스에 대한 큐)

프로세스가 생성되어 PCB 만들어지면 레디 큐 뒤쪽에 쌓인다. 실행중에 timer interrupt 에 의해 timeout 된것은 다시 레디 큐 뒤로, io이벤트 기다리는 것은 event wait 하다가 다시 레디 큐 뒤로. 실행 끝나면 프로세스 종료

이벤트큐가 여러개 존재, 각각 이벤트에 따로 구현되어 있다.


Swapping - 프로세스의 일부분을 메인메모리가 아닌 디스크에 저장하는것

메인메모리 크기가 필요량보다 부족할때, locality가 허용하는 범위 내에서 빼내면 마치 전체가 들어온것처럼 실행가능

만약 Ready state인 프로세스가 메인 메모리에 없거나, 프로세스가 끝나서 종료되서 메인메모리가 남는 상태라면 OS는 블럭된 프로세스중 일부를 디스크로부터 가져와서 ready 상태인 프로세스를 만들어낸다.



suspend state까지 확장한 과정 추가한것



ready 상태를 분류해서 suspend ready를 만든것


이런 상태를 갖는 프로세스들은 PCB에 의해 관리된다

이것들을 관리하는 포인터가 있고, 1개 프로세스마다 PCB 1개씩 연결

유사한것이 파일시스템, 디바이스, 메모리에 테이블이 있어서 관리를 해주도록 한다.

OS를 제어하는 테이블들이고 OS에서 가장 중요한 자료구조



#

메모리 테이블 - 메인메모리와 가상메모리를 관리하는 정보를 담고있다.

메인메모리는 각 프로세스별로 할당되어야 하는데 할당되기 위해서는 전체적인 테이블이 하나 필요, 전체 메모리는 얼마나 있고, 누구에게 할당되었으며 어떻게 사용되고 있는지

그리고 프로세스별 세컨더리 메모리가 사용되는데 그 할당에 대해서도 정보를 담고 있어야

protection은 어떻게 해야 하는지

virtual memory, swapping를 위한 secondary storage 관리


IO Table - IO디바이스 관리를 위한

IO장치들의 상태들

통신을 위해 사용하는 버퍼의 위치들에 대한 정보를 담고 있다.

그리고 주어진 시간에 어느 프로세스에 할당되어 있는지에 대한 정보도 담고 있다.


파일 테이블 - 파일 존재여부

존재한다면 위치, 현재상태, access list같은 attribute등...

프로그램에서 파일에 접근해서 읽고 쓰는 연산을 하기에 필요, 커널과 별개로 file management안에 들어있는 경우도 있고(유닉스) 커널에 있는 경우도 있고



프로세스 테이블 - 프로세스 관리를 위해 유지하는 테이블

이 안에는 메모리나 각종 리소스에 접근할수 있도록 포인터를 가지고 있다.

테이블 자체는 OS전역에서 접근할수 있는 전역변수, 테이블에 접근해서 각 정보를 채워넣는등 프로세스 관리 위해 사용


프로세스 관리 위한 control table에는 프로세스가 어디에 존재하는지 관한 정보와 각종 attribute 저장된다.


PCB - 프로그램 위치정보, 할당받은 양

실행시 stack을 사용해서 procedure call을 했을때 parameter를 전하고 결과값을 돌려받는 연산을 하는데, stack의 위치정보도 들어가있다.

프로그램, 데이터, bss, heap, stack으로 구성되는 메모리 덩어리를 포인팅하는 포인터를 가지고 있다.






process identifier - 프로세스가 unique한 숫자를 갖는다

이 숫자로 OS가 프로세스를 찾을수 있게 이 인덱스 값을 사용

PCB는 보통 배열로 선언되어 고정된 메모리가 각각 할당되고

그 배열 시작점은 인덱스를 가지고 접근할수 있도록 함


다른 테이블에서도 프로세스를 가리키기 위해서 사용한다

메모리 테이블 - 메인메모리가 어느 프로세스에 할당되어 있는지

다른 IO테이블이나 파일 테이블, 동기화를 위한 통신 등에 사용

생성시 parent와 descendent프로세스의 id도 유지하고 있다가 parent프로세스 죽으면 자식 프로세스도 따라 죽도록 한다.



# process의 context의 구성

프로세서 register들

 PSW - 각종 플래그를 달고 있는... 세부정보는 생략




프로세서를 제어하기 위한 정보도 가지고 있다.




# PCB의 역할

운영체제에서 존재하는 자료구조중 가장 중요한것

프로세서관리에 필요한 모든 정보를 담은것

OS안에서 모든 모듈(management)에서 읽고 쓸수있는 자료구조

운영체제의 가장 중요한 state


운영체제 전체에서 접근하기에 디버깅하기 어렵다

간단한 루틴에 의해 PCB가 망가지면 전체 시스템이 망가질수 있다.

한번 고치면 전체 커널에 영향주기에 주의를 해야 함


PCB는 User Mode 에서 고칠수 없고 System Mode에서 고칠수 있다

이것은 프로세서 내의 한 비트로 표현된다



# 프로세스 생성 절차

unique한 프로세스 아이디를 할당, PCB가 저장된 배열 안에서 특정 블럭을 줌

메모리 할당

이 정보들 가지고 PCB초기화

필요한 링크 연결

다른 필요한 자료구조 생성

프로세스 생성시 하는 일은 그것을 관리하는데 필요한 자료구조를 생성하는것 



#

Process Switching은 언제 발생하는가

interrupt

trap - cpu instruction에 의해 발생하는 interrupt, 오류나 예외적 상황에서 발생

supervisor call - os기능 호출시 발생하는 interrupt 

이런 경우 실행중인 프로세스는 cpu를 사용하지 않고, 다른 프로세스에게 넘어가게 된다



#

interrupt vs trap

interrupt - clock io memory falut 같은 외부적 요인에 의해 발생

time slice - 우리가 사용하는 운영체제는 time slice를 해서, 최대 사용시간이 넘어가면 timer interrupt 발생해서 다음 프로세스가 cpu에 dispatch

trap - 프로세스가 실행중 예외나 오류 발생시 생성되는 interrupt

os는 종료시킬지 스위칭할지 결정하게 된다.


process는 interrupt가 pending되지 않으면 다시 fetch cycle로 돌아가서 실행이 계속됨

interrupt signal이 와 있으면 PC를 interrupt handler program의 시작점으로 돌려놓는다 

그렇게 해서 user 모드에서 kernel모드로 스위칭  

그렇게 해서 mode switching이 하드웨어에서 일어나게 된다.



#

context switching

interrupt와 유사

현재 context 저장, 현재 reg 값을 가지고 PCB 업데이트, 이 PCB를 적절한 큐에 집어넣고,  

스케줄러에 의해 다른 프로세스가 선택, 

선택된 프로세스의 상태를 run으로 변경하고, 메모리 관련 자료구조를 update, 각종 reg값을 선택된 프로세스의 PCB내용으로 집어넣는다



#



커널스택이 왜 필요한가?

os가 각 프로세스별로 이미지를 가지고 있는것처럼 운용되려면

커널로 들어갔을때, 함수를 불렀을때, 그 함수들의 parameter local variable을 저장할수 있는 스택이 필요