운영체제(OS)/with PintOS 15

(Project3-Virtual Memory) - Copy-on-write (Extra)

Copy-on-write (Extra) Pintos에서 Copy-on-Write 메커니즘을 구현하세요. Copy-on-Write는 물리적 페이지의 동일한 인스턴스를 사용하여 더 빠른 복제 작업을 허용하는 리소스 관리 기술입니다. 한 리소스가 여러 프로세스에서 사용되면 각 프로세스는 일반적으로 충돌이 발생하지 않도록 리소스의 자체 복사본을 가져야 합니다. 그러나 리소스가 수정되지 않고 단순히 읽히는 경우에는 물리 메모리에 여러 복사본이 필요하지 않습니다. 예를 들어, fork를 통해 새 프로세스가 생성되면 자식은 부모의 리소스를 상속하여 데이터를 가상 주소 공간에 복제해야 합니다. 일반적으로 가상 메모리에 내용을 추가하려면 물리 페이지를 할당하고 데이터를 프레임에 쓰며 페이지 테이블에 가상->물리 매핑을 ..

(Project3-Virtual Memory) - Swap In/Out

스왑 인/아웃 메모리 스왑은 물리적 메모리의 사용을 최대화하기 위한 메모리 회수 기술 중 하나입니다. 메인 메모리의 프레임이 할당되어 있을 때 시스템은 더 이상 사용자 프로그램의 메모리 할당 요청을 처리할 수 없습니다. 이 문제를 해결하기 위한 한 가지 방법은 현재 사용되지 않는 메모리 프레임을 디스크로 스왑아웃하는 것입니다. 이렇게 하면 일부 메모리 자원이 해제되어 다른 응용 프로그램에 사용할 수 있게 됩니다. 스왑은 운영 체제에 의해 수행됩니다. 시스템이 메모리 부족 상태임을 감지하지만 메모리 할당 요청을 받으면, 현재 사용되지 않는 페이지를 스왑 디스크로 이동시킵니다. 그런 다음, 해당 메모리 프레임의 정확한 상태가 디스크에 복사됩니다. 프로세스가 스왑아웃된 페이지에 액세스하려고 할 때, 운영 체제..

(Project3-Virtual Memory) - Memory Mapped Files

메모리 매핑된 파일 이 섹션에서는 메모리 매핑된 페이지를 구현합니다. 익명 페이지와 달리 메모리 매핑된 페이지는 파일을 기반으로 하는 매핑입니다. 페이지 내용은 기존 파일의 데이터를 반영합니다. 페이지 부재가 발생하면 물리적인 프레임이 즉시 할당되고 내용이 파일로부터 메모리로 복사됩니다. 메모리 매핑된 페이지가 매핑 해제되거나 스왑 아웃되면 내용의 변경 사항이 파일에 반영됩니다. mmap 및 munmap 시스템 콜 메모리 매핑된 파일을 위한 두 가지 시스템 콜인 mmap과 munmap을 구현하세요. VM 시스템은 mmap 영역에서 페이지를 게으르게 로드하고 mmap된 파일 자체를 매핑의 백업 저장소로 사용해야 합니다. 이 두 시스템 콜을 구현하기 위해 **vm/file.c**에 정의된 do_mmap 및 ..

(Project3-Virtual Memory) - Stack Growth

스택 성장 기능을 구현하세요. 이를 위해 먼저 `vm/vm.c`의 `vm_try_handle_fault` 함수를 수정하여 스택 성장을 식별하도록 해야 합니다. 스택 성장을 식별한 후에는 `vm/vm.c`에 있는 `vm_stack_growth` 함수를 호출하여 스택을 성장시켜야 합니다. `vm_stack_growth` 함수를 구현하세요. bool vm_try_handle_fault (struct intr_frame *f, void *addr, bool user, bool write, bool not_present); 이 함수는 `userprog/exception.c`의 `page_fault` 함수에서 페이지 부재 예외를 처리하는 동안 호출됩니다. 이 함수에서는 페이지 부재가 스택 성장에 대한 유효한 경우인..

(Project3-Virtual Memory) - Anonymous Page

vm_alloc_page_with_initializer()를 구현하세요. 전달된 vm_type에 따라 적절한 초기화 프로그램을 가져와서 uninit_new를 호출해야 합니다. bool vm_alloc_page_with_initializer (enum vm_type type, void *va, bool writable, vm_initializer *init, void *aux); 주어진 유형의 초기화되지 않은 페이지를 생성합니다. 초기화되지 않은 페이지의 swap_in 핸들러는 자동으로 유형에 따라 페이지를 초기화하고 주어진 AUX로 INIT을 호출합니다. 페이지 구조체를 획득한 후에는 해당 페이지를 프로세스의 보충 페이지 테이블에 삽입합니다. vm.h에서 정의된 VM_TYPE 매크로를 사용하는 것이 편리..

