기타/운영체제

[운영체제]File System

stonesy 2022. 5. 23. 21:39
728x90

4. Interlude: Files and Directories

4-1. File and Directories

File

정의: 문자열인데 영속적으로 저장된다.

각각의 파일은 자신의 고유한 구조를 가지고 있다.

하지만 OS입장에서는 이런 format을 신경쓰지 않고, 이런 format들은 application 입장에서 고려된다.

파일은 절대경로와 상대경로의 2가지 이름을 가진다.

절대경로(absoulte path): root부터 시작

상대경로(relative path): 현재 디렉토리 위치부터 시작

 

Directory

파일중에 특별한 목적으로 사용되는 파일로, 계층구조를 만든다.

-Root directory: 가장 상위에 존재하는 디렉토리

-Home directory: 로그인 후 처음 들어가는 디렉토리

-Working directory: 현재 작업 중인 디렉토리

<file name, inode>의 쌍을 가진다.

 

다양한 개체들을 파일이라는 이름으로 접근할 수 있다.

 

4-2. File System Interfaces

API, 파일과 관련된 API들

user가 볼 수 있는것들

open(): 파일을 열고, file descriptor를 return함

I/O: 실제 I/O를 담당하는 read/write들

attribute(): 속성을 알아내는 API

create(): 파일을 생성함

user가 볼 수 없지만, disk 내부에 구현된 것들

allocate/free block: block을 할당하고 해제함

alocate/free inode: inode를 할당하고 해제함

name

buffer related: 버퍼 공간을 관리함

 

4-3. Creatng Files

파일을 생성하는 API, CREATE API

create flag와 함께 file을 open한다.

open(파일 이름, flags, 접근권한)

open(파일 이름, flags, 접근권한)

1)name, 2)flags, 3)permissions

→접근 권한을 User, Group, Others로 구분한다.

creat()를 사용해서 파일을 직접 만들 수 있다.

 

4-4. Reading and Writied Files

Read/Write API

read, write

모양은 비슷하고 방향만 다를 뿐이다.

read와 관련된 대표적인 명령어 cat

 

4-5. Reading and Writing, But Not Sequentially

*file은 다음과 같은 3가지 attribute로 설명가능하다.

: start, offset(현재 읽거나 쓰려고 하는 위치), end

file을 sequential하게 읽고 싶지 않고 random하게 읽고 싶을 때, lseek()라는 system call을 사용하면 된다.

 

4-7. Writing immediately with fsync()

write와 성능 고려

DRAM에 비해서 Disk의 속도가 매우 느리다. 따라서 지연쓰기를 한다. 즉, Disk에 바로 데이터를 쓰는게 아니라 buffer cache에 잠깐 써놓았다가 어느정도 시간이 지나면 disk에 데이터를 적는다.asychronous I/O(비동기적 I/O)

하지만 이런 지연쓰기는 durability를 깨트릴 수 있다.(예상치 못한 이유로 데이터가 날아갈 수 있다.)

fsync()를 요청하면 sychronous I/O(동기적 I/O)로 동작하게 할 수 있다.

 

4-8. Renaming Files

파일 이름을 바꾸고 싶을 때, Change a file name

-명령어의 입장

prompt> mv foo bar

-system call의 입장

