SW사관학교 정글 23

File System

파일 시스템의 경우 FAT 부분과 파일/디렉토리로 나뉘어져 있습니다. 파일과 디렉토리 내용에 관해서는 이미 우리가 OS를 사용하면서 써왔기 때문에 친숙한 개념이라 생각하여 생략하고, FAT와 Inode 아키텍쳐에 관한 설명과 저희가 어떤 식으로 파일시스템을 구현했는지를 정리했습니다.  기존의 Pintos는 freemap을 사용한 형태로 디스크를 사용하고 있습니다. freemap은 bitmap이라고 이해하시면 됩니다. 그래서 기존의 파일 시스템은 그림과 같이 단편화가 발생해 있으면 Data가 들어갈 수 없습니다. 따라서 우리는 disk를 효율적으로 사용하기 위해 bitmap에서 fat 방식으로 파일시스템을 수정하게 됩니다. FAT란 File Allocate Table의 약자로 빈 Sector를 찾아 데이터..

Copy on Write (CoW)

Project 3의 Extra 과제인 Copy on Write에 관해 알아보겠습니다. 먼저, Git book에서는 copy on write에 대해 다음과 같이 정의하고 있습니다.  그래서 fork를 할 때에는 새로운 물리 페이지를 할당하지 않고 부모와 같은 물리 페이지를 매핑만 해주었다가 추후에 write를 시도할 때에만 새로운 물리 페이지를 할당해 주면 되는 것입니다. 우리는 filebacked Page의 경우에 이미 같은 물리 메모리를 공유하도록 구현했기 때문에 여기서 힌트를 얻을 수 있었습니다. 기존에 우리 프로그램은 이 페이지가 작성가능한지만을 검사하고 있었습니다. 그런데 이 페이지가 원래 부모 프로세스가 만들어 놓은 Anonymous Page이고 fork된 프로세스에서 write 하려고 한다면 ..

System Call

User Program 주의 주 개념인 System Call을 핀토스에서 어떻게 처리하는 지에 대해 간략하게 알아보았습니다.  먼저 System Call이 어떻게 동작하는지 대략적으로 그려보았습니다. 유저 모드에서 동작을 하고 있던 프로세스가 read나 write같은 함수에서 system call을 호출 시 syscall entry shell을 통해 현재 CPU의 동작하던 내용을 user stack에 저장한 후 커널로 넘어가게 됩니다. 그 후 syscall_handler에서 system call 함수를 실행하고, ret를 통해 다시 유저 모드로 돌아와 작업을 재개합니다.  유저 함수에서 어떠한 동작을 하다가 system call을 호출하는 경우가 발생할 수 있습니다. Pintos에서는 저희가 유저 함수를..

Multi-Level Feedback Queue Scheduler

핀토스 1주차 Option 과제인 Advanced Scheduler를 구현해봤습니다. 기존의 Priority Scheduler의 경우에는 우선 순위가 낮은 스레드가 오랫동안 CPU를 점유하지 못하는 문제가 발생할 수 있습니다. 이로 인해 스레드의 평균 반응 시간이 너무 길어지는 문제가 발생합니다. 이를 해결 하기 위한 방법으로 multi-level feedback queue scheduler가 제시되었습니다. MLFQS는 Priority에 따라 여러 개의 Ready Queue가 존재하고, Priority에 영향을 주는 변수가 있어서 Feedback으로 Priority를 조절할 수 있습니다. 이 때, multi level까지는 구현하기 힘들 것 같아서 Feedback만 구성을 해봤습니다. 사실 상 feed..

[Week15] 나만의 무기를 갖기 - 5

최종발표까지 준비를 많이 했고, 서버 상태도 완벽하게 해놨는 데, 어이없게 발표 때 문제가 터지고 말았다. STT서비스인 리턴제로 쪽에 보내는 API가 한번에 뭉치는 문제가 생겨 429 에러코드가 계속 들어와서 STT가 되지 않았다. 한번도 이런 적이 없었는데... 무튼, 이 때문에 발표 중간에 NLP 서버를 재부팅했고, 다시 동작하는 것을 확인했다. 그러나 이 진행 상태를 알 리 없는 태리는 오류가 터지자마자 혹시 몰라서 준비해놨던 비상용 시연 영상을 빠르게 틀어버렸고, 우리는 시연을 하는 데에 실패했다. 발표가 끝나고 질문 시간에 아무도 질문을 하지 않아 조금 불안했다. 아무래도 지피티를 사용해서 남이 볼 때 아 그냥 쉽게 쉽게 갔구나로 보일 수도 있다고 생각했다. 그러다가 어떤 분이 오셔서 이것 저..

[Week15] 나만의 무기를 갖기 - 4

