떠도는..개발자 취준생

운영체제 : Process(1) 본문

운영체제

운영체제 : Process(1)

iamjaewhan 2021. 10. 13. 22:13

Process

 프로그램을 실행은 디스크에 저장된 프로그램을 메모리에 로드하고, CPU는 메모리에 로드된 프로그램(명령어, 데이터)를 CPU 레지스터로 가져와 연산을 수행하는 것이다. 이처럼 디스크에 저장된 명령어와 데이터는 프로그램이라는 단위로 메모리에 로드되는데, 이처럼 메모리에 로드된 프로그램을 프로세스라고 한다.

 이와 같은 프로세스는 task를 수행하기 위해서 CPU 사용 시간, Memory, Files, I/O Devices와 같은 컴퓨터 자원들을 사용하게 된다. 따라서 OS는 이와 같은 컴퓨터 자원들을 관리해주어야 한다.

 

Memory Layout

 

 

프로세스는 위와 같은 레이아웃으로 메모리 공간을 할당받는다. 크게 명령어를 저장하는 Text와 데이터들을 저장하는 Data, Heap, Stack 공간으로 크게 나눌수 있다.

Text Section : 실행가능한 명령어 코드

Data Section : 프로세스 전반에 사용되는 전역변수가 저장되는 공간

Heap Section : 프로그램이 실행되며 동적으로 할당되는 메모리 공간

Stack Section : 메소드가 실행되며 일시적으로 생성되는 변수에게 할당하는 메모리 공간

 

Process State

 

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

New : 프로세스가 생성된 상태이다.

Ready : 연산을 하기 위해 프로세서(CPU)를 할당받기를 기다리고 있는 상태이다.

Running : 프로세서(CPU)를 할당받아 명령어를 실행(연산수행)하는 상태이다.

Waiting : event가 발생하기를 기다리고있는 상태이다. event의 예로는 입출력의 완료 등이 있다.

Terminated : 프로세스 실행이 종료된 상태이다.

 

 

PCB : Process Control Block

 프로세스는 운영체제에게 PCB 형태로 나타난다. PCB는 프로세스가 필요한 모든 정보를 저장하는 구조체이다. 프로세스에 관하여 관리가 필요한 정보들을 포함하는 운영체제 커널영역의 자료구조이다. 프로세스 ID와 상태, 프로세스가 다음에 실행할 명령어 주소를 저장하는 Program Counter와 같은 프로세스의 전반적인 정보가 저장되어있다.

 

 

 

Process Scheduling

프로세스 스케쥴링은 여러 프로세스 중에서 다음에 실행되는 프로세스를 결정하고, 프로세서(CPU)를 해당 프로세스에게 할당해주는 과정이다. 프로세스가 생성되고, ready 상태가 되면 프로세스는 ready queue에 놓여 CPU를 할당받기를 기다리게 된다. 이처럼 ready queue나 wait queue에 있는 프로세스들은 PCB형태로 Linked List 자료형으로 저장되게 된다. Process Scheduler는 이러한 queue에서 적절한 PCB에게 CPU를 할당하여 해당 프로세스를 실행시킨다.

Multi Programming

프로세스는 실행 내내 연산만 하지 않는다. 중간중간 입출력 기기를 통해 데이터를 입력받거나 출력등 또한 수행하는데, 이러한 입출력은 시간이 오래 걸릴 수 있다. 만약 한 프로세스가 전부 끝나야 다음 프로세스를 실행할 수 있다고 가정해보자. 그렇다면 한번에 크롬창을 하나만 쓸 수 있는 것처럼 효율성이 매우 떨어질 것이다. 이러한 문제를 해결하는 방법이 멀티프로그래밍이다. 예를 들면 멀티프로그래밍은 입출력을 진행중인 프로세스는 잠시 쉬고 이틈에 다른 프로세스를 처리할 수 있는 것이다. 이처럼 여러개의 프로세스가 CPU 사용 시간을 공유하며 CPU utilization을 극대화하는 것을 멀티프로그래밍이라고 한다. 간단히 말하면 제한된 프로세서(CPU)를 여러개의 프로세스가 짧은 시간동안 번갈아가며 사용하는 것이다.

 

Context Switching

Context는 특정 시점의 PCB에 나타나는 프로세스 정보의 상태이다. 즉, PCB에 저장되는 정보는 프로세스가 실행됨에 따라서 변할수 있는데, 이러한 정보는 CPU를 사용하는 프로세스가 변경될 때 PCB에 저장되게 된다. 

 Context Switching은 멀티프로그래밍에서 Time Sharing시, CPU를 차지하는 프로세스가 변경될 때마다 정지되는 프로세스의 정보들을 PCB에 저장하고, 실행되는 프로세스의 PCB 정보를 바탕으로 프로세스를 실행하고, CPU를 사용하는 프로세스를 변경해주는 것을 말한다. 

 

 

Process creation / termination

프로세스는 또 다른 프로세스를 생성시킬 수 있다. 이때 프로세스를 생성시킨 프로세스는 부모 프로세스(Parent Process), 새로운 프로세스를 자식 프로세스(Child Process)라고 한다. 하지만 이러한 프로세스는 fork()라는 시스템 호출로 생성되고 exec(),exit()이라는 시스템 호출로 프로세스가 실행, 종료된다. 하지만 프로그램은 커널영역으로 진입하여 시스템 호출을 할 수 없으니, 운영체제에서 프로세스를 생성하고 실행, 종료하는 매커니즘을 제공해야 한다. 

2 possibilities for Execution

부모 프로세스가 자녀 프로세스가 생성하면 이 두 프로세스를 실행시키는 방법은 두가지가 있다. 

1. 부모 프로세스는 wait()을 호출하여 대기하고 자녀 프로세스는 exec() 시스템 호출을 호출하여 실행된다. 자녀 프로세스의 실행이 끝나면 부모 프로세스가 실행된다.

2. 부모 프로세스와 자녀 프로세스는 Time sharing을 하며 concurrent하게 실행된다.

2 possibilities of address-space

새로운 프로세스가 생성되는 것은 프로세스가 실행되는 것과 마찬가지로 메모리에 새로운 프로세스를 위한 메모리 영역을 할당 받아야한다. 이 메모리 주소를 할당받는 방법에도 두가지가 있다.

1. 자식 프로세스가 부모 프로세스와 같은 일을 하는 경우, 메모리에 새로운 영역을 할당받지 않고 부모 프로세스의 메모리 영역을 공유한다. 단, PCB만 새로 생성한다.

2. 자식 프로세스가 부모와 다른 일을 하는 경우, 새로운 프로그램을 메모리에 로드하여 프로세스를 위한 메모리 영역을 할당받는다.

 

UNIX 기반 O/S - fork() system call

유닉스 기반 OS에서는 자녀 프로세스를 생성시키는 시스템호출은 fork()이다. fork()를 호출하게 되면 새로운 프로세스가 생성되며 해당 프로세스는 부모 프로세스의 메모리 주소 공간을 그대로 복사하게 된다. fork()로 인해 자녀 프로세스가 생성되면 자녀프로세스, 부모프로세스 모두 호출된 fork() 명령어 다음 코드라인을 실행하게 된다. 단, 자녀 프로세스에서 fork() 명령어를 호출하면 0을 반환하게되고, 부모프로세스에서 fork() 호출의 반환값은 자녀 프로세스의 pid값이 된다. 

 

 

 

 

'운영체제' 카테고리의 다른 글

운영체제 : Introduction & O/S Structure  (0) 2021.09.29