Major S-T-U-D-Y/System Programming

[시스템 프로그래밍] 8 . Process

rlo-lo 2024. 12. 19. 17:50

프로세스 

 

: 실행 프로그램의 인스턴스

 

프로그램이란?

: 실행가능한 이진 파일에 저장되어 있는 데이터와 명령어 집합

프로그램이 실행될 때, ELF 포맷의 일정부분( code, data)이 메모리로 로드된다.

 

 

프로세스 메모리

: 프로세스를 띄우기위해 메모리로부터 할당받는 공간을 의미하며, 스택 메모리, 힙 메모리, 코드 영역, 힙 영역으로 구분된다. 즉, 프로세스 실행을 위한 메모리 영역을 의미한다. 

- 프로세스는 프로그램과 달리 state를 갖는다. 프로세스는 메모리영역에 저장된 코드와 데이터 영역을 의미하는데, stack과 heap state에 포함된다. 

 

관련 링크 참조

 

 

프로세스에게는 메모리 영역이 주어지는데 (가상메모리는 나중에 정리해보도록 하겠다) 이런 메모리가 바로 주어지는 것이 아니라, ELF 실행가능 목적 파일(실행가능하고 링킹 가능한 포맷) 에서 기원한다. ELF 포맷에서는 프로그램이 실행될 때 메모리에 올라가야 할 부분을 정리해서 관리하다가, 실행 명령이 들어오면 그때서야 추가적인 영역과 함께 정리된 부분들이 메모리 영역에 적재된다. 

 

- x86_64 환경에서 가상주소는 64bit로 표현될 수 있지만  2^48 개만 활용한다. 유저모드에서 47비트 (128 TB) 나머지가 커널모드에서 사용 ! (유저모드에 반해 커널모드는 메모리에 항상 상주한다)

 

프로세스의 추상 

커널이 프로세를 관리하기 위해 각 프로그램에 두 가지 핵심적인 추상을 제공한다. 

1. Virtual addressing (독립적인 메모리 공간) 

- 가상 메모리를 통해 없는데 있는 것 같은 illusion  제공한다. 

가상메모리 :  메모리를 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 의미한다.

- 가상 메모리를 이용하면 실제 물리메모리가 가지고 있는 크기를 논리적으로 확장하여 사용 할 수 있다.

- 프로그램 입장에서 각각의 프로그램이 메인메모리 공간을 독점적으로 사용하는 것처럼 보여짐 

$gcc proc.c -o proc_mem
$./proc_mem & ./proc_mem & // 동일한 프로그램을 2개의 프로세스로 실행한다. 
(21002) address of global : 0x60104c
(21001) address of global : 0x60104c //주소는 같지만 물리적으로 다른 값ㅇ르 의미한다. 
// virtual addressing 
(21001) global : 21002
(21002) global : 21003
(21001) global : 21003
(21002) global : 21004
(21001) global : 21004
(21002) global : 21005

 

 

2. Logical control flow

- 하나의 CPU가 여러 개의 프로그램을 순회하며 동작하는데, 프로그램 입장에서는 자신이  CPU를 독점적으로 사용하는 것처럼 보여진다.

 

- 문맥 전환을 통해 실현된다.  CPU가 하나의 프로세스를 끝날 때까지 계속 처리하고, 그 다음에서야 다음 프로세스를 처리할 수 있다면 프로세스들 간의 참조도 이루어질 수 없고, 프로세스 간 병목 현상도 심화되기 때문에!!   

문맥전환 :  커널이 프로세스간 스위칭 할 때, 현재 실행 중인 프로세스의 상태를 저장하고, 다음 실행할 프로세스의 상태를 불러오는 과정을 의미한다. (모드스위칭과 혼재해서 용어사용)

- (1) scheduling:  현재 프로세스 상태 메모리에 저장한다 (2) 문맥전환: 커널이 다음 프로세스를 선택 (3) 저장된 레지스터 정보를 로드하고 주소공간을 불러와 CPU가 프로세스를 실행할 수 있도록 한다. 

- multiprocessing 이 가능하다. 

multiprocessing

 

 

 

 

Process Control Block 

: 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 커널의 자료구조로, 프로세스의 상태정보를 저장하는 구조체

- 프로세스 생성 시에 만들어지며 주기억 장치에 저장된다. 

- 프로세스 완료 시 PCB도 함께 제거된다. 

- 로딩과정에서 주요한 정보는 PCB에 존재하는 PID( process ID )로, 프로세스를 구분하는 ID값이다.

- PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 남는다. 

PC : 다음에 실행할 프로세스 주소 

 

 

Mode switch VS Context(process) switch

- 프로세스는 커널모드에서 관리된다. 

- 최근 프로세스 상태를 저장하고, 새로운 프로세스의 상태를 저장한다. 

- 모드 스위칭 후 프로세스 스위칭이 이뤄지기 때문에 모드스위칭이 더 빈번하게 이뤄진다. (의존적)

디스크에서 정보를 가져오기 시간이 오래걸릴 것 같다면 프로세스 스위칭을 통해 효율적으로 관리한다. 

 

프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 공유하는 메모리가 존재하지 않는다. 따라서 Context Switching이 발생할 때 (1) 캐시 초기화, (2) 메모리 매핑 초기화, (3) 모드 스위칭 이라는 세 가지 비용을 항상 수반하게 되고, 이로 인해 큰 오버헤드가 발생하게 된다.