[wiki용] PintOS 키워드 정리(중...)

Serye·2023년 4월 22일
1

운영체제

목록 보기
1/7
post-thumbnail

Project 0: PintOS

Virtual Machine ~= Hypervisor

[ 가상 머신(Virtual Machine) ]
하드웨어 자원을 소프트웨어적으로 추상화하여, 여러 개의 가상 환경(VM)을 생성하고 이들을 독립적으로 실행할 수 있는 가상화 기술.

* 가상화(virtualization): 단일 PC나 서버가 동시에 여러 운영체제 또는 단일 운영체제의 여러 세션을 실행할 수 있게 해준다.

[ Hypervisor ]
가상 머신을 생성하고 관리하기 위한 가상화 소프트웨어로 하드웨어와 가상머신 사이에서 자원 중개자의 역할을 수행한다.

qemu

Quick Emulator의 약자


Common bugs

Memory leak(메모리 누수)

컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상. 할당된 메모리를 사용한 다음 반환하지 않는 것이 누적되면 메모리가 낭비된다. 더 이상 불필요한 메모리가 해제되지 않으면서 메모리 할당을 잘못 관리할 때 발생한다.

Race condition(경쟁 상태)

두 개 이상의 프로세스가 공유 자원을 동시에 접근을 시도하는 상태. 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있다.

Deadlock(교착 상태)

두 개 이상의 프로세스 각각이 서로 상대방(다른 프로세스)의 작업이 끝나기만을 기다리고 있기 때문에 두 개 이상의 프로세스들이 더 이상 진행을 할 수 없는 상태.

Use after free

해제된 메모리를 참조하면 프로그램이 충돌하거나 예기치 않은 값을 사용할 수 있다.


Project 1: Threads

Time-sharing system(시분할 시스템)

각 사용자 프로그램이 짧은 시간동안 번갈아 수행되도록 해주는 운영체제를 통해, 다수의 사용자가 동시에 시스템에 접근할 수 있다. 각각의 사용자에게 컴퓨터 시스템의 자원(프로세서, 메모리, 입출력 장치 등)을 일정한 시간 비율로 할당하여, 동시에 여러 사용자가 작업을 수행할 수 있도록 한다.
정해진 일정 시간 간격으로 현재 수행 중인 사용자는 선점되고(preempted) 다른 사용자가 적재된다. 추후에 이전에 선점되었던 사용자 프로그램의 수행을 재개하기 위해, 새로운 사용자 프로그램과 데이터를 읽기 전에 이전 사용자 프로그램과 데이터를 디스크에 저장하여 보존하였다. 그 후 다음번 차례가 되면 이전 사용자 프로그램은 전에 사용했던 주기억장치 공간을 다시 차지하게 된다.

Context Switching(문맥 교환)

운영 체제에서 실행 중인 하나의 프로세스가 다른 프로세스로 전환될 때, 현재 프로세스의 상태 정보를 저장하고 다음 프로세스의 상태 정보를 불러오는 작업.

* context: 프로세스와 관련된 정보들의 집합

이 과정에서 운영 체제는 현재 실행 중인 프로세스의 정보(프로세스 상태, 레지스터 값, 프로그램 카운터 등)를 PCB(Process Control Block)에 저장하고, 다음 실행할 프로세스의 정보를 불러와 레지스터에 로딩합니다. 이후 CPU는 새로운 프로세스에게 제어를 넘기고 작업을 계속합니다.

* 프로그램 카운터: 다음에 실행할 명령어의 주소를 저장하는 레지스터. CPU가 명령어를 실행할 때마다, 프로그램 카운터는 다음에 실행할 명령어의 주소를 가리키도록 업데이트된다. 따라서, 프로그램 카운터는 현재 수행 중인 명령어의 위치를 추적하고, 다음에 실행할 명령어의 위치를 결정하는 데 사용된다.