int fd = open("foo.txt.tmp", O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
write(fd, buffer, size);
fsync(fd);
close(fd);
rename("foo.txt.tmp", "foo.txt");

 

4-10. Removing Files

Remove a file

-명령어의 입장

rm:rm이라는 명령어가 어떤 system call을 사용하는지 trace해보면 unlink를 사용한다.

-system call

unlink(”foo”);

 

4-9. Getting information about Files

Contents in a file system

file system에는 여러가지 내용들이 들어갈 수 있다. 이 내용은 2개의 타입으로 나눌 수 있다. user data와 metadata로 나눌 수 있다.

User data: 사용자에 의해 쓰여진 데이터
Metadata: file system이 파일을 관리하기 위해서 만든 데이터

 

파일의 속성(Metadata의 내용)을 보고 싶을 때 다음과 같은 명령어를 사용하면 된다.

stat(file_name, struct stat)

fstat(fd, struct stat)

 

4-11. Making Directories, 4-12. Deleting Directories

디렉토리를 만드는 API, API for making directory

mkdir(name, permission)

리눅스에서 .→자기 자신을 나타냄

..→부모를 나타냄

 

API for deleting directory

rmdir(file_name)

 

API for reading directory

opendir(dp), readdir(dp), closedir(dp)

int main(int argc, char *argv[]){
	DIR *dp = opendir(".");
	assert(dp!=NULL);
	struct dirent *d;
	while((d=readdir(dp))!=NULL){
		printf("%d %s\n", (int) d->d_ino, d->d_name);	
	}
	closedir(dp);
	return 0;
}

결국 directory에 들어간 것들은 파일이름과 inode의 쌍이다.

  • writedir()이 없는이유? opendir()로 열고 옵션을 주면 된다.

4-14. Hard Links, 4-15. Symbolic Links

Link

  1. Hard link: inode number를 공유한다.
  2. Symbolic link(Soft link): inode를 새로 할당받아 간접적으로 파일에 접근한다.

-Soft link는 사용자 입장에서 보면 hard link와 동일하지만, 시스템 입장에서는 soft link는 서로 다른 inode를 사용한다는 점에서 차이점이 있다. 하지만 soft link는 서로 다른 file system끼리 사용가능하다는 장점이 있다.

-dangling reference: 원본 파일이 삭제된 경우 파일을 찾을 수 없다는 에러가 발생할 수 있다.

A라는 파일이 있고, A라는 파일이 어떤 파일 객체를 가르킨다. 이때, A라는 이름 말고도 B라는 이름으로 파일에 접근하고 싶을 때 link를 사용한다.

→file 이름을 새로 inode에 연결시키는 것이다.

unlink를 통해서 link count가 0이 되면, 파일 객체를 가리키는 파일이름이 없어지고 최종적으로 파일이 삭제된다.

 

File system

-디렉토리와 파일들의 집합

-파일시스템을 관리하기 위한 메타데이터: superblock, bitmap

-파일시스템을 만들기 위한 명령어: mkfs

→파일시스템을 만들 때는 mkfs를 사용한다. 파티션은 fdisk를 사용한다.

disk를 여러 부분으로 나누는데, 그 각각을 파티션이라고 말한다. 각각의 파티션마다 서로 다른 파일 시스템을 만들 수 있다. 물론 디스크 하나를 통째로 사용하여 하나의 파일 시스템을 만들 수 있다.

 

sudo mkfs.ext4 /dev/sda5

sda5이라는 파티션에 ext4타입의 file system을 만들어 달라는 의미이다.

*전통적으로 첫번째 파티션을 sda1, sda2, sda3,..라고 한다. 0부터 시작할 수도 있고, 1부터 시작할 수도 있다.

 

Mount

mount의 역할

  1. 파일시스템을 사용자에게 보여준다.
  2. 다양한 파일시스템을 서로 연결해서 단일한 디렉토리 트리로 만들어줌
$mount -t ext3 /dev/sda4/mnt

1번째 인자로 file system type이 들어간다. 2번째 인자로는 어떤 partition인지가 들어간다.

3번째 인자는 mount point가 들어간다.

mount를 통해서 하나의 통합된 디렉터리 구조를 갖게 된다.

 

*왜 multiple partition으로 구분하는 것일까?

이는 데이터의 신뢰성을 높이기 위함인데, 하나의 file system에 문제가 생겨도 문제없이 동작하도록 하기 위해서 multiple partition으로 구분한다.

 

file system이 어떻게 구현되어 있는지 내부구조를 자세히 다뤄보자.

file system을 API측면에서 공부할 수 있고, 모양(layout)이 어떻게 생겼는지 측면에서 공부할 수 있다.

 

다양한 파일 시스템

-UFS: Unix File System

-FFS: Fast File System

-EXT 2/3/4: 리눅스의 기본 File System

-JFS: 저널링 파일 시스템

-LFS: 로그 구조(로그 structure)→쓰기(write)에 좋은 성능을 보임

-NTFS(Windows)

-F2FS(Flash): Flash라는 Storage 특성에 알맞다.

-FUSE(User level file system)

-RAMPS(Memory 기반 file system)

-NFS(분산 file system): Nerwork File system, 성공한 분산 File System 중 하나이다.

-AFS

-ZFS

-GFS(Google File system)

-FAT: 이동형 Storage에서 많이 사용됨

 

-VSFS(Very Simple File System)을 만들어보자!

 

Disk

디스크는 여러 partition으로 나눌 수 있다.

위에서 8개의 partition으로 나눠진 것을 확인할 수 있다.

 

Partition

하나의 Partition은 여러 개의 disk block으로 구성되어 있고, disk block의 크기는 4KB이다.

이 디스크블록에 user data가 올라간다. Disk block의 크기는 페이지의 크기와 동일하다.

 

Partition에 다음과 같은 내용들이 필요하다.

Superblock, Bitmap, Inode, User data의 4영역으로 구성되며 각 영역은 다음과 같다.

-Superblock: 파일 시스템을 관리하기 위한 메타데이터

-Bitmap: 가용 공간을 관리하기 위한 메타데이터

-Inode: 파일을 관리하기 위한 메타데이터

-User data: 실제로 파일에 저장되어 있는 일반적인 데이터

 

파일의 Metadata를 어떻게 관리하는가?

Inode는 고정된 값을 가지고 있으며, 1. 파일에 대한 meta-data를 관리하고, 2. 파일의 위치를 관리한다.

파일의 위치는 관리하는 포인터들은 multi-level structure로 이루어져 있다.

inode의 block을 가리키는 pointer는 direct pointer와 indirect pointer로 나눌 수 있는데, 15개의 pointer block 중 12개의 direct pointer와 3개의 indirect pointer로 이루어져 있다. indirect pointer는 index를 가리킨다.

imbalance tree구조로 만들면, 작은 파일에 대해서는 빠르게 접근하고 큰 파일에 대해서도 동시에 지원할 수 있다.

 

다음과 같이 root directory에 7KB의 hello.c를 만들고, 이를 컴파일하여 70KB의 a.out파일을 만드는 상황을 가정하자.

Inode와 data를 어떻게 찾아갈 것인가?

1. Inode를 찾아가는 방법

-Directory entry: <file name, i_number>

inode에 대한 정보는 directory에 있다.

-inode number는 inode table에서 원하는 inode를 찾아가기 위한 index로 사용된다.

 

2. User data를 찾아가기 위한 과정은 다음과 같다. 

1. 현재 inode를 찾는다

2. 파일의 현재 offset을 disk size로 나눈다.

3. 몫은 inode를 찾기 위한 pointer로 사용된다.

4. 나머지는 disk block에서의 offset으로 사용된다.

 

https://stonesy927.tistory.com/2

 

Lab3 : [Analyze Ext2 file system internal]

목표: 2번 directory의 89파일과 98파일 찾기 1. Root Directory에서 찾을 File이 속한 Directory의 Inode Number를 찾는다. 1단계에서 이루어진 내용 정리: 찾고자하는 파일이 속한 directory의 위치를 알 수 없..

stonesy927.tistory.com

 

Directory Oraganization

Directory

windows 환경에서는 folder라고 부르며, 서로 연관된 파일들의 집합이다.

사용자 관점: 같은 위치에 있는 서로 연관된 파일들의 집합

시스템 관점: directory 안에 있는 file 이름과 그 이름을 관리하는 inode 쌍의 집합 <file name, inode number>

 

Free space

Bitmap은 가용 공간을 관리한다.

Pre-allocation: 실제 크기보다 조금 더 크게 할당하여 파일의 크기가 커져도 유연하게 대응가능하도록 한다.

 

Reading a file from disk

Writing a file into disk

위와 비교하면 read보다 write의 I/O횟수가 많음을 확인할 수 있다. 이는 bitmap 연산 때문이다.

 

Issue

디스크는 느린데 disk I/O가 많이 발생해 성능상에 문제가 생길 수 있다.

Caching(디스크에 있는 데이터를 미리 메모리에 올려놓고 이후에 읽을 때는 캐시를 통해서 읽는다.)

최근에 사용된 file의 inode를 DRAM에 올려놓는다.

지연쓰기를 한다.(Write buffering, Delayed write), 쓸 때마다 디스크에 직접 쓰는 것이 아니라 메모리에 일단 써놓는다.

여러번의 I/O를 묶을 수 있다.

하지만 전원 결함이 있을 때, 데이터의 손실 가능성이 있고, fsync()를 통해서 이를 방지할 수 있다.

728x90

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

[운영체제]Advanced File System  (0) 2022.06.04
[운영체제]Paging  (0) 2022.06.03
[운영체제]Memory Virtualization  (0) 2022.05.23
[운영체제]Hard Disk Drives  (0) 2022.05.23
[운영체제]Persistence  (0) 2022.05.23