일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- stack
- BOJ
- Euclidean
- Gold
- level1
- Flyweight Pattern
- binary search
- BFS
- effective C++
- trie
- 3D RPG
- dirtyflag pattern
- SWEA
- Bronze
- solid 원칙
- Zenject
- Silver
- knapsack Problem
- algorithm
- Project
- Modern C++
- level3
- programmers
- two pointer
- 8-Puzzle
- Unity
- 프로세스 상태
- PrefixSum
- LEVEL2
- 프로그래머스
- Today
- Total
Patrick's Devlog
[운영체제] 프로세스 본문
프로세스
프로세스는 쉽게 설명하면 실행 중인 프로그램이다. 보통 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하면 해당 프로그램은 프로세스가 된다. 이러한 과정을 프로세스를 생성한다고 생각하면 된다.
종류
1. 포그라운드 프로세스(Foreground Process)
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스
2. 백그라운드 프로세스(Background Process)
- 사용자가 볼 수 없는 공간에서 실행되는 프로세스
- 사용자와 상호작용이 가능한 프로세스, 상호작용 하지 않고 일만 하는 프로세스(데몬, 서비스) 두 가지로 나뉨
프로세스 제어 블록(PCB, Process Control Block)
모든 프로세스는 실행을 위해 CPU를 필요로 하나, CPU 자원은 한정되어 있다. 쉽게 말해 모든 프로세스가 CPU를 동시에 사용할 수 없다. 따라서 프로세스들은 차례대로 돌아가며 정해진 시간동안 CPU를 이용한다. 이 때, 타이머 인터럽트(클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트) 발생 시 차례를 양보한다.
빠르게 번갈아 수행되는 프로세스를 관리하기 위해 생겨난 자료구조가 PCB이다. 프로세스 관련 정보를 저장하는 자료 구조이며, 상품에 달린 태그와 같은 정보로 생각하면 된다.
대표적으로 PCB에 담기는 정보는 위의 그림과 같다.
- 프로세스 ID : 특정 프로세스를 식별하기 위해 부여하는 고유 번호
- 프로세스 상태 : 프로세스의 현재 상태 저장
- 레지스터의 값 : 프로그램 카운터, 스택 포인터 등 프로세스가 실행하며 사용했던 레지스터의 값들
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당 받을지에 대한 정보
- 메모리 정보 : 프로세스가 어느 주소에 저장되어 있는지에 대한 정보, 페이지 테이블 정보
- 사용할 파일과 입출력 장치 정보 : 할당된 입출력장치, 사용중인(열려있는) 파일 정보
이는 운영체제마다 상이하며, PCB는 커널 영역에 생성된다.
문맥 교환(Context Switching)
CPU는 한정되어 있으므로 돌아가면서 사용하기 위해 문맥 교환을 이용한다. 예를 하나 들어보면 A 프로세스가 B 프로세스로 순서가 넘어갈 때, A 프로세스는 지금까지 중간 정보(문맥)를 백업한다. 뒤이어 실행할 B 프로세스 문맥을 복구하면 자연스레 실행 중인 프로세스가 바뀐다. 이처럼 기존에 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 문맥 교환이다.
사용자 영역에서의 프로세스 메모리 구조
커널 영역에 PCB가 생성되는 반면, 사용자 영역에서는 프로세스 메모리 영역이 아래의 그림 처럼 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘게 된다.
1. 코드 영역(= 텍스트 영역)
- 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역
2. 데이터 영역
- 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
- 임시로 쓰는 데이터가 아니므로 프로그램 시작과 함께 할당되며, 프로그램 종료 시 소멸
3. 힙 영역
- 사용자(프로그래머)가 직접 관리할 수 있는 그리고 반드시 그렇게 해야만 하는 메모리 영역
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제 됨
- 스택과 다르게 낮은 주소에서 높은 주소 방향으로 할당
ex> C의 malloc, C++의 new 등으로 동적 할당 가능
4. 스택 영역
- 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역
- 함수 호출 시 할당되며 함수 호출 완료 시 소멸
- 스택은 push를 통해 데이터 저장, pop을 통해 데이터 인출
→ LIFO 방식에 따라 동작하므로 가장 늦게 저장된 데이터가 가장 먼저 인출
- 메모리 주소가 높은 주소에서 낮은 주소의 방향으로 할당됨
여기서 힙과 스택의 영역의 크기는 가변적으로 변할 수 있다. 일반적으로 힙은 낮은 주소 → 높은 주소 순으로 할당이 되고 스택은 높은 주소 → 낮은 주소순으로 할당된다.
힙 VS 스택 영역
스택 | 힙 |
매우 빠른 액세스 | 상대적으로 느린 액세스 |
변수를 명시적으로 할당 해제할 필요 X | 변수 할당 및 해제의 책임 有 |
지역 변수만 저장 | 전역적으로 변수 저장 및 액세스 가능 |
CPU에 의해 관리 → 메모리 단편화 X | 메모리 관리해야 함 → 효율적 공간 사용 보장하지 않으면 할당 후 메모리 조각화되어 강제 해제 |
스택 크기 제한(OS에 따라 다름) | 메모리 크기 제한 X |
변수 크기 조정 X | malloc, realloc, new 로 할당 및 크기 조정 가능 |
참고 문서 및 자료
'Computer Science > Operating System' 카테고리의 다른 글
[운영체제] 프로세스 상태 (0) | 2024.10.28 |
---|