Scheduler

  • Round Robin(RR)
  • Priority(Priority donation)
  • Multi-Level Feedback Queue Scheduler(MLFQS)(4BSD, nice)

Thread

🤔 프로세스와 스레드의 차이
프로세스: 프로세스는 실행 중인 프로그램의 인스턴스이다. 프로그램 코드, 데이터 및 시스템 리소스를 캡슐화하는 독립적인 엔터티이다. 각 프로세스는 자체 주소 공간을 가지며 다른 프로세스와 격리된다.
스레드: 스레드는 프로세스 내의 가벼운 실행 단위이다. 독립적으로 예약하고 실행할 수 있는 일련의 명령을 나타낸다. 동일한 프로세스 내의 스레드는 동일한 주소 공간과 리소스를 공유한다.

  • Thread control block(TCB)

Timer interrupt

타이머 인터럽트는 미리 정의된 간격 또는 타이머 값을 기반으로 주기적인 인터럽트를 생성하기 위해 컴퓨터 시스템에서 사용되는 하드웨어 생성 인터럽트이다.


Timer sleep


Synchronization

Semaphore

lock

condvar


Project 2: User Programs

User mode vs. Kernel mode

컴퓨터의 중앙처리장치(CPU)는 두 가지 모드로 동작할 수 있다.: 유저 모드와 커널 모드이다.

유저 모드는 일반적인 응용 프로그램이 동작하는 모드로, CPU가 실행하는 명령어 중 대부분은 유저 모드에서 실행된다. 이 모드에서는 시스템 자원에 직접적으로 접근할 수 없고, 반드시 운영체제(커널)를 통해 접근해야 한다.

커널 모드는 운영체제가 동작하는 모드로, 시스템 자원에 직접적으로 접근할 수 있다. 운영체제는 커널 모드에서 실행되며, 커널 모드에서만 실행 가능한 명령어들을 사용할 수 있다.


Process

Process Environment Block(PEB)

PEB는 프로세스의 유저 모드에서 실행되는 부분에 대한 정보와 함께 프로세스와 관련된 여러 정보들을 담고 있다. PEB는 각 프로세스마다 존재하며, 윈도우 운영체제 내부적으로 매우 중요한 역할을 한다. PEB에는 프로세스의 이미지, 메모리 상태, DLL, 환경 변수, 핸들 테이블 등 많은 정보들이 저장된다.

Process identifier(PID)

프로세스 식별자(Process identifier, PID)는 운영체제에서 각 프로세스에 할당된 고유한 식별번호이다. 이 식별번호를 사용하여 운영체제는 프로세스를 구분하고 관리할 수 있다.
PID는 일반적으로 0에서 65,535 사이의 정수값으로 표현된다. 운영체제가 프로세스를 생성할 때마다 새로운 PID를 할당하며, 각 프로세스는 할당된 PID를 가지게 된다. PID는 시스템 전역에서 유일해야 하므로, 같은 PID를 가진 프로세스는 동시에 존재할 수 없다.

PID는 프로세스 관리에 중요한 역할을 한다. 예를 들어, 운영체제는 특정 PID를 가진 프로세스를 종료시킬 수 있으며, 특정 PID를 가진 프로세스에게 시그널을 보낼 수 있다. 또한, 프로세스를 모니터링하거나 디버깅할 때도 PID를 사용한다.


User stack

유저 스택(user stack)은 유저 모드에서 실행 중인 프로세스가 함수 호출을 할 때 매개 변수, 지역 변수 및 함수 호출 정보를 저장하는 메모리 영역이다. 스택은 Last-In-First-Out(LIFO) 방식으로 동작하며, 프로세스가 함수를 호출하면 해당 함수의 매개 변수 및 지역 변수가 스택에 푸시(push)되고, 함수가 반환되면 스택에서 팝(pop)된다. 스택은 주로 x86 아키텍처의 경우, 스택 포인터(SP) 레지스터를 사용하여 관리된다.


