| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- 오퍼레이팅시스템
- 오에스
- 구현
- 코딩
- c++
- 컴공과
- 북리뷰
- 그래프
- DP
- cs
- Computer science
- Stack
- 자료구조
- 정석학술정보관
- OS
- 개발
- coding
- Operating System
- 너비우선탐색
- 브루트포스
- vector
- 코테
- 백준
- 문제풀이
- bfs
- 컴퓨터공학과
- 컴공
- 스택
- 알고리즘
- 정석
- Today
- Total
Little Jay
[OS] Process Description and Control I (Terminologies, Memory, Stack) 본문
[OS] Process Description and Control I (Terminologies, Memory, Stack)
Jay, Lee 2022. 7. 26. 13:56Program vs Process
Program과 Process를 섞어서 많이 혼용한다. 그러나 두 용어는 본질적인 차이가 존재한다. 먼저 Program은 Passive Entity로서 디스크에 저장된 Binary Sequence이다. .data나 .text(code)들이 이에 해당한다. 반면 Process는 Active Entity로서 메모리에 올라간 Execution Sequence이다. Program은 따라서 메모리에 load 될 때 Process가 되는 것이다. 또한 하나의 프로그램이 여러 개의 프로세스로 나누어져 Multi Process가 될 수 있다. 하나의 프로그램이 여러 번 수행되는 것이 이에 해당한다. 따라서 다시 간략하게 두 용어의 차이는 실행 가능하거나, 실행 중, 혹은 처리기에 할당이 되었는지 여부에 따라서 Process와 Program으로 나뉘게 된다. 따라서 data와 code는 Process에서 필수적인 주요 요소가 된다. Process는 따라서 Instruction, current state(variable's value), system resource의 실행으로서 Characterize 한 activity의 단위이다. Program+
α 정도로 이해하면 쉬울 것이다. 또한 많은 교과서에서 Job, Task, Process를 같은 용어로서 설명하고 있다. 이는 어느 정도 일맥상통하지만 Mark Kernel에서는 task라는 단어는 resource allocation의 기본 단위이고, thread는 execution state의 기본 단위의 의미로 사용되기 때문에 이 부분을 조심해서 사용하면 되겠다.
Memory Layout

위의 그림은 대락적인 C Program에서의 Memory Layout이다. 시스템 프로그래밍의 Linking 쪽에서 한번 다루었으니 참고하면 좋을 것이다. 메모리에 프로그램이 올라갈 때는 모든 것이 이렇게 Segment 단위로 나누어 저장이 된다. 그림의 위쪽인 Higher Address이고 아래쪽이 Lower Address라고 생각하면 편할 것이다. 특히 중요한 것은 stack인데 이는 Execution Sequence에서 꼭 필요하다. Runtime시에 Stack이 Allocate 되고, Deallocate 된다. 또한 stack은 Procedure단위별로 생기기 때문에 동적으로 할당하는 이 부분이 필요하다. Heap부분에는 malloc 같은 동적 메모리 할당 관련 코드들이 들어가게 된다.
Execution Sequence and Stack
Program의 Execution Sequence를 잡기 위해서, 즉 실행의 흐름을 잡기 위해서 Stack은 필수적이다. Stack은 기본적인 자료구조로서 LIFO(Last in First Out) list 형태를 띄고 있다. Stack을 Call Stack이라고 부르기도 한다. Program의 실행 흐름을 저장하기 위해 subroutine을 담고 있는 Stack을 의미하는데, execution stack, control stack, run-time stack 등 다양한 용어로 불린다. 그러나 중요한 것은 우리는 OS 상에서 메모리에 Stack을 Alloc/Dealloc 함으로써 Execution Sequence를 잡는다는 것이다. Processor가 어떤 Sys Call이나 Function, Interrupt 등의 행동을 발생시키면 어쨌든 Processor는 현재의 작업이 아니라 다른 작업을 하러 가야 한다. 따라서 이때 복귀 주소를 Stack의 최상단에 push 하게 된다.


위 그림의 왼쪽은 메모리에 있는 Process라고 하자. 실행 흐름을 따라가보자면 Main에서 P1을 호출하고, P1에서는 P2를 두 번 호출한다. 그림의 왼쪽 그림은 이 Execution Sequence의 실행 흐름을 Stack의 관점에서 바라본 것이다. Main에서 P1을 호출할 때 복귀 주소인 6201번지를 Stack에 Push 한다. 그리고 P1에서 P2를 호출할 때 복귀 주소인 8101번지를 다시 Push 한다. P2는 실행되다가 마지막에 Return 되는데, 이때 다시 P1으로 돌아와야 하므로 복귀 주소가 저장된 Stack에서 pop 하여 복귀 주소로 돌아간다. 그리고 다시 P2를 호출해야 하니 8301번을 Push, P2가 끝났으니 pop, P1이 끝났으니 pop 하는 과정을 거치게 된다.
Implementation of Stack
Stack을 구현하기 위해서는 HW적인 지원이 필요한다. Stack의 주소는 특이하게도 High Level에서 Low Level로 내려가는 형태로 구현이 된다. 메모리의 내부를 Segment로 나눈 위의 그림을 보면 Stack은 내려가고, Heap은 올라가는 모습을 보이는 것을 확인할 수 있다. Stack은 동적인 부분이기에 Stack Pointer를 관리해주기 위한 레지스터가 필요하다. 이 레지스터는 Stack의 top의 주소를 담고 있는 레지스터 이다. 대부분의 아키텍처에서 SP로 구분이 된다. 또한 Stack 영역이 다른 Segment들을 침범하지 않게 해 주기 위한 Stack Base와 Stack Limit이 필요하다. 따라서 Stack Base <= SP <= Stack Limit의 관계가 성립한다. 또한 이 Stack에는 복귀 주소뿐만이 아니라 Parameter, Return Parameter까지 Stack에 저장하여 전달할 수 있다. 이러한 Stack의 구조를 Stack Frame이라고 하며 이를 activiation record, activiation frame이라고도 한다.
'Univ > Operating System(OS)' 카테고리의 다른 글
| [OS] Process Description and Control III (Process State Models) (0) | 2022.07.30 |
|---|---|
| [OS] Process Description and Control II(Process Description, PCB, Process Image) (0) | 2022.07.28 |
| [OS] System Call (POSIX API) (0) | 2022.07.25 |
| [OS] Resource Protection (Kernel Mode, Timer) (0) | 2022.07.21 |
| [OS] Operating System Overview II (Evolution through History) (0) | 2022.07.19 |