본 글은 '이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접' 책을 읽고 정리한 글입니다.
프로세스
프로세스는 컴퓨터에서 실행 중인 프로그램을 의미한다.
✔️ 프로세스의 메모리 구조
컴퓨터의 메모리는 RAM, 레지스터와 같이 물리적인 컴퓨터의 구성요소이고, 지금 볼 프로세스의 메모리는 운영체제가 해당 프로세스에 할당한 논리 메모리 구조이다.
프로세스의 메모리 구조는 다음 그림과 같다. 커널 영역에는 프로세스 제어 블록 (PCB)이 저장되고, 사용자 영역에는 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장된다.
코드 영역
코드 영역은 함수, 상수와 같은 기계어가 저장되는 공간으로, 텍스트 영역이라고도 한다.
CPU가 읽고 실행할 명령어가 담겨 있기 때문에 읽기 전용 공간이다. 만약 쓰기가 가능하다면, 실행 중에 코드가 바뀌어 오작동이나 충돌이 발생할 수 있다.
데이터 영역
데이터 영역은 프로그램이 실행되는 동안 유지할 데이터가 저장되는 영역이다. `ex. 정적 변수, 전역 변수, 배열, 구조체`
힙 영역
힙 영역은 사용자에 의해 동적 메모리 할당이 일어나는 영역으로, C언어에서 `malloc()`으로 할당되는 영역이라고 보면 된다.
스택 영역
스택 영역은 함수의 실행이 끝나면 사라지는 정보들이 저장되는 영역이다. `ex. 매개변수, 지역 변수, 반환되는 주소 값`
✔️ PCB와 문맥 교환
운영체제가 메모리에 적재된 프로세스들을 관리하기 위해서는 프로세스를 식별할 수 있어야 하는데, 이때 사용하는게 프로세스 제어 블록(PCB)이다. PCB는 프로세스와 관련된 정보를 가진 구조체의 일종으로, 새로운 프로세스가 메모리에 적재됐을 때 커널 영역에 만들어지고 프로세스의 실행이 끝나면 폐기된다.
PCB에 담기는 정보들은 다음과 같다.
- 프로세스 ID (PID)
- 실행 과정에서 사용한 레지스터 값
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관련 정보
- 파일 및 입출력 관련 정보
메모리에 적재된 프로세스들은 운영체제로부터 CPU 자원을 할당받아서 이용을 하게 되는데, 이때 프로세스의 CPU 사용 시간은 타이머 인터럽트에 의해 제한된다. 타이머 인터럽트는 시간이 끝났음을 알리는 인터럽트이다. (= 타임아웃 인터럽트)
인터럽트는 현재 실행 중인 작업을 잠시 멈추고, 운영체제가 개입할 수 있도록 CPU 흐름을 바꾸는 것이다.
프로세스는 자신의 차례가 되면 정해진 시간만큼 CPU를 이용하고, 타이머 인터럽트가 발생하면 다음 차례를 기다리게 된다. 프로세스가 실행되는 순서는 CPU 스케줄링에 의해 정해지게 된다.
문맥 교환이란?
만약 프로세스 A가 실행되다가 타이머 인터럽트가 발생하여 프로세스 B로 CPU 사용을 양보하는 경우,
프로세스 A는 다음에 다시 실행 차례가 되었을 때 이전에 실행했던 내용을 이어서 재개하기 위해서 실행 정보를 백업해두어야 한다.
여기서 백업 대상이 되는, 기억해야 할 정보를 문맥(context)라고 한다.
위의 상황처럼 CPU를 사용할 프로세스가 바뀌는 시점에 운영체제는 이전 프로세스의 PCB에 문맥을 백업하고, 뒤이어 실행할 프로세스의 문맥을 복구한다. 이러한 과정을 문맥 교환(context switching)이라고 한다.
즉 문맥 교환은 여러 프로세스가 끊임없이 빠르게 번갈아가며 실행이 되는 것을 생각하면 된다.
위의 그림을 보면 문맥 교환 도중에 `유휴 구간`이라고 하는 CPU가 아무 작업도 수행하지 않는 구간이 존재한다. 만약 프로세스 간에 문맥 교환이 자주 발생한다면 실행할 프로세스의 내용을 가져오는 작업이 빈번해지고 이는 큰 오버헤드로 이어질 수 있다. 따라서 문맥 교환이 자주 발생하는 것은 좋지 않다.
오버헤드 : 어떤 작업을 하기 위해 추가로 드는 비용
✔️ 프로세스의 상태
하나의 프로세스는 생성, 준비, 실행, 대기, 종료 상태를 거치며 실핸된다. 이러한 프로세스의 상태를 운영체제는 PCB를 통해 인식하고 관리한다.
- 생성(new)
프로세스를 생성 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태다.
- 준비(ready)
CPU를 할당 받으면 바로 실행 가능한 상태를 말한다. 준비 상태인 프로세스가 CPU를 할당 받아서 실행 상태로 전환되는
것을 `디스패치`라고 한다.
- 실행(running)
CPU를 할당 받아 실행 중인 상태이다. 실행 중 타이머 인터럽트가 발생하면 다시 준비 상태로 가고, 실행 중 입출력 장치를
사용하게 되면 그 작업이 끝날 때까지 대기 상태가 된다.
- 대기(blocking)
프로세스가 곧장 실행 불가능한 조건에 놓이는 경우 대기 상태가 된다. 실행 가능한 상태가 되면 다시 준비 상태로 전환하고
CPU 할당을 기다린다.
- 종료(terminated)
프로세스가 종료된 상태를 말하며, 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
✔️ 멀티프로세스와 멀티스레드
멀티프로세스
멀티 프로세스란 여러 개의 프로세스가 동시에 실행되는 구조를 말하며, 각 프로세스는 독립적인 메모리 공간을 가지고 실행된다.
이를 잘 설명하는 대표적인 예가 웹 브라우저의 탭인데, 웹 브라우저는 여러 개의 탭을 열 수 있고 각 탭은 모두 독립적으로 실행된다. 이때 하나의 탭이 하나의 프로세스라고 생각하면 된다.
프로세스는 독립적인 메모리 공간을 갖고 프로세스 간 자원을 공유하지 않으므로 다른 프로세스에 영향을 거의 끼치지 않는다. 그래서 웹 브라우저의 여러 탭 중 하나가 문제가 발생하더라도 다른 탭들에는 직접적인 영향을 끼치지 않게 되는 것이다.
멀티스레드
멀티스레드는 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 방식이다. 하나의 스레드는 스레드ID, 프로그램 카운터(PC), 레지스터 값, 스택 등으로 구성된다.
인스타그램의 피드와 같이 이미지가 많은 화면을 스크롤한다고 생각해보자. 만약 싱글스레드로 구현되어있다면, 이미지 로딩과 사용자의 스크롤이 같은 스레드에서 일어나게 되고 UI 작업이 밀려서 버벅임이 생기게 될 것이다. 이와 같이 이미지 처리나 서버 통신과 같은 작업은 백그라운드 스레드에서 구현하게 된다.
멀티프로세스 vs 멀티스레드
위에서 언급을 했듯이 프로세스는 독립적인 메모리 공간을 가지고 스레드는 스택 영역 외의 자원들은 공유한다. 이러한 자원의 공유 여부가 가장 큰 차이점이다.
멀티프로세스 | 멀티스레드 | |
메모리 | 독립적 | 공유 |
통신 방식 | IPC 필요 | 공유 변수 가능 |
속도 | 느림(문맥 교환 비용) | 빠름 |
안정성 | 하나 죽어도 나머지 OK | 하나 죽으면 전체 영향 |
사용 예 | 크롬 탭, OS 서비스 | 게임, UI 앱, 웹서버 |
통신 방식에 대해서는 바로 아래서 다뤄보도록 하겠다.
✔️ 프로세스 간 통신
프로세스는 기본적으로 자원을 공유하지는 않지만, 프로세스 간에도 자원을 공유하고 데이터를 주고 받을 수 있는 방법이 있다. 이를 프로세스 간 통신(IPC: Inter-Process Communication)이라고 한다.
프로세스 간 통신 방식은 크게 공유 메모리와 메시지 전달이 있다.
공유 메모리는 데이터를 주고받을 프로세스가 공통적으로 사용할 메모리 영역을 두는 방식이고, 메시지 전달은 프로세스 간에 주고 받을 데이터를 메시지 형태로 주고 받는 방식을 말한다.
공유 메모리
공유 메모리라는 공간을 할당하면, 프로세스가 해당 메모리 공간을 공유하여 읽고 쓸 수 있게 된다. 위의 그림과 같이 두 프로세스가 공유 메모리 공간을 읽고 쓰는 과정으로 데이터를 공유할 수 있다는 것을 볼 수 있다.
공유 메모리 기반 IPC는 프로세스가 공유하는 메모리 영역을 확보하는 시스템 콜을 기반으로 수행할 수도 있고, 프로세스가 공유하는 변수나 파일을 활용할 수도 있다. 프로세스가 공유하는 파일을 활용한다는 것을 예시를 들어 설명해보자면, 한 프로세스는 텍스트 파일을 수정하고 다른 프로세스는 같은 텍스트 파일을 읽는다면, 두 프로세스는 데이터를 공유한 셈이 된다.
공유 메모리 기반 IPC의 특징을 한 번 정리해보자.
- 데이터를 주고받는 과정에 커널의 개입이 없다
- 통신 속도가 빠르다
- 데이터 일관성 훼손이 가능하다 (공유 메모리 영역을 동시에 읽고 쓸 경우 -> race condition 발생 가능)
메시지 전달
메시지 전달은 프로세스 간에 주고받을 데이터가 커널을 거치는 통신 방식이다. 메시지 전달 기반 IPC는 메시지를 보내는 시스템 콜(`send()`)과 받는 시스템 콜(`recv()`)이 정해져있다.
대표적인 수단으로는 파이프, 시그널, 소켓, 원격 프로시저 호출(RPC) 등이 있다.
공유 메모리 기반 IPC와 비교하여 메시지 전달 기반 IPC의 특징을 정리해보자.
- 커널의 도움을 받으므로 race condition, 동기화 문제를 고려하는 일이 적다
- 통신 속도가 (공유 메모리보다) 느리다
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 5. 가상 메모리 (1) | 2025.05.01 |
---|---|
[운영체제] 4. CPU 스케줄링 (0) | 2025.04.19 |
[운영체제] 3. 동기화와 교착 상태 (0) | 2025.04.16 |
[운영체제] 1. 운영체제 기본 (1) | 2025.04.04 |