x86_64 calling convention

함수 호출시 레지스터와 스택을 어떻게 사용할지에 대한 규칙입니다. 함수를 호출하면 호출된 함수에서 사용할 인자들을 레지스터와 스택에 저장하고, 반환할 값을 레지스터에 넣는다.


Reigister vs. Memory

[ Register ]
Register는 CPU 내부에 있는 작고 빠른 저장소입니다. CPU는 명령어를 실행할 때 Register에 있는 값을 읽어와 연산하고, 결과를 다시 Register에 저장합니다. Register는 CPU의 일부분이므로 다른 저장소에 비해 빠릅니다. 또한 Register는 개수가 제한되어 있으므로 자주 사용하는 데이터를 저장하기에 적합합니다.

[ Memory ]
Memory는 주로 하드웨어 장치 중 하나인 RAM(Random Access Memory)을 의미합니다. Memory는 크고 느리지만, 대신 컴퓨터에서 가장 기본적인 저장소입니다. CPU는 Memory에서 데이터를 읽어와 Register에 저장하거나, Register의 값들을 Memory에 저장합니다. 프로그램과 데이터는 Memory에 저장되어 실행됩니다.

Register와 Memory는 모두 데이터를 저장하기 위한 저장소이지만, Register는 빠르고 작으며, Memory는 크고 느립니다. 따라서 Register는 CPU의 연산 작업에 주로 사용되고, Memory는 데이터를 저장하는 데 사용됩니다.


argument vector

C 프로그래밍 언어에서 main 함수의 인자로 전달되는 문자열 배열.예를 들어, 다음과 같은 명령어를 실행할 경우:

$ my_program arg1 arg2 arg3
my_program의 main 함수에서는 다음과 같은 형식으로 argument vector를 받아들인다.
int main(int argc, char *argv[])
argc는 인자의 개수를 나타내고, argv는 인자들의 값(문자열)을 저장하는 포인터 배열이다. argv[0]은 항상 프로그램의 이름을 가리키고, argv[1], argv[2], ...은 순서대로 인자들의 값을 가리킨다.


Executable Linkable Format(ELF) & loader

[ Executable Linkable Format(ELF) ]
Executable and Linkable Format(ELF)은 실행 가능한 파일, 라이브러리 등의 이식 가능한 이진 파일 형식 중 하나입니다. ELF는 다양한 운영 체제에서 사용되며, 이진 파일 형식으로서 다양한 정보를 포함하고 있습니다.

ELF 형식은 크게 ELF header, program header, section header로 구성됩니다. ELF header는 ELF 파일의 전반적인 정보를 포함하고 있으며, program header는 프로그램 실행에 필요한 정보를 포함하고 있습니다. section header는 코드와 데이터 등의 섹션 정보를 포함합니다.

[ loader ]
ELF 형식을 이용하여 프로그램 실행 가능한 형태로 만들어주는 것이 loader입니다. loader는 운영 체제가 프로그램을 실행하기 위해 프로그램의 코드 및 데이터를 메모리에 로드하는 역할을 합니다. 운영 체제는 ELF 파일의 program header를 읽어서 필요한 정보를 찾은 후, 메모리에 적재하고, 실행 시작 위치로 이동하여 프로그램을 실행합니다.


system call(syscall)


file descriptor

