반응형
프로세스 : 프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다.
- 사용자가 보는 앞에서 실행되는 포르세스는 포그라운드 프로세스
- 사용자가 보지 못하는 뒤편에서 실행되는 프로세스는 백그라운드 프로세스
- 백그라운드 프로세스를 유닉스 체계의 운영체제에서는 데몬이라고 부른다.
- 윈도우 운영체제에서는 서비스라고 부른다.
프로세스 제어 블록
- 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
- 운영체제는 프로세스 제어블록(PCB: Process Control Block)이하 PCB를 이용한다.
- 프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조다.
- 상품에 달린 택을 생각하면 좋다. 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다.
- PCB는 커널영역에 생성된다.
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기 된다.
- 즉, 새로운 프로세스가 생성되었다 => 운영체제가 PCB를 생성
- 프로세스가 종료되었다 => 운영체제가 PCB를 폐기
프로세스 ID : Process ID이하 PID는 특정 프로세를 식별하기 위해 부여하는 고유한 번호. 같은 일을 수행하는 프로그램이라 할지라도 두 번실행하면 PID가 다른 두 개의 프로세스가 생성된다.
레지스터 값 : 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다. 즉, PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
프로세스 상태 : 현재 프로세스가 어떤 상태인지도 PCB에 기록된다.
CPU 스케쥴링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록된다.
메모리 관리 정보 : 프로세스마다 메모리에 저장된 위치가 다르다. PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다. 페이지 테이블정보도 담긴다.
사용한 파일과 입출력장치 목록 : 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다. 즉, 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다.
문맥교환
- 하나의 프로세스 수행을 재개하기 위해 기억해야할 정보를 문맥이라고 한다.
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다.
- 실행 문맥을 잘 기억해 두면 언제든 해당 프로세스의 실행을 재개할 수 있기 때문에 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다.
- 그리고 뒤이어 다른 프로세스 문맥을 복구한다. 자연스럽게 실행되는 프로세스가 바뀌게 된다.
- 이처럼 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환(context switching)이라고 한다.
- 문맥교환은 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리다.
- 하지만 너무 자주 하면 오버헤드가 발생할 수 있다.
프로세스의 메모리 영역
- 코드 영역
- 텍스트 영역이라고도 부른다. 기계어로 이루어진 명령어가 저장된다. 코드 영역은 읽기 전용 공간이다.
- 데이터 영역
- 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 전역 변수가 대표적이다.
- 코드 영역과 데이터 영역은 크기가 고정된 영역인 정적 할당 영역이라고 부른다.
- 힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있는 영역이여서 동적 할당 영역이라고 한다.
- 힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간.
- 힙 영역에서 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다. 그렇지 않으면 메모리 누수가 발생.
- 스택 영역
- 데이터를 일시적으로 저장하는 공간. 함수의 실행이 끝나면 사라지는 매개 변수, 지역변수가 대표적이다.
- 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은주소에서 낮은 주소로 할당된다.
- 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 발생하지 않는다.
프로세스 상태
- 생성 상태
- 프로세스를 생성 중인 상태. 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비 상태
- 당장이라도 CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니기에 기다리고 있는 상태.
- 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치라고 한다.
- 실행 상태
- CPU를 할당받아 실행 중인 상태를 의미한다. 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
- 할당된 시간을 모두 사용한다면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
- 대기 상태
- 입출력장치의 작업을 기다리는 상태를 대기 상태라고 한다.
- 종료 상태
- 프로세스가 종료된 상태. 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

프로세스 계층 구조
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
- 이때 새 프로세스를 생성한 프로세르를 부모 프로세스라고 한다.
- 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스 라고 한다.
- 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기에 각기 다른 PID를 가진다. 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.
- 많은 운영체제는 이처럼 프로세스가 프로세스를 낳는 계층적은 구조로써 프로세스들을 관리한다.
- 컴퓨터가 부팅 될 때 실행되는 최초의 프로세스가 자식 프로세스들을 생성하고, 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 도잇에 실행되는 것이다.
프로세스 생성 기법
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해낸다.
- 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.
- fork, exec는 시스템 호출이다. 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스에 생성한다. 즉, fork는 자기 자신 프로세스의 복사본을 만드는 시스템 호출.
- 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들이 상속된다.
- fork를 통해 복사본이 만들어진 뒤에 자식 프로세스는 exec 시스템 호출을 통해 새로운 프로그램으로 전환된다.
- exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다. 새로운 프로그램 내용으로 전환하여 실행하는 시스템 호출.
- exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 된다.
스레드
- 실행의 단위. 스레드란 프로세스를 구성하는 실행의 흐름 단위다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
- 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
- '실행의 흐름 단위가 하나'라는 점의 실행되는 프로세스들은 단일 스레드 프로세스라고 불 수 있다.
- 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 점이다.
멀티프로세스와 멀티스레드
- 여러 프로세스를 동시에 실행하는 것을 멀티스레드
- 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.
- 프로세스끼리 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
- 즉, 멀티프로세스는 프로세스를 fork하여 같은 작업을 하는 동일한 프로세스 두 개를 동시에 실행하면?
- 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재된다. 한 마디로 PID, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재된다.
- 멀티스레드는 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유한다.
- 단점은 멀티프로세스는 하나의 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만, 멀티스레드는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
반응형