본문 바로가기

프로그래밍/CS

[study] 프로세스 (Process)

프로세스(Process)란?

프로세스는 '컴퓨터에서 실행 중인 프로그램'을 의미하며,

프로그램이란 '저장공간에 있는 코드와 리소스들이 집합된 파일'을 말한다.

따라서 이 프로그램을 실행하면 메모리에 올라가 프로세스로서 동작되는 것이다.

 

옛날의 컴퓨터에서는 프로세스가 하나만 실행가능 했으나,

컴퓨터가 발전하여 멀티프로세싱(멀티태스킹)을 이용해 여러개의 프로세스를 띄울 수 있게 되었다.

 

모든 프로세스는 부모와 자식의 관계를 가지는데,

A프로세스가 B프로세스를 생성한다면, B 프로세스의 부모는 A 프로세스가 되고,

A 프로세스의 자식은 B 프로세스가 되는 관계를 가진다.

추후 게시물에서 다룰 'fork()'가 이러한 자식 프로세스를 생성하는 함수이다.

 

 

Process는 Operation System (운영체제 시스템) 으로부터 메모리 공간을 할당받고,

프로세스 당 4GB의 크기를 가지고 있다. (전부 메모리에 올려 사용하는 것이 자원낭비이므로,

가상 메모리 방식을 이용해서 필요한 부분만 부분적으로 사용하는 방식을 취한다.)

 

4GB 중, 1GB는 Kernel이 가지고 있는 Kernel Space로 사용하고,

3GB는 User가 사용하는 User Space로 사용한다.

 

이 User Space를 자세히 살펴보면,

Text (= Code) 영역은 실행할 프로그램의 코드가 저장되며, CPU가 이 영역에서 명령어를 하나씩 가져와 처리한다.

Data 영역은 '전역변수'와 '정적변수'가 저장되며, 프로그램이 시작될 때 할당되고 종료시 소멸된다.

Stack 영역은 '지연변수', '매개변수 (인자)', '반환값 (return)'  등 잠시 사용되고 사라지는 데이터를 저장한다.

함수 호출 시 할당되고 반환 시에 소멸된다. 컴파일을 할 때 이 영역의 크기가 결정된다.

Heap 영역은 동적 데이터 영역으로, 메모리 주소 값에 의해서만 참조되고 사용된다.

프로그램 동작 시 크기가 결정이 되며 malloc과 같은 동적할당 함수를 통해 할당된 메모리가 여기에 저장된다.


 

또한, 프로세스는 5가지 상태 중 하나를 가지는데, 다음과 같다.

- 생성 (create) : 프로세스가 생성되는 중인 상태

- 실행 (running) : 프로세스가 프로세서를 차지하여 명령어들이 실행되는 상태

- 준비 (ready) : 프로세스가 프로세서를 사용하고 있지는 않지만, 언제든지 사용가능한 상태, CPU 할당을 기다림.

- 대기 (waiting) : 프로세스가 입출력 완료한 상태, 시그널을 받거나 어떤 사건을 기다리는 상태

- 종료 (terminated) : 프로세스의 실행이 종료된 상태

 

그리고 한 CPU는 프로세스를 동시에 실행시킬 수가 없으므로,

프로세스들 간 어떤 게 다음에 실행되는지를 CPU Scheduler를 통해 결정하는데,

이를 프로세스 스케줄링(Process Scheduling)이라 하며 일정한 기준으로 순서를 정해 실행시킨다.

 

가볍게 스케줄링들을 살펴보면,

크게 선점 비선점 방식으로 나뉘고,

'선점'은 운영체제가 프로세스에 할당된 CPU를 자체적으로 판단해 뺏어와 다음으로 넘길 수 있는 방식이며, 

'비선점'은 프로세스가 대기 상태에 들어가거나 종료되지 않으면 전환이 일어나지 않는 방식이다.

(선점이라는 말이 운영체제의 입장에서 운영체제가 프로세스 전환 권한을 선점했다는 뜻에 가깝다.)

 

FCFS 스케줄링 : 먼저 요청한 프로세스가 먼저 배정 (비선점)

SJF 스케줄링 : CPU 한차례 사용시간이 작은 프로세스부터 먼저 끝내는 방식 (선점 + 비선점)

우선순위 스케줄링 : 각 프로세스들마다 배정된 우선순위를 바탕으로 실행 (비선점)

Round Robin 스케줄링 : 정해진 시간 단위로만 프로세스가 실행되고 다음으로 넘어가는 방식 (선점)

 

이러한 스케줄링 알고리즘들이 있다. 


 

그리고 위에서도 말했듯이, 가상 메모리를 통해서 자원낭비를 줄이는데,

실제 메모리와 이 가상 메모리를 연결하는 방법은 'MMU'를 이용하는 것이다.

 

MMU (Memory Management Unit)

가상메모리는 한정적인 메모리의 공간을 위해 만들어졌고, 그 가상메모리의 논리 주소로부터

실제 데이터가 담겨 있는 물리 주소로 접근하기 위한 빠른 주소 변환을 해주는 하드웨어이다.

프로그램을 메모리로 가져오고, 배치하며, 메모리가 꽉차면 프로세스를 재배치하는 역할을 한다.

CPU -----virtual address-----> MMU -----physical address-----> Memory

 

페이징 (Paging)

가상 메모리의 주소 공간은 '페이지'라는 일정한 크기로 분할되어 있다.

이 '페이지'라는 단위로 가상주소와 물리주소 공간을 매칭하여 관리하며, 페이지 번호를 기반으로 매핑한다.

 

그때 어떤 페이지가 실제 물리 메모리에 존재하지 않는다면, 인터럽트가 발생하고 운영체제가 해당 페이지를

물리 메모리에 올리는 과정을 거친다. 이를 '페이지 폴트'(page fault) 라 한다.

 

만약, 위의 페이지 폴트 상황이라 해당 페이지를 물리 페이지로 올려야하는데, 물리 페이지가 꽉차있다면,

기존의 어떤 것과 교체할지를 결정해야하는데, 이를 '페이지 교체 알고리즘'으로 정한다.

 

기본적인 페이지 교체 알고리즘의 예시로는,

FIFO : 페이지가 주기억장치에 적재된 시간을 기준으로, 가장 오래있던 페이지를 교체하는 기법

LFU : 가장 적은 횟수를 참조하는 페이지를 교체하는 기법

LRU : 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법

이 있으며, 각각의 장단점이 존재하므로 상황에 따라 다르게 사용할 수 있다.

'프로그래밍 > CS' 카테고리의 다른 글

[Study] 뮤텍스 (Mutex)  (1) 2024.09.19
[Study] 스레드 (Thread)  (2) 2024.08.31
Recent Posts
Popular Posts
Recent Comments