운영체제에서 파일과 관련된 작업을 수행할 때 사용되는 매개변수. 파일 디스크립터는 파일에 대한 참조를 나타내며, 일반적으로 정수로 표시된다. 파일 디스크립터는 대개 프로세스 내에서 고유하며, 일반적으로 파일을 열 때마다 새로운 파일 디스크립터가 생성된다.
운영체제는 파일 디스크립터를 통해 파일에 접근하고 조작한다. 일반적인 파일 작업(읽기, 쓰기, 열기, 닫기 등)은 파일 디스크립터를 통해 수행된다. 파일 디스크립터는 일반적으로 0, 1, 2와 같은 특수 값으로 사용된다. 이러한 값은 표준 입력(stdin), 표준 출력(stdout) 및 표준 오류(stderr)를 나타내며, 이들은 대개 파일 디스크립터 0, 1 및 2로 지정된다.
파일 디스크립터는 프로세스의 파일 시스템과의 상호 작용을 담당한다. 파일 디스크립터를 사용하여 파일을 열고, 쓰고, 읽고, 닫을 수 있으며, 이러한 파일 디스크립터를 사용하여 네트워크 연결, 파이프, 소켓 등의 다른 I/O 리소스에도 액세스할 수 있다.

file descriptor table

파일 디스크립터 테이블(File Descriptor Table)은 운영체제가 프로세스가 열어놓은 파일과 관련된 정보를 저장하는 자료구조로 파일 시스템에서 사용된다.
파일 디스크립터 테이블은 파일 디스크립터를 인덱스로 사용하여, 해당 파일과 관련된 정보를 저장합니다. 이 정보에는 파일 오프셋, 파일 열림 모드(읽기/쓰기), 파일 상태 등이 포함된다.
프로세스는 파일 디스크립터 테이블을 사용하여 열린 파일에 대한 작업을 수행한다. 예를 들어, 파일 디스크립터를 사용하여 파일에서 읽기/쓰기 작업을 수행하거나, 파일 디스크립터를 사용하여 파일을 닫을 수 있다.

dup2 syscall

dup2 시스템 콜은 기존 파일 디스크립터(oldfd)를 새 파일 디스크립터(newfd)로 복제하는 역할을 한다. 만약 newfd가 이미 열려있는 파일을 가리키고 있다면, 먼저 그 파일을 닫고 oldfd를 newfd로 복제한다.

dup2 시스템 콜의 호출 형식은 다음과 같다.
int dup2(int oldfd, int newfd);

  • oldfd: 복제하려는 파일 디스크립터 번호
  • newfd: oldfd를 복제하여 새로 만들 파일 디스크립터 번호

dup2 시스템 콜은 일반적으로 파이프(pipe)를 구현하거나, 표준 입력, 출력 및 오류 출력 스트림(stdin, stdout, stderr)을 다른 파일로 리디렉션할 때 사용된다. 또한, 네트워크 소켓을 복제하여 다중 클라이언트 서버를 작성할 때도 사용할 수 있다.


Project 3: Virtual Memory

가상 메모리는 컴퓨터의 사용 가능한 메모리를 확장하기 위해 최신 운영 체제에서 사용하는 기술입니다. 이를 통해 컴퓨터는 가상 메모리라고 하는 추가 RAM인 것처럼 하드 드라이브의 일부를 사용할 수 있습니다. 하지만, 컴퓨터가 가상 메모리를 사용할 때 하드 드라이브와 RAM 간에 데이터를 교환해야 하므로 시스템 성능이 느려지고, 하드 드라이브에 조각화를 일으켜 시스템 속도를 더욱 저하시킬 수 있습니다.

* 디스크 조각화: 하드 드라이브의 파일이 단일 위치에 연속적으로 저장되지 않고 디스크의 여러 부분에 흩어져 있을 때 발생하는 현상입니다. 이것은 시간이 지남에 따라 파일이 생성, 수정 또는 삭제되고 하드 드라이브가 파일을 저장할 단일 연속 공간 블록을 찾을 수 없을 때 발생합니다.

Virtual memory management

  • Memory allocation
  • Paging
  • Page replacement
  • Page fault handling
  • Memory fragmentation

paging

페이징은 페이지 테이블이라는 데이터 구조를 사용하여 가상 메모리 주소를 해당 물리적 ​​메모리 주소에 매핑하여 작동한다. 가상 메모리는 페이지 단위로, 물리적 메모리는 프레임 단위로 구분되며, 일반적으로 크기는 동일하다(예: 4KB). 프로그램이 가상 주소에 액세스하면 운영 체제는 페이지 테이블을 사용하여 가상 주소를 물리적 주소로 변환한다.

