해당 게시글은 운영체제 스터디를 위해 반효경 교수님 운영체제 강의를 보고 기록한 게시물입니다. 틀린 정보가 있다면 언제든 지적해주세요🙏🏻
파일은 이름을 통해서 접근하는 것
A named collection of related information
비휘발성의 보조기억장치에 저장
Operation: create, read, write, reposition(lseek), delete, open, close 등
File attribute - 파일의 metadata
File system
Directory and Logical Disk
partition(=logical disk)
특정 파일의 메타데이터를 메모리에 올려두는 것
각 파일에 대해 누구에게 어떤 유형의 접근을 허락할 것인가?
AccessControl Matrix (행렬)
Grouping: 일반적인 운영체제에서 사용. 전체 user를 owner, group, public의 세 그룹으로 구분. 각 파일에 대해 세 그룹의 접근 권한을 3비트씩으로 표시.
예시) rwsr—r—(owner, group, other)
Password: 파일마다 password를 두는 방법. 모든 접근 권한에 대해 하나의 password. 접근 권한별 password 암기 문제, 관리 문제.
물리적인 디스크는 파티션을 통해서 여러개의 논리적인 디스크로 나눌 수 있다. 다른 파티션에 있는 파일 시스템에 접근할때 어떻게 해야할까? -> 이를 위해 마운팅이 있음.
파일 접근에는 순차적인 접근과 직접 접근이 있다.
직접 접근이 가능한 매체라도 데이터를 관리가 어떻게 되느냐에 따라서 순차적인 접근이 허용되는 경우가 있다.
디스크에 파일을 저장하는 방법엔 크게 세가지가 있음
1. Contiguous allocation
2. Linked allocation
3. Indexed allocation
단점: 외부조각이 생길 수 있음. 길이가 다 다르기 때문에.
File grow가 어려움(파일의 크기가 커지는 것에 대한 제약이 있을 수 있음) 커질것을 대비해서 미리 할당하면 내부 조각 발생.
장점: I/O가 빠름. process의 swapping 용도, realtime file용도로 사용.
Direct access(=random access) 가능
장점: 외부조각 발생 안함
단점: 랜덤 엑세스 불가능. 하나의 sector가 고장나 pointer가 유실되면 많은 부분을 잃음.
장점: 외부조각이 생기지 않으면서 직접 접근이 가능함
단점: 아무리 작은 파일이라도 블럭이 두개 필요하다(인덱스를 위한 블럭, 실제 저장을 위한 블럭)-> 공간이 낭비.(실제로 많은 파일들이 작음), 굉장히 큰 파일의 경우 인덱스 블럭 하나로 표시를 할수 없다. -> 해결방안: linked scheme, multi-level index
파일의 메타데이터는 그 파일의 디렉토리에 갖고 있다고 하지만 유닉스 파일 시스템의 경우 디렉토리는 메타 데이터의 일부만 가지고 있고 inode list에 저장되고 있다. 파일의 이름은 디렉토리가 가지고 있고 다른 메타데이터들은 Inode가 가지고 있다.
Bit map: 각각의 블럭 별로 비트를 둬서 사용중인지 아닌지 0,1로 표시함. 연속적인 블럭을 찾는데 효과적.
Linked-list: 비어 있는 블럭들을 연결해두는 방법. 비어 있는 첫번째 위치를 가지고 있음. 비트맵에 비해 추가적인 공간 낭비가 없지만 연속적인 공간을 찾는 것은 쉽지 않다.
Grouping: linked list 방법의 변형. 연속적인 빈 블럭을 찾기에 효과적이진 않음
Counting: 연속적인 빈블럭을 표시하기 위해서 빈 블럭에 첫번째에 위치하고 몇개가 이어져 있는지 쌍으로 관리.
위의 해쉬 테이블 - 파일의 이름을 해쉬함수를 적용함.
Collision 서로 다른 파일에 대해서 결과값이 같은것으로 매핑되는.. 문제가 발생할 수 있다.
Long file name: 대부분의 메타데이터의 길이는 한정되어 있음. 파일이름은 그렇지 않다.
Virtual file system
파일 시스템에 접근할때 개별 파일시스템에 상관없이 vfs 통해서 파일에 접근.
Network File system
원격에 저장되어 있는 파일 시스템에 접근 할 때 사용.
어떤 프로그램이 실행되다가 디스크에 있는 파일을 읽어달라 부탁할때? 이때는 운영체제에게 시스템 콜을 하여 부탁. -> 파일을 읽어다가 버퍼 캐시 영역에 읽어두고 사용자 메모리 영역에 카피를 해서 보내게 된다. 이 때 버퍼캐시는 파일 전달 뒤에 버리지 않고 보관하고 있다가 똑같은 파일에 대해 요청이 들어왔을 때 버퍼 캐시에 있던 내용을 사용자에게 바로 전달. 이래서 버퍼 캐시를 사용. 파일 입출력을 빠르게 하기 위해서.
페이지 캐시는 프로세스의 주소공간 중 당장 사용되는 것을 페이지 캐시에 올려두고
버퍼 캐시는 파일 시스템에서 당장 사용되는 것을 버퍼 캐시에 올려두는.. 서로 다름.
이 두가지 캐시를 운영체제가 관리하는 방법에는 차이가 있음. Replace 알고리즘을 사용한다.