Search
💾

[OS] File Systems

contents

들어가며

파일(File)

A named collection of related information
저장 장치에 연관된 정보의 논리적 저장 단위
파일은 하드 디스크에다가 저장하는 단위
바이트의 나열
관련 정보를 이름을 가지고 저장하는 것
일반적으로 파일은 비휘발성의 보조기억장치(하드 디스크)에 저장
데이터를 저장하는 목적뿐만 아니라 OS에서는 서로 다른 장치들을 관리하는 목적으로 file를 사용합니다.
device special file
파일에 정의되는 연산은 create, read, write, delete, reposition(lseek), open, close가 있습니다.
reposition(lseek)
필요에 따라서 파일 시작 부분, 현재 위치 포인터 부분말고 다른 부분부터 read, write하고 싶을 때가 있는데, 현재 파일 접근 위치를 변경해주는 것이 reposition 연산입니다.
파일 위치 포인터
open, close
read, write를 하려면 open를 하고서야 할 수 있습니다. 다 끝내고 할 일이 없다면 close를 해줘야 합니다.
 : 왜 open, close가 따로 정의되어 있는가?
open의 역할은 해당 파일의 메타데이터를 디스크에서 메모리로 올리는 일입니다.
 : 파일의 메타데이터?
파일의 메타데이터(file attribute)는 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들이 들어 있습니다.
 파일 - 파일 자체 내용은 음악이지만, 파일 이름, 유형, 디스크 상 저장 위치, 사이즈 같은 게 같이 관리되어야 합니다.
 파일 - 파일 자체 내용은 그림이지만, 파일 이름, 파일 접근 권한, 파일 생성 시간 등 내용과 관련없이 관리되어야 합니다.
File system
운영체제에서 파일을 관리하는 소프트웨어 부분
  파일 시스템은 파일 자체 내용뿐만 아니라 해당 파일의 메타 데이터도 같이 저장하고 있습니다.
  보통 파일 시스템은 저장할 때 디렉토리라는 걸 따로 둬서 루트 디렉토리로부터 계층적으로 저장할 수 있도록 구현되어 있습니다.
  파일 시스템은 파일을 어떻게 저장할 지, 해당 파일을 어떻게 관리할 지, 파일의 보호 등을 담당합니다.

Directory and Logical Disk

Directory

대부분의 파일 시스템에서 제공이 되며, 디렉토리 밑에 있는 파일들이 어떤거고, 각각에 해당하는 정보(메타 데이터)가 뭔지를 파일의 내용으로 담고 있는 파일
디렉토리에 메타 데이터를 몽땅 저장할 수도 있지만 해당 디렉토리 밑에 있는 일부 메타 데이터만 디렉토리에다가 직접 저장하고 일부는 다른 곳에다가 저장할 수 있습니다.
디렉토리 연산
1.
파일 목록을 보는 것
2.
파일을 찾는 것
3.
파일 생성, 삭제
4.
파일 이름 변경
5.
파일 시스템 전체 탐색

Partition(= Logical Disk)

파일 시스템은 하드 디스크에 저장이 되게 되는데, 디스크에는 논리적인 디스크가 있고, 물리적인 디스크가 있습니다. OS가 보는 디스크라는 건 논리적인 디스크이고, 논리적인 디스크는 다른 말로 Parition이라고 합니다.
우리가 하드 디스크를 하나 사서 C 드라이브, D 드라이브로 파티션을 나누면 각각 논리적인 디스크
  논리적인 디스크 여러 개를 합쳐서 물리적인 디스크 하나를 구성 가능
파티션에다가 파일 시스템을 설치할 수도 있고, Swap area 용도로도 사용 가능
우리는 디스크 용도를 파일 시스템, Swap area 용도로 나눌 수 있음

Open()

파일의 메타 데이터를 메모리로 올려두는 것
논리적인 디스크 안에 파일 시스템이 있다면 특정 파일의 메타 데이터와 내용 저장
내용을 가리키는 포인터도 같이 저장
파일을 오픈하면 해당 파일의 메타 데이터가 메모리로 올라옴
open(/a/b/c)
/a/b/c 를 오픈하면 c의 메타 데이터가 메모리로 올라옵니다.
→ 디렉토리 경로가 계층적으로 구성되어 있을 때 오픈하라고 하면 c라는 파일의 메타 데이터가 어디 저장되어 있는지부터 디스크에서 찾아야 합니다.
찾는 방식
보통 루트 디렉토리의 위치는 잘 알려져 있기 때문에 루트 디렉토리부터 경로를 따라 내려가면서 c라는 파일의 위치를 찾습니다.