[virtual page]
가상 페이지는 가상 메모리를 관리하기 위해 운영 체제에서 사용하는 고정 크기의 가상 메모리 블록이다. 가상 페이지는 실제 메모리 페이지와 크기가 동일하며 대부분의 최신 운영 체제에서 일반적으로 크기가 4KB이다.

[physical frame]
물리적 프레임은 운영 체제에서 프로세스 실행을 위한 데이터 및 코드를 저장하는 데 사용하는 고정 크기의 물리적 메모리 블록이다. 데이터가 상주하는 실제 물리적 메모리 위치이다.

물리적 프레임은 가상 메모리 페이지와 동일한 크기이며 대부분의 최신 운영 체제에서 일반적으로 크기가 4KB이다. 실행 중인 프로세스에 제공되는 연속 주소 공간인 가상 페이지에 매핑된다.

[page table & supplementary page table]
페이지 테이블
페이지 테이블은 프로세스에서 사용하는 가상 메모리 주소RAM의 해당 물리적 메모리 주소 간의 매핑을 추적하기 위해 운영 체제에서 사용하는 데이터 구조이다.
각 프로세스에는 메모리에 저장되고 운영 체제에서 관리하는 자체 페이지 테이블이 있다. 페이지 테이블에는 프로세스에서 사용하는 각 가상 페이지를 데이터가 저장된 RAM의 해당 물리적 프레임에 매핑하는 항목이 포함되어 있다.
프로세스가 가상 메모리 주소에서 데이터를 요청할 때 프로세서는 페이지 테이블을 사용하여 데이터가 저장된 물리적 메모리 주소를 찾는다. 해당 물리적 프레임이 RAM에 없는 경우 페이지 테이블 항목은 데이터가 하드 드라이브의 가상 메모리에 저장되어 있음을 나타낸다. 그런 다음 운영 체제는 하드 드라이브에서 데이터를 검색하여 자유 물리적 프레임의 RAM에 저장한다. 가상 페이지와 물리적 프레임 사이의 새로운 매핑을 반영하도록 페이지 테이블이 업데이트된다.

보조 페이지 테이블
보조 페이지 테이블은 가상 메모리 주소와 물리적 메모리 주소 간의 매핑에 대한 추가 정보를 저장하기 위해 운영 체제에서 사용하는 추가 데이터 구조이다.
추가 정보로는 Access permissions, Cacheability, Protection, Location, Performance metrics 등이 있다.

Memory Management Unit (MMU)

프로세스에서 사용하는 가상 메모리 주소와 RAM의 해당 물리적 메모리 주소 간의 매핑을 관리하는 컴퓨터 시스템의 하드웨어 구성 요소이다.
MMU는 프로세서에 통합되어 낮은 수준에서 작동하며 프로세서가 만든 메모리 참조를 가로채 가상 주소와 물리적 주소 간에 변환한다. MMU는 운영 체제에서 관리하는 페이지 테이블을 사용하여 이 변환을 수행한다.
프로세스가 가상 메모리 주소에서 데이터를 요청하면 프로세서는 주소를 MMU로 보낸다. MMU는 페이지 테이블을 사용하여 데이터가 저장된 해당 물리적 메모리 주소를 찾은 다음 물리적 주소를 프로세서에 반환한다. 그런 다음 프로세서는 RAM의 물리적 주소에 있는 데이터에 액세스한다.

Translation Lookaside Buffer (TLB)

가상 메모리 주소 변환 속도를 높이기 위해 컴퓨터 시스템의 메모리 관리 장치(MMU)에서 사용하는 하드웨어 캐시이다.
MMU가 가상 메모리 주소를 받으면 먼저 TLB를 확인하여 변환이 이미 캐시에 저장되어 있는지 확인한다. 변환이 TLB에서 발견되면 페이지 테이블에 액세스하지 않고 물리적 메모리 주소를 직접 검색할 수 있다.


