[OS] File System 1

밈무·2023년 3월 4일
0

운영체제

목록 보기
13/15
post-custom-banner

File and File System

File

  • A named collection of related information, 즉 관련 정보를 이름을 가지고 저장하는 것이다.
  • 일반적으로 파일을 비휘발성의 보조기억장치 (ex. 하드디스크)에 저장한다.
  • 또한 데이터를 저장하려는 목적 외에도, 운영체제에서는 다양한 저장 장치를 file로 관리한다. 즉, 운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해주는 것이다. 이런 파일을 device special file이라고 부르며, 우리가 일반적으로 접근하려는 파일과는 다르다.

Opertation

파일에 대한 연산은 다음과 같다.

  • create : 파일 생성
  • read, write : 파일을 읽고 쓰는 연산
  • reposition(lseek) : 파일이 여러 개의 바이트로 구성되고 사이즈가 크기 때문에 어느 부분을 쓸지, 읽을지를 가리키는 포인터가 있다. 파일을 읽어나가는 것에 따라 파일 포인터가 시작 부분에서부터 이동한다. 필요에 따라 현재 위치 포인터가 아니라 다른 부분부터 읽거나 쓰고 싶을 때는 reposition을 사용한다.
  • delete : 파일 삭제
  • open, close : open은 디스크에서 메모리로 파일의 내용을 올려놓는 게 아니라 파일의 메타데이터를 메모리로 올려놓는 것이다. 파일을 읽고 쓰기 전에 open해야하고, 이를 완료해서 파일을 쓸 일이 없어지면 close해야 한다.

Directory and Logical Disk

Directory

파일의 메타데이터 중 일부를 보관하고 있는 일종의 특별 파일이다. 디렉토리 밑에 있는 파일이 어떤 것인지에 대한 정보를 그 파일의 내용으로 가지고 있는 파일이다. 즉, 그 디렉토리에 속한 파일 이름 및 파일 attribute들을 저장하고 있는 파일이다.
메타데이터를 directory에 저장하기도 하고 일부 메타데이터는 다른 곳에 저장하기도 한다. (뒤에서 설명)

Operation

  • search for a file : 그 디렉토리 밑에 있는 파일을 찾는 것
  • create a file : 그 디렉토리 밑에 파일을 만든 것
  • delete a file : 그 디렉토리 밑에 파일을 지우는 것
  • list a directory : 그 디렉토리 밑에 있는 파일 목록을 보는 것
  • rename a file : 파일의 이름을 바꾸는 것
  • traverse the file system : 파일 시스템 전체를 탐색하는 것

파일 시스템이 하드 디스크에 저장이 될텐데, 디스크에 논리적인 디스크가 있고 물리적인 디스크가 있다. 운영체제가 보는 디스크는 논리적인 디스크이며 다른 말로 partition이라고 부른다.

Partition(=Logical Disk)

보통 하나의 물리적 디스크 안에 여러 개의 파티션이 있다.
경우에 따라 여러 개의 물리적 디스크를 합쳐서 하나의 파티션으로 구성하기도 한다.
물리적 디스크를 파티션으로 구성한 다음, 각각의 파티션에 file system을 설치할 수도 있고 또는 논리적 디스크를 swapping하기 위한 swap area로 사용할 수도 있다.

=> 즉 논리적 디스크의 목적 2가지
1. file system
2. swap area

open()

open()을 하면 파일의 메타데이터를 디스크에서 메모리에 올려두게 된다. 디스크에는 메타데이터와 내용이 함께 들어있으며, 메타데이터는 파일이 어디에 저장되어있는지 나타내는 포인터를 가지고 있다.

예를 들어서 open("/a/b/c")를 한다면 c라는 파일의 메타데이터가 메모리에 올라온다.
이런 식으로 디렉토리가 계층적으로 구성되어 있을 때 open을 하려면 어디에 파일이 저장되어 있는지 찾아야 한다. 보통 루트 디렉토리의 위치가 알려져 있기 때문에 루트 디렉토리부터 시작해서 파일을 찾게 된다.

