ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 90일차] Project 4 과제를 파악하며 필요한 개념 정리
    기타/SW 사관학교 정글 2021. 11. 1. 01:55

    오늘은 어제의 양자택일 중에 결정을 했다.

    아침에 와서 HTTP 완벽가이드를 읽은 후에 점심을 먹고 pintos project 4를 다시 보았다.

    전체적으로 지금 어떠한 상황이 문제인지와 어떤걸 고치고 싶은지는 알겠다.

    그리고 과제를 파악하면서 필요한 개념들을 다시 리마인드하고 반효경 교수님 강의를 들으면서 오늘 내가 배운 내용들을 정리하려고 한다.

     

     

    첫 번째과제는 Indexed and Extensible Files이다.

    어제 잠깐 짧게 정리를 했는데 project 3까지는 continuous allocation을 사용했다.

    continuous allocation의 문제는 external fragmentation이 발생할 수 있고 file이 growth(write를 하여 file이 더 커지는 경우)에 뒤에 free block이 없으면 해당 크기가 들어갈 수 있는 continuous한 free blocks를 찾아야한다는 것이다.

     

    이를 보완하기 위해 나온 것은 noncontinuous allocation이고 noncontinuous allcation에는 linked-list allocation과 indexed allcation이 있다.

     

    linked-list allocation은 말 그대로 flie이 존재하는 block을 linked list로 순차적으로 연결해놓은 것이다.

    접근하는 방법은 inode나 directory의 file metadata에 file의 시작 block number를 저장해놓는다.

    그 후에 시작 block number에 접근하면 다음 block number를 알 수 있고 또 다음 block number에 가면 다음 block number를 알 수 있게 해준다.

     

    linked-list allocation을 통해 continuous allocation의 단점을 보완할 수 있지만 새로운 단점이 생긴다.

    단점으로는 direct access(random access)를 못한다는 것이다.

    보면 알 수 있듯이 file의 3번째 block을 접근하고 싶어도 순차적으로 읽어야한다.

    다른 단점으로는 각 block에 다음 block number를 저장하기 위한 공간을 따로 내주어야한다는 것이다.

    그리고 한 block이 손실되면 다음 block을 접근할 수 있는 방법이 없다는 것도 단점이다.

     

    그래서 이를 보완하기 위해 나온 것이 FAT(File allocation table) file system이다.

    내가 처음 FAT를 접했을 때에는 '이게 linked-list allocation의 한 종류로 봐야하나?', 'indexed allocation'으로 봐야하나 하는 생각이 들었다.

    오늘 반효경 교수님의 강의 보고 내린 결론은 FAT는 하나의 file system이고 linked-list를 기반으로 한 table을 가지고 있다는 것이다.

    출처: https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f

    간단한 원리를 설명하면 하나의 partition에 FAT를 저장할 block을 따로 두고 FAT의 크기는 Data block의 갯수이다.

    그리고 file의 시작 block number는 directory file에 저장되어있고 해당 block number를 index로 사용하여 FAT에 접근하여 다음 block number를 얻을 수 있다.

    이렇게 되면 file의 block 일부분이 손실되도 FAT를 이용하여 file에 접근할 수 있고 block에 block number를 두기 위한 공간을 따로 안내주어도 된다.

    그리고 완전안 direct access라고하기에는 애매모호하지만 기존의 linked-list보다는 빠르게 접근할 수 있다고 생각한다.

    왜? => table에서 index접근을 통해 block number를 얻을 수 있으니까

     

    마지막으로 Indexed allocation이 있는데 이 부분은 시간 상 PPT를 첨부하려고 한다.

    출처: https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f
    출처: https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f

     

    다음 과제는 Subdirecories and Soft Links이다.

    project 3까지는 모든 파일들이 하나의 directory에서 관리되었다.

    directory structure에는 여러 구조가 존재한다.

    아래의 강의를 통해 개념을 나의 것으로 만들 수 있었고 project 4에서 요구하는 것은 hierarchical directory structure이다.

    https://www.youtube.com/watch?v=3VOqyi-wbJU&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=40 

     

    그리고 현재 file name의 길이가 14-character로 제한되어 있는데 이것은 유지하거나 늘려보고 싶으면 option으로 해보라고 한다.

    long file name을 관리하는 방법은 반효경 교수님의 강의를 통해 알 수 있었다.

     

    file name이 저장할 수 있는 공간보다 크다면 마지막 byte에 file name을 이어서 저장하는 공간을 link하는 형식으로 구현할 수 있다.

     

    그리고 해야 할 일들은 directory에 관한 systemcall인 chdir(current directory 변경), mkdir(새로운 directory 생성), readdir(directory entry 읽기), isdir(directory 내에 인자로 받은 fd가 존재하는지 여부), inumber(인자로 받은 fd에 대한 inode number 반환)을 구현하는 것이다.

    project 2때 system call의 지옥을 맛봤는데 여기서도 연장선이 있었다는 것에 충격을 먹었다..

    그리고 각각의 process별로 current directory를 유지하기 위해 기존에 구현한 system call도 수정해야한다....

    일단 여기까지 과제파악 완료...

     

    마지막이 Soft Link에 대한 것인데 이 부분은 내일 다시 봐야할 것같다.

    내가 본 강의와 교재에서 자세히 다룬 부분이 없어 따로 찾아봐야할 것같다.

     

     

    세 번째 과제는 Buffer Cache이다.

    Cache에 대한 개념은 Virtual memory에서 접한 적이 있다.

    Virtual memory와 다른 점은 cache hit을 운영체제가 알 수 있어 LRU나 LFU 알고리즘을 사용할 수 있다는 것이다.

    그리고 Buffer Cache는 메모리의 kernel 영역에 자리를 잡고 있고 이 말은 process들이 동일한 file을 read할 경우에 buffer cache에 저장이 되어있다면 해당 buffer cache에 있는 file data를 copy해서 쓸 수 있다는 것이다.

    이 부분에 대한 개념정리는 아래의 반효경 교수님 강의가 매우 큰 도움이 되었다.

    https://core.ewha.ac.kr/publicview/C0101020140523142954456205?vmode=f 

     

    이 과제에서 구현해야할 것은 file block이 cache되도록 해주는 것이고 최소한 clock algorithm보다 좋은 cache replacement algorithm을 구현하는 것이다.

     

    출처: https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f

     

     

    Extra 과제(Mount, Filesystem journaling)을 제외하면 마지막 과제인 Synchronization이다.

    이 부분은 과제파악이 잘 안된다.

    external synchronization에 대한 말이 나왔는데 이해가 잘 안된다..

    뭔가 얘기하는 것은 동기화를 위해 추가 작업을 해줘야한다는 것 같은데 솔직히 잘 모르겠다.

    내일 다시 천천히 과제를 파악해봐야겠다.

    The provided file system requires external synchronization, that is, callers must ensure that only one thread can be running in the file system code at once. Your submission must adopt a finer-grained synchronization strategy that does not require external synchronization. To the extent possible, operations on independent entities should be independent, so that they do not need to wait on each other.
    Operations on different cache blocks must be independent. In particular, when I/O is required on a particular block, operations on other blocks that do not require I/O should proceed without having to wait for the I/O to complete.
    Multiple processes must be able to access a single file at once. Multiple reads of a single file must be able to complete without waiting for one another. When writing to a file does not extend the file, multiple processes should also be able to write a single file at once. A read of a file by one process when the file is being written by another process is allowed to show that none, all, or part of the write has completed. (However, after the write system call returns to its caller, all subsequent readers must see the change.) Similarly, when two processes simultaneously write to the same part of a file, their data may be interleaved.
    On the other hand, extending a file and writing data into the new section must be atomic. Suppose processes A and B both have a given file open and both are positioned at end-of-file. If A reads and B writes the file at the same time, A may read all, part, or none of what B writes. However, A may not read data other than what B writes, e.g. if B's data is all nonzero bytes, A is not allowed to see any zeros.
    Operations on different directories should take place concurrently. Operations on the same directory may wait for one another.
    Keep in mind that only data shared by multiple threads needs to be synchronized. In the base file system, struct file and struct dir are accessed only by a single thread.

     

     


    [오늘의 나는 어땠을까?]

    오늘은 아침 8시에 알람은 들었지만 10분만 더 자야지 하는 것을 1시간 더 자버렸다...

    이렇게 잠을 내가 계획한 것보다 오래 잤다는 것에 짜증이 나지만 한편으로는 이렇게 중간에 깨지도 않고 자본 것도 되게 오랜만이여서 몸 상태는 좋은 것같다.

    그래도 내일부터는 반드시 목표한 시간에 일어날 것이다.

     

    오늘 하루는 계획한대로 공부를 했고 중간에 OS에 지쳐 Express 프레임워크를 공부했는데 너무 재미있었다.

    그리고 말로만 듣던 JS에서의 Test code 작성도 해보면서 신기함을 느끼기도 했다.

    더 많은 서버단에서의 지식을 얻고 싶다.

    서버 뿐만 아니라 DB쪽도 공부를 해야해서 많은 양의 지식이 단기간 안에 나의 것으로 만들어야하는 불안감이 있지만 최대한 나만의 무기 때에는 즐기려고 한다.

    댓글

Designed by Tistory.