open()이 진행되는 방식

물리적인 메모리(좌), 논리적인 디스크(우)
[1] 물리적인 메모리와 논리적인 디스크가 있다.
[2] 물리적인 메모리는 커널 영역과 사용자 메모리 영역을 가지고 있다. 사용자 프로그램은 시스템 콜을 할 수 있다.
[3] 프로세스 A에서는 저 파일(/a/b)을 오픈하려고 한다. open도 시스템 콜이다.   write, read, open, close 모두 I/O를 하는 시스템 호출
[4] open을 하면 시스템 콜이니깐 시스템 제어권이 OS에게로 간다.
  OS 안에는 각 프로세스별로 관리하기 위한 자료 구조가 있고 전체 프로그램에서 open한 파일들이 뭔지 관리하는 글로벌한 테이블을 유지하고 있다. → Open file table
[5] open를 하면 루트 디렉토리의 메타 데이터는 무엇인지 알려져 있기 때문에 OS가 루트 디렉토리 메타 데이터를 먼저 메모리에 올린다.
[6] 메타 데이터 가운데에는 그 파일 위치 정보가 들어있는데, 이 정보를 통해서 루트 디렉토리의 실제 내용이 어디있는지 위치를 찾을 수 있다.
[7] 루트는 디렉토리 파일이기 때문에 디렉토리 밑에 있는 파일들의 메타 데이터, 내용을 담고 있는 파일이다.
[8] 루트 밑에 a라는 파일이 존재하고 루트 디렉토리 내용에서 a라는 파일에 메타 데이터를 찾을 수 있을 것이다.
[9] a를 찾아서 메모리에 올리고 a를 open한다.
[10] a는 이제 메모리에 올라와 있고 a의 메타 데이터 중에는 a의 파일 시스템 상의 위치 정보가 들어있다. 따라서 디스크에서 a의 위치를 찾을 수 있다.
[11] a라는 파일은 디렉토리 파일, 디렉토리 밑 파일들의 메타 데이터를 가진다. b라는 파일이 a 밑에 있는 파일이기 때문에 a 내용안에는 b의 메타 데이터가 있을 것이다.
[12] b를 찾아서 또 메모리에 올려주자.
[13] b를 오픈하고 메모리에 올려주자.
[14] 오픈이 끝나면 시스템 콜을 했기 때문에 어떤 결과 값을 리턴해야 한다. 결과 값은 파일 desciptor이다.
파일 descriptor
[15] 오픈을 했기 때문에 b라는 파일에 대해서 write, read 연산이 들어오면 루트 디렉토리부터 찾을 필요 없다.
[16] descriptor를 가지고 있기 때문에 사용자 프로세스는 파일 descriptor만 가지고 write, read 요청을 할 수 있다.
[17] read 시스템 콜이 들어왔기 때문에 CPU가 OS에게 넘어가고 A의 pcb에 가서 해당 descriptor에 대응하는 메타 데이터 부분을 찾아서 파일의 디스크 위치 정보를 알아낸다.
[18] 그냥 읽어오라고 했으니깐 시작 위치부터 요청한 용량만큼을 읽어오게 된다.
[19] 그 내용을 메모리로 읽어서 사용자 프로그램에게 직접 전달해주는 것이 아니고 OS가 자신의 메모리 공간 일부에 읽어두고 사용자 프로그램에게는 내용을 copy해서 전달한다.
[20] read 작업 끝
OS의 copy
커널의 테이블
per-process file descriptor table
파일 descriptor 테이블은 프로세스마다 가지고 있다고 해서 저렇게 부름
open file table
파일을 오픈했을 때는 프로세스마다 가지고 있는게 아니라 오픈된 파일의 목록들을 시스템에서 와이드하게 관리하는 것이기 때문에 시스템 전체에 하나 존재하는 open file table이라고 부름
  운영체제 구현에 따라서 이런 테이블이 두 종류가 아니고 세 종류가 있을 수도 있습니다.
메타 데이터가 디스크에 있을 때는 file attribute만이 메타 데이터가 되는데 메모리로 올려놓게 되면 추가적인 한 가지 메타데이터가 더 필요하게 됩니다. → 파일의 어느 위치를 접근하고 있는지에 대한 offset (별도)
offset
만약 a라는 프로그램이 해당 파일을 open했다고 하면 다른 프로그램도 이 파일을 오픈할 수 있습니다. b라는 메타 데이터는 메모리에 시스템 와이드하게 하나만 존재하지만 offset은 서로 다를 수 있습니다.
  프로그램이 읽는 위치와 다른 프로그램이 이 파일을 읽는 위치가 다를 수 있기 때문에 파일 내에서 어디를 접근하는 지 offset를 별도로 가지고 있어야 합니다.
