일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Flutter
- pintos
- create
- scaffold
- file
- flutter
- algorithm
- Cow
- widget
- System call
- Copy-on-write
- vm
- materialapp
- stack growth
- BFS
- icon button
- Today
- Total
목록PintOS (14)
JunHyeok

Swap In/Out 메모리 스왑은 물리 메모리 사용을 최적화하기 위함!메인 메모리의 frame (USER POOL)이 모두 할당되면, 추가 메모리 할당 요청을 처리할 수 없음해결책 : 사용되지 않는 메모리 frame을 disk로 swap_out 하여 다른 응용 프로그램이 사용할 수 있도록 메모리 자원을 확보스왑 작업은 운영 체제에서 수행시스템이 메모리가 부족할 때 메모리 할당 요청을 받으면 페이지를 선택하여 스왑 디스크로 내보냄메모리 프레임의 정확한 상태를 디스크에 복사프로세스가 스왑 아웃된 페이지에 접근하려고 하면 운영 체제가 페이지를 메모리로 복원익명 페이지와 파일 기반 페이지의 스왑 처리Anon page 는 백업 스토리지가 없음, 임시 백업 스토리지로 swap_disk 사용File-backed-p..

Memory Mapped Files Memory Mapped Files기존 파일의 데이터를 반영하는 페이지 단위 매핑 방식페이지 부재 (page fault) 발생 시 물리 프레임 할당 및 파일 내용 복사System call mmap: 메모리 맵핑 수행munmap: 메모리 맵핑 해제구현 방법:lazy loading 을 활용! (lazy_load_segment 코드 참조) lazy loading 을 위해서, 파일 메타데이터를 저장함!구현 코드 위치:vm/file.c: do_mmap & do_munmap 함수 정의 mmap void *mmap (void *addr, size_t length, int writable, int fd, off_t offset); 매핑 방식파일 디스크립터 fd로 열린 파일의 ..

