01. 프로세스 개요
- 프로세스(process): 실행 중인 프로그램
- 프로세스를 생성한다는 것: 보조 장치에 저장되어 있는 데이터 덩어리(프로그램)을 메모리에 적재하고 실행하는 것
- 프로세스 직접 확인하는 방법
- 윈도우: 작업 관리자의 [프로세스] 탭
- 유닉스: ps 명령어
- 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행되는 프로세스를 의미
- 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤에서 실행되는 프로세스를 의미
- 데몬(demon): 유닉스 운영체제에서의 백그라운드 프로세스
- 서비스(service): 윈도우 운영체제에서의 백그라운드 프로세스
- 프로세스 제어 블록
- CPU 자원은 한정되어 있으므로 모든 프로세스가 동시에 CPU를 할당받을 수 없음
- 타이머 인터럽트(Timer Interrupt): 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트(타임 인터럽트)
- OS는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 분배
- 프로세스 제어 블록(PRB: Process Controll Block): 프로세스와 관련된 정보를 저장하는 자료구조
- 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장됨
- 커널 영역에 생성됨
- 프로그램 생성 시에 만들어지고 실행이 끝나면 폐기됨
- 새로운 프로세스가 생성되었음 == 운영체제가 PCB를 생성하였음
- 프로세스가 종료되었음 == 운영체제가 해당 PCB를 폐기하였음
- PCB에 담기는 정보들
- 프로세스 ID(PID; Process ID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값: 이전에 진행했던 작업을 이어하기 위해 이전까지 사용했던 레지스터의 중간 값들을 모두 복원함
- 프로세스 상태: 프로세스의 현재 어떤 상태인지를 저장
- CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU에 할당받을지에 대한 정보 기록
- 메모리 관리 정보: 프로세스마다 저장된 메모리 위치가 다름
- 사용한 파일과 입출력 장치 목록: 실행 과정중에서 특정 입출력 장치나 파일을 사용하면 해당 내용이 명시
- 문맥 교환
- 문맥(contest): 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- CPU를 사용가능한 시간이 다되어가거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 OS는 해당 프로세스의 PCB에 문맥을 백업
- 문맥 교환(context switching): 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
- 문맥 교환이 자주 일어나면 오버헤드가 발생할 수 있음
- 프로세스의 메모리 영역
- 하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됨
- 코드 영역(code segement)
- 텍스트 영역(text segement)
- 실행할 수 있는 코드
- 즉 기계어로 이루어진 명령어가 저장
- 읽기 전용(read-only)
- 데이터 영역(data segement)
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 전역 변수(global variable): 프로그램이 실행되는 동안, 프로그램 전체에서 접근할 수 있는 변수
- 정적 할당 영역: 크기가 고정된 영역
- 코드 영역, 데이터 영역
- 동적 할당 영역: 프로세스 실행 과정 중에서 크기가 변할 수 있는 영역
- 힙 영역, 스택 영역
- 힙 영역(heap segemet)
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역에 메모리 공간을 할당했다면 반환해줘야함
- 메모리 누수(memory leak): 메모리 공간을 반환하지 않는다면 할당된 공간이 메모리 내에 남아 메모리 낭비를 초래
- 스택 영역(stack segement)
- 데이터를 일시적으로 저장하는 공간
- 매개변수, 지역 변수
- 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고
- 스택 영역은 높은 주소에서 낮은 주소로 할당됨
- 코드 영역(code segement)
- 하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됨
02. 프로세스 상태와 계층 구조
- 프로세스의 상태를 PCB에 기록하여 계층적으로 관리함
- 프로세스 상태
- 생성 상태(new): 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
- 준비 상태(ready): 당장이라도 CPU 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니여서 기다리고 있는 상태
- 디스패치(dispatch): 준비 상태인 프로세스가 실행 상태로 전환되는 것
- 실행 상태(running): CPU를 할당 받아 실행중인 상태를 의미
- 타이머 인터럽트(할당된 시간을 다 사용하면)가 발생되면 다시 준비 상태로 변환
- 실행 도중 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태로 변환
- 대기 상태(blocked): 입출력 작업을 요청한 프로세스가 입출력장치가 끝낼때까지 기다리는 상태
- 입출력 작업은 CPU에 비해 처리 속도가 느리므로
- 종료 상태(terminated): 프로세스가 종료된 상태
- 프로세스가 종료되면 사용한 메모리를 정리함
- 프로세스 상태 다이어그램(process state diagram)
- 프로세스 계층 구조
- 프로세스는 실행도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
- 부모 프로세스(parent process): 새 프로세스를 생성한 프로세스
- 자식 프로세스(child process): 부모 프로세스에 의해 생성된 프로세스
- 부모 프로세스와 자식 프로세스는 각각 다른 PID를 가짐
- 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)가 기록되기도 함
- 프로세스가 프로세를 낳는 계층적인 구조로 프로세스들을 관리
- 프로세스 계층 구조
- 프로세스는 실행도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음
* 최초의 프로세스 *
- 유닉스: init
- 리눅스: systemd
- macOS: launchd
- 프로세스 생성 기법
- 부모를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해냄
- 만들어진 복사본(자식 프로세스)는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- 시스템 호출: fork, exec
- fork: 부모 프로세스의 자원들(메모리 내의 내용, 열린 파일 목록 등)이 자식 프로세스에 상속
- exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출, 새로운 내용으로 전환하는 것
- 프로세스 계층 구조를 이루는 과정은 fork와 exec가 반복되는 과정임을 알 수 있음
- 부모 프로세스가 자식 프로세스를 fork한 후에 부모/자식 프로세스 중 exec를 하지 않을 경우: 같은 코드를 병행하여 실행하는 프로세스가 됨
- 부모를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
03. 스레드
- 스레드(thread): 실행의 단위, 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러개의 스레드를 가질 수 있음
- 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있음
- 프로세스와 스레드
- 단일 스레드 프로세스: 실행의 흐름 간위가 하나
- 멀티 스레드 프로세스: 하나의 프로세스가 여러 일을 동시에 처리하는 것
- 스레드의 중요한 점: 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행됨
- 리눅스에서의 프로세스와 스레드
- 프로세스와 스레드 대신 테스크(task)라는 이름으로 통일해서 사용
- 멀티 프로세스와 멀티 스레드
- 멀티 프로세스(multi process): 여러 프로세스를 동시에 실행하는 것
- 멀티 스레드(multi thread): 여러 스레도로 프로세스를 동시에 실행하는 것
- 동일한 작업을 수행하는 단일 스레드 프로세스 여러개 실행 vs 하나의 프로세스를 여러 스레드로 실행하는 것 차이
- 여러 프로세스로 병행 실행: 자원이 복제되어 메모리에 적재
- 여러 스레드로 병행 실행: 스레드끼리 같은 프로세스 내의 자원을 공유함
- 쓰기 시 복사(copy on write): fork한 후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼지 자원을 공유하지 않는 방법도 존재
- 프로세스간 통신(IPC; Inter-Process Communicaton)
- 기본적으로 프로세스는 자원을 공유하지 않지만, 가능함
- 공유 메모리(shared memory): 서로 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있음
'CS 상식 - 운영체제' 카테고리의 다른 글
[CS 상식 - 운영체제] 동기화 (1) | 2025.02.19 |
---|---|
[CS 상식 - 운영체제] CPU 스케줄링 알고리즘 (1) | 2025.02.14 |
[CS 상식 - 네트워크] CPU 스케줄링 (0) | 2025.02.14 |
[CS 상식 - 운영체제] 병렬과 병행 (2) | 2025.02.10 |
[CS 상식 - 운영체제] 운영체제 시작하기 (스터디 1) (2) | 2025.02.05 |