본문 바로가기

프로그래밍/운영체제

[운영체제] File and File System

 

메모리는 주소를 통해 접근하는 장치였다면, 파일이라는건 이름을 단위로 접근하는 것

 

파일의 메타데이터는 파일의 각종 정보들을 저장하는 정보

 

파일 시스템은 운영체제에서 파일을 관리하는 부분

 

디렉토리도 하나의 파일이다

 

운영체제가 보는 디스크는 논리적인 디스크고 이걸 다른말로 파티션이라고 한다.

D드라이브 C 드라이브 처럼 파티션으로 나눌수있다.

 

이 파티션에 파일시스템을 설치하거나 swapping 등의 용도로 사용할수있다.

 

 

파일의 operation 중 open() 을 봐보자

 

파일의 메타데이터를 메모리로 올려놓는 작업이다.

c의 메타데이터를 메모리로 가지고온다.

근데 디렉토리 경로가 계층으로 되어있을때

open 하라고 하면 c의 메타데이터 위치를 디스크에서 찾아야한다.

root 디렉토리 경로는 알고있어서 root 부터 a 를 획득하고 b 를 획득하고 c를 open 한다

 

사용자 프로그램이 시스템콜(open) 을 하게 되면

시스템콜이니까 제어권이 운영체제로 넘어간다.

운영체제가 root의 메타데이터를 먼저 메모리에 올리고 , root의 실제 데이터 위치를 찾고,

a의 메타데이터를 찾고 그걸또 메타데이터로 올리고 하는식으로 반복해서 위치를 찾게된다.

 

open 이 끝나면 결과값을 return 하는데

어떤값이냐면 , 프로세스마다 프로세스가 오픈한 파일의 포인터를 가지고있다.

b의 값의 파일 디스크립터를 return 하게 된다.

 

이제 파일 디스크립터를 알았으니 이 배열만으로 파일의 read, write 요청을 할 수 있다.

read()를 하게 되면 , 다시 시스템콜을 하게 되고 ,

b의 content 를 요청한 만큼 얻고 전달해주면된다.

근데, 이과정에서 디스크에 읽어서 바로 사용자 프로세스에 전달하는게 아니라

운영체제가 자신의 메모리공간에 읽어 두고 , 그 다음에 사용자 프로세스에 카피해서 전달을 해주고 read 작업이 끝난다.

 

자신의 일부 메모리 공간에 저장해두니까 다른 프로세스가 같은걸 요청했을때 디스크까지 안가고

바로 전달할수있다. 이게 바로 버퍼 캐싱이라고 한다.

 

 

파일의 접근권한을 알아보자

 

파일의 프로텍션은 여러 사용자, 프로그램이 같이 사용 할 수 있기 때문에,

누구에게, 어떤 권한을 줄 지를 정해줘야한다.

 

Access control Matrix

각각의 사용자가 권한이 있는지 를 행렬로 표시해둔다.

근데 이 방법은 행렬 자체의 낭비가 너무 많이 생긴다.

 

그래서 링크드리스트로 만드는 방법을 생각해볼수있다.

ACL, Capability 등이 리스트 방식이다.

 

하지만 , 이게 너무 부가적인 오버헤드가 심하다

그래서 일반적으로 운영체제는 Grouping으로 접근 권한을 제어한다.

모든 사용자에 대해 보지 않고 

user를 3그룹으로 나눈다. owner, group, public  

 

파일 하나에 9비트만 있으면 권한을 알 수 있게 된다.

 

 

하나의 물리적인 디스크를 파티션으로 여러개의 논리적인 디스크로 나눌 수 있다고 했다.

각각의 논리적인 디스크에는 파일시스템을 설치해서 사용가능하다.

 

근데 이때 disk 1 이 disk3 의 있는 내용을 원한다면?

Mounting 이라는 연산이 있다.

disk3의 root 가 usr에 붙어 있는 것