포그라운드 프로세스: 사용자가 보는 공간에서 사용자와 상호작용하며 실행
백그라운드 프로세스: 사용자가 보지 못하는 곳에서 실행
데몬: 백그라운드 프로세스 중 사용자와 별다른 상호작용 없이 주어진 작업만 수행하는 특별한 백그라운드 프로세스, 윈도우 운영체제에서는 서비스라고 부름
메모리 영역
커널 영역
PCB (프로세스 제어 블록)
프로세스를 식별할 수 있는 커널 영역 내의 정보
프로세스와 관련한 다양한 정보를 내포하는 구조체
새로운 프로세스가 메모리에 적재됐을 때 커널 영역이 만들어지고, 프로스세 실행이 끝나면 폐기됨.
프로세스 ID(PID), 실행 과정에서 사용한 레지스터 값, 프로세스 상태, CPU 스케줄링 (우선순위) 정보, 메모리 관련 정보, 파일 및 입출력 장치 관련 정보가 명시
PCB는 커널 내에 프로세스 테이블 형태로 관리되는 경우가 많음
좀비 프로세스: 프로세스가 비정상 종료되어 사용한 자원이 회수되었음에도 프로세스 테이블에 종료된 프로세스의 PCB가 남아있는 경우의 상태
사용자 영역
스택 영역 (동적 할당 영역)
일시적으로 사용할 값들 저장
매개변수, 지역 변수, 함수 복귀 주소 등
스텍 트레이스 형태의 함수 호출 정보가 저장될 수 있다.
스택 트레이스: 특정 시점에 스택 영역에 저장된 함수 호출 정보, 문제 발생 지점을 추적할 수 있어 디버깅에 매우 유용
힙 영역 (동적 할당 영역)
개발자가 직접 할당 가능한 공간
프로그램 실행 도중 자유롭게 할당하여 사용 가능한 메모리 공간
메모리 공간을 반환하지 않으면 할당한 공간이 계속 메모리 내에 남아 메모리를 낭비하는 메모리 누수를 발생시킬 수도 있음
메모리 누수를 해결하기 위해 프로그램 언어 내에서 자체적으로 사용되지 않는 힙 메모리를 해제하는 GC 기능 제공
데이터 영역 (정적 할당 영역)
프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
정적 변수, 전역 변수
코드 영역 (= 텍스트 영역) (정적 할당 영역)
실행 가능한 명령어가 저장되는 공간
CPU가 읽고 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있는 읽기 전용 공간
프로세스가 실행된다?
운영체제에서 CPU의 자원을 할당받았다.
CPU가 프로세스를 구성하는 명령어와 데이터를 인출하여 실행하고, 운영체제가 CPU 자원을 할당하기 때문
프로세스의 CPU 사용 시간은 타이머 인터럽트에 의해 제한됨
타이머 인터럽트: 타임아웃 인터럽트. 시간이 끝났음을 알리는 인터럽트
프로세스는 자신의 차례가 되면 정해진 시간만큼 CPU를 이용하고, 타이머 인터럽트가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다림.
프로세스가 CPU를 사용할 시간이 다 되거나 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 Context를 백업함.
Context Switching이 자주 발생하면 캐시 미스가 발생할 가능성이 높아져 오버헤드가 발생할 수 있음
프로세스의 상태
생성 상태 (new)
프로세스를 생성 중인 상태
메모리에 적재되어 PCB를 할당받은 상태
준비 상태 (ready)
CPU를 할당받아 실행할 수 있지만, 자신의 차례가 아니라 기다리는 상태
Dispatch: 준비 상태인 프로세스가 CPU를 할당받으면 실행 상태로 전환되는 것
실행 상태 (running)
CPU를 할당받아 실행 중인 상태
일정 시간 동안만 CPU를 사용할 수 있다.
타이머 인터럽트가 발생하여 프로세스가 할당된 시간을 모두 사용하면 다시 준비 상태가 됨.
실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 됨.
입출력 작업이 완료되는 등 실행 가능한 상태가 되면 다시 준비 상태가 됨
대기 상태 (blocked)
프로세스가 입출력 작업을 요청하거나 바로 확보할 수 없는 자원을 요청하는 등 곧장 실행 불가능한 조건에 놓이는 경우
입출력 작업을 요청하는 경우가 대표적
입출력 작업이 완료되는 등 실행 가능한 상태가 되면 다시 준비 상태가 되어 CPU 할당을 기다림
종료 상태 (terminated)
프로세스가 종료된 상태
프로세스가 종료되면 PCB와 프로세스가 사용한 메모리를 정리함
블로킹 입출력과 논블로킹 입출력
블로킹 입출력 (blocking I/O)
프로세스 실행 도중 입출력 작업을 수행해야 하는 상황일 때, 대기 상태로 접어들고, 입출력 작업이 완료되면 준비 상태가 되어 실행을 재개
논블로킹 입출력 (non-blocking I/O)
입출력 장치에게 입출력 작업을 맡긴 뒤, 이어질 명령어를 실행
멀티프로세스와 멀티스레드
멀티프로세스와 멀티 스레드의 가장 큰 차이점은 자원의 공유 여부이다.
서로 다른 프로세스들은 기본적으로 자원을 공유하지 않기 때문에 독립적으로 실행
같은 프로세스를 실행하는 여러 스레드들은 프로세스의 자원을 공유
멀티프로세스
동시에 여러 프로세스가 실행되는 것
다른 프로세스들이 기존적으로 자원을 공유하지 않고, 독립적으로 실행된다.
하나의 스레드는 스레드를 식별할 수 있는 고유 정보인 스레드 ID, 프로그램 카운터, 레지스터 값, 스택 등으로 구성
스레드마다 각각의 프로그램 카운터 값과 스택을 갖고 있어서 스레드마다 다음에 실행할 주소를 가질 수 있고, 연산 과정의 임시 저장 값을 가질 수 있다.
한 프로세스에 문제가 생겨도 다른 프로세스에는 지장이 없거나 적다.
멀티스레드
같은 프로세스를 실행하는 여러 스레드들은 프로세스의 자원을 공유
스레드들은 동일한 주소 강간의 코드, 데이터, 힙, 영역을 공유하고, 열린 파일과 같은 프로세스의 자원을 공유하기 때문에 쉽게 통신할 수 있다.
한 스레드에 생긴 문제가 프로세스 전체의 문제가 될 수 있다.
스레드 조인
join: 스레드를 생성한 주체가 "생성/실행된 스레드가 종료될 때까지 대기"해야 함을 의미
메인 쓰레드가 A쓰레드를 생성할 때 join을 호출헀다면? 메인 쓰레드는 A쓰레드가 종료될 때까지 실행되지 않고 대기해야 함
프로세스 간 통신
프로세스는 기본적으로 자원을 공유하지 않음
프로세스 간 통신(IPC, Inter-Process Communication)을 통해 자원을 공유함
공유 메모리
데이터를 주고받는 프로세스가 공통적으로 사용할 메모리 영역을 두는 방식
프로세스가 공유하는 메모리 영역을 확보하는 시스템 콜을 기반으로 수행 or 간단하게 프로세스가 공유하는 변수나 파일을 활용할 수도 있음
통신을 주고받는 각 프로세스가 마치 자신의 메모리 영역을 읽고 쓰는 것처럼 통신한다.
프로세스가 데이터를 주고 받는 과정에서 커널의 개입이 거의 없다. 즉, 프로세스가 주고 받는 데이터는 커널 영역을 거치지 않는 경우가 많다.
각 프로세스가 각자의 메모리 영역(사용자 영역)을 읽고 쓰는 것뿐이므로 통신 속도가 빠르다.
각각의 프로세스가 서로의 공유 메모리 영역을 동시에 읽고 쓸 경우, 데이터의 일관성이 훼손될 수 있다. (레이스 컨디션)
메시지 전달
주고받을 데이터를 메시지 형태로 주고받는 방식
주고받을 데이터가 커널을 거쳐 송수신되는 통신 방식
메시지를 보내는 수단과 받는 수단이 명확하게 구분되어 있음
send(): 메시지를 보내는 시스템 콜
recv(): 메시지를 받는 시스템 콜
각 프로세스는 시스템 콜을 호출하며 메시지를 송수신할 수 있다.
커널의 도움을 적극적으로 받을 수 있으므로 레이스 컨디션, 동기화 동의 문제를 고려하는 일이 적다.
데이터가 커널을 통해 송수신되므로 통신 속도가 느리다.
메시지 전달 기반 IPC를 위한 수단으로는 파이프, 시그널, 소켓, 원격 프로세저 호출 (RPC)등이 있다.
파이프
단방향 프로세스 간 통신 도구
단방향으로만 읽고 쓸 수 있는 파이프. 양방향 통신을 할 경우, 읽기용 파이프와 쓰기용 파이프 2개를 이용해 양방향으로 통신하는 경우가 많다.
FIFO
익명 파이프(unnamed pipe): 단방향 통신 수단. 양방향 통신을 지원하지 않음. 부모 프로세스와 자식 프로세스 간에만 통신이 가능하다.
지명 파이프(named pipe): 익명 파이프를 확장. 양방향 통신 지원. 임의의 프로세스 간에 사용 가능
시그널
프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적 신호
시그널 자체는 IPC만을 위해 존재하는 개넘은 아님
프로세스는 시그널이 발생하면 하던 일을 잠시 중단하고 시그널 시그널 핸들러를 실행한 후, 실행을 다시 한다.
프로세스는 특정 시그널을 발생시키거나, 시그널 핸들러를 재정의할 수 있다.
코어 덤프(core dump): 비정상적으로 종료하는 경우 생성되는 파일. 프로그램이 특정 시점에 작업하던 메모리 상태가 기록되어 있다.
원격 프로시저 호출 (RPC)
원격 코드를 실행하는 IPC 기술
다른 프로세스의 원격 코드 실행
성능 저하를 최소화하고, 메시지 송수신이 가능하기 때문에 대규모 트래픽 처리 환경에서 많이 쓰임
'운영체제' 카테고리의 다른 글
[운영체제] 파일 시스템 (0) | 2025.01.12 |
---|---|
[운영체제] 가상 메모리 (0) | 2025.01.12 |
[운영체제] CPU 스케줄링 (0) | 2025.01.09 |
[운영체제] 동기화와 교착 상태 (0) | 2025.01.08 |
[운영체제] 운영체제란 (1) | 2025.01.06 |