프로세스 (Process)
- 컴퓨터에서 실행되고 있는 프로그램
- HDD/SDD에 있던 프로그램이 인스턴스화되어 메모리(RAM)에 올라가면 프로세스가 된다.
프로세스 상태 (Process State)
- New(=Create) : 생성 상태
- 프로세스가 생성된 상태 (이지만 아직 메인 메모리에 올라가지는 않았다.)
- fork() 또는 exec() 함수를 통해 생성되며, 이때, PCB가 할당된다.
fork() : 부모 프로세스의 주소 공간을 그대로 복사하여, 새로운 자식 프로세스를 생성한다.
exec() : 새롭게 프로세스를 생성한다.
- Ready : 대기 상태
- 메인 메모리 공간에 로드되어 CPU에서 실행을 기다리고 있는 상태
- Dispatcher 또는 Short-term scheduler에 의해 CPU로 컨텍스트 스위칭되기를 기다리는 상태
- 대기하는 프로세스는 여러 개 일 수 있으며, 이를 관리하기 위해 Ready queue 또는 Run queue 가 사용된다.
다른 이벤트가 발생하기를 기다리는 프로세스(정보 로드 또는 인터넷 연결을 기다리는 경우)는 Ready queue에 포함되지 않는다.
- Ready Suspended : 대기 중단 상태
- 메모리 부족으로 일시 중단된 상태
- 메모리 부족으로 일시 중단된 상태
- Running : 실행 상태
- CPU에서 프로세스의 명령어가 실행되는 상태
- 해당 프로세스는 커널 모드 또는 사용자 모드 중 하나에서 실행될 수 있다.
- 커널 모드
- 커널 모드에서 실행 중인 프로세스는 커널과 사용자 주소를 모두 접근할 수 있다.
- 권한이 필요한 명령을 포함한 하드웨어에 대한 무제한 액세스가 허용된다.
- 사용자 모드에서 system call이 발생하면 커널 모드로 전환된다.
- 사용자 모드
- 사용자 모드에서 실행 중인 프로세스는 자신의 명령어와 데이터에 접근할 수 있지만 커널 명령어와 데이터, 또는 다른 프로세스의 명령어와 데이터에는 접근할 수 없다.
- 그러나 운영 체제에 system call을 통해 서비스를 요청하면, 시스템은 사용자 모드에서 커널 모드로 전환하여 요청을 수행한다.
- 각 프로세스에 대한 가상 주소 공간이 있어 다른 프로세스에 영향을 미치지 않는다.
- 하드웨어 장치에 직접 액세스하는 것이 허용되지 않는다.
시스템 콜이란?
- Blocked(=Waiting) : 중단 상태
- 외부 상태 변경 또는 특정 이벤트 발생을 기다리는 상태
- I/O 대기 : 외부 I/O 장치(ex. 하드 디스크, 프린터 등)와 상호작용해야 하는 경우, 그 장치가 사용중이거나 사용 불가능한 경우에는 프로세스가 중단될 수 있다. 이때, 프로세스는 해당 I/O 작업이 완료될 때까지 기다리며 다른 작업을 수행하지 않는다.
- 사용자 입력 대기 : 프로세스가 사용자로부터 특정 입력을 기다리는 경우, 입력이 발생할 때까지 중단된다.
- 임계 영역 진입 대기 : 프로세스가 공유 데이터나 리소스에 접근해야 하는데 해당 리소스가 다른 프로세스에 의해 사용 중인 경우, 프로세스가 중단될 수 있다.
- 시스템 호출 대기 : 프로세스가 운영 체제의 특정 서비스 또는 기능을 사용하려면, system call을 통해 운영 체제에 요청을 보내야하는데, 이때 프로세스는 system call의 완료를 기다리며 중단된다.
- 이벤트가 발생하거나 입출력 작업이 완료되면 Ready 상태로 전환된다.
- Blocked Suspended : 일시 중단 상태
- Blocked 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
- Blocked 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
- Terminated : 종료 상태
- 프로세스의 실행이 완료되어 종료된 상태
- 부모 프로세스가 자식 프로세스를 강제로 종료시키는 경우도 있다.
- 운영체제는 프로세스의 자원을 해제하고 PCB를 제거하여 메모리 공간을 회수한다.
프로세스 주소 공간(=메모리 구조)
각각의 프로세스는 독립된 메모리 공간을 할당 받는데 4가지 부분으로 나눌 수 있다.
- Text (Code segment)
- 프로세스의 실행 가능한 코드가 저장되는 영역
- 공유 가능하며, 자주 실행되는 프로그램에 대해 메모리에 하나의 복사만 유지한다.
- 일반적으로 읽기/실행 전용이다.
- Data (BSS segment, Data segment)
- 전역 변수, 정적 변수, 상수 등 초기화된 데이터가 저장되는 영역
- 프로세스의 실행 도중에 값이 변경될 수 있다.
- BSS segment : 실행 시작 전에 0으로 초기화 또는 어떠한 값으로도 초기화 되어 있지 않은 변수가 저장되는 영역
- Data segment : 0이 아닌 값으로 초기화 된 변수가 저장되는 영역
- Heap
- 프로그램 실행 중에 동적으로 할당된 변수들을 관리하는 영역
- 주로 동적으로 생성된 데이터 구조나 객체가 저장된다. (ex. vector, linked list, hash, priority queue, etc)
- malloc()/free() 함수를 통해 관리되며, 시스템 호출(brk() 및 sbrk())를 사용하여 크기를 조절할 수 있다.
- Stack
- 지역 변수, 매개변수, 함수 호출 정보, 임시 데이터 등 함수 호출에 필요한 모든 데이터를 저장하는 영역으로 동적 할당된다.
- 각 함수 호출에 대한 스택 프레임이 생성되며, 매개변수, 복귀 주소, 지역 변수 등이 포함된다.
- 스택 포인터 레지스터가 스택의 최상위를 추적하며, 스택이 힙 포인터와 만나거나 RLIMIT_STACK에 지정된 한계에 도달하면 사용 가능한 여유 메모리가 소진된다.
PCB (Process Control Block)
- 운영체제가 각 프로세스를 관리하고 제어하기 위해 프로세스에 대한 메타데이터를 저장한 자료구조
- 프로세스가 생성될 때 할당된다.
메타데이터란?
데이터에 대한 데이터로 정보의 특성, 구조, 특징 또는 다른 데이터 요소를 설명하거나 식별하는 정보를 의미한다.
주어진 데이터 집합을 분석하고 관리하는 데 도움을 주며, 데이터를 효과적으로 이해, 조직 및 활용하는데 필수적이다.
PCB의 구조
- 프로세스 식별자(Process Id)
- 각 프로세스에는 고유한 식별자가 할당된다.
- 프로세스를 식별하고 구분하기 위해 사용
- 만약 자식 프로세스가 있다면 자식 프로세스 ID도 저장된다.
- 프로세스 상태(Process State)
- 프로세스의 현재 상태를 나타낸다.
- new(create), ready, running, waiting(blocked), terminated가 있다.
- 스케줄링 및 운영체제의 상태 관리에 사용
- 프로그램 카운터(Program Counter)
- 현재 프로세스가 다음에 실행할 명령어의 주소를 가리키는 레지스터 값
- 프로세스가 중단되었다가 다시 실행될 때, 이전 상태로 복원하기 위해 필요하다.
- 레지스터(Registers)
- 프로세스의 레지스터 값들을 저장한다. 레지스터에는 프로세스의 실행 상태와 관련된 정보가 포함된다.
- ex) 범용 레지스터, 스택 포인터, 프로그램 상태 레지스터 등의 값
- 프로세스 상태 전환이나 중단/복원 시에 레지스터 값을 유지하기 위해 필요하다.
- 스케줄링 정보(Scheduling Information)
- 프로세스의 우선순위, 스케줄링 알고리즘에 필요한 정보 등을 저장한다.
- 스케줄링 알고리즘이 결정되는 데 사용되며, 운영체제가 프로세스를 효율적으로 관리할 수 있도록 도와준다.
- 메모리 관리 정보(Memory Related Information)
- 프로세스의 메모리 할당과 관련된 메모리 영역의 범위, 페이지 테이블, 세그먼트 테이 등의 정보를 저장한다.
- 메모리 관련 유틸리티가 메모리 할당 및 해제를 관리하는 데 사용
- 계정 정보(Accounting Information)
- 프로세스와 관련된 계정 정보를 저장한다.
- ex) CPU 사용량, 실행 시간, 입출력 작업 통계 등
- 이러한 정보는 성능 모니터링, 로그 기록, 자원 사용 축적 등에 사용된다.
- I/O 관련 상태 정보(Status Information related to I/O)
- 프로세스와 관련된 입출력 장치의 상태 정보를 저장한다.
- ex) 현재 열린 파일, I/O 대기열, 입출력 상태 등
- 입출력 작업 관리와 관련된 운영체제 기능을 지원하기 위해 사용
PCB 사용
1. Context Switching (컨텍스트 스위칭)
- 다중 프로세스 환경에서 CPU가 한 프로세스에서 다른 프로세스로 전환하는 과정
Context Switching이 발생하는 상황
- 프로세스 스케줄링
- 현재 실행 중인 프로세스를 중지하고 다른 프로세스를 실행해야 하는 경우
- 현재 실행 중인 프로세스를 중지하고 다른 프로세스를 실행해야 하는 경우
- 인터럽트
- 현재 실행 중인 프로세스를 중지하고 인터럽트 처리를 위한 다른 프로세스를 실행해야 하는 경우
- 인터럽트를 처리한 후 원래 진행 중이던 프로세스를 다시 진행 할 경우
Context Switching 과정
- 현재 실행 중인 프로세스/스레드의 상태 저장 : 현재 실행 중인 프로세스/스레드의 레지스터 값, 프로그램 카운터, 상태 정보 등을 해당 프로세스의 PCB에 저장
- 다음 실행할 프로세스/스레드 정보 로드 : 다음으로 실행할 프로세스/스레드의 PCB에서 해당 프로세스의 레지스터 값, 프로그램 카운터, 상태 정보 등을 CPU에 로드
- 프로세스/스레드 상태 전환 : 현재 실행 중인 프로세스/스레드를 waiting 상태로 전환하고, 다음으로 실행할 프로세스/스레를 ready 또는 running 상태로 전환
- 이전 프로세스/스레 복원 : 컨텍스트 스위칭이 완료되면 CPU는 다음에 실행할 프로세스/스레드로 이동하고, 해당 작업의 프로그램 카운터(PC) 값부터 실행을 재개
Context Switching 비용
- 비용 = 컨텍스트 스위칭이 일어날 때 발생하는 유휴 시간(idle time)과 캐시미스
- 프로세스가 스레드보다 많이 든다.
- 스레드는 stack을 제외한 모든 메모리를 공유하기 때문에 컨텍스트 스위칭이 일어나도 stack 영역만 변경하면 된다.
캐시미스란?
CPU의 캐시 메모리에서 필요한 데이터나 명령어를 찾을 수 없는 상황
컨텍스트 스위칭이 일어날 때, 현재 실행 중인 프로세스의 캐시에 저장된 데이터 및 명령어는 새로운 프로세스의 것과 다를 수 있다. 따라서 이전 프로세스의 캐시 내용은 무효화하게 되는데 이 때문에 캐시미스가 발생한다.
2. 메모리와 CPU 레지스터 간 정보 전환
- 대기 중이거나 준비 중인 프로세스의 PCB는 메모리에 유지된다. 그리고 해당 프로세스가 실행되기 위해 선택되면 PCB의 정보가 CPU 레지스터로 올라간다.
- 즉, ready/waiting → 메모리, running → CPU 레지스터에 위치한다.
PCB 관리 방식
- 일반적으로 주기억장치(RAM)에 저장되며, 각 프로세스마다 PCB가 할당되고 주소를 통해 연결리스트 형태로 관리된다. PCB List Head에 PCB들이 생성될 때마다 연결 리스트에 추가된다.
- 연결 리스트는 PCB의 주소를 통해 각 PCB가 연결되어 있어, PCB의 삽입 및 삭제 작업이 용이하다.
- 프로세스가 생성되면 해당 프로세스에 대한 PCB가 생성되고, 프로세스가 종료되면 해당 PCB는 제거된다.
멀티프로세스
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것
- 한 번에 많은 서로 다른 작업을 처리할 때 사용 (ex. 웹 서버에서 여러 요청을 동시에 처리)
단점
- Context Switching이 발생하면 캐시에 존재하는 모든 데이터를 리셋하고 다시 캐시 정보를 불러와야 한다. 즉, Context Switching의 오버헤드가 커서 비용이 크다.
- 프로세스 간의 통신에 복잡한 IPC를 사용해야 한다.
장점
- 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생하더라도 다른 프로세스는 영향을 받지 않기 때문에 신뢰성이 높다.
IPC (Inter Process Communication)
프로세스는 독립적으로 실행되므로 다른 프로세스와 통신을 위해 운영체제의 커널 영역에서 IPC 기능을 제공한다.
IPC 종류
1. 공유 메모리 (Shared Memory)
- 여러 프로세스가 동일한 메모리 영역에 접근할 수 있게하는 것
- 프로세스가 커널에 공유 메모리 할당을 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해 주며, 이후 어떤 프로세스든 해당 메모리 영역에 접근할 수 있다.
- 중개자(메시지 큐의 큐) 없이 바로 메모리에 접근할 수 있기 때문에 IPC 중에 가장 빠르다.
- 그러나 동일한 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요하다.
2. 소켓
- 프로세스 간의 네트워크 통신을 위해 사용되는 방식
- 소켓을 생성하고 이름을 지정하여 사용한다.
- 서버-클라이언트 모델에서 연결, 통신, 종료 등의 작업을 수행하여 데이터를 교환한다.
3. 익명 파이프 (Anonnymous PIPE)
- 파이파는 두 개의 프로세스를 연결
- 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 읽기만 할 수 있다. (FIFO)
- 한 쪽 방향으로만 통신이 가능하기 때문에 단방향 통신 또는 Half-Duplex(반이중) 통신이라고 한다.
- 송수신을 동시에 수행해야하는 경우 두 개의 파이프를 사용해야 한다.
- 이 방식은 부모, 자식 프로세스 간에만 사용할 수 있다. (같은 부모를 가진 자식 프로세스들 사이도 가능)
4. 명명된 파이프 (Named PIPE)
- Named Pipe는 부모 프로세스와 관계없이 다른 프로세스 간에 통신 및 다른 네트워크상의 컴퓨터와도 통신이 가능하다.
- 파일 시스템에 특정 이름을 부여하여 다른 프로세스가 해당 이름을 통해 파이프에 접근할 수 있다.
- Named PIPE도 PIPE와 같이 읽기/쓰기가 동시에 가능하지 않다. 하지만 통신선로가 파일로 존재하므로 하나를 읽기 전용으로 열고 다른 하나를 쓰기 전용으로 열어서 전이중 통신을 구현할 수 있다. 결국 PIPE와 같이 두 개의 FIFO 파일이 필요하다.
5. 메시지 큐
- 선입선출 자료구조인 Queue를 이용하는 방식
- 커널에서 관리되는 메모리 공간을 통해 프로세스 간 통신한다.
- 송신 프로세스는 자신의 주소 공간에서 메시지 큐의 주소 공간으로 메시지를 복사하고, 메시지 큐는 자신의 주소 공간에 복사된 메시지를 수신 프로세스의 주소 공간으로 복사한다.
- 송신 프로세스는 자신의 주소 공간에서 메시지 큐의 주소 공간으로 메시지를 복사하고, 메시지 큐는 자신의 주소 공간에 복사된 메시지를 수신 프로세스의 주소 공간으로 복사한다.
- 메시지 큐는 클라이언트와 동기 방식으로 많은 데이터 통신을 수행하면 병목 현상이 발생할 수 있으므로, 서버의 성능 저하를 방지하기 해 메시지 처리를 위임하여 순차적으로 처리하는 방식을 사용한다. 대용량 데이터 처리, 채팅 서비스 등에 사용된다.
- 다양한 프로세스가 동시에 데이터를 다룰 수 있다는 장점이 있다.
6. 메모리 맵 (Memory Map)
- 공유 메모리와 마찬가지로 메모리를 공유한다.
- 차이점은 Memory Map의 경우 파일을 메모리에 맵핑하여 메모리 영역에 연결한다는 것이다.
- 프로세스가 파일을 읽거나 쓰기 위해서는 저장매체에서 메모리로 데이터를 이동해야 하는데, 이때 메모리 맵을 사용하면 파일을 메모리에 직접 맵핑함으로써 이동 과정을 줄이고, 파일을 메모리처럼 다룰 수 있다.
- 이를 통해 대용량 파일을 읽을 때 파일 전체를 메모리에 맵핑하여 읽기 작업을 진행할 수 있다. 이는 파일을 조각조각 나누어 읽는 방식보다 훨씬 효율적이다.
- 또한, 여러 프로세스가 동일한 파일을 메모리 맵으로 연결하여 데이터를 공유할 수 있다.
[참고]
https://www.geeksforgeeks.org/states-of-a-process-in-operating-systems/
https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/
https://www.geeksforgeeks.org/process-table-and-process-control-block-pcb/
'Computer Science > Operating System' 카테고리의 다른 글
[OS] Blocking & Non-Blocking I/O (0) | 2023.07.16 |
---|---|
[OS] Blocking/Non-blocking & Synchronous/Asynchronous (0) | 2023.07.16 |
[OS] 파일 시스템 (File System) (0) | 2023.06.17 |
[OS] 메모리 (Memory) (0) | 2023.06.17 |
[OS] Thrashing (0) | 2023.06.17 |