프로세스란 무엇인가?
실행 중인 프로그램은 어떤 자원을 가질까?
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
실행 파일은 디스크에 저장된 코드와 데이터다. 이 실행 파일을 운영체제가 메모리에 올리고 실행에 필요한 자원을 붙인 상태를 Process(프로세스)라고 부른다.
즉 프로그램은 파일이고, 프로세스는 실행 중인 프로그램의 인스턴스다.
프로세스가 가지는 것
프로세스는 코드만 가지고 있지 않다.
- 독립된 가상 주소 공간
- 실행 코드와 전역 데이터
- 동적으로 할당하는 Heap
- 스레드가 사용하는 Stack
- 열린 파일과 소켓 정보
- 보안 권한과 프로세스 ID
높은 주소
┌──────────────┐
│ Stack │ 스레드의 함수 호출과 지역 변수
├──────────────┤
│ │
│ Heap │ new, malloc 등 동적 할당
├──────────────┤
│ Data / BSS │ 전역 변수, 정적 변수
├──────────────┤
│ Code │ 실행할 명령어
└──────────────┘
낮은 주소
실제 배치와 세부 구역은 운영체제와 실행 파일 형식에 따라 달라질 수 있지만, 서로 다른 용도의 메모리 구역을 가진다는 흐름은 같다.
프로세스는 서로 격리된다
프로세스 A에서 사용하는 포인터를 프로세스 B가 그대로 가져와도 같은 데이터에 접근할 수 없다. 각 프로세스는 자신의 가상 주소 공간을 가지고, 커널이 페이지 테이블을 통해 실제 메모리와 연결하기 때문이다.
이 격리 덕분에 브라우저 하나가 잘못되더라도 다른 프로그램의 메모리를 바로 망가뜨리지 않는다.
프로세스끼리 통신하려면 방법이 필요하다
메모리가 분리되어 있으므로 프로세스끼리 데이터를 주고받으려면 IPC(Inter-Process Communication)를 사용해야 한다.
- Pipe
- Shared Memory
- Socket
- Message Queue
공유 메모리는 빠르지만 동시에 접근할 때 동기화가 필요하다. 소켓이나 메시지 방식은 경계가 분명하지만 데이터 복사와 통신 비용이 생길 수 있다.
프로세스는 단순히 실행 중인 코드 한 덩어리가 아니다. 운영체제가 메모리와 파일, 권한, 하나 이상의 스레드를 묶어 관리하는 자원 컨테이너에 가깝다.