[운영체제] Files and Directories
Abstractions for Storage
File
- byte 로 이루어진 1차원 배열구조 입니다.
- 각각의 파일은 low-level 의 name (inode number) 을 가지고 있습니다.
- 운영체제는 file 의 structure 에 대해 자세히 알지 못합니다. (e.g., pcture, or a text file, or C code)
- 운영체제는 확장자와 연결하여 mapping 정보만을 가지고 있습니다.
Directory
- user-readable name 과 low-level name 의 쌍을 리스트로 포함하고 있습니다.
- 한 directory 는 마찬가지로 low-level name 을 가지고 있습니다
- pathname (경로)
- 절대 경로 : /bar/foo/bar.txt
- 상대 경로 : ./bar.txt (assume the current directory is /bar/foo)
File System Interface
Creating Files — open() system call with O_CREATE flag
int fd = open("foo",
O_CREAT|O_WRONLY|O_TRUNC,
S_IRUSR|S_IWUSR);
- O_CREATE : 같은 이름의 file 이 존재하지 않을 경우 file 을 생성합니다. 만약 있다면 해당 file 을 open 합니다.
- O_WRONGLY : write only 하게 file 을 open 합니다.
- O_TRUNC : 만약 file 이 이미 있다면, 기존의 내용을 지우고 새로 덮어씌웁니다.
-
S_IRUSR S_IWUSR : readable or writable 의 permissions 를 구체화 합니다.
File descriptor
file 이 정상적으로 create 하게 되면 File descriptor 을 return 합니다.
- An integer
- 해당 프로세서는 file에 대해 읽거나 쓰기 위한 permission 을 명시합니다.
- File 에 대한 Object Pointer 역할을 합니다.
- Private per process
- 각각의 프로세스들 내에서 고유한 번호를 갖습니다. 다만, 다른 프로세스끼리 같은 file descriptor 를 가질 수 있습니다. 또 같은 file descriptor 을 가진다고 해서 같은 file 을 가리키는 것은 아닙니다.
- 즉 PCB 내에서 open 한 file 들의 descriptor 들을 배열 형태로 관리합니다.
Accessing Files
File descriptors 0,1 그리고 2 는 표준 input, output 그리고 error 를 위해 각각 사용됩니다. 이후에 file descriptor 를 부여받을 때는 3부터 시작하여 제일 작은 수를 부여받습니다.
Accessing Files (Random Access)
현재 read write 포인트 (시작지점으로부터) offset 정보를 운영체제는 유지합니다.
- 현재 read 혹은 write 하는 부분의 시작지점으로부터 offset 정보를 운영체제는 update 하여 유지합니다.
- Implicit update : N bytes operation 할 경우 N 만큼 offset 이 추가됩니다.
- Explicit update : off_t lseek(int fd, off_t offset, int whence)
- fd : file descriptor
- offset : whence 에 의해 의미가 달라짐
- SEEK_SET : offset 을 offset bytes 로 설정
- SEEK_CUR : 현재의 offset 에 인자로 받은 offset 을 더한 값
- SEEK_END : file 의 맨 끝에서부터 offset 까지 더한 값
Open File Table
운영체제는 open 된 file 들에 대한 정보를 table 로 관리합니다. OFT 의 각각의 entry 들은 PCB에서 관리하고 있는 file descriptor 들과 1:1 mapping 되어있습니다.
- Example (xv6)
struct { struct spinlock lock; struct file file[NFILE]; } ftable;
struct file { int ref; char readable, writable; struct inode *ip; uint off; };
- process 의 ofile 에서 file 들을 object pointer 로 관리하고 각각 pointer 의 값들은 Open File Table 의 file entry 의 file 구조체를 가리킵니다.
- int ref : 어떤 프로세스들이 동시에 접근하는지에 대한 정보
- 접근권한 정보
- inode 정보
- offset 정보
Shared File Entries
서로 다른 프로세스가 같은 file 을 open 한다고 하더라도 각각의 Open File Table 안에 별도의 entry 를 갖습니다. 하지만 file entry 들을 프로세스가 공유하는 경우가 발생할 수 있습니다.
- Shared file entry by fork()
- Shared file entry by dup()
- 인자로 넘겨받는 file descriptor 와 동일한 file entry 를 공유하는 file descriptor 를 생성합니다.
int fd=open(“output.txt", O_APPEND|O_WRONLY);
close(1);
dup(fd); //duplicate fd to file descriptor 1
printf(“My message\n"); // write in txt file
Writing Immediately
- write() : 운영체제는 write 정보를 메모리에 buffering 해놓습니다. buffer 가 쌓이면 한번에 disk 에 저장합니다. Disk scheduling 의 효율성을 높일 수 있습니다.
- fsync() : 현재 입력받는 값과 buffer 의 값을 즉시 disk 에 저장합니다.
Removing Files
unlink() -> 밑의 Directroy System Interface 에서 link 와 함께 다루겠습니다.
Directory System Interface
Making Directories
- mkdir() : empty 한 directory 를 만듭니다.
- . : 현재 자신의 directory 를 의미합니다.
- .. : 자신의 부모 directory 를 의미합니다.
Reading Directories
- opendir() : 현재 directry 의 directory object pointer 를 얻습니다.
- readdir() : Directory 의 한 Entry 의 정보를 얻습니다.
- closedir() : close
int main(int argc, char *argv[]) {
DIR *dp = opendir(".");
struct dirent *d;
while ((d = readdir(dp)) != NULL) {
printf("%lu %s\n", (unsigned long) d->d_ino, d->d_name);
}
closedir(dp);
return 0;
}
Deleting Directories
- rmdir() : directory 가 empty 해야합니다. 만약 empty 하지 않으면 함수가 fail 됩니다.
Link and Unlink Files
- link() : directory 에 다른 이름으로 file 을 생성하고, original file 과 같은 inode number 를 참조시킵니다.
- rm COMMAND and unlink() : user-readable 이름과 inode number 와 link 를 끊습니다. reference count 를 감소시키고 zero 가 되면 해당 파일을 완전히 지우게 됩니다.
Type of File
type of file
-
- : regular file
- d : directory
- l : symbolic link
Permission bit
- grouping by 3 bits ( owner + group + other )
- 권한을 바꾸려면 chmod 를 이용합니다.
- ex) chmod 600 = rw- — —
Making a File
명령어를 통해 백지상태의 Disk 에 File system 을 깔아주는 기능입니다.
- mkfs COMMAND
- empty file system 을 만듭니다. disk partition 에 쓰이며 root directory 만을 가집니다.
- prompt> mkfs -t ext4 /dev/sda1
- 특정 File system tree 에 연결되어야 합니다.
- mount COMMAND
- File system tree 에 연결하기 위한 명령어 입니다.
- prompt> mount -t ext4 /dev/sda1 /home/users