프로세스
포그라운드 프로세스
- 사용자가 보는 앞에서 실행되는 프로세스
백그라운드 프로세스
- 사용자가 안보는 곳에서 실행되는 프로세스
- 유닉스에서는 데몬, 윈도우에서는 서비스라고 부른다.
프로세스 제어 블록(PCB)
- 프로세스와 관련된 정보를 저장하는 자료 구조
- 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
PCB 정보
프로세스 ID(PID)
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
레지스터 값
- 프로세스는 한번에 자신의 프로그램을 끝낼 수도 중간에 멈출 수도 있다.
- 그렇기에 자신의 차례가 되면 이전까지 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
프로세스 상태
- 프로세스의 사용 목적(입출력장치 사용, CPU사용 등)이 저장된다.
CPU 스케줄링 정보
- 프로세스가 언제 어떤 순서로 CPU에 할당받을지에 대한 정보 저장
메모리 관리 정보
- 베이스 레지스터, 한계 레지스터 값, 페이지 테이블 정보 등 프로세스 메모리 저장 위치 저장
사용한 파일과 입출력장치 목록
- 프로세스가 실행과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다.
문맥 교환
- 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것
문맥 - 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
프로세스의 메모리 영역 - 사용자 영역
정적 할당 영역(크기가 고정된 영역)
코드 영역(텍스트 영역)
- 기계어로 이루어진 명령어 저장
- CPU가 실행할 명령어가 저장되기 때문에 쓰기가 금지되어 있다.
데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장되어 있는 영역
- 전역 변수가 대표적이다.
동적 할당 영역(크기가 변할 수 있는 영역)
힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 프로그래밍 과정에서 힙 영역에 메모리를 할당했다면 언젠가 반환해야 한다.
- 반환을 하지 않으면 메모리 낭비를 초래 해 메모리 누수 문제를 만든다.
스택 영역
- 데이터를 일시적으로 사용하는 저장 공간
- 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수가 대표적이다.
프로세스 상태
생성 상태
- 프로세스를 생성 중인 상태
- 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
준비 상태
- 당장이라도 CPU에 할당 받아 실행할 수 있지만 차례를 기다리는 상태
- 차례가 되면 바로 CPU를 할당 받아 실행이 가능하다.(디스패치)
실행 상태
- CPU를 할당 받아 실행 중인 상태
- 할당 받은 일정 시간 동안만 CPU를 사용할 수 있다.
- 할당 시간이 끝나면(타이머 인터럽트) 다시 준비 상태가 된다.
- 입출력 요청 인터럽트를 받으면 CPU에서 프로세스를 대기 상태로 전환한다.
대기 상태
- 입출력장치의 작업을 기다리는 상태
- 입출력 작업은 CPU에 비해 처리 속도가 느려 입출력을 끝낼 때 까지(입출력 완료 인터럽트 받을 때까지)기다린다.
- 입출력 작업이 완료되면 준비 상태로 CPU할당을 기다린다.
종료 상태
- 프로세스가 종료된 상태
- 프로세스가 종료되면 운영체네는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층 구조
부모 프로세스와 자식 프로세스의 PID는 다르고 일부 운영체제에서는 자식 스포세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.
최초 프로세스는 유닉스에서는 init, 리눅스에서는 systemd, macOS에서는 launchd이고 PID는 항상 1이다.
부모 프로세스
- 새 프로세스를 생성한 프로세스
자식 프로세스
- 부모 프로세스에 의해 생성된 프로세스
프로세스 생성 기법
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
- 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 대체
- fork : 자신의 복사본을 자식 프로세스로 생성하는 시스템 호출
- exec : 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
- 부모 프로세스의 자원들이 자식 프로세스에 상속된다. 단, PID값이나 저장된 메모리 위치는 다르다.
스레드
- 프로세스를 구성하는 실행의 흐름 단위
단일 스레드 프로세스 - 실행 흐름 단위가 하나인 프로세스
스레드는 프로세스 내의 각기 다른 스레드 ID, 프로그램 카운터값, 레지스터값, 프택 값이 있어 각기 다른 코드를 실행할 수 있다.
프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스의 자원을 공유하며 실행된다.
프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다.
멀티프로세스
- 여러 프로그램을 동시에 실행하는 것
멀티스레드
- 여러 스레드로 프로세스를 동시에 실행하는 것
프로세스와 스레드
프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
그렇기에 프로세스를 fork하면 PID, 메모리 주소를 제외한 모든 자원들이 메모리에 적재된다. 코드, 데이터, 힙, 파일은 자원을 공유하고 레지스터, 스택, 프로그램 카운터는 스레드마다 자원을 따로 가진다.
참고) 혼자 공부하는 컴퓨터 구조+운영체제
'공부 > 컴퓨터구조, 운영체제' 카테고리의 다른 글
12장 프로세스 동기화 (0) | 2023.04.10 |
---|---|
11장 CPU 스케줄링 (0) | 2023.04.10 |
9장 운영체제 시작하기 (0) | 2023.03.30 |
8장 입출력장치 (0) | 2023.03.27 |
7장 보조기억장치 (0) | 2023.03.27 |