본문 바로가기

전체 글

(51)
[PintOs] PROJECT1: THREADS 크래프톤정글 7주차 이번 주차는 카이스트에서 제공하는 'PintOs 구현하기' 입니다. 카이스트에서 제공하는 핀토스 자료 Introduction · GitBook No results matching "" casys-kaist.github.io Alarm Clock 1차 시도 아래 APPENDIX 항목에 스레드와 동기화 등에 대한 설명과 간단한 코드 예제가 있는데 그 중 모니터monitor라는 동기화 기법을 사용하려 했다. 이유는 모니터 설명에 자유로운 조건 변수 설명이 있었는데 e.g. "some data has arrived for processing" or "over 10 seconds has passed since the user's last keystroke". 저 시간을 조건 변수로 설정할 수 있다는 설명에 꽂혔다..
3/29 (금) TIL - fork 테스트케이스까지 모두 통과! ! 오늘의 알고리즘 백준 14502번 연구소 bfs 문제지만 접근이 좀 어려웠다. 조합을 사용해야 한다는 힌트를 듣고 풀 수 있었다. 브루트포스 등의 모든 경우에 접근해야 하는 경우, 조합이나 순열을 사용해야 하는게 생각이 잘 안 떠오르네... ! 오늘의 실수 palloc_get_page() 했던 메모리에 대해 free()로 메모리 해제를 해주어 오류가 발생... 미처 깨닫지 못 해 몇 십분 흘러버려... ! 오늘의 무지함 1 hash 시스템, 사용법에 대해 무지했다. 어제 TIL에 썼던거 같은데 - 왜 insert 해준적 없는 page에 대한 hash_find()가 가능한가? 이 질문에 대한 답을 얻었다. 전체 질문 채널에 질문했는데 다른 정글러분께서 설명해주셨다! hash_init() 할 때 설정해주..
3/28 (목) TIL - Project3 Anonymous Page 구현하기 ! 오늘의 이슈 어디서 발생하는지 모르는 Page Fault 며칠간 열심히 구현한 결과, 많이 늦었지만 ㅠ Anonymous page 페이지 테이블 copy 직전까지 구현했다. 물론 fork() 이전에도 read-boundary, open-empty 같은 케이스가 실패한다...어딘가 예외처리를 덜 한 모양. 일단 gitbook에 써있는 가이드와 선배님이 작성해두신 sudo 코드처럼 글로만 가이드해두신 글을 보고 구현했다. 그러고 한참 안 돼서...정답 코드와 비교해보며 작성했다. 거의 우리가 작성한 코드와 같아서 대체 어디가 문제인지 고민했다. printf()를 이용해서 디버깅을 진행했는데, 이상하다 느꼈던 부분은 spt_find_page()에서 리턴하지를 않았다는 것이다. 분명 함수를 모두 처리하고 r..
10주차 키워드 정리 가상 메모리 : 실제 하드웨어보다 소프트웨어의 크기가 더 커도 운용이 가능하게 만들어주는 메모리 기법. 어플리케이션이 실행될 때, 실행에 당장 필요한 부분만 메인 메모리에 적재되고 나머지는 보조 기억장치(디스크)에 남아있는다. 가상 메모리 구현을 위해서는 MMU가 있어야 한다. 페이지 테이블 : 메모리를 적재하는 단위인 페이지, 이 페이지를 관리하는 테이블이다. 각 페이지의 가상 주소와 실제 적재되어 있는 물리 주소가 매핑되어 있다. TLB (translation lookaside buffer) : 페이지 테이블에 접근하는 횟수를 줄여 주소 변환 시간을 단축한다. TLB는 적은 엔트리만 가질 수 있지만, 그렇기에 연산 속도가 빠르다. (내가 보기엔 접근 횟수는 TLB가 있으나 없으나 비슷한거 같은데 연산..
Page Fault, Lazy Loading, Page Replacement Policy 간단하게 정리 Page Fault 페이지 폴트 페이지 - 가상 메모리를 사용하는 최소 크기 단위 각 프로세스는 페이지를 관리하는 Page Table을 가진다. 페이지 폴트는 요구 페이징 기법에서 필요한 페이지가 물리 메모리에 없을 때 발생하는 인터럽트다. 요구 페이징(Demand paging) - 모든 페이지를 물리 메모리에 올리지 않고, 필요한 페이지만 메모리에 올리는 방식 Page Fault 처리 과정 물리메모리(주기억장치)를 확인하여 페이지가 없으면 trap을 발생, 운영체제에 알린다. 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인한다. 없으면 프로세스 중단. 페이지 폴트면, 현재 물리 메모리에 비어있는 프레임이 있는지 찾는다. - 페이지 폴트가 발생하면 운영체제는 해당 페이지를 저장..
3/20 (수) TIL - 오늘은 반드시 목요일에 마무리하는 수요일 TIL do fork()에서 sema_up(&parent->fork_wait); /* Finally, switch to the newly created process. */ if (succ) do_iret(&if_); 세마 업의 위치가 do iret()아래였는데 위로 올려줘서 패스 do iret()이 레지스터를 이용해 실행하는 프로그램을 점프하는? 함수였다. 그래서 do iret 아래는 실행이 되지 않는 것이였다...sema up이 되지 않아 부모의 fork wait이 끝나지 않는 이슈였다. dueplicate_pte()에서 if (is_kernel_vaddr(va)) // 커널이면 즉시 리턴 { return true; } 처음 코드와 주석을 봤을 때, 커널이면 리턴하는 경우에..
3/19 (화) TIL - 오늘은 꼭 fork를 끝내야지 어제 마무리하면서 적었던 내용이 remove와 close를 어떻게 다르게 구현해야 하는가? 였다. 다른 정글러분께 질문했고 답을 들을 수 있었다! remove를 내가 기존에 구현했던 close처럼 동작하게 하고, close는 파일에 대한 메모리 할당을 해제해주어야 한다. 그리고 filesys_remove는 실제 하드웨어의 파일을 삭제하는 것이라고 한다. 그냥 썼으면 큰일날뻔~ 퀴즈 준비하면서 돌려놓은 make check 36개 남았다 ㅎㅎ... fork 가보자고~ 못 갔 다! thread.h에 선언했던 자식 리스트를 활용해봤다. init_thread()에서 부모와 자식 스레드 모두 만날 수 있기 때문에 여기에서 자식 리스트에 추가, 자식의 부모 설정을 동시에 해주었다. 이것저것 추가하고 wait()에서 ..
3/18 (월) TIL - 여전히 시스템 콜 하는중 파일 디스크립터 테이블에 대한 설명을 봤다. 파일 디스크립터가 할당되는 과정 그래서 char *fd_table에서 struct file *fd_table로 변경해봤다. 아니 테케 돌리는데 뭐 건든거 없고 다 주석처리 했는데 왜 어제 돌아가던 코드가 갑자기 오버플로우가 나는거?;;; 진심 짱나; 찾았다 안 되는 이유! struct file *fd_table[1024]; 로 파일 디스크립터 테이블을 정적으로 선언해줬는데 이게 너무 수치가 컸던 것이다... struct file *fd_table[64]; 로 줄여주니 돌아간다 ^^...저번주마냥 실수아닌 실수로 시간을 계속 잡아먹는다리...후배님들은 시간손해보지마시길...(참고: 256은 오버플로우 발생, 128은 괜찮습니다!) BUT, GitBook의 FAQ..