+) open()도 I/O를 위한 시스템콜이다.

동작 과정

open()을 하게 되면 어떤 일이 일어날까. 먼저 open()은 시스템콜이기 때문에 CPU 제어권이 운영체제에게 넘어간다. 운영체제에는 프로세스들을 관리하기 위한 PCB가 있고 전체 프로그램들이 오픈한 파일이 어떤 것인지 관리하는 Open File Table이 있다.

1. open file table에 root metadata를 올린다.
루트디렉토리의 메타데이터는 미리 알려져 있다. 따라서 Open File Table에 먼저 root metadata를 올린다. 이 메타데이터에 있는 파일의 위치 정보를 통해서 루트데이터의 실제 내용이 디스크의 어디에 있는지 찾을 수 있다.
2. open file table에 a의 metadata를 올린다.
루트 디렉토리의 content에 가면 a라는 파일의 메타데이터가 존재한다. 또 a를 오픈해서 open file table에 a의 메타데이터를 올린다. 그럼 또다시 a의 content를 찾을 수 있다.
3. open file table에 b의 metadata를 올린다.
a의 내용에는 b의 메타데이터가 들어있다. b를 오픈해서 open file table에 b의 메타데이터를 올리면 Open이 끝난다.

=> open()에 대한 결과값으로 b에 해당하는 포인터를 가진 배열의 인덱스(=b의 fd(file descriptor))를 리턴한다. 이 배열은 open file table의 b 메타데이터 위치를 가리키는 포인터를 가리킨다.

open() 후 read


read할 때는 fd를 파라미터로 넘겨준다.
그럼 다시 시스템콜을 해서 cpu가 운영체제에게 넘어가고 메모리로 읽어와서 프로그램에게 파일의 content를 읽어와 전달한다.

Buffer Caching

이 과정에서 그 내용을 읽어와 사용자 프로그램에게 바로 직접 주는 게 아니라 운영체제가 자신의 메모리 공간 일부에 먼저 읽어 놓은 다음, 사용자 프로그램에게 그 내용을 copy해서 전달한다.

만약 다른 프로그램이 동일한 파일의 동일한 위치를 읽어오기 위해 시스템 콜을 하게 되면 이 내용을 다시 디스크에서 읽어올 필요 없이, 운영체제에 읽어놓은 내용으로 바로 전달할 수 있다. 이를 buffer caching이라고 한다.

  • Paging과 비교
    Paging은 이미 메모리에 올라와 있는 내용에 대해서는 시스템 콜이 발생하지 않기 때문에 운영체제가 정보를 충분히 알지 못해 LRU, LFU알고리즘을 사용하지 못하고 Clock 알고리즘을 사용한다.
    하지만 파일 시스템의 Buffer Cahcing에서는 요청한 내용이 Buffer Cache에 있든 없든 시스템 콜이 발생하기 때문에 운영체제에게 CPU가 넘어가게 된다. 즉, 요청한 파일 내용이 buffer cache에 있는지 없는지를 운영체제가 판단한다. 따라서 모든 정보를 운영체제가 알고 있어 LRU, LFU 알고리즘을 사용할 수 있게 된다.


file descriptor는 프로세스마다 가지고 있어서 per-process file descriptor table이라고 부르기도 한다.
Open file table은 프로세스마다 가지고 있는 게 아니라 시스템 전체적으로 한번에 관리하기 때문에 system-wide open file table이라고 부르기도 한다.

운영체제 구현에 따라 테이블이 여러 개가 될 수 있다.
왜? 메타 데이터가 디스크에 있을 때는 앞서 설명한 file attribute만이 메타데이터가 되는데, 메모리에 올려놓게 되면 이 프로세스가 이 파일의 어느 위치에 접근하고 있는지, offset을 프로그램마다 별도로 가지고 있어야 한다.
만약 한 파일을 A, B 프로그램이 오픈하고 있다면, 파일에 대한 메타데이터는 open file table에 system-wide하게 한 카피만 존재하지만, Offset은 프로세스마다 별도로 가지고 있어야 한다. 그래서 open file table을 두개로 나누어 offset을 관리하는 테이블을 따로 두는 것이 일반적이다.

