✓ 프로세스 개요
✏️ 프로세스: 보조기억장치에 저장되어있는 프로그램을 메모리에 적재하고 실행하는 과정
포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스
백그라운드 프로세스: 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 사용자와 직접 상호작용하는 백그라운드 프로세스
- 사용자와 상호작용하지 않는 백그라운드 프로세스: (유닉스) 데몬 daemon, (윈도우) 서비스
프로세스 제어 블록 PCB
- 프로세스와 관련된 정보를 저장하는 자료 구조.
- 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리. 프로세스에 CPU를 비롯한 자원을 배분
- 커널 영역에 생성됨. 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
- PCB에 담기는 정보
- 프로세스 ID (PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값: 이전까지 사용했던 레지스터의 중간값들(프로그램 카운터 등)
- 프로세스 상태
- CPU 스케줄링 정보: 프로세스가 언제 어떤 순서로 CPU를 할당받을지
- 메모리 관리 정보: 어느 주소에 저장되어 있는지. (베이스 레지스터, 한계 레지스터 값, 페이지 테이블 등)
- 사용한 파일과 입출력장치 목록
문맥 교환
✏️ 문맥 context: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보 → PCB에 기록되는 정보
- 프로세스가 실행되다가 인터럽트가 발생하면 운영체제가 해당 프로세스의 PCB에 문맥을 백업한다
- 문맥 교환: 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역 - 사용자 영역에서의 프로세스
1️⃣ 정적 할당 영역 : 크기가 고정된 영역 (read-only)
- 코드 영역 code(text) segment: 실행할 수 있는 코드가 저장
- 데이터 영역 data segment: 프로그램이 실행되는 동안 유지할 데이터. (ex. 전역 변수)
2️⃣ 동적 할당 영역 : 크기가 변할 수 있는 영역
- 힙 영역 heap segment: 프로그래머가 직접 할당할 수 있는 저장 공간.
- 스택 영역 stack segment: 데이터를 일시적으로 저장하는 공간. (ex. 매개 변수, 지역 변수)
❗️ 메모리 누수 memory leak: 메모리 공간을 할당했다면 언젠가는 꼭 해당 공간을 반환해야 하는데, 반환하지 않아 메모리가 낭비되는 것
💡 메모리에서 힙 영역과 스택 영역이 겹치지 않게, 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고 스택 영역은 반대로 할당된다.
✓ 프로세스 상태와 계층 구조
프로세스 상태
- 생성 상태 new: 이제 막 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태 ready: 아직 CPU를 할당 받지 못한, 차례를 받지 못한 상태
- 실행 상태 running: CPU를 할당받아 실행 중인 상태
✏️ 디스패치 dispatch: 준비상태 → 실행상태로
타이머 인터럽트: 실행상태 → 준비상태
- 대기 상태 blocked: 입출력장치의 작업을 기다리는 상태. 입출력작업이 완료되면 다시 준비 상태가 됨.
- 종료 상태 terminated: 프로세스가 종료된 상태 (PCB와 프로세스가 사용한 메모리가 정리됨)
프로세스 계층 구조
- 부모 프로세스: 새 프로세스를 생성한 프로세스
- 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
- 최초의 프로세스: 모든 프로세스 최상단에 있는 부모 프로세스. (유닉스) init, (리눅스) systemd, (macOS) launched
- 부모 프로세스와 자식 프로세스는 각기 다른 고유의 PID를 가짐 (일부 운영체제에서는 자식 프로세스의 PCB에 PPID Parent PID가 기록되기도 함)
프로세스 생성 기법
fork: 부모 프로세스가 자신의 복사본을 자식 프로세스로 생성하는 시스템 호출
exec: 복사된 자식 프로세스가 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
✓ 스레드
✏️ 스레드: 프로세스를 구성하는 실행의 흐름 단위
- 구성
- 각기 다른 스레드 ID
- 프로그램 카운터 값을 비롯한 레지스터 값
- 스택
- 단일 스레드 프로세스: 한 번에 하나의 일만을 처리하는 프로세스
❗️ 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.
(공유하는 자원: 주소 공간의 코드, 데이터, 힙 영역, 열린 파일)
- 멀티프로세스: 여러 프로세스를 동시에 실행하는 것
- 멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것
❗️프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 프로세스 내 자원을 공유한다.
멀티프로세스의 경우 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재할 수 있다.
이에 반해 스레드는 서로 자원을 공유하기 때문에 협력, 통신에 유리하고 메모리의 효율적인 사용이 가능하다.
그러나 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다는 단점이 있다.
+ 프로세스 간 통신 IPC Inter Process Communication: 프로세스끼리 자원을 공유하고 데이터를 주고 받는 것
+ 공유 메모리 shared memory: 프로세스들이 공유할 수 잇는 메모리 영역
'컴퓨터 & 코딩 > CS' 카테고리의 다른 글
[혼공학습단 10기][혼공컴운] CPU 스케줄링 (0) | 2023.07.14 |
---|---|
[혼공학습단 10기][혼공컴운] 4주차 미션 (0) | 2023.07.13 |
[혼공학습단 10기][혼공컴운] 운영체제의 큰 그림 (0) | 2023.07.11 |
[혼공학습단 10기][혼공컴운] 3주차 미션 (0) | 2023.07.10 |
[혼공학습단 10기][혼공컴운] 입출력장치 (0) | 2023.07.07 |