본문 바로가기

Information Technology/OS

[운영체제] File Systems

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)


메모리 -> 주소를 통해 접근하는 단위

파일 -> 이름을 통해 접근하는 단위

리눅스 같은 OS에서는 단순히 데이터 저장 외에 장치를 관리하기 위해 파일 시스템을 사용

 

- Operation: 생성, 읽기, 쓰기, reposition, open, close

대게의 파일 읽기 -> 파일의 시작 부분부터. 파일을 한 번 읽으면 파일의 포인터가 다음 위치로 자동 이동. 필요에 따라 파일의 시작 부분, 혹은 현재 위치 포인터 부분이 아니라 특정 부분부터 읽거나 쓰고 싶을 때 그 포인터를 설정하는 연산이 reposition(lseek) 연산

* Open: 파일의 메타 데이터를 디스크에서 메모리로 올려놓음

 

- File attribute(metadata): 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들

ex) 이름, 유형(그림, 음악 등등..), 사이즈, 등등

 

- File system: 파일과 파일의 메타 데이터도 함께 저장. 관리상 편의성을 위해 디렉토리를 두고 있음


디렉터리 역시 일종의 파일. 디렉터리 밑에 존재하는 파일들에 대한 메타 데이터를 저장하는 파일.

 

디스크에는 논리적 디스크와 물리적 디스크 존재. 운영체제가 보는 디스크는 논리적 디스크. 이걸 곧 파티션이라고 부름. 파티션으로 구분한 디스크를 file system을 설치하거나, swap erea로 사용할 수 있음.


파일을 open하면 파일의 metadata가 메모리로 올라오게 됨. 

 

1) read, write, open 등등.. 모두 system call.

2) CPU 제어권이 운영체제에게 넘어감

3) root의 metadata는 미리 알려져 있음(Root를 open) -> root의 metadata에서 실제 root의 내용의 주소

4) root의 내용 -> root 밑에 존재하는 디렉터리 파일들의 내용

5) root 밑에 존재하는 a 디렉토리의 metadata를 메모리에 올림

6) a의 metadata로부터 a의 실제 내용이 어디에 저장되어있는지 주소 확인

7) a의 내용에서 b의 metadata를 디스크로부터 가져와서 메모리에 올림(여기서 open 연산이 종료)

이 syscall 연산의 종료로 return되는 값 = b를 열기까지 호출한 root와 a의 메타데이터 등등이 배열로 만들어지는데, 여기서 b가 있는 주소가 그 배열의 몇 번째에 존재하는지 알려주는 file descriptor(fd) 값

open을 통해 b라는 파일의 위치를 알고 있기 때문에(메모리에 올라와 있음, fd 값을 통해 메모리 상의 주소 확인 가능), 이 fd값만 가지고 read와 write 연산이 가능.

 

read 연산 역시 syscall을 통해 CPU 제어권이 넘어가고, 커널에서는 fd값을 가지고 디스크에서 b의 content의 시작 위치부터 요청한 용량만큼 메모리로 가져와서 사용자에게 전달. 운영체제는 가져온 값을 사용자에게 바로 주지 않고 메모리 공간에 저장한 다음 이 값을 카피해서 전달. 그런데 만약 같은 프로그램이 동일한 데이터 값을 요청한다면, 다시 디스크까지 가지 않고 자신이 임시로 저장한 값을 바로 전달. 이게 바로 버퍼 캐싱(buffer caching)

 

버퍼 캐싱 환경에서는 버퍼에 이미 데이터가 있든 없든 syscall로 인해 CPU 제어권이 무조건 운영체제로 넘어오게 됨. 즉, 모든 정보를 운영체제가 다 알고 있기 때문에 LRU, LFU 등등의 알고리즘을 사용할 수 있음.(paging에서는 운영체제가 page들에 대한 정보를 모두 알 수 없기 때문에 clock알고리즘을 사용하는 것과는 대조됨)

 

* 프로세스별로 존재하는 per-process file descriptor table과

* 시스템 전체에 단 하나만 존재하는 system-wide open file table


* 메모리의 protection: read/write 권한이 있는지 없는지. 

 

1) Access-control Matrix: 공간 낭비의 문제 발생. 이 문제를 해결하기 위해 Access control list와 Capability 둘 중 한 방법을 사용. 하지만 이렇게 함에도 부가적인 오버헤드가 많이 발생.

 

2) Grouping: 각각의 파일에 대해 사용자 그룹을 3가지로 나눔. 1. 파일의 소유주 2. 소유주와 동일 그룹의 사용자 3. 그 외의 외부 사용자. -> 파일 하나에 대해 총 9개의 bit만 존재하면 됨. 권한이 있으면 1 없으면 0. 

 

3) Password: 모든 파일 혹은 디렉터리에 대해 password 설정.


하나의 디스크를 파티션을 통해 여러 개의 논리적 디스크로 분할 가능.

각각의 논리적 디스크에 파일 시스템 설치 가능.

- root file system 외에 다른 디스크에 존재하는 파일 시스템에 연결을 도와주는 것이 Mounting

-> root file system의 하부 디렉토리에 또 다른 파티션의 root를 만들어 놓으면, 이 디렉토리에 접근하면 곧 다른 파일 시스템의 루트 디렉토리에 접근하는 것. 이렇게 서로 다른 파일 시스템에 접근 가능


파일 접근 방법

순차 접근: A-B-C 순으로 저장되어있을 때 A와 C를 보고 싶다면 B를 반드시 거쳐서 C에 접근

직접 접근: 동일한 상황에서 B를 거치지 않고 C에 접근 가능