내용 출처
반효경 교수님의 <운영체제> 강의 내용을 기반으로 정리했으며,
이 포스팅의 모든 이미지는 <운영체제> 강의에서 가져왔습니다.
메모리는 주소를 통해서 접근하는 반면, 파일은 이름을 통해서 접근한다.
File
File Attribute (파일의 meta data)
File System
Directory
Partition = Logical Disk
파일의 메타 데이터를 메모리에 올려 놓는 것
메타 데이터 중에는 파일의 저장 위치도 포함된다. 그래서 파일의 내용을 가리키는 포인터도 같이 저장되어 있다.
이 파일을 open()하면 이 파일의 메타 데이터가 메모리로 올라오게 된다.
open(“/a/b/c/”)
왼쪽 : 물리적 메모리 / 오른쪽 : 논리적 디스크
fd = open("/a/b")의 과정
open() 함수는 시스템 콜을 하여, CPU가 운영체제로 넘어간다.
루트 디렉토리의 메타 데이터를 먼저 메모리에 올린다. 그런데 메타 데이터 중에는 파일의 위치 데이터가 포함되어 있다. 그래서 root의 메타 데이터를 열면 루트 디렉토리의 실제 내용의 위치를 알 수 있다. root는 디렉토리 파일이므로, 그 내용은 디렉토리 밑에 있는 파일들의 메타 데이터를 가지고 있다.
그중 a라는 파일의 메타 데이터가 있으면, a의 메타 데이터를 메모리에 올린다. 같은 방식으로 a의 위치를 알 수 있고, a라는 디렉토리 아래에 있는 b의 메타 데이터를 찾을 수 있다. b의 메타 데이터를 다시 메모리에 올려놓으면 open이 마무리 되게 된다.
open()은 시스템 콜을 했으므로 값을 리턴한다. 각 프로세스마다 그 프로세스가 open한 파일들의 메타 데이터 포인터를 가지고 있는 배열이 있다. (이를 per-process file descriptor table이라고 한다.) 그 배열 어딘가에 b의 메타 데이터를 가리키는 포인터가 만들어지고, 이 포인터가 배열의 몇 번째 인덱스인지의 값이 b의 file descripter가 되어, 그 값을 사용자 프로세스에게 리턴한다.
사용자 프로세스는 이제 file descripter 숫자로 read/write 요청을 할 수 있다. 예를 들어, b라는 파일에서 무언가를 읽어오고 싶다면 read(fd...)와 같이 시스템 콜을 요청하면 된다. 이를 요청하면 배열의 인덱스를 통해 b의 내용을 읽어올 수 있다. 그런데 이때 읽어온 내용을 사용자 프로그램에 직접 주는 것이 아니라, 운영체제가 자신의 메모리 공간 일부에 먼저 읽어놓는다. 그 다음 사용자 프로그램에 그 내용을 copy해서 전달하면 read 작업이 마무리된다.
왜 copy를 하는가? 만약 동일한 파일의 동일한 위치를 read 시스템 콜을 하면, 디스크까지 갈 필요없이 이미 운영체제가 읽어온 내용을 바로 전달할 수 있기 때문이다. 이를 buffer cache라고 한다.
페이징 시스템에서는 LRU/LFU 알고리즘을 쓸 수 없다. 반면 버퍼 캐싱 환경에서는 모든 정보를 운영체제가 알고 있기 때문에, LRU/LFU 알고리즘을 사용할 수 있다.
open file table은 시스템 전체에 하나만 있으므로 system-wide open file table이라고 한다.
파일에 대한 protection은 이 파일을 여러 프로그램이 같이 사용할 수 있으므로, 파일의 접근 권한이 누구에게 있는지, 그리고 어떤 연산이 가능한지의 2가지 정보를 같이 가지고 있어야 한다.
접근 제어 방법
행렬로 접근 권한을 표시한다. 그런데 행렬의 경우 메모리 낭비가 크므로, 연결 리스트로 만들 수 있다. 아래의 2가지 방법이 있다.
하지만 연결 리스트로 구현하더라도, 여전히 오버헤드가 너무 크다. 그래서 일반적인 운영체제에서는 grouping을 사용한다.
예시 : rwxr--r-- (9비트만으로 접근 권한 표시 가능)
owner는 read/write/execution 모두 가능 / group, public은 read만 가능
다른 파티션에 설치되어 있는 파일 시스템을 어떻게 접근할 것인가?
루트 파일 시스템의 특정 디렉토리 이름에 또 다른 파티션에 있는 파일 시스템을 mounting해준다. 그러면 그 mount된 디렉토리에 접근했을 때 또 다른 파일시스템의 루트 디렉토리에 접근하는 꼴이 된다. 이러한 방식으로 서로 다른 파티션에 존재하는 파일 시스템에 접근할 수 있다.
시스템이 제공하는 파일 정보의 접근 방식
순차 접근 (sequential access)
직접 접근 (direct access, random access)