파일 시스템 ( File System )

임태영·2022년 3월 30일
0

운영체제

목록 보기
8/8
post-thumbnail

운영체제에서 파일을 관리하는 부분을 파일 시스템이라 한다.

파일 (File)

파일이란 연관된 정보의 모음이다.
파일에는 이름, 저장된 위치, 사이즈, 권한 등이 있다.
이렇게 파일과 관련된 정보를 파일의 metadata라고 한다.

디렉토리 (Directory)

디렉토리란 파일의 메타데이터 중 일부를 보관하고 있는 파일이다.
우리가 디렉토리를 열면 내부의 파일 이름들이 보인다.
이는 디렉토리가 파일의 메타데이터 중 파일 이름을 나열한 것이다.

파일 읽기

파일 이름을 더블 클릭 하면, 파일이 열린다.
또는 프로세스에서 파일을 읽어오기도 한다.
이는 두 단계로 이뤄진다.

open()

open()은 시스템 콜로서, 해당 파일의 메타데이터를 커널 메모리로 가져온다.
예를 들어 '/a/b/c' 경로에 위치한 파일을 open()해보자.
운영체제는 순서대로 디스크로부터 읽기 시작한다.

  1. root의 메타데이터를 커널 메모리에 읽어온다.
  2. root의 메타데이터에서 a의 메타데이터 주소를 찾아 읽어온다.
  3. a의 메타데이터에서 b의 메타데이터 주소를 찾아 읽어온다.
  4. b의 메타데이터에서 c의 메타데이터 주소를 찾아 읽어온다.

만약 파일을 읽는 과정이 한 단계라면, 매번 파일을 읽을때마다 위 과정을 반복해야 한다.
이는 많은 시간을 필요로 한다.
그래서 이렇게 한 번 읽어온 메타데이터들은 Open file table이라는 공간에 저장된다.
이 공간은 커널 메모리에 존재하며, 모든 프로세스에서 사용된다.

read()

open()이 끝나면, file descriptor가 리턴된다.
file descriptor는 PCB에 있는 배열로,
이 배열에는 open file table에 저장된 메타데이터의 위치정보가 저장된다.
리턴받은 file descriptor를 이용해 read() 시스템 콜을 하면,
b의 메타데이터로부터 c의 디스크 저장 주소를 찾아 읽는다.
읽은 c의 내용을 커널 메모리의 버퍼 캐시에 저장한다.
버퍼 캐시에 저장된 내용을 프로세스에 복사한다.
버퍼 캐시에 저장하는 이유는 다른 프로세스에서 b를 요청했을 때 위 과정을 반복하지 않기 위해서다.

파일 저장

하나의 파일은 블럭(block)이라는 단위로 나눠지고, 이 블럭들이 디스크에 할당된다.
이때 할당되는 방식에 따라 파일에 접근하는 방식이 달라진다.
index를 사용할 수 있다면 시작주소 + index로 직접 접근이 가능하지만,
링크드리스트와 같이 index를 사용할 수 없다면 순차적으로 접근해야 한다.

연속 할당

이때 이 블럭들을 연속으로 할당하는 방식이다.
이 방식은 직접 접근이 가능하지만, file size를 키우는게 불가능하다.

Linked 할당

한 블럭이 다음 블럭을 가리키도록 하여 전체를 연결한다.
이 방식은 직접 접근이 불가능 하며, 순차적으로 접근해야 한다.
중간에 블럭이 사라지면 링크가 끊어지는 위험이 존재한다.

Indexed 할당

하나의 블럭에 해당 파일의 모든 블럭의 인덱스를 저장하는 방식이다.
직접 접근이 가능하다.
하지만 파일이 커지게 되면 하나의 블럭에 모든 인덱스를 저장할 수 없게 된다.
이 문제는 multi-level index로 해결한다.

profile
나 스스로를 깊게 알고싶은 사람입니다.

0개의 댓글

관련 채용 정보