(Project3-Virtual Memory) - Memory Management

git book 가이드와 코드 구현 보충 페이지 테이블 구현 이 시점에서 Pintos에는 가상 및 물리 메모리 매핑을 관리하기 위한 페이지 테이블 (pml4)이 있습니다. 그러나 이것만으로는 충분하지 않습니다. 이전 섹션에서 논의된 대로 페이지 폴트 및 리소스 관리를 처리하기 위해 각 페이지에 대한 추가 정보를 보유할 보충 페이지 테이블도 필요합니다. 따라서 프로젝트 3의 첫 번째 작업으로 보충 페이지 테이블을 위한 몇 가지 기본 기능을 구현하는 것이 좋습니다. vm/vm.c에 보충 페이지 테이블 관리 함수를 구현하세요. 먼저 Pintos에서 어떻게 보충 페이지 테이블을 설계할지를 결정해야 합니다. 자체 보충 페이지 테이블을 설계한 후에 아래 세 가지 함수를 해당 설계에 따라 구현하세요. void sup..

(Project2-User Programs) - Extend File Descriptor (Extra)

Extend File Descriptor (Extra) 리눅스에서 stdin, stdout 및 dup2 시스템 호출 종료를 지원하도록 핀토스 만들기 현재 핀토스의 구현에서는 stdin과 stdout의 fd를 닫는 것이 금지되어 있습니다. 이 추가 점수 요구 사항에서는 먼저 사용자가 리눅스와 동일하게 stdin과 stdout을 닫을 수 있도록 허용합니다. 즉, 사용자가 stdin을 닫으면 프로세스가 입력을 읽지 않아야 하고, stdout을 닫으면 프로세스가 아무것도 출력하지 않아야 합니다. 다음으로 dup2 시스템 호출을 구현합니다. int dup2(int oldfd, int newfd); dup2() 시스템 호출은 newfd에 지정된 파일 기술자 번호로 파일 기술자 oldfd의 복사본을 생성하고 성공하면..

(Project2-User Programs) - Deny Write on Executables

Deny Write on Executables 실행 파일로 사용 중인 파일에 대한 쓰기를 거부하는 코드를 추가하세요. 프로세스가 디스크에서 변경 중인 코드를 실행하려고 할 때 예상치 못한 결과가 발생할 수 있기 때문에 많은 OS에서 이 기능을 사용합니다. 이는 프로젝트 3에서 가상 메모리가 구현된 후 특히 중요해졌지만, 지금도 문제가 될 수 있습니다. 열린 파일에 대한 쓰기를 방지하기 위해 file_deny_write()를 사용할 수 있습니다. 파일에서 file_allow_write()를 호출하면 다시 활성화됩니다(다른 오프너에서 파일 쓰기가 거부되지 않는 한). 파일을 닫아도 쓰기가 다시 활성화됩니다. 따라서 프로세스의 실행 파일에 대한 쓰기를 거부하려면 프로세스가 계속 실행되고 있는 동안에는 파일을 ..

(Project2-User Programs) - Process Termination Message

Process Termination Message Print out the process termination message 사용자 프로세스가 종료를 호출하거나 다른 이유로 인해 종료될 때마다 프로세스의 이름과 종료 코드를 다음과 같은 형식으로 인쇄합니다. printf ("%s: exit(%d)\n", ...); 인쇄되는 이름은 fork()에 전달된 전체 이름이어야 합니다. 사용자 프로세스가 아닌 커널 스레드가 종료되거나 중단 시스템 호출이 호출될 때는 이러한 메시지를 인쇄하지 마십시오. 이 메시지는 프로세스가 로드되지 않을 때 선택 사항입니다. 이 메시지 외에 제공된 핀토가 아직 인쇄하지 않은 다른 메시지는 인쇄하지 마세요. 디버깅 중에 추가 메시지가 유용할 수 있지만 채점 스크립트를 혼동하여 점수가 ..

(Project2-User Programs) - System Calls

System Calls Implement the following system calls. 나열된 프로토타입은 include/lib/user/syscall.h를 포함하는 사용자 프로그램에서 볼 수 있는 것입니다(이 헤더와 포함/lib/user의 다른 모든 헤더는 사용자 프로그램에서만 사용할 수 있습니다). 각 시스템 호출에 대한 시스템 호출 번호는 include/lib/syscall-nr.h에 정의되어 있습니다: void syscall_handler(struct intr_frame *f) { // TODO: Your implementation goes here. uint64_t args[5] = {f->R.rdi, f->R.rsi, f->R.rdx, f->R.r10, f->R.r8}; thread_cur..