open file table은 2개로 나눠서 관리할 수 있습니다.
1.
프로세스와 무관하게 하나만 가지면 되는 메타 데이터
2.
별도로 가지고 있어야 하는 offset
  PCB는 메타 데이터 위치만 가르키는 포인터이기 때문에 내용을 가지지 않아서 나눌 필요 없음.

File Protection

여러 사용자, 여러 프로그램이 공유할 수 있기 때문에 파일에 대한 접근 권한은 누구한테 있는지, 어떤 연산을 가능하게 했는 지, 두 가지 정보를 같이 가지고 있어야 함
접근 권한을 제어하는 방법
1.
Access control matrix
행렬의 행과 열에 사용자, 파일 이름을 나열해두고 각각의 사용자가 각각의 파일에 대해서 어떤 권한이 있는지 표시해두는 방식입니다.
특정 사용자가 특정 파일에 대해 접근했을 때 권한이 있는 지 체크하고 권한이 있으면 허용
행렬 자체가 희소 행렬 형태가 될 것
희소 행렬 : 행렬의 값이 대부분 0인 행렬
파일들은 엄청 많지만 특정 사용자가 본인만 사용하려고 만든 건 다른 사용자들이 접근할 권한이 전혀 없기 때문에 값이 0으로 설정된 부분이 다수일 것
행렬의 칸을 다 만들면 낭비
“주체를 누구로 하느냐”에 따라서 방식이 나뉨
  모든 사용자에 대해서 모든 파일의 접근 권한을 제어하는 것이 가능하지만 부가적인 오버헤드가 크기 때문에 사용하기 어렵습니다.
2.
Grouping
각 파일에 대해서 사용자 그룹을 owner, group, public으로 나누고 세 그룹에 대한 접근 권한(rwx)을 표시합니다.
모든 사용자에 대해서 접근 권한을 나타내지 않기 때문에 일반적으로 사용
접근 권한을 나타내기 위해서는 총 9개의 비트만 있으면 가능
권한이 있다면 1, 없다면 0으로 나타냄
굉장히 효율적
3.
Password
모든 파일에 대해서 비밀번호로 관리하는 방식입니다.
파일, 디렉토리에 대해서 비밀번호 걸고 접근하려면 비밀번호를 풀어야 함
모든 권한에 대해 하나의 비밀번호가 존재
패스워드도가 굉장히 많이 생기고 기억하기 어려워짐
어디다가 써놓으면 보안에 안좋음.
  파일에 대한 접근권한은 grouping 방식을 일반적으로 사용

Mounting

하나의 물리적인 디스크는 여러 개의 논리적인 디스크로 나눌 수 있고 각 논리적인 디스크는 파일 시스템을 설치해서 사용할 수 있습니다.
루트 파일 시스템은 위치는 잘 알려져 있기 때문에 접근이 가능합니다.
그런데 다른 파티션에 있는 파일 시스템을 접근하고 싶다면 어떻게 해야 할까요?
마운팅(Mounting) !
마운팅
루트 파일 시스템의 특정 디렉토리 이름에다가 또 다른 파티션에 있는 파일 시스템을 가져다가 마운트를 해주는 것입니다.
마운트된 디렉토리를 접근하게 되면 또다른 파일 시스템의 루트 디렉토리를 접근해서 서로 다른 파티션에 접근할 수 있게 됩니다.
루트가 고스란히 붙어있는 모습

Access Methods

파일을 접근하는 방법
1.
순차 접근
카세트 테이프, 비디오 테이프 → 순차 접근만 가능
2.
직접 접근(임의 접근)
CD, 하드 디스크, LP판과 같이 접근 → 직접 접근 가능한 매체
특정 위치를 접근한 다음에 다른 위치 바로 접근 가능
A, B, C라는 내용이 있다고 가정하자.
A 다음에 C를 보고 싶다고 한다면 어떻게 해야할까?
B를 반드시 접근해야만 C - 순차 접근
A 다음에 바로 C - 직접 접근
매체에 따라서 직접 접근만 되는 매체가 있고 아닌 매체가 있다. 관리를 어떻게 하는가에 따라서 순차 접근만 가능한 경우도 존재한다.
해당 내용은 다음 챕터에서 배워보자.