1. 프로세스 개요
1) 프로세스
- 프로세스(process)
- 실행 중인 프로그램
- 프로그램은 실행 전까지는 데이터 덩어리, 메모리에 적재되어 실행되는 순간 프로그램은 프로세스가 됨
- 포그라운드 프로세스(foreground process)
- 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process)
- 사용자가 보지 못하는 뒤에서 실행되는 프로세스
2) 프로세스 제어 블록
- 프로세스의 실행
- 모든 프로세스는 실행을 위해 CPU 자원을 필요로 하지만, CPU 자원은 한정되어 있음
- 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 사용
- 타이머 인터럽트를 통해 종료
- 타이머 인터럽트: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트
- 프로세스 제어 블록(PCB; Process Control Block)
- 프로세스와 관련된 정보를 저장하는 자료구조
- 프로세스를 식별하기 위해 필요한 정보들이 저장됨
- 프로세스 생성 시에 커널 영역에서 생성되고, 실행이 끝나면 폐기됨
- 프로세스에 담기는 정보
- 프로세스 ID
- 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값
- 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 복원
- 이를 위해 프로그램 카운터를 비롯한 레지스터 값이 담김
- 프로세스 상태
- 현재 프로세스가 어떤 상태인지 기록됨
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU에 할당받을지에 대한 정보
- 메모리 관리 정보
- 프로세스가 어디에 저장되어 있는지에 대한 정보
- 사용한 파일과 입출력장치 목록
- 프로세스 실행 과정에서 특정 입출력장치나 파일을 사용한 내역이 저장
- 프로세스 ID
3) 문맥 교환
- 문맥(context)
- 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보(=중간 정보)
- PCB에 기록되는 정보들
- 문맥 교환(context switching)
- 기존 프로세스의 문맥을 PCB에 백업하고, 새 프로세스의 문맥을 PCB로부터 복구하여 프로세스 실행하는 것
- 프로세스가 빨리 번갈아 가며 수행되기 때문에, 우리 눈에 프로세스들이 동시에 실행되는 것처럼 보임
- 문맥 교환을 너무 자주하면 오버헤드가 발생할 수 있음
4) 프로세스의 메모리 영역
- 코드 영역(code segment)
- 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장
- 쓰기가 금지된 읽기 전용 공간
- 데이터 영역(data segment)
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- Ex) 전역 변수
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 힙 영역(heap segment)
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역에 메모리 공간을 할당했다면, 반드시 해당 공간을 반환해야함
- 그렇지 않으면 메모리 누수(=메모리 낭비) 발생
- 스택 영역(stack segment)
- 데이터를 일시적으로 저장하는 공간
- 데이터 영역과 달리 잠깐 사용되는 값들이 저장
- Ex) 매개 변수, 지역 변수
- Ex) 매개 변수, 지역 변수
- 정적 할당 영역
- 크기가 고정된 영역
- 코드 영역과 데이터 영역이 해당
- 동적 할당 영역
- 프로세스 실행 과정에서 크기가 변할 수 있는 영역
- 힙 영역과 스택 영역이 해당
2. 프로세스 상태와 계층 구조
1) 프로세스 상태
- 생성 상태(new)
- 메모리에 적재되어 PCB를 할당받은 상태
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU 할당을 대기
- 준비 상태(ready)
- 당장이라도 CPU 할당을 받아 실행될 수 있지만, 차례를 기다리는 상태
- 실행 상태(running)
- CPU를 할당받아 실행 중인 상태
- 할당된 일정 시간 동안 CPU를 사용하고, 타이머 인터럽트가 발생하면 다시 준비 상태가 됨
- 대기 상태(blocked)
- 프로세스 실행 도중 입출력장치를 사용하는 경우, 입출력장치의 작업을 기다리는 상태
- 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태가 됨
- 종료 상태(terminated)
- 프로세스가 종료된 상태
- 운영체제는 PCB와 프로세스가 사용한 메모리를 정리
프로세스 상태 다이어그램
2) 프로세스 계층 구조
- 부모 프로세스(parent process)
- 기존 실행 중인 프로세스
- 자식 프로세스(child process)
- 프로세스는 실행 도중 시스템 호출을 통해 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 각기 다른 PID를 가짐
- 자식 프로세스가 생기면 트리 구조를 띄는데, 이를 프로세스 계층 구조라고 함
3) 프로세스 생성 기법
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
- 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- fork
- 자기 자신 프로세스의 복사본을 만드는 시스템 호출
- 자식 프로세스는 부모 프로세스의 내용을 상속 받음
- exec
- 자신의 메모리 공간을 새로운 프로그램으로 덮어씌는 시스템 호출
- 새로운 프로그램 내용으로 전환하여 실행
- exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 변경, 나머지는 초기화
https://github.com/kmg0157/self-learning-cs/blob/main/process/process_cplusplus.md
3. 스레드
1) 프로세스과 스레드
- 스레드(thread)
- 프로세스 내의 실행 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
- 스레드를 사용하면 하나의 프로세스에서 여러 부분을 동시에 실행 가능
- 프로세스의 여러 명령어를 동시에 처리
- 스레드는 프로세스 내에서 각기 다른 스레드 ID, 레지스터 값, 스택으로 구성
- 따라서 각기 다른 프로세스의 코드를 실행할 수 있음
- 한 프로세스 내의 스레드들은 실행에 필요한 최소한의 자원을 공유하며 실행
- 프로세스 내의 스레드는 프로세스의 자원을 공유
- 스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행됨
'컴퓨터 구조 &운영체제 > 컴퓨터구조 + 운영체제' 카테고리의 다른 글
운영체제 (0) | 2024.02.15 |
---|---|
입출력장치 (0) | 2024.02.13 |
메모리와 캐시 메모리 (0) | 2024.02.07 |
CPU 성능 향상 기법 (1) | 2024.02.06 |
CPU의 작동 원리 (0) | 2024.02.05 |