Stack Growth Userprog 에서는 아래와 같이 단일 페이지의 스택만을 활용하였다./* Create a minimal stack by mapping a zeroed page at the USER_STACK */static boolsetup_stack (struct intr_frame *if_) { uint8_t *kpage; bool success = false; kpage = palloc_get_page (PAL_USER | PAL_ZERO); if (kpage != NULL) { success = install_page (((uint8_t *) USER_STACK) - PGSIZE, kpage, true); if (success) if_->rsp = USER_STACK; else ..

파일 기반이 아닌, 익명 페이지를 구현해야 한다! Page Initialization with Lazy Loading지연 로드 개념메모리 로드를 필요한 시점까지 미루는 설계 방식입니다.페이지는 할당되었지만, 실제 물리적 프레임이나 콘텐츠는 아직 로드되지 않은 상태입니다.페이지 폴트가 발생할 때 콘텐츠가 로드됩니다.페이지 초기화 흐름vm_alloc_page_with_initializer 호출: 커널이 새로운 페이지 요청을 받을 때 호출됩니다.페이지 구조체를 할당하고 페이지 타입에 따라 적절한 초기화자를 설정합니다.사용자 프로그램으로 제어를 반환합니다.페이지 폴트 발생: 프로그램이 콘텐츠가 아직 로드되지 않은 페이지에 접근을 시도할 때 발생합니다.uninit_initialize 호출: 페이지 폴트 처리 과정..

Implement Supplemental Page Table 현재 Pintos 시스템은 메모리의 가상 주소와 물리 주소 매핑을 관리하는 페이지 테이블(pml4)을 가지고 있습니다.앞 장의 논의처럼, Page Fault Handle 과 자원 관리를 위해 각 페이지에 대한 추가 정보를 저장하는 supplementary page table이 필요합니다.따라서 프로젝트 3의 첫 번째 작업으로 supplementary page table의 기본 기능을 구현합시다!1) SPT의 자료구조 선택 ./* Representation of current process's memory space. * We don't want to force you to obey any specific design for this stru..

🎬 IntroductionBy now you should have some familiarity with the inner workings of Pintos. Your OS can properly handle multiple threads of execution with proper synchronization, and can load multiple user programs at once. However, the number and size of programs that can run is limited by the machine's main memory size. In this assignment, you will remove that limitation by buiding an illusion o..
exec 시스템 콜 구현 가이드exec 시스템 콜은 현재 프로세스를 주어진 cmd_line의 실행 파일로 변경하고, 주어진 인자를 전달합니다. 성공할 경우 이 함수는 반환되지 않습니다. 그렇지 않으면 프로그램을 로드하거나 실행할 수 없는 이유로 인해 프로세스는 종료 상태 -1로 종료됩니다. 이 함수는 exec를 호출한 스레드의 이름을 변경하지 않습니다. 파일 디스크립터는 exec 호출을 통해 계속 열려 있어야 합니다.주요 요구사항프로세스 변경: 현재 프로세스를 cmd_line에 주어진 실행 파일로 변경합니다. 주어진 인자를 전달하여 새로운 프로세스를 시작합니다.성공 시 반환 없음: exec가 성공적으로 실행되면 호출된 함수는 반환되지 않습니다.실패 시 종료: 프로그램을 로드하거나 실행할 수 없는 경우 프..

wait 시스템 콜 구현 가이드wait 시스템 콜은 자식 프로세스 pid를 기다리고 자식의 종료 상태를 가져옵니다. 이 함수의 주요 동작과 요구사항을 다음과 같이 정리할 수 있습니다.기본 동작자식 프로세스 종료 대기: wait는 자식 프로세스 pid가 아직 실행 중인 경우, 종료될 때까지 기다립니다.종료 상태 반환:wait는 자식 프로세스 pid가 exit에 전달한 종료 상태를 반환합니다.만약 pid가 exit()를 호출하지 않고 커널에 의해 종료된 경우(예: 예외로 인해 종료됨), wait(pid)는 -1을 반환해야 합니다.즉시 실패 조건wait는 다음 조건 중 하나라도 충족되면 즉시 실패하고 -1을 반환해야 합니다:직접적인 자식이 아닌 경우:pid가 호출 프로세스의 직접적인 자식이 아닙니다. pid는..
Fork와 Exec 시스템 호출의 역사와 배경프로그램 발전 역사1960년대와 1970년대에 멀티태스킹 운영체제의 개발이 시작되면서, 여러 프로세스가 동시에 실행될 수 있는 개념이 도입되었습니다.이 시기에 UNIX 운영체제가 개발되었고, UNIX는 프로세스를 효율적으로 관리하기 위해 여러 시스템 호출을 도입했습니다. 이 중 중요한 것이 fork와 exec 시스템 호출입니다.fork() 시스템콜1960년대 초, MIT의 Dennis Ritchie와 Ken Thompson 팀은 Multics 운영체제를 개발하면서 fork() 사용했습니다.이 시스템콜은 프로세스를 복제하여 새로운 프로세스를 만드는 데 사용되었습니다.exec() 시스템콜1969년, Unix 운영체제의 개발자인 AT&T Bell Labs의 Denn..

write 시스템 호출, 어떻게 작동할까?🤔write 시스템 호출은 파일 디스크립터를 통해 파일이나 표준 출력(화면)에 데이터를 쓰는 함수입니다.이는 크게 세 단계로 나눌 수 있습니다! ( read 시스템 콜과 유사하네요!)✅ 출력 버퍼가 유효한지 확인합니다.✅ 파일 디스크립터가 1이라면 화면에 데이터를 출력합니다.📂 파일 디스크립터가 1이 아니라면 파일에 데이터를 씁니다.int write(int fd, const void *buffer, unsigned size) { is_valid_addr(buffer); int writes = 0; lock_acquire(&filesys_lock); if (fd == 1) { putbuf(buffer, size); // 표준 출..