Page type

Uninitalized page

Uninitialized page는 초기화되지 않은 페이지를 나타낸다. 초기화되지 않은 페이지는 어떠한 데이터나 값으로도 채워지지 않은 상태를 말한다. 즉, 이 페이지에는 이전에 다른 데이터가 저장되었을 수도 있고, 아무런 값도 저장되지 않은 상태일 수도 있다. Uninitialized page는 일반적으로 초기화되지 않은 변수나 할당된 메모리 공간 등을 가리키는 포인터로 사용되며, 적절한 초기화 작업을 수행해야 올바르게 사용할 수 있다.

[Lazy initialization]
초기화 작업을 처음 필요로 할 때까지 미루는 것을 의미한다. Lazy initialization은 자원이나 데이터를 미리 초기화하는 대신, 실제로 사용되기 전까지 초기화를 지연시킨다. 이를 통해 초기화 작업에 드는 비용이나 시간을 절약할 수 있다. 특히, 프로그램이 실행될 때 모든 자원을 미리 초기화하는 것이 비효율적인 경우에 유용하다.

Anonymouse page

Anonymouse page(익명 페이지)는 가상 메모리 시스템에서 사용되는 용어로, 디스크에 저장된 데이터가 아닌 메모리에만 존재하는 페이지를 의미한다. 이 페이지는 디스크나 파일과 연결되지 않고, 메모리에 할당된 프로세스의 익명 영역(anonymous region)에 대응한다. 익명 페이지는 주로 프로세스의 스택이나 힙과 같은 동적으로 할당되는 메모리 영역에 사용되며, 프로그램의 런타임 내에서만 수정 및 액세스할 수 있다. 프로세스가 메모리를 동적으로 할당하거나 해제할 때, 익명 페이지는 해당 메모리 영역에 대응하여 필요한 크기만큼 할당되거나 해제된다. 익명 페이지는 디스크에 저장된 파일과는 달리 디스크에 저장되지 않으므로, 메모리에서만 접근 가능하며 프로세스가 종료되면 사라진다.

이러한 특징은 프로세스 간의 메모리 공유를 제한하고, 보안 및 프라이버시를 보호하는 데 도움을 준다. 익명 페이지는 가상 메모리 시스템의 일부로서, 운영체제가 메모리 관리와 페이지 교체를 위해 사용한다. 익명 페이지의 할당과 해제는 프로세스의 메모리 요구에 따라 동적으로 이루어지며, 가상 메모리 시스템의 효율성과 성능에 영향을 미친다.

🤔 익명 페이지는 왜 필요한가?
실행 중에 메모리를 할당해야 하는 프로그램이 있다고 상상해 보자. 이 메모리는 특정 파일이나 데이터베이스와 관련이 없다. 변수, 임시 데이터 또는 기타 프로그램별 정보 저장과 같은 용도로 사용할 수 있다. 이 동적 메모리 할당을 처리하기 위해 운영 체제는 익명 페이지를 사용한다. 이 페이지는 메모리의 빈 공간 역할을 하며 프로그램에 의해 데이터로 채워질 준비가 된다. 프로그램이 작성할 수 있는 빈 종이라고 생각해보자.
익명 페이지를 사용하면 프로그램이 외부 파일에 의존하지 않는 유연한 개인 메모리 공간을 가질 수 있다. 프로그램 실행 내에서 메모리를 동적으로 관리하는 방법을 제공하여 프로그램별 데이터 저장에 대해 더 나은 제어 및 효율성을 제공한다.

[stack growth]

file-backed page

[mmap syscall]


Swap in/out

page replacement policy

swap disk


Copy on Write (COW)


참고 자료

profile
🎤 📷 ❄️ 🌊

0개의 댓글