프로세스 개념
- 프로세스(Process): 실행 중인 프로그램을 의미하며, 현재 활동 상태는 프로그램 카운터(PC)와 다른 CPU 레지스터 값으로 표현된다.
- 메모리 레이아웃: 프로세스는 메모리에서 일반적으로 다음 4가지 영역으로 구성된다.
- 텍스트(Text): 실행 코드(명령어) 저장
- 데이터(Data): 전역 변수, static 변수 저장
- 힙(Heap): 동적 메모리 할당 영역
- 스택(Stack): 함수 호출 정보, 지역 변수 저장
프로그램 카운터
정의 | CPU가 다음에 실행할 명령어의 메모리 주소를 저장하는 레지스터 |
역할 | - 프로세스 실행 중 다음 명령어를 어디서 읽어야 할지 CPU에게 알려줌 - 문맥 교환 시, 현재 실행 중인 명령어의 위치를 저장해 두었다가, 나중에 이어서 실행할 수 있도록 함 |
예시 | 어떤 프로세스가 1000번지 명령을 실행하고 있었다면, PC 값은 1000 또는 다음 명령의 주소 1004 같은 값이 저장됨 |
CPU 레지스터 값
정의 | CPU 내부의 매우 빠른 임시 저장소. 연산 중간 결과나 메모리 주소 등을 저장 |
종류 예시 | 일반 목적 레지스터 (AX, BX, CX< DX 등 / x86 기준) > 변수 값, 계산 결과 등 저장 스택 포인터 > 현재 스택의 최상단 주소 프레임 포인터 (Frame Pointer, BP) > 현재 함수 호출 프레임의 기준 주소 인덱스 레지스터 > 배열 접근, 메모리 오프셋 계산 플레그 레지스터 > 연산 결과 강태 (0인지, 음수인지, 오버플로우인지 등) |
프로세스 상태
- 실행 중 프로세스는 상태가 변화한다.
- 준비(Ready): CPU 할당을 기다림
- 실행(Running): CPU에서 명령어 실행 중
- 대기(Waiting/Blocked): I/O 작업 등 이벤트 대기
- 종료(Terminated): 실행 완료 후 자원 해제
프로세스 관리 구조
- PCB(Process Control Block): 커널이 프로세스를 관리하기 위한 자료구조
- 포함 정보: 프로세스 상태, 프로그램 카운터, 레지스터 값, 메모리 관리 정보, 파일 핸들 등
- 프로세스 실행을 중단했다가 나중에 재개하려면
- 어디서 부터 다시 실행할 지 알아야 함하기에 프로그램 카운터가 필요
- 중간 계산 결과, 변수 값, 메모리 주소 등을 그대로 복원해야 함 > CPU 레지스터 값 필요
- 프로세스 스케줄러: 실행 가능한 프로세스 중 CPU에 할당할 프로세스를 선택
- 문맥 교환(Context Switch): 실행 중인 프로세스를 다른 프로세스로 전환할 때 CPU 상태(레지스터, PC 등)를 저장하고 복원하는 작업
프로세스 생성
fork() CreateProcess() API 시스템 콜로 프로세스 복제 및 생성
프로세스 간 통신(IPC)
공유 메모리(Shared Memory)
개념 | 두 개 이상의 프로세스가 하나의 물리적 메모리 영역을 함께 접근할 수 있도록 운영체제가 허용하는 방식 |
특징 | 데이터를 메모리에 직접 읽고/쓰기 때문에, 커널을 거쳐 메시지를 전달하는 방식보다 빠름 메모리를 공유하지만, 각 프로세스의 주소 공간에 동일한 물리 메모리 페이지가 매핑되는 구조 단순히 '같은 메모리'를 쓰는 것만 제공하고, 동기화는 운영체제가 자동으로 해주지 않아 개발자가 직접 구현해야함 |
동작 원리 | 1. 공유 메모리 생성: 한 프로세스 (혹은 둘 다) 가 운영체제에 공유 메모리 시그먼트를 만들도록 요청 shm_open() 2. 매핑: 생성된 공유 메모리 세그먼트를 각 프로세스의 가상 주소 공간에 매핑. 이때 각 프로세스는 해당 주소를 통해 같은 물리 메모리를 바라봄 3. 데이터 읽기 / 쓰기 4. 제거 / 해제 |
장점 | 속도: 커널을 거치지 않고 메모리에 바로 접근하여 메시지 큐, 파이프보다 빠름 대용량 데이터 전송에 효율적 양방향 통신 가능 |
단점 | 동기화 필요. 동시에 같은 메모리를 쓰면 데이터 경합(Race Condition) 발생 보안 문제: 권한 제어 하지 않으면 다른 포로세스가 임의 접근 가능 메모리 관리 복잡성: 사용 후 해제하지 않으면 메모리 누수 발생 |
실무 활용 예 | 밀티프로세스 웹서버 캐시: 여러 워커 프로세스가 동일 캐시 데이터 접근 |
메시지 전달(Message Passing)
- 프로세스 간에 메시지를 교환
- Mach OS는 기본 IPC 방식으로 메시지 전달 사용
파이프(Pipe)
- 일반 파이프(Anonymous Pipe): 부모-자식 관계에서만 사용, 단방향
- 지명 파이프(Named Pipe/FIFO): 파일 시스템에 이름을 갖고, 관계 없는 프로세스 간도 통신 가능
- pipe() 시스템 콜로 일반 파이프 생성
클라이언트-서버 통신
- 소켓(Socket): 네트워크를 통한 프로세스 간 통신
- 원격 프로시저 호출(RPC): 다른 컴퓨터의 함수를 로컬 함수처럼 호출