pintos 7

[PintOS Project 3 - VIRTUAL MEMORY] pintos 가상 메모리 구조

pintos 실제 가상 메모리 구조가상 메모리는 페이지 단위로 나뉘고, 페이지 테이블을 통해 가상 주소를 물리 주소로 매핑한다. 가상 메모리는 물리 메모리 크기와 상관 없이 더 큰 주소 공간을 제공하고, 실제로 필요한 시점에만 물리 메모리를 할당하는 방식이다.  👇pintos에서 가상 메모리와 물리 메모리의 실체  `init.c`에서 Pintos main program을 시작하는 `int main(void)` 함수에서 `paging_init( mem_end )` 함수를 사용하여 페이징 초기화를 해준다.  `paging_init( mem_end )` 함수를 보면 pintos 실제 물리 주소 [ 0 ~ mem_end] 범위를 가상 주소에 매핑 해주는 반복문이 나온다. 실제 가상 메모리에서의 KERN_BAS..

카테고리 없음 2024.10.12

[PintOS Project 3 - VIRTUAL MEMORY] Memory management 구현 중.. 간단한 예시로 흐름 파악하기(사용자가 arr[1024]를 요구했다면!)

실제 우리 프로젝트에서 사용한 코드는 아니다. 전체적 흐름만 파악하기 위한 코드 (참고) 현재 vm_entry 버리고 page 구조체에 spt로 관리전체 흐름 요약1. 사용자 가상 주소 (UVA) 0x80400000에 배열이 선언됨.2. vm_entry가 생성되어 가상 메모리 페이지 정보를 관리.3. 배열에 처음 접근할 때 페이지 폴트 발생.4. vm_claim_page가 호출되어 해당 가상 주소를 물리 메모리로 매핑.5. 프레임을 할당받아 페이지 테이블을 통해 UVA와 KVA 및 물리 주소를 매핑.6. 배열이 물리 메모리에 할당되고, CPU는 페이지 테이블을 통해 물리 메모리에 접근. 1. 배열 선언 (arr[1024])과 가상 주소 할당배열을 선언하면, 컴파일러는 배열을 위한 메모리 공간을 가상 주소..

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

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

[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] 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..

[Pintos : 동기화] 락(Lock)

락(Lock)세마포어와 유사하지만 주로 리소스에 대한 상호 배제를 보장하기 위해 사용된다.세마포어처럼 동작하지만 초기값이 1인 세마포어와 동일한 개념이다. 락의 목적한 번에 하나의 스레드만 특정 리소스에 접근할 수 있도록 보장락의 연산 락 획득(Acquire): 세마포어의 down 연산에 해당하며, 락을 잠그고 현재 스레드가 리소스를 사용하게 만듭니다.락 해제(Release): 세마포어의 up 연산에 해당하며, 락을 풀고 다른 대기 중인 스레드가 리소스를 사용할 수 있도록 합니다.락의 추가적인 제약세마포어와 비교했을 때, 락에는 하나의 중요한 제약이 있습니다. 락을 획득한 스레드, 즉 `락의 소유자(owner)`만 `그 락을 해제`할 수 있습니다. 만약 다른 스레드가 락을 해제하려고 시도하면, 이는 잘못..

[Pintos : 동기화] 세마포어(Semaphore)

세마포어(Semaphore)비동기적으로 실행되는 여러 스레드나 프로세스 간의 **동기화(synchronization)**를 위해 사용하는 중요한 도구이다. 세마포어의 두 가지 연산 Down 또는 P 연산: 세마포어 값이 양수일 때까지 대기하고, 양수가 되면 그 값을 1 감소시킵니다.Up 또는 V 연산: 세마포어 값을 1 증가시키고, 대기 중인 스레드가 있으면 하나를 깨워서 실행시킵니다.이제 세마포어가 "0,1, 그 이상의 수" 초기화 되는 경우 3가지를 설명합니다.세마포어의 활용 예시세마포어는 `0`으로 초기화되면 한 번만 발생하는 `이벤트를 기다리기 위한 목적`으로 사용할 수 있다.스레드 A가 스레드 B를 생성하고, 스레드 B가 어떤 작업을 완료할 때까지 A가 기다려야 한다고 가정해봅시다. 스레드 A는..