3 분 소요

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() : 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

업데이트: