파일시스템 1
(참고 강의 : http://www.kocw.net/home/search/kemView.do?kemId=1046323)
파일은 정보를 모아 '이름'으로 구분해놓은 것이다.
파일에 관한 명령을 할 땐 먼저 open하고 읽던, 쓰던, 지우던 하고, close 해줘야 한다.
open을 해야 메모리에 올리기 때문이다.
디렉토리는 파일의 메타데이터 중 일부를 보관하는 파일이다.
하나의 하드웨어 하드 디스크를, 여러 논리적으로 구분해 놓을 수 있다. 이것이 파티션인데,
이를 통해 메모리 관리에서 배운 Swapping area와 file system을 구분할 수 있는 것이다.
Open()을 통해 파일을 디스크에서 메모리에 '메타데이터'를 올린다.
메타데이터에는 파일 이름, 위치 등이 담긴다고 했다.
여기서 위치를 통해 파일 컨텐츠에 접근할 수 있는 것이다.
좀 더 자세히 알아보자.
그림을 함께 보면서 이해해보자.
프로세스 A가 파일 open을 요청했다. (시스템 콜)
운영체제가 CPU를 잡고 요청을 수행해준다.
"/"
root 디렉토리도 일종의 파일이라고 했다.
root의 metadata를 커널 메모리의 Open file table로 가져온다. (파일 시스템은 운영체제가 하니까)
root의 metadata에 root의 content 위치가 담겨 있다.
"a"
root의 content 위치에 들어가면 a 디렉토리의 metadata가 있다.(디렉토리에 파일 메타데이터의 일부를 담는다고했지?)
a 디렉토리의 metadata를 커널 메모리의 Open file table로 가져온다.
a metadata에 a content의 위치가 담겨있다.
"b"
a content 위치로 가보면 안에 파일 b의 metadata가 담겨있다. Open file table로 가져온다.
PCB에는 이 프로세스가 어떤 파일을 열어봤는지 배열이 있는데, 위에 보이는 list of open files다.
이미 메모리에 올라와있는 b의 메타데이터를 가르키는 포인터를 저장해 놓는다.
open 할 때마다 1,2,3 과정을 반복할 필요가 없이 포인터로 바로 b의 metadata에 접근이 가능한 것이다.
따라서 fd는 list of open files의 file b meta pointer인 인덱스이다.
여기까지가 Open()이고, 이 밑은 다른 operation, Read를 해보자.
Process A의 PCB의 list of open files에서 fd를 찾는다. b의 metatata 위치를 가르킨다.
b의 metatata에 b content 위치를 알고 있다. 가서 b의 내용을 커널 영역의 buffer caching 영역으로 가져온다.
파일 b의 시작점을 안 줬으니 통째로 복사해서 Process A에 전달한다.
여기서 Open file table은 시스템 전체에 1개 있는 것이고, list of open files는 프로세스 각각 존재하는 것이다.
따라서 만약에 프로세스 B가 buffer cache에 있는 파일 b를 read 한다면, open할 필요없이 바로 전달이 가능하다.
또한, 파일 시스템은 메모리 관리와 다르게 전부 운영체제가 일을 하니까, LFU, LRU 적용이 가능하다.
각 파일에 대해 누구에게 어떤 유형의 접근(read/write/execution)을 허락할 것인가?
둘 중 하나만 쓰면 됨
비번 거는 건 그냥 읽고 잊어버리자. 구리다.
파티션으로 하나의 물리적 디스크를 여러 개로 나눌 수 있다고 했다.
그런 디스크 1에서 디스크 3을 접근하고 싶을 때 사용하는 것이 Mounting이다.
disk 1의 디렉토리에 disk 3 root를 연결하는 것이다.
파일을 접근할 때, 시스템이 접근하는 파일 정보의 접근 방식