분류 전체보기 108

[PintOS Project 3 - VIRTUAL MEMORY] 가상 메모리 이론 공부2 운영체제가 관여하는 Virtual Memory

Demand Paging실제로 필요할 때 page를 메모리에 올리는 것I/O 양의 감소빈번히 사용되는 코드는 제한적Memory 사용량 감소빠른 응답 시간더 많은 사용자 수용Valid / Invalid bit의 사용Invalid의 의미사용되지 않는 주소 영역인 경우페이지가 물리적 메모리에 없는 경우처음에는 모든 page entry가 invalid로 초기화address translation 시에 invalid bit이 set되어 있으면 => "page fault"6번 7번은 사용하지 않는 비트page fault가 나면 운영체제에 넘어간다. 소프트웨어 인터럽트 발생Page Fault페이지 폴트는 프로세스가 메모리에 없는 페이지를 접근하려고 할 때 발생.예를 들어, 잘못된 메모리 주소(bad address)에 ..

[PintOS Project 3 - VIRTUAL MEMORY] 가상 메모리 이론 공부1 물리적인 메모리 관리(Memory Management)

KEY-WORDLogical Address와 Physical Address주소 바인딩 (compile, load, run(execution))MMU -> Dynamic Relocation(base 레지스터 + limit 레지스터)Dynamic Loading, Overlays, Swapping(swap in,out / backing store)Dynamic Linking(shared 라이브러리) 과 Static Linking(static 라이브러리)연속할당(first fit, best fit, compaction)과 불연속 할당(paging)페이징, 페이지 엔트리, 페이지 테이블, 다중 페이지 테이블 메모리 관리 메모리 주소의 종류와 주소 바인딩, 변환방식, 관련 용어, 물리적인 메모리 관리에 있어서 두 ..

syscall-entry.S

x86-64에서는 int 0x30이 아니라 `syscall`로 바뀌었다.시스템 콜과 Ring 0: 커널 모드 스택 전환의 이해운영체제의 핵심 개념 중 하나는 시스템 콜을 통해 사용자 모드에서 커널 모드로 전환하는 과정입니다. 이 글에서는 시스템 콜이 이루어지는 과정, 그리고 커널 모드에서의 스택 전환 과정을 구체적으로 설명합니다. 특히, 코드 예제를 바탕으로 레지스터의 역할, TSS(Task State Segment)의 의미, 그리고 Ring 0의 중요성에 대해 알아보겠습니다.1. CPU 권한 레벨: Ring의 개념현대의 컴퓨터는 보안과 안정성을 위해 CPU 권한을 여러 레벨로 나누어 관리합니다. 이를 "링(Ring)"이라고 부르며, x86-64 아키텍처에서는 일반적으로 4가지 권한 레벨을 사용합니다.R..

[PintOS Project 2 - User Program] 여러 자료 정리..(kaist 자료 등)

kaist 자료Overview1. 시스템 호출 핸들러 테이블 채우기:Pintos의 기본 설정에서는 시스템 호출 핸들러 테이블이 비어있습니다. 시스템 호출은 커널이 사용자 프로그램과 상호작용하는 중요한 수단이므로, 이 테이블을 채워서 필요한 서비스를 사용자에게 제공할 수 있도록 해야 합니다.2. 추가해야 할 시스템 호출:프로세스 관련 호출:halt: 이 호출은 시스템을 중지시키고 종료합니다.exit: 프로세스가 종료될 때 호출되며, 이 호출은 자원을 정리하고 프로세스를 종료하는 역할을 합니다.exec: 새로운 프로그램을 실행할 때 사용되며, 주어진 프로그램을 실행하면서 현재 프로세스를 대체하거나 새로운 프로세스를 생성합니다.wait: 부모 프로세스가 자식 프로세스의 종료를 기다리기 위해 사용됩니다.파일 관..

pml4(page map level 4) 페이지 테이블 최상위 레벨

pml4x86-64 아키텍처에서 사용하는 페이지 테이블(Paging) 시스템의 최상위 레벨을 나타낸다.페이지 테이블의 최상위 구조가 뭔데?쉽게 표현하자면, 페이지 테이블이 4층 건물이라면, PML4는 건물 4층에 위치한 첫 번째 입구라고 생각하시면 됩니다. 거기서부터 계단을 따라 더 낮은 레벨의 페이지 테이블로 내려가면서, 최종적으로 물리 메모리의 주소를 찾게 되는 겁니다.x86-64에서는 4단계의 페이지 페이지 테이블을 사용하여 가상 메모리와 물리 메모리 간의 매핑을 관리하는데 PML4(Page Map Level 4)는 가상 메모리 주소를 물리적 메모리 주소에 매핑하기 위한 가장 상위 레벨의 구조각 프로세스 또는 스레드가 자신의 페이지 테이블을 가리키고 관리하기 위해 사용된다.프로세스마다 다른 가상 주..

