Process(프로세스)
- 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케쥴링의 대상이 되는 작업(task) 라는 용어와 같은 의미로 쓰임
🤔 Program VS Process
- Program
: HDD/SDD(disk)의 파일에 저장된 수동 명령 모음
EX) 크롬 프로그램(chrome.exe)과 같은 실행 파일
- Process
: Program이 disk에서 memory(RAM)로 로드된 후 해당 명령을 실행하는 것(실행 중인 프로그램)
: Program으로부터 인스턴스화된 것
: 이후 OS의 CPU 스케쥴러에 따라 CPU가 프로세스를 실행시킴
EX) 크롬 프로그램을 두 번 클릭하면 크롬 '프로세스'가 시작
프로세스와 컴파일 과정
- 프로그램
: 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것
🤔 잠깐
여기서 프로그램은 C언어 기반(컴파일 언어)의 프로그램을 의미
인터프리터 언어(파이썬 등)로 된 프로그램과 다름
→ 인터프리터 언어로 된 프로그램은 별도의 컴파일 과정 없이 한 번에 한 줄씩 읽어들여서 실행
🤔 잠깐 프로그램의 컴파일 과정
- 전처리 : 소스 코드의 주석을 제거하고
#include
등 헤더 파일을 병합하여 매크로를 치환
- 컴파일러 : 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
- 어셈블러 : 어셈블리어는 목적 코드(object code)로 변환, 확장자는 운영체제마다 다름 (EX. 리눅스 :
.o
)
- 랑커 : 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일 만듬(확장자는
.exe
혹은 .out
)
- 정적 라이브러리와 동적 라이브러리
: 정적 라이브러리는 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
→ 시스템 환경 등 외부 의존도가 낮음, 코드 중복 등 메모리 효율성 떨어짐
: 동적 라이브러리는 프로그램 실행 시 필요할 때만 DLL(Dynamic-link library)이라는 함수 정보를 통해 참조하는 방식
→ 메모리 효율성, 외부 의존도 높아짐
프로세스의 상태
프로세스는 실행되면서 상태가 변한다. 이름은 임의적이고 운영체제마다 변한다.
생성 상태(create)
- 프로세스가 생성 중이다.
fork()
또는 exec()
함수를 통해 생성
- PCB 할당
🤔 잠깐
- fork()
부모 프로세스의 주소 공간을 그대로 복사, 새로운 자식 프로세스를 생성하는 함수
주소 공간만 복사할 뿐 부모 프로세스의 비동기 작업 등을 상속하지 않음
- exec()
새롭게 프로세스를 생성하는 함수
대기 상태(ready)
- 프로세스가 처리기에 할당되기를 기다린다.
- 메모리 공간이 충분하면 메모리 공간을 할당받고, 아니면 아닌 상태로 대기
- CPU 스케쥴러로부터 CPU 소유권이 넘어오기를 기다리는 상태
대기 중단 상태(ready suspended)
실행 상태(running)
- 명령어들이 실행되고 있다.
- CPU 소유권과 메모리를 할당받고 명령어(instructions)을 수행 중
- CPU burst가 일어났다고도 표현
중단 상태(blocked)
- 프로세스가 어떤 이벤트(입출력 완료 또는 신호의 수신 같은)가 일어나기를 기다린다.
- 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- I/O 디바이스에 의한 인터럽트로 인해 많이 발생 EX) 프린트 인쇄 버튼을 눌렀을 때 프로세스가 잠시 멈춘 듯한 현상
일시 중단 상태(blocked suspended)
- 대기 중단과 유사
- 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
종료 상태(terminated)
- 프로세스의 실행이 종료
- 메모리와 CPU 소유권을 모두 놓고 가는 상태
- 비자발적 종료(abort: 부모 프로세스가 자식 프로세스를 강제시키는 종료)도 존재
🤔 언제?
자식 프로세스에 할당된 자원의 한계치를 넘어섬
부모 프로세스가 종료
사용자가 process.kill
등 여러 명령어로 프로세스를 종료할 때
프로세스의 메모리 구조
운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 한다.
- text 및 data 영역은 프로그램 실행 시간 동안 크기가 변하지 않는다.
- stack과 heap은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있다.
Stack
- 함수를 호출할 때 임시 데이터 저장장소(ex. 함수 매개변수, 복귀 주소 및 지역 변수)
- 지역변수, 매개변수, 함수가 저장
- 컴파일 시에 크기가 결정되며 '동적'인 특성을 가짐
- 재귀적으로 호출(함수가 함수를 호출)하면서 동적으로 크기가 늘어날 수 있음
→ 힙과 스택의 메모리 영역이 겹쳐질 수 있으니 충분한 공간 확보 필요
Heap
- 프로그램 실행 중에 동적으로 할당되는 메모리
- 동적 할당 할 때 사용
- 런타임 시 크기가 결정되며 '동적'인 특성을 가짐
EX) vector와 같은 동적 배열은 heap에 동적 할당
Data(BSS segment+Data segment)
- 전역 변수(초기화된 global data)
- 전역변수, 정적변수가 저장
- 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역
- BSS segment : 초기화 되지 않은 변수가 0으로 초기화되어 저장
- Data segment : 0이 아닌 다른 값으로 할당된 변수들이 저장
Text(code segment)
- 실행 코드
- 프로그램에 내장되어 있는 소스 코드가 들어감
- 수정 불가능한 기계어로 저장
PCB(Process Control Block)
- 프로세스에 연관된 메타데이터를 저장한 '데이터'를 말한다.
- 각 프로세스는 운영체제에서 PCB(프로세스 제어 블록 혹은 태스크 제어 블록)에 의해 표현된다.
→ 프로세스가 생성되면 운영체제는 해당 PCB를 생성
🤔 잠깐 메타데이터란?
- 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터
- 대량의 정보 가운데에 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
✅ 따라서..
- 프로그램이 실행
- 프로세스가 생성
- 프로세스 주소 값들에 메모리 할당(스택, 힙 등의 구조를 기반)
- 이 프로세스의 메타데이터들이 PCB에 저장되어 관리(커널 스택의 가장 앞부분에서 관리)
PCB의 구조
메타데이터 | 설명 |
---|
프로세스 스케쥴링 상태 | 'ready', 'waiting' 프로세스가 CPU에 대한 소유권을 얻은 이후 또는 이후 경과된 시간과 같은 기타 스케쥴링 정보 |
프로세스 ID | 프로세스 ID, 해당 프로세스의 자식 프로세스 ID |
프로세스 권한 | 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보 |
program counter(PC) | 프로세스가 실행해야 할 다음 명령어의 주소에 대한 포인터 |
CPU registers | 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보 |
CPU scheduling information | CPU 스케쥴러에 의해 중단된 시간 등에 대한 정보 |
Accounting information(계정 정보) | 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보 |
I/O status information(I/O 상태 정보) | 프로세스에 할당된 I/O 디바이스록 |
Context Switching(컨텍스트 스위칭)
- PCB를 교환하는 과정
- CPU가 다른 프로세스로 전환할 때, 운영체제는 context switching을 통해 이전 프로세스의 상태를 저장하고 새 프로세스에 대해 저장된 상태를 로드한다.
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
🤔 잠깐 여러 프로그램이 동시에 실행되는 거 아니었어?
- 많은 프로세스가 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
- 동시에 실행하는 것처럼 보여도 어떤 시점에서 실행되고 있는 프로세스는 단 한 개임
- 참고)
현대 컴퓨터는 멀티코어의 CPU를 가지기 때문에 한 시점에 한 개의 프로그램이라는 말은 틀린 설명이나, 컨텍스트 스위칭을 이야기 할 때는 싱글 코어를 기준으로 설명하겠어요
1. 한 개의 프로세스 A가 실행하다 멈춤
2. 프로세스 P0의 PCB를 저장하고 프로세스 P1을 로드하여 실행
3. 다시 프로세스 P1의 PCB를 저장하고 프로세스 P0의 PCB를 로드함
비용 1. 유후 시간(idle time)
- 컨텍스트 스위칭이 일어날 때 유후 시간이 발생
비용 2. 캐시미스(cache miss)
- 컨테스트 스위칭이 일어날 때 이전의 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생김
- 기존의 캐시 메모리에 저장되어 있던 데이터들은 cache clear 과정을 겪게 되고 이 때문에 cache miss가 발생
- 스레드에서 컨텍스트 스위칭이 일어나지만 스택 영역을 제외한 모든 메모리를 공유하기 때문에 비용이 더 적고 시간도 더 적게 걸림
멀티프로세싱
- 여러 개의 프로세스, 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 하나 이상의 일을 병렬로 처리 가능
- 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생되어도 다른 프로세스를 이용해서 처리할 수 있어 신뢰성이 높은 강점이 있음
웹 브라우저의 멀티프로세스 구조
- Browser Process : 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당, 네트워크 요청이나 파일 접근 같은 권한을 담당
- Renderer Process : 웹 사이트가 '보이는' 부분의 모든 것을 제어
- GPU Process : GPU를 이용해 화면을 그리는 부분을 제어
- Plugin Process : 웹 사이트에서 사용하는 플러그인을 제어
IPC(Inter Process Communication)
- 멀티프로세스는 IPC가 가능
- IPC란 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
- 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐
🤔 예시) 클라이언트와 서버
클라이언트 : 데이터를 요청
서버 : 클라이언트 요청에 응답하는 것
- IPC의 종류
공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐
공유 메모리(shared memory)
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것
- 각 프로세스의 메모리를 다른 프로세스가 접근할 수 없지만 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있음
- IPC 방식 중 가장 빠르다
: 매개체를 통해 데이터를 주고 받는 것이 아니라 메모리 자체를 공유하기 때문에 불필요한 데이터 복사 오버헤드가 발생하지 않음
- 같은 메모리 영역을 여러 프로세스가 공유하므로 동기화 필요
파일
- 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
- 이를 기반으로 프로세스 간 통신
소켓
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미
- TCP와 UDP가 있음
익명 파이프(unnamed pipe)
- 프로세스 간에 파이프(FIFO 방식으로 읽히는 임시 공간)를 기반으로 데이터를 주고 받음
- 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
- 부모, 자식 프로세스 간에만 사용 간으 다른 네트워크 상에서는 사용 불가
명명된 파이프(named pipe)
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 (명명된) 단방향 또는 이중 파이프
- 클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있음
- 컴퓨터 프로세스 간 뿐만 아니라 다른 네트워크 상 컴퓨터와도 통신 가능
하나의 파이프 서버 당 하나의 클라이언트 파이프
하나의 서버 파이프 인스턴스에 여러 개의 클라이언트 파이프
메세지 큐
- 메시지를 큐(queue) 데이터 구조 형태로 관리하는 것
- 커널에서 전역적으로 관리
- 사용 방법이 직관적이고 간단, 사용방법이 간단함
- 공유 메모리를 통해 IPC를 구현하면 쓰기 및 읽기 빈도가 높으면 동기화 땜누에 긴으을 구현하는 것이 매우 복잡해져서 대신 메시지 큐를 사용하기도 함
참고자료
면접을 위한 CS 전공지식노트
operating system concepts 10th
Process (computing)
What is a Process in Operating System and what are the different states of a Process?
context switching과 cache memory
최신 브라우저의 내부 살펴보기 1
Using Named Pipes
메세지 큐