일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 일지 시작한 지 얼마나 됐다고
- 파란 장미
- 셋업
- botw
- 핀토스 프로젝트 3
- 가테
- 글루민
- 핀토스 프로젝트 2
- 핀토스 프로젝트
- multi-oom
- 황금 장미
- Project 1
- 끝
- 글리치
- 자 이제 시작이야
- 핀토스 프로젝트 1
- 내일부터
- alarm clock
- 핀토스 프로젝트 4
- 제발흰박
- PINTOS
- 노가다
- 아직도 실험 중
- 마일섬
- 바빠지나?
- Today
- Total
거북이의 쉼터
(2022.03.29) Subdirectories 가이드라인 (2) 본문
이젠 구체적으로 어떤 기능 및 함수를 구현해야 할 것인지를 살펴보자.
각 프로세스의 cwd를 위해서는 thread 구조체에 또 다시 인자를 추가해야 할 것 같다. 각 thread에 대해 directory를 하나 열어두고, 열린 디렉토리를 cwd로 취급한다. 가장 처음에 시작되는 프로세스의 경우는 root directory를 열어서 cwd로 삼을 것이다. fork 할 때 해당 cwd를 한 번 더 열어서 새롭게 생성되는 프로세스에게 이전할 수 있으며, chdir 함수를 이용해서 cwd를 변경할 수 있을 것이다.
다음으로는 파일 경로로 들어오는 이름을 파싱할 함수를 구현해야 한다. 파싱할 함수를 두 개 만드는 것이 적절해보이는데, 하나는 해당 파일이 최종적으로 위치한 디렉토리를 여는 함수, 다른 하나는 해당 파일의 순수한 이름, 그러니까 경로 정보를 제외한 이름만을 따오는 함수이다. 디렉토리를 여는 함수의 경우, 만약 절대 경로가 들어온다면 root directory를 기준으로 움직이고, 상대 경로가 들어온다면 cwd를 기준으로 움직이면 된다. 두 함수 모두에서 strtok_r을 쓰는 것이 괜찮을 것 같다.
해당 설계를 채택할 경우 chdir은 단순히 현재 thread의 열려있는 cwd를 기준으로 새로운 디렉토리를 열고, 기존 디렉토리를 닫는 것이 된다. 위 기능을 모두 구현한다면 간단할 것이라 생각하니 세부적인 사항은 구현에서 살펴보자.
mkdir의 경우, 디렉토리 파싱을 통해 생성하려는 디텍토리의 부모 디렉토리가 먼저 존재하는지를 확인하고, 존재할 경우 섹터를 할당해, dir_create로 디렉토리를 부모 디렉토리 내에 생성한다. 그 뒤에는 부모 디렉토리에 dir_add를 통해 엔트리를 추가함으로서 작업을 모두 마치면 된다.
readdir, inumber는 지난 포스팅에 살펴본 것처럼 구현하면 문제는 없을 것이다.
문제는 기존 함수인 open의 수정과 isdir, 그리고 readdir에서의 fd 검사이다. 최종 구현 이후에는 디렉토리가 open을 통해 열릴 경우, 그 사용처는 readdir, isdir, 그리고 close 뿐이다. 해당 함수들 외에 다른 syscall로 디렉토리 fd가 들어올 경우 거부하는 루틴도 구현해주어야 하는 것이다. 이는 열린 fd에 연동된 객체가 directory라고 표시해 주는 것이 없으면 구현할 수 없다. 결국 open에서 inode를 열 때, 해당 inode가 디렉토리인지 아닌지를 표시해주는 것이 있어야 하며, 이 때문에 inode_disk 구조체에 is_dir field를 추가해야 한다. 파일 또는 directory를 생성할 때 해당 인자에 마킹해주면, 후에 해당 inode가 들어있는 섹터를 불러온 뒤에도 판별이 가능하다.
디렉토리를 remove를 할 때 디렉토리가 비어있는지와, 열려있는지 검사하는 방식도 찾아내야 한다. 비어있다는 것을 판단할 때는 readdir에서 했던 방식을 차용해 false를 반환하는지를 검사하면 된다. 열려있는지를 검사하기 위해서는 만약 디렉토리를 remove하려고 dir_remove까지 도달했을 때, inode를 열어 본 결과 해당 inode의 open_cnt가 1 초과, 즉 dir_remove외에 열고 있는 프로세스가 있을 경우에는 삭제할 수 없도록 하면 된다. 다른 많은 syscall을 변경하기보다는 이게 간단하므로 해당 방식을 채택한다.
열고 있는 프로세스가 없을 때 root를 없애려하는 시도는 어떻게 생각할 수 있을까? 일단 해당 프로그램이 실행중이기 때문에 비어있지는 않을테지만 어떠한 경우건 root directory는 없어지면 안 된다. 디렉토리 파싱 결과, 만약 없애려고 한 것이 최종적으로 root directory였을 경우, 해당 경우는 따로 분류하여, 바로 reject하도록 하자.
지금까지의 내용을 정리해 주요하게 구현할 사항을 나열하면 아래와 같다.
- thread 구조체에 cwd 만들기
- 디렉토리 파싱 및 파일 이름 파싱 함수 만들기
- inode_disk에 is_dir 만들기
이를 기반으로 Subdirectory 관련 함수를 구현할 것이다.
'코딩 삽질 > KAIST PINTOS (CS330)' 카테고리의 다른 글
(2022.04.02) Soft Link 가이드라인 (0) | 2022.04.02 |
---|---|
(2022.04.02) Subdirectories 구현 (0) | 2022.04.02 |
(2022.03.29) Subdirectories 가이드라인 (1) (0) | 2022.03.29 |
(2022.03.29) Indexed & Extensible 구현 (2) (0) | 2022.03.29 |
(2022.03.28) Indexed & Extensible 구현 (1) (0) | 2022.03.28 |