CS/운영체제

[운영체제] 24. File and Directory

공영재 2023. 12. 9. 13:08

Reference - Operating Systems: Three Easy Pieces

 

 

https://pages.cs.wisc.edu/~remzi/OSTEP/

 

Operating Systems: Three Easy Pieces

Blog: Why Textbooks Should Be Free Quick: Free Book Chapters - Hardcover - Softcover (Lulu) - Softcover (Amazon) - Buy PDF - EU (Lulu) - Buy in India - Buy Stuff - Donate - For Teachers - Homework - Projects - News - Acknowledgements - Other Books Welcome

pages.cs.wisc.edu

 

 

Files and Directories

이전 글에서 OS가 disk에 대한 logical view 가상화를 제공한다는 것을 배웠다.

이때 두개의 핵심 추상화가 존재한다.

File과 Directory다.

 

파일은 1차원 바이트 배열로, 각 바이트는 읽고 쓸 수 있다. 또한 디렉토리라는 계층 구조가 존재한다.

디렉토리의 시작은 root라고 하며, "/"로 표기된다.

 

Unix는 일반적인 파일뿐만 아니라 peripheral devices와 inter-process communication channel도 파일 개념을 쓴다.

(ex. /dev/stdin, /dev/rmt0 = I/O device를 file로 represent)

(ex2. write data of file1 to tape device = "$ cat file1 > /dev/rmt0")

각 파일은 low-level name(ID)가 존재하는데, 이를 inode number라 한다.

 

Unix에서 디렉토리는 (uesr-readable name, inode#)의 리스트로 구성된다. 디렉토리의 각 entry는 file 혹은 다른 디렉토리를 가리킨다. 여기엔 ownership과 permission이라는 개념이 있는데, owner는 각 파일의 permission을 정하고, permission은 누가 접근하고 읽고 쓸 수 있는지 여부를 정할 수 있다.

 

"ls -l /디렉토리 path" 을 통해 해당 디렉토리의 권한을 볼 수 있다.

이때 -rwxr-x--x student dgist 와 같은 형태로 권한이 어떻게 설정되었는지 나온다.

 

chmod(change mode)로 권한 설정이 가능하다. 소유권 자체를 변경하는 것은 chown으로 가능하다.

 

Unix File IO

 

File을 생성할 땐 open() system call을 O_CREAT flag와 함께 사용한다.

 

 

O_WRONLY : onnly write, O_TRUNC : 기존 파일이 있으면 기존 content를 제거하고 열게 한다.

open()은 Fild Descriptor를 반환한다. 이는 프로세스가 가지는, 파일에 대한 권한을 나타내는 int다.

파일을 열 때, if ((fd = open(/~, O_RDONLY) < 0)를 통해 FD가 -1이면 에러를 발생시킨다. 

파일을 닫을 땐 if ((return_value = close(fd)) < 0) 이면 에러를 발생시킨다.

파일을 읽고 쓸땐 open() 후 read() or write() syscall이 호출된 뒤 close()가 수행된다. 예시를 보자.

echo hello > foo  // write

cat foo  // read

를 하면 prompt에 hello가 출력된다.

 

어떤 프로그램이 수행하는 syscall을 보려면 strace 명령어를 쓴다. strace cat foo를 해보자.

 

3은 open이 return하는 file descriptor다. 6은 read 혹은 write한 bytes 수를 return한 값이다.

 

위 read, write는 연속적으로 읽고 쓰는 방법인데, 특정 부분만 읽고 쓰기 위해 lseek(fd, offset, whence) syscall을 사용한다.

offset은 파일의 특정 위치를 가리키고, whence는 어디를 기준으로 offset을 설정할지를 정한다.

whence에서 seek_set은 offset만큼, seek_cur은 지금위치+offset 위치, seek_end는 끝+offset 위치부터 작업한다는 뜻이다. 

file의 메타데이터를 얻으려면, stat 혹은 fstat으로 가능하다.

 

이러한 type의 정보를 inode structure(called inode)라 한다.

 

rm command는 파일을 remove하는데, 이때 rm내에서 unlink()를 통해 삭제한다.

 

directory remove의 경우 rmdir()을 통해 삭제한다. 이때 empty directory가 아니라면 실패한다.

 

Links

 

link command는 ln이라하는데, 기존 파일에 대해 inode 번호만 공유한 새로운 파일을 만들겠다는 것이다.

말그대로 "링크"를 통해 같은 파일에 대한 새로운 접근 방법을 만든다. 이를 hard link라 하자.

unlink는 이러한 link를 끊는것이고, reference count를 통해 해당 파일이 연결된 파일의 수를 구한다. 이때 원본을 unlink하면 reference count가 0이 되면서 해당 inode와 data block도 삭제하게 된다.

 

위의 hard link와 다르게 symbolic link가 있다. hard link는 파일의 inode를 사용해 연결하는데, inode는 file system마다 독립적이기 때문에 다른 File system의 파일엔 사용할 수 없다. 이를 가능하게 하는것이 symbolic link다.

ln -s 를 하면 symbolic link를 사용할 수 있는데, 두개의 파일이 다른 inode를 가리키며 reference count도 각각 1이 된다.

 

 

symbolic link의 경우 원본 파일의 경로를 저장하기 때문에 원본과 사이즈가 다르며, 그 크기는 pathname의 길이에 따라 달라진다.  같은 이유로(경로를 저장) 원본 파일이 제거된다면 더이상 접근할 수 없게 된다.

이러한 문제를 dangling reference라 한다.

반응형

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 26. Fast file system  (1) 2023.12.10
[운영체제] 25. File system Implementation  (1) 2023.12.10
[운영체제] 23. Flash-based SSD  (0) 2023.12.08
[운영체제] 22. HDD and RAID  (1) 2023.12.08
[운영체제] 21. I/O Devices  (1) 2023.12.08
loading