전원이 꺼지더라도 오랜 기간 동안 정보를 저장할 필요성이 있는데 이를 지원하는 운영체제의 서브시스템을 파일시스템이라고 한다.
파일 시스템에는 파일, 디렉토리가 있다. 둘을 합쳐서 그냥 파일이라고 표현을 한다. 더 정확하게는 파일 중에 파일의 타입이 레귤러 파일이 있고 디렉토리 파일이 있다. 디렉토리는 윈도우즈에선 폴더라고 한다.
디렉토리 또는 폴더는 파일들을 논리적으로 관리하기 위한 도구
파일과 디렉토리는 여러 프로세스가 공유할 수도 있어야 하고 반대로 다른 프로세스나 다른 사용자는 내가 사용하는 파일을 볼 수 없게 하거나 변경할 수 없게 프로텍션 기능을 제공해야 함
Files
로우 레벨 프로그래밍할 때 파일을 두 가지 케이스로 나눈다.
1. 텍스트 파일: 안에 담겨 있는 데이터는 알파벳 같은 경우 아스키코드로 저장이 되어있고, 한글 같은 경우 한글 코드 등 결국 이 안에 들어가는 데이터는 그 값이 의미가 있는 것이 아니라 값이 나타내는 코드로 변환을 해서 화면에 보여주는 파일 ex) txt파일, 소스코드 파일
2. 바이너리 파일: 데이터 자체로 의미가 있는 파일 ex) 실행 파일, 아래한글 파일
File Attributes
위 내용은 Mac OS 기준
File Operations
파일의 명령어를 수행할 수 있는데 이건 운영체제에 요청을 해서 운영체제가 작업을 해줘야 한다.
File Types
파일의 타입을 실제 파일에 이름을 붙일 수 있다. 윈도우즈에서는 익스텐션이라고 한다.
유닉스는 익스텐션 개념이 없다.
File Access
일반적으로 파일은 sequential access(프로그램을 실행하면 그 실행파일에 포함되어 있는 코드들을 메모리에 올려서 실행을 해야 함, 실행파일을 처음부터 끝까지 다 읽어야 함)가 제일 많다.
어떤 데이터 파일 같은 경우에는 내가 원하는 위치의 데이터만을 읽을 수도 있어야 한다(Direct access). 보통 이런 direct access인 경우에는 레코드 단위로 읽게 된다. 그런 것을 record access
레코드 단위로 저장되어 있는 파일에서 내가 원하는 데이터를 찾으려면 서치를 너무 많이 해야 하기 때문에 주요한 키 값에 대한 인덱싱을 한 파일이 별도로 존재하고 실제 서칭은 인덱싱 파일에서 수행을 하게 되는데, 그런 형태의 access를 Index access
Example of Index and Relative Files
relative file이라고 표현했지만 이게 데이터 파일이다. 이 데이터 파일에는 레코드 단위로 특정 정보가 저장이 되는데, smith라는 사람에 대한 정보를 읽고 싶다면 이 큰 데이터 파일을 다 읽어서 찾기에는 오버헤드가 너무 크기 때문에 사람 이름을 따로 저장하고 이 사람에 대한 레코드는 이 파일에 어디에 위치해 있는지 정보를 저장. 작은 인덱스 파일에서 서치를 해서 내가 원하는 정보를 찾고 그 정보에 해당하는 위치로 이동을 한다(direct access). 레코드 단위로 액세스 하니까 record access고 이런 것들을 효율적으로 하기 위해서 index access라고 표현을 하고 있다.
Directories
윈도우즈에서는 폴더, 유닉스리눅스에서는 디렉토리
Directory Internals
Directory Operations
Pathname Translation
유닉스리눅스에서는 /이고 윈도우즈에서는 \
File System Mounting
윈도우즈에서는 파일 시스템 용량이 부족하면 드라이브를 추가로 장착
유닉스리눅스는 드라이브라는 개념 없이 전부 다 루트 디렉토리 밑에서부터 쫓아간다.
하나의 디스크 드라이브를 사서 그 밑에 파일 시스템을 만들고 이 파일 시스템을 운영체제가 사용하기 위해서는 마운팅이라는 절차가 필요, 기존에 있는 파일 시스템에 붙이는 동작을 마운팅이라고 한다. 비어있는 디렉토리에다가 마운팅을 하면 루트 디렉토리 밑에 users라는 디렉토리 밑에 연결이 된다.
File Sharing - Remote File Systems
네트워크로 연결되어 있는 다른 컴퓨터에 존재하는 파일 시스템을 마치 내 컴퓨터에 있는 파일 시스템처럼 사용하는 방법
윈도우즈에서는 드라이브라는 개념으로 네트워크 드라이브를 하나 만들어서 사용을 한다. 이때 사용하는 프로토콜이 CIFS
유닉스의 remote file system은 NFS, 이때 사용하는 프로토콜도 NFS, 파일 시스템도 NFS(network file system)
Protection
다른 사용자 또는 다른 프로세스가 내가 사용하는 파일들을 마음대로 변경하거나 삭제하거나 업데이트 못하도록 심지어 읽지도 못하도록 두어야 함.
윈도우즈에서 이런 기능이 다 존재, 나 혼자 사용하기 때문에 이런 게 별로 안 중요함
유닉스는 기본적으로 나 혼자 쓰는 게 아니라 여러 명이 사용하기 때문에 이런 protection이 중요하다.
protection을 표현할 때 두 가지 방법이 있다. ACLs과 Capabilities
object라고 하는 게 파일 또는 디렉토리, 파일 또는 디렉토리 별로 사용자가 무엇을 할 수 있을지 표시하는 게 ACLs
사용자 별로 무엇을 할 수 있을지 표시하는 방법이 Capabilities, 파일이 하나 생길 때마다 모든 사용자에게 이 작업을 해줘야 함.
현재 대부분 운영체제에서는 ACLs 사용한다.
유닉스가 취하는 방법은 모든 사용자를 다 표시하지 않고 사용자의 그룹에 대해서 지원한다.
ACLs VS Capabilities
Access Lists in Unix/Linux
파일 별로 누가 어떻게 할 수 있는지 표시
사용자가 많아지면 너무 많은 표시를 해야 함 그래서 3가지 클래스로 나누어서 사용자를 표시한다.
owner: 파일을 만든 자기 자신이 어떻게 할 수 있다. read, write, execution
윈도우즈는 파일 이름이. exe나. com이 아니면 실행이 안된다.
유닉스는 익스텐션이라는 개념이 없다. 그래서 실행 가능 여부는 permission으로 구분을 한다.
group: 자기 자신이 속해져 있는 그룹, 그 그룹에 속해져 있는 모든 사용자들은 무엇을 할 수 있는지 표시
public: 모든 사람들이 어떻게 할 수 있는지 표시
파일 하나당 총 9비트가 필요하다.
8진수 표현 761, 7이니까 111 owner는 다 가능, 110 group은 execution 빼고 가능, 001 public은 execution만 가능하다.
제일 앞이 파일의 타입 -가 레귤러 파일, d가 디렉토리
오너는 rw 가능, 그룹 rw 가능, 퍼블릭은 r만 가능
디렉토리 일 때 x가 의미하는 것은 그 디렉토리로 change 디렉토리를 할 수 있다는 의미