중간 발표를 마쳤는 데, 운영진 측에서 키워드 맵으로 문맥 파악이 전혀 안되는 데 문맥 파악이 되었다고 억지를 부리는 느낌이다. 수정하라는 피드백이 들어왔다. 이 때문에 다시 회의를 했는 데, 결국 문맥 파악이라는 것에 초첨을 두게 되면 키워드 맵으로는 당연히 단어끼리의 연결이기 때문에 될 수가 없었고, 다시 처음으로 돌아가 마인드 맵으로 수정해야 한다는 결론이 나왔다. 차라리 처음에 마인드맵으로 하지말고 키워드맵으로 하라는 피드백이 없었으면 더 나았을까? 라는 생각도 문득 스쳐지나갔다. 그러나 우리의 아키텍쳐는 이미 키워드 맵에 맞게 끔 수평 관계로 구성되어 있었다. 각 노드는 서로의 존재를 모르고 이 노드들을 연결하는 Edge라는 구조체가 있는 상태였다. 이를 마인드맵으로 수정하려면 일단 상하 관계가..

[Week15] 나만의 무기를 갖기 - 3

키워드 추출하는 타이밍을 정하는 데에 ELMo를 사용하려고 시도했다. ELMo는 사전학습된 모델로 단어의 임베딩 섹터를 생성하여 문맥이 바뀌었을 때를 알 수 있는 모델이었다. 나는 이를 사용하여 문맥이 바뀔 때를 체크해서 Keyword의 추출타이밍으로 적용하거나 키워드를 묶을 때 다른 메인 아이디어로 묶고자 하였다. 찾아보니 한국어 모델이 mini 모델이지만 있긴 있어서 이를 사용하게 되었다. 그러나 세팅을 마치고 직접 사용해보니 mini model이어서 그런가 성능이 너무 안좋았다. 이 때 사용한 예시 스크립트는script = '여행 어디로 갈까? 대구나 부산 어때? 그럼 부산으로 가자. 우리 여행가서 먹을 점심 메뉴 고르자. 국밥이나 밀면 어때?' 였는 데, ELMo 에서 반환된 데이터는switchi..

[Week15] 나만의 무기를 갖기 - 2

프로젝트를 개발하며 Keyword를 추출하는 것이 아무래도 Main Server에서 수행하면 부하가 너무 심할 것 같아서 차라리 언어에 친화적인 NLP Server를 따로 구성하기로 했다. 그리고 사용할 수 있을 만한 기술들을 찾아봤는 데, KRWordRank, Elmo, KoBERT 등의 라이브러리와 언어모델을 사용할 수 있을 것 같다. KRWordRank는 비지도학습으로 키워드를 추출해주는 라이브러리다. 그래서 이를 이용하여 문장에서 단어를 추출하는 데 성공했고, 조사나 부사까지는 필터링이 가능하다는 것을 깨달았다. 그러나 다른 문제가 생겼다. KRWordRank는 이 문맥에서의 가장 중요한 단어를 추출한다기 보다는 반복적으로 많이 나오는 단어에 대해서 중요도가 올라가서 가장 중요한 단어 순서로 뽑아..

[Week14] 나만의 무기를 갖기 - 1

나는 해내야한다 조의 서포터로 팀에 참가했다. 원래 내가 팀장을 하고자하는 생각이 있었으나, 이전에 0주차에 같이 팀을 했었던 태리와 마음이 맞아 둘 중에 한명이 팀장을 하기로 했다. 나는 이전 회사에서도 파트장까지 달았었고, 게임을 할 때도 길드장을 한다던가 공대장을 하는 등 리더 위치에서 무언가 했던 경험이 많았고 프로팀 생활도 했었기 때문에, 이번에는 태리에게 팀장을 양보하기로 했다. 아무래도 포폴쓸 때 나보다는 태리에게 더 많은 도움이 될 것이라고 생각했다. 처음에 우여곡절이 많았다. 내가 프로젝트를 시작하자마자 3일정도 몸살에 걸려서 거의 아무것도 못하고 잠만 잤는데, 정신이 들었을 때 마다 한두마디씩 툭툭 던진 아이디어 로 나머지 팀원들이 아이디어를 추리고 재밌게 바꿔서 제출했다. 이 때 나 ..

Pintos의 Test Case는 완벽하지 않다

Pintos의 test를 맹신하지 마라. Test를 실행하다가 이상한 부분을 발견했는데 2번째 msg에서 실제로 값에 접근하지 않았는 데 VA가 정확히 ACTUAL로 부터 4096만큼 떨어진 곳에 위치한 곳에 ACTUAL + 4096이 있는 것을 발견했다.확인해 보니 실제로 프로그램은 ACTUAL + 4096을 할당해주긴 하지만 접근을 하지않아 page fault조차 뜨지 않았다. 이는 말이 안된다고 판단해서 내 코드를 계속 뜯어보다가 나중에 Test Case를 열어보게 되었다.#define ACTUAL ((void *) 0x10000000)voidtest_main (void){ int handle; void *map; CHECK ((handle = open ("sample.txt")) > 1, "..