프로세스의 개념
- 프로세스는 실행 중인 프로그램
- 프로그램은 실행되기 전까지는 보조기억장치에 있 데이터 덩어리일 뿐이지만, 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 프로그램은 프로세스가 됨 => '프로세스를 생성'하는 과정
[프로세스 종류]
- 포그라운드 프로세스: 사용자가 볼 수 있는 공간에서 실행되는 프로세스
- 백그라운드 프로세스: 사용자가 볼 수 없는 공간에서 실행되는 프로세스
- 유닉스 운영체제: 데몬
- 윈도우 운영체제: 서비스
운영체제는 프로세스 제어 블록(PCB)를 이용하여 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분함
[프로세스 제어 블록(PCB)]
- PCB에는 프로세스를 식별하기 위해 꼭 필요한 정보들 저장됨
- PCB는 커널 영역에 생성
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기됨
PCB에 담기는 정보
● 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
● 레지스터 값: 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들 모두 복원하기 때문에 PCB에 레지스터 값 기록
● 프로세스 상태: 현재 프로세스가 어떤 상태인지 상태 정보 PCB에 기록
● CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
● 메모리 관리 정보: 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
○ 베이스 레지스터, 한계 레지스터, 페이지 테이블
● 사용한 파일과 입출력장치 목록: 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보 PCB에 기록
문맥 교환
문맥: 하나의 프로세스가 이전까지 실행했던 내용을 이어서 다시 실행을 재개하기 위해 기억해야 할 정보
하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어야 한다. 즉, PCB에 기록되는 정보들이 문맥
문맥 교환: 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위한 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
★ 문맥 교환이 자주 일어나면 사람 눈엔 프로세스들이 동시에 실행되는 것처럼 보임. 하지만 문맥 교환을 너무 자주하면 오버헤드가 발생할 수 있어 문맥 교환이 다두 일어난다고 반드시 좋은 것은 아님!
프로세스의 메모리 영역
커널 영역: PCB 생성
사용자 영역: 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됨
- 코드 영역(텍스트 영역): CPU가 실행할 명령어(기계어로 이루어진 명령어)가 담겨 있는 읽기 전용 공간
- 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- ex) 전역 변수
★ 코드 영역과 데이터 영역은 크기가 고정된 영역으로 정적 할당 영역
- 힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역에 할당한 메모리 공간 반환하지 않으면 메모리 누수 발생
- 메모리 누수: 메모리 공간울 반환하지 않으면 할당한 공간 메모리에 남아 있어 메모리 낭비 발생
- 스택 영역: 데이터를 일시적으로 저장하는 공간
- ex) 매개 변수, 지역 변수
- 일시적으로 저장할 데이터는 스택 영역에 PUSH되고, 더 이상 필요하지 않는 데이터는 POP됨
★ 힙 영역과 스택 영역은 크기가 변할 수 있는 영역으로 동적 할당 영역
힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당됨
스택 영역은 높은 주소에서 낮은 주소로 할당됨
프로세스 상태
프로세스들은 여러 상태를 거치며 번갈아 가며 실행됨. 또한, 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리
- 생성 상태: 메모리에 적재되어 PCB를 할당받은 상태
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 됨
- 준비 상태: 당장 CPU 할당 받아 실행할 수 있지만, 아직 자신의 차례가 아니기 때문에 기다리고 있는 상태
- 실행 상태: CPU를 할당받아 실행중인 상태를 의미
- 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용 가능
- 대기 상태: 입출력 작업은 처리 속도가 느리기 떄문에 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지 기다려야함. 이러한 입출력장치의 작업을 기다리는 상태가 대기 상태
- 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태가 됨
- 종료 상태: 프로세스가 종료된 상태
프로세스 계층 구조
- 부모 프로세스: 새 프로세스를 생성한 프로세스
- 자식 프로세스: 부모 프레스에 의해 생성된 프로세스
PPID: 부모 프로세스의 PID
일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 함
운영체제는 프로세스가 프로세스를 생성하는 계층적인 구조로 프로세스를 관리함
최초의 프로세스: PID는 항상 1번이며, 모든 프로세스 최상단에 있는 부모 프로세스
[프로세스 생성 기법]
부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해 냄
만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체함
- fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출
- 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원들이 자식 프로세스에 상속됨
- 하지만 복사된 자식 프로세스라도 PID값이나 저장된 메모리 위치는 다름
- exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
- exec 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 됨
정리하자면, 부모가 자식 프로세스를 실행하며 프로세스 계층 구조를 이루는 과정은 fork가 exec가 반복되는 과정
프로세스와 스레드
스레드란?
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
- 스레드를 이용하여 하나의 프로세스에서 여러 부분 동시에 실행 가능
단일 스레드 프로세스: 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행
멀티 스레드 프로세스: 하나의 프로세스가 한 번에 여러 명령어를 동시에 실행
스레드는 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유며 실행됨
[멀티프로세스와 멀티스레드]
- 멀티프로세스: 여러 프로세스를 동시에 실행하는 것
- 멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것
멀티프로세스와 멀티스레드의 차이점
=> 프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유함
[멀티스레드 장점]
- 단일 스레드 프로세스 여러개가 동일한 프로그램을 실행하기 위해선 메모리에 동일한 내용들이 중복해서 존재해야 하기 때문에 낭비가 됨. 하지만 멀티 스레드를 사용한다면 프로세스내의 자원을 공유하기 때문에 메모리를 더 효율적으로 사용 가능
- 서로 다른 프로세스들은 자원을 공유하지 않기 때문에 독립적으로 실행되지만 스레드는 자원을 공유하여 협력과 통신에 유리
[멀티스레드 단점]
- 멀티프로세스 환경에선 하나의 프로세스에 문제가 생겨도 다른 프로세스엔 영향이 없음. 하지만 멀티스레드 환경에선 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있음
프로세스 간 통신(IPC)
프로세스끼리는 기본적으로 자원을 공유하지 않지만 프로세스 간 통신(IPC)을 통해 자원을 공유하고 데이터를 주고 받을 수 있음
- 파일을 통한 프로세스 간 통신: 파일 속 데이터를 주고 받음
- 공유 메모리: 프로세스들이 서로 공유하는 메모리 영역을 두어 데이터를 주고 받음
'운영체제' 카테고리의 다른 글
혼공 운영체제 ch9 - 운영체제란? (1) | 2023.12.29 |
---|