티스토리 뷰
※ 반효경 교수님의 운영체제와 정보기술의 원리를 기반으로 작성하였습니다.
프로그램의 실행
프로그램의 실행(execution)이라고 함은 크게 두 가지 의미를 가진다. 첫 번째는 디스크에 존재하던 실행파일이 메모리에 적재되는 것이고, 두 번째는 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태라는 것이다. 일반적인 컴퓨터 시스템에서 CPU는 하나만 존재하므로 매 시점 실행되는 프로그램은 한 개이지만, 여러 프로그램이 짧은 시간 동안 CPU를 나누어 쓰면서 메모리에 동시에 적재되어 있을 수 있으므로 여러 프로그램이 동시에 실행된다는 말을 보편적으로 사용한다.
메모리에 적재된다는 것을 프로그램 구조와 함께 조금 더 구체적으로 알아보자.
프로그램의 구조
컴퓨터 프로그램은 프로그래밍 언어(Python, Java 등)으로 작성되는데 어떤 언어로 작성되었든 여러 함수들로 구성된다. 하나의 함수가 실행되면 그 내부에 있는 다른 함수를 호출하고, 호출된 함수의 실행이 끝나면 다시 원래의 함수의 위치로 돌아가 계속 프로그램을 실행하게 된다. 이렇게 프로그램이 CPU에서 실행되기 위해서는 프로그램의 주소 영역이 메모리에 올라가 있어야 한다.
프로그램의 주소영역은 크게 코드(code), 데이터(data), 스택(stack) 세 부분으로 구분된다. 코드 영역은 우리가 작성한 코드를 컴퓨터가 이해할 수 있는 기계어 명령(machine instruction) 형태로 변환해 저장하는 부분이고, 데이터 영역은 프로그램이 사용하는 데이터(예를 들어 전역 변수)들을 저장하는 부분이다. 스택영역은 함수 내부에서 다른 함수를 호출했을 때, 원래의 함수로 다시 돌아가기 위해 복귀할 주소 및 데이터를 임시로 저장하는 부분이다.
스택영역은 디버깅을 통해 쉽게 확인할 수 있다. 아래와 같이 func1을 호출하면 차례대로 func2,3,4를 호출하여 Hello를 프린트하는 코드가 있다. 이 코드를 IDE를 통해 돌려보면 보통 함수 stack을 확인할 수 있는 부분이 있다. 아래 이미지는 vscode에서 call stack을 캡처한 것이다. 실제 스택 영역을 보여주는지는 모르겠지만 이런 식으로 스택 영역에 복귀 함수가 쌓일 것이라고 생각해 볼 수 있다.
가상메모리(논리적 메모리)
현재 사용중인 프로그램을 프로세스(process)라고 하고, 프로세스마다 주소 공간을 가지는데 이 주소공간을 가상의 영역에서 메모리 주소 0번부터 시작하는 독자적인 메모리 공간에 올리는 것을 가상메모리(virtual memory) 혹은 논리적 메모리(logical memory)라고 한다. 가상메모리 중 실행에 필요한 일부의 영역이 RAM과 같은 물리적 메모리에 적재되어 CPU의 실행에 이용되고, 나머지 부분은 디스크의 특정 영역(스왑 영역)에 내려가 있는다. 스왑 영역은 디스크를 메모리의 연장공간으로 사용한 것이라고 보면 된다. 프로그램이 종료되고 나면 RAM에 올라가 있는 프로그램은 사라진다.
커널의 주소 영역 구조
운영체제도 하나의 프로그램이므로 코드, 데이터, 스택의 구조를 가지는 주소 공간 구성을 가지고 있다.
운영체제의 코드는 커널의 기능에 맞게 CPU와 메모리 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공하기 위한 부분이 주를 이루고 있다. 또한, 시스템 콜 및 인터럽트를 처리하기 위한 코드도 포함한다.
데이터 영역에는 각종 자원을 관리하기 위한 자료구조가 저장된다. 크게 하드웨어를 관리하기 위한 자료구조와 프로세스를 관리하기 위한 자료구조가 있다. 프로세스 관리를 위한 자료구조를 PCB(Process Control Block)이라고 하며, 프로세스마다 존재한다. 이것은 프로세스의 상태, CPU사용 정보, 메모리 사용 정보 등을 유지하기위한 것이다.
스택 영역은 일반 프로그램의 스택 영역과 마찬가지로 복귀 주소를 저장하기 위함이다. 프로세스가 특권 명령을 수행하기 위해 시스템 콜을 호출하고, 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀 주소를 저장한다. 이때 이 복귀 주소는 커널에서만 접근 가능한 것이므로 프로세스의 주소 영역과는 별도의 공간이 필요한 것이다. 또한 커널은 일종의 공유 코드로서 모든 사용자 프로그램이 사용할 수 있으므로, 일관성 유지를 위해 각 프로세스마다 별도의 스택을 가지게 된다. 여기서 주의할 점은 시스템 콜이나 인터럽트 이후의 복귀 주소는 커널의 스택 영역에 저장되지만, 사용자 프로그램에서 운영체제로 수행 주체가 바뀌는 순간의 복귀 주소는 PCB에 저장된다는 것이다.
사용자 프로그램이 사용하는 함수
- 사용자 함수: 프로그래머가 직접 작성한 함수
- 라이브러리 함수: 이미 누군가 작성해놓은 함수를 호출만 하여 사용하는 것
- 커널함수: 운영체제 커널 코드에 정의된 함수. 커널함수를 사용하려면 인터럽트를 통해 제어권을 넘겨야 한다. 예를 들어, printf()와 같이 라이브러리 함수이지만 특권명령이 입출력을 포함하는 함수는 결국 시스템 콜을 동반함.
프로세스 실행의 두 가지 상태
크게 사용자 모드에서의 실행 상태(user mode running), 커널모드에서의 실행 상태(kernel mode running) 두 가지로 나누어진다. 예를 들어 프로세스 A에서 시스템 콜을 통해 운영체제가 CPU를 사용하고 있다고 하자. 이때 시스템 콜 이전은 user mode running, 운영체제가 CPU를 점유한 이후를 kernel mode running이라고 생각할 수 있지만, 프로세스에서 시스템 콜을 수행중일 때에도 user mode running이라고 한다.
'OS' 카테고리의 다른 글
5장. 프로세스 관리 (0) | 2023.02.18 |
---|---|
3장. 컴퓨터 시스템의 동작 원리 (1) | 2023.01.15 |
동기식과 비동기식 입출력 (0) | 2023.01.08 |
2장. 운영체제 개요 (0) | 2023.01.05 |
- TRACKING
- controllable GAN
- 운영체제
- 디지털신호처리
- mode collapse
- MLOps
- ML
- DSP
- Operating System
- OS
- 신호처리
- machine learning
- AI
- 3d object detection
- depth
- Raspberry Pi
- conditional GAN
- design pattern
- deeplearning
- Deep learning
- depthmap
- Depth estimation
- feature
- pcb
- ML Pipeline
- 딥러닝
- Generative Model
- image
- Building Basic GAN
- Gan
- Total
- Today
- Yesterday
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |