목차
하드웨어 및 운영 체제와 밀접하게 상호 작용하는 소프트웨어 개발을 시스템 프로그래밍이라 한다. 시스템 프로그래밍의 핵심 목표 중 하나는 시스템의 효율성과 성능을 최적화하는 것이다.
프로세스와 메모리는 이런 시스템 프로그래밍을 이해하기 위한 기초적인 개념이다. 이 두 요소는 컴퓨터 시스템의 효율적인 운영과 시스템 프로그래밍에 필수적이다.
1. 프로세스와 스레드
1-1. 프로세스
프로세스는 실행 중인 프로그램의 인스턴스로, 운영 체제로부터 메모리, CPU 시간, 디스크 공간 등의 자원을 할당받는다. 프로세스는 각각 독립된 메모리 공간을 가지며 독립적인 실행 단위로 간주된다.
1-2. 스레드
프로세스 내에서 실행되는 하나의 실행 단위. 모든 프로세스는 최소 하나의 스레드를 가지며, 멀티스레딩을 통해 한 프로세스 내에서 여러 작업을 동시에 처리할 수 있다. 스레드는 프로세스 내에서 코드 실행, 메모리 할당 등을 공유한다.
1-3. 프로세스의 생명 주기와 상태 전이
+------+ +-------+
| New | ----> | Ready |
+------+ +-------+
^ |
| v
+------+ +-------+
| Exit | <---- | Wait |
+------+ +-------+
프로세스의 생명 주기에는 다음 네 가지 상태가 있으며 각 단계를 성공적으로 마치면 종료된다.
- 생성: 프로세스가 생성되는 초기 단계
- 실행: 프로세스가 명령어를 수행하는 단계
- 대기: 프로세스가 이벤트나 자원을 기다리는 단계
- 종료: 프로세스의 실행이 완료되고 자원이 회수되는 단계
2. 프로세스의 메모리 구조
2-1. 기본 메모리 구조
+----------------------------------------------------------------+
| User Space |
| +----------------+ +----------------+ +----------------+ |
| | Process A | | Process B | | Process C | |
| | | | | | | |
| | +------------+ | | +------------+ | | +------------+ | |
| | | Code | | | | Code | | | | Code | | |
| | +------------+ | | +------------+ | | +------------+ | |
| | | Data | | | | Data | | | | Data | | |
| | +------------+ | | +------------+ | | +------------+ | |
| | | Heap | | | | Heap | | | | Heap | | |
| | +------------+ | | +------------+ | | +------------+ | |
| | | Stack | | | | Stack | | | | Stack | | |
| | +------------+ | | +------------+ | | +------------+ | |
| +----------------+ +----------------+ +----------------+ |
+----------------------------------------------------------------+
다음은 각 프로세스가 가지는 메모리 영역이다. 각 프로세스는 기본적으로 메모리 공간 내에서 힙(Heap), 스택(Stack), 코드(Code), 데이터(Data) 섹션을 지닌다.
- 코드(Code) 영역
- 모든 스레드가 공유하는 영역
- 프로세스를 실행하는 데 필요한 실행 파일의 기계어 코드가 저장된다.
- 이 코드는 프로세스 실행 동안 변경되지 않는다.
- 데이터(Data) 영역
- 전역 변수와 정적 변수가 저장되는 영역
- 프로그램 실행 중에 변경될 수 있다.
- 이 영역 역시 프로세스 내 모든 스레드에 의해 공유된다.
- 힙(Heap) 영역
- 동적 메모리 할당이 이루어지는 영역
- 모든 스레드가 접근할 수 있다.
- 프로그램 실행 중 메모리 공간의 할당과 해제가 자유롭게 수행된다.
- 스택(Stack) 영역
- 각 스레드별로 독립적인 스택이 존재한다.
- 이 영역은 함수 호출과 관련된 지역 변수, 매개변수 등을 저장하며, 함수의 호출과 반환에 따라 데이터가 추가되고 제거된다.
2-2. 상세 메모리 구조
다음은 상세 메모리 구조이다. 스레드는 멀티스레딩 환경에서 각각의 독립된 스택을 가지는데, 각 스레드는 독립적으로 함수를 호출하고, 자신의 지역 변수를 관리할 수 있다. 스택 내에는 한 개 이상의 스레드가 포함된다.
+-------------------------+
| Process Memory |
| |
| +---------------------+ |
| | Code | | <- Shared by all threads
| +---------------------+ |
| | Data | | <- Shared by all threads
| +---------------------+ |
| | Heap | | <- Shared by all threads
| +---------------------+ |
| | Shared Memory | | <- Explicitly shared between processes
| +---------------------+ |
| | Stack for Thread 1 | | <- Independent for each thread
| +---------------------+ |
| | Stack for Thread 2 | | <- Independent for each thread
| +---------------------+ |
| | Stack for Thread 3 | | <- Independent for each thread
| +---------------------+ |
| |
+-------------------------+
2-3. 공유 메모리 상세 구조
또한 프로세스에는 공유 메모리를 설정할 수 있다. 공유 메모리 영역은 두 개 이상의 프로세스가 명시적으로 접근할 수 있는 메모리 영역을 지칭한다. 이는 특별히 설정된 메모리 영역으로, IPC(Inter-Process Communication) 기법 중의 하나로 사용된다. 이 때 공유 메모리는 힙 영역에 설정하거나 별도 영역으로 구성할 수 있다.
- 힙 영역에 설정
// 힙 영역에 설정
+-------------------------+ +-------------------------+
| Process 1 | | Process 2 |
| | | |
| +---------------------+ | | +---------------------+ |
| | Code | | | | Code | |
| +---------------------+ | | +---------------------+ |
| | Data | | | | Data | |
| +---------------------+ | | +---------------------+ |
| | Heap | | | | Heap | |
| | | | | | | |
| | +-----------------+ | | | | +-----------------+ | |
| | | Shared Memory | <====+====> | Shared Memory | | |
| | +-----------------+ | | | | +-----------------+ | |
| +---------------------+ | | +---------------------+ |
| | Stack | | | | Stack | |
| +---------------------+ | | +---------------------+ |
| | | |
+-------------------------+ +-------------------------+
- 별도 공간에 메모리 매핑을 통해 구성
// 별도 공간에 메모리 매핑을 통해 구성
+-------------------------+ +-------------------------+
| Process 1 | | Process 2 |
| | | |
| +---------------------+ | | +---------------------+ |
| | Code | | | | Code | |
| +---------------------+ | | +---------------------+ |
| | Data | | | | Data | |
| +---------------------+ | | +---------------------+ |
| | Heap | | | | Heap | |
| +---------------------+ | | +---------------------+ |
| | Shared Memory | |<===>| | Shared Memory | |
| +---------------------+ | | +---------------------+ |
| | Stack | | | | Stack | |
| +---------------------+ | | +---------------------+ |
| | | |
+-------------------------+ +-------------------------+
'컴퓨터 과학 > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스와 메모리 구조(5): 프로세스 스케줄링(Process Scheduling) (0) | 2024.04.27 |
---|---|
[운영체제] 프로세스와 메모리 구조(4): 프로세스 제어 블록(PCB) (0) | 2024.04.27 |
[운영체제] 프로세스와 메모리 구조(2): 커널 공간과 사용자 공간 (0) | 2024.04.27 |
[운영체제] 프로세스와 메모리 구조(1): 메모리와 저장공간 계층구조(Memory Hierachy) (0) | 2024.04.27 |
[운영체제] HDD 구조와 디스크 스케줄링 (0) | 2024.03.15 |