CS/운영체제

[운영체제] 3. From program to process / CPU Virtualization

공영재 2023. 10. 2. 19:25

Reference - Operating Systems: Three Easy Pieces

 

 

https://pages.cs.wisc.edu/~remzi/OSTEP/

 

Operating Systems: Three Easy Pieces

Blog: Why Textbooks Should Be Free Quick: Free Book Chapters - Hardcover - Softcover (Lulu) - Softcover (Amazon) - Buy PDF - EU (Lulu) - Buy in India - Buy Stuff - Donate - For Teachers - Homework - Projects - News - Acknowledgements - Other Books Welcome

pages.cs.wisc.edu

 

Processors and Assembly

 

processor : CPU나 Microprocessor와 같은 하드웨어를 의미한다.

(process는 메모리에 적재된, 프로세서에 의해 실행중인 프로그램을 의미하므로 두 단어는 차이가 있다.)

 

Architecture : ISA(명령어 집합 구조) = 하드웨어와 소프트웨어 사이, 최하위 레벨의 programming Interface. ex) x86, arm

microarchitecture : ISA를 물리적으로 구현하는 방법. ex) 펜티엄, i5, ...

intel과 amd는 모두 같은 Computer Architecture인 x86을 사용하지만, 그 성능은 제각각이다.

그 이유는 아키텍처는 같아도 이를 구현하는 마이크로아키텍처가 다르기 때문이다.

 

CPU의 아키텍처(설계방식)으로는 크게 CISC와 RISC가 있다.

CISC(Complex Instruction Set Computer)는 많은 명령어를 가지고 있어 설계가 어려우며, 소프트웨어적 제어 방식이다.

가변 길이 명령어 형식이며, 호환성은 좋지만 속도가 느리다. 컴파일도 쉽다. ex) Intel, amd

RISC(Reduced Instruction Set Computer)는 CISC에 비해 적은 명령어를 가지고 있으며, 하드웨어적 제어 방식이다.

고정 길이 명령어 형식( => 빠름)이며, 구조가 간단하지만 호환성이 안좋다. ex) RISC-V, 고성능 워크스테이션

하드웨어가 간단한만큼 소프트웨어 컴파일러 최적화가 요구되므로 소프트웨어는 복잡해진다.

 

Compiling, Linking, and Loading

 

Compiling이란 코드가 컴파일러를 통해 어셈블리어로 변환되고, 어셈블리어가 어셈블러를 통해 object files로 변환되는 일련의 과정 전부를 통칭한다.

Linking이란 컴파일 과정으로 생성된 object file들이 Linker를 통해 .p파일이라 불리는 executable object file로 변환되는 과정을 말한다. 쉽게 말하면 실행 파일이다.

 

유닉스 계열 실행 파일은 ELF라는 format을 가지고 있다. 그 구조는 아래와 같다

ELF Header는 실행 파일에 대한 byte ordering, file type 등의 정보를 가지고 있다. 

.text section에는 mov, int 0x80 등의 바이너리 형식 명령어가 들어간다.

.rodata section에는 읽기만 가능한 데이터, 즉 static이나 const 값들이 들어간다.

.data section에는 초기화된 전역변수가 들어간다.

그 외에 .bss section에는 초기화되지 않은 전역변수가 들어간다.

Section header table에는 section name, virtual address 등의 section에 대한 메타데이터가 들어간다.

 

Loading이란 linker로 생성된 실행 파일이 loader를 통해 DRAM과 같은 메인메모리로 전달하는 과정을 말한다.

loading까지 끝나면 OS는 프로그램을 실행할 준비가 된 것이다. 

 

Process

 

다시 복기하자면, Process는 실행중인 프로그램 상태를 말한다. 프로세스는 아래의 2가지 추상화를 제공한다. 

- logical control flow : 프로세스 간의 스위칭을 통해 각각의 CPU가 있는 것처럼 함.

- private virtual address space : 각각의 memory가 있는 것처럼 함.

Process API를 통해 생성, 제거, wait 등을 사용할 수 있다.

 

프로그램 실행과정

1. 컴파일과 링킹을 거친 exe 파일(.p)을 메모리에 loading한다.

2. stack 메모리 공간에 local variable, function parameter 등을 적재한다.

3.  heap 메모리 공간에 데이터를 동적할당한다.

4. File descripter(stdin, ...)와 I/O 처리를 수행한다.

5. 준비를 마치면 시작지점 (= entry point = main.c) 으로 이동해 프로그램을 실행한다.

 

이때 하나의 CPU로 돌아가는 여러개의 프로세스들은 각각의 logical flow를 가진다.

이것이 어떻게 가능할까?

 

CPU Virtualization

프로세스들은 CPU Virtualization을 통해 각각의 CPU가 존재하는 것처럼 동작할 수 있다.

이는 Time Sharing과 Context Switching이라는 Mechanism으로 가능하다.

또한 Time Sharing과 동시에 성능 효율성을 위한 scheduling Policy가 필요하다.

운영체제에서 Policy와 Mechanism을 잘 구분해야하는데, Mechanism은 어떻게 할 것인지, Policy는 무엇을 할 것인지라 이해하면 편하다.

 

 용어를 정리하자면, Time Sharing은 하나의 프로세스를 돌리다가, 멈추고 다른 프로세스를 돌리도록 하는 방법을 말한다.

Context Switching은 Time Sharing으로 process를 switching하는 중 프로세스 상태를 저장했다가 복원하는 과정을 말한다.