[PintOS Project 2 - User Program] System Call(시스템 콜)

시스템 콜이 들어왔을 때 💭 t1 쓰레드가 CPU running 중이다. read()라는 system call을 만나 `kernel mode`로 진입한다. t1은 실행중이던 cpu 상태를 저장한 후 디스크에서 파일을 읽을 준비를 한다. I/O 요청은 시간이 오래걸리기에 t1을 대기 리스트(waiting list)에 보내고 ready list에 있던 t2를 실행 시킨다. t2가 실행중이다가 t1이 디스크에 요청했던 read가 끝나면 I/O 컨트롤러에서 인터럽트를 발생시켜 kernel 모드로 다시들어온다. 실행중이던 t2 상태를 저장 후 t1이 요청했던 read()가 준비가 다 되었기에 ready list에 올린다.  system handler까지 실행 순서시스템 콜 호출: 사용자 프로그램이 read()와..

[PintOS Project 1 - Threads] 2번 Priority Scheduling

높은 우선순위 쓰레드가 양보락 세마포어 또는 조건변수 대기할 때 우선순위가 가장 높은 대기 스레드를 꺠움우선순위 063 (PRI_MIN PRI_MAX)초기 쓰레드 우선순위는 thread_create()에 인수에 우선순위 저장우선순위 선택 이유 없으면 PRI_DEFAULT(31) 사용우선순위 역전(Priority inversion)높은 우선순위의 스레드가 낮은 우선순위의 스레드가 소유한 락(lock)을 기다릴 때, 그 낮은 우선순위의 스레드가 일시적으로 높은 우선순위를 "기부받아" 실행 우선순위를 높이는 개념구현 계획기존 코드 분석:thread.c 파일을 열어 현재 스레드 우선순위 관리 방식과 실행 순서에 대한 구조를 이해합니다. 특히 스레드가 준비 리스트에 추가되는 부분과 우선순위 비교를 중점적으로 확인..

cpu와 스레드

스레드가 CPU를 점유하고 있다는 것은 해당 스레드가 현재 CPU에서 실행되고 있다는 의미입니다. 이 개념을 이해하려면, 스레드와 CPU의 관계를 먼저 살펴볼 필요가 있습니다.1. 스레드와 CPU의 관계CPU는 컴퓨터의 연산 장치로, 모든 프로그램이나 작업을 처리합니다. 하지만 CPU는 한 번에 하나의 작업(즉, 하나의 스레드)만 실행할 수 있습니다.스레드는 프로그램 실행의 단위입니다. 프로그램 내의 스레드가 CPU에서 실행됨으로써 프로그램의 로직을 처리하게 됩니다.여러 스레드가 동시에 존재할 수 있지만, CPU는 한 순간에 하나의 스레드만 실행할 수 있기 때문에, 운영체제의 스케줄러는 여러 스레드를 번갈아가며 실행하도록 조정합니다.2. CPU를 점유하고 있다는 의미스레드가 CPU를 점유하고 있다는 것은..

[Week07] WIL 핀토스 정리

[Pintos] Project 1 :TREADS1. alarm clockhttps://jinsang-2.tistory.com/9 [PINTOS : PROJECT1] THREADS 쓰레드Alarm Clock첫번째 과제 목적은 스레드를 일정한 시간만큼 재우는 기능을 하는 Alarm Clock을 busy-wait 방식에서 sleep-awake 방식으로 변경한다.   busy-wait  voidtimer_sleep (int64_t ticks) { int64_t start = timer_ticksjinsang-2.tistory.com2.Priority Schedulinghttps://jinsang-2.tistory.com/96 [PINTOS : PROJECT1] 2. Priority Scheduling높은 우선순..

[PintOS Project 1 - Threads] 1번 Alarm Clock

Alarm Clock첫번째 과제 목적은 스레드를 일정한 시간만큼 재우는 기능을 하는 Alarm Clock을 busy-wait 방식에서 sleep-awake 방식으로 변경한다.   busy-wait  voidtimer_sleep (int64_t ticks) { int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start)   현재 위에 코드의 방식은 busy_wait 방식으로 timer_sleep()이 구현되어 있다.timer_ticks() 함수를 이용해 start 변수에 현재 시각(static ticks)를 저장한다.얼마만큼 재울지 지정한 ticks만큼 while문을 통해 thread_yi..