[시스템 프로그래밍] 8 . Process
프로세스
: 실행 프로그램의 인스턴스
프로그램이란?
: 실행가능한 이진 파일에 저장되어 있는 데이터와 명령어 집합
프로세스 메모리
: 프로세스를 띄우기위해 메모리로부터 할당받는 공간을 의미하며, 스택 메모리, 힙 메모리, 코드 영역, 힙 영역으로 구분된다. 즉, 프로세스 실행을 위한 메모리 영역을 의미한다.
- 프로세스는 프로그램과 달리 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 이 가능하다.
Process Control Block
: 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 커널의 자료구조로, 프로세스의 상태정보를 저장하는 구조체
- 프로세스 생성 시에 만들어지며 주기억 장치에 저장된다.
- 프로세스 완료 시 PCB도 함께 제거된다.
- 로딩과정에서 주요한 정보는 PCB에 존재하는 PID( process ID )로, 프로세스를 구분하는 ID값이다.
- PCB는 프로세스의 중요한 정보를 포함하고 있기 때문에, 일반 사용자가 접근하지 못하도록 보호된 메모리 영역 안에 남는다.
PC : 다음에 실행할 프로세스 주소
Mode switch VS Context(process) switch
- 프로세스는 커널모드에서 관리된다.
- 최근 프로세스 상태를 저장하고, 새로운 프로세스의 상태를 저장한다.
- 모드 스위칭 후 프로세스 스위칭이 이뤄지기 때문에 모드스위칭이 더 빈번하게 이뤄진다. (의존적)
디스크에서 정보를 가져오기 시간이 오래걸릴 것 같다면 프로세스 스위칭을 통해 효율적으로 관리한다.
프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 공유하는 메모리가 존재하지 않는다. 따라서 Context Switching이 발생할 때 (1) 캐시 초기화, (2) 메모리 매핑 초기화, (3) 모드 스위칭 이라는 세 가지 비용을 항상 수반하게 되고, 이로 인해 큰 오버헤드가 발생하게 된다.