File Protection

파일의 접근 권한, 파일의 보호와 관련된 이야기이다.
메모리에 대한 protection은 페이지의 read, write에 대한 권한(연산에 대한 권한)만 따졌다. (메모리는 프로세스마다 별도로 가지기 때문에 해당 프로세스만 접근할 수 있는 공간이기 때문이다.)

파일은 여러 사용자, 여러 프로세스가 같이 사용할 수 있다. 따라서 접근 권한이 누구에게 해당하는지, 그리고 어떤 접근 연산이 가능한지에 대한 총 두가지 권한을 가지고 있어야 한다.

이런 접근 권한 제어 방법은 크게 세가지가 있다.

Access Control 방법

Access Control Matrix


행렬에 사용자와 파일 이름을 나열해두고 각각의 사용자가 각각의 파일에 대해 어떤 권한이 있는지 표시해둔다.

그런데 이런 방법의 행렬은 매우 sparse matrix(희소 행렬)의 형태가 될 것이다. 왜냐하면 특정 사용자가 본인만 사용하려고 만든 파일과 같은 형태가 많기 때문에 대부분의 공간이 낭비가 된다.

그래서 linked list로 만드는 방법이 있다. 이것은 주체를 누구로 하느냐에 따라 두가지 방법이 있다.

  • Access Control List(ACL) : 파일을 주체로 해서, 파일 별로 누구에게 어떤 접근 권한이 있는지 연결리스트로 표시한다.
  • Capability : 사용자를 주체로 해서, 사용자 별로 자신이 접근 권한을 가진 파일 및 해당 권한을 연결리스트로 표시한다.

⇒ 모든 사용자에 대해 모든 파일의 접근 권한 제어 가능

하지만 연결리스트를 쓰더라도 부가적인 오버헤드가 크다.

Grouping

일반적인 운영체제에서 쓰는 방법.

모든 사용자에 대해 접근권한을 다루는 것이 아니라 각각의 파일에 대해 세 그룹의 접근권한(rwx)을 3비트씩으로 표시한다.
권한이 있으면 1, 없으면 0으로 표시하며 전체 user를 owner, group, public의 세 그룹으로 분류한다.
한 파일에 대해 접근 권한을 나타내기 위해 총 9개의 비트만 있으면 된다.(매우 효율적)

Password

파일마다 패스워드를 두는 방법이다. 또는 디렉토리 파일에 패스워드를 두는 방법도 가능하다.

각각의 접근 권한에 대해 하나의 패스워드를 주어야 하기 때문에 너무 패스워드가 많아진다.
따라서 암기 문제와 관리 문제가 발생한다.

File System의 Mounting


하나의 물리적인 디스크를 파티셔닝을 통해 논리적인 디스크로 나눌 수 있다. 각 논리적 디스크에는 파일 시스템을 설치해 사용할 수 있다.
루트 파일 시스템에서 다른 파티션에 설치되어 있는 file system 에 접근하기 위해서는 mounting을 사용해야 한다.

mounting은 루트 파일 시스템의 특정 디렉토리 이름에 또다른 파티션에 있는 파일 시스템을 마운트 해주고 이에 접근하면 또 다른 파일 시스템의 루트 디렉토리에 접근하게 된다.

Access Method

파일을 접근하는 방법이다.

순차접근(sequential access)

카세트 테이프는 순차접근만 가능했다. 이는 카세프 테이프를 사용하는 방식처럼 접근하는 것이다.
A, B, C 순서로 저장 → A다음 C를 보려면 무조건 B를 거쳐야 한다.

직접접근(direct access, random access)

= 임의 접근

LP 레코드 판과 같이 접근하도록 한다. 특정 위치 접근 한 다음에 다른 위치를 접근 하는 것이 바로 가능하다.
A, B, C 순서로 저장 → A 다음 C를 바로 볼 수 있다.

post-custom-banner

0개의 댓글