[CS] File

do yeon kim·2022년 10월 24일
0

CS-운영체제

목록 보기
18/20

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

File

File(파일) 이란 하드디스크에 저장하는 단위로 알려져 있다.

앞서 본 메모리의 경우 데이터를 주소를 통해서 접근하는 장치였다.
디스크는 저장하는 파일을 이름을 통해서 접근한다.

파일이란 관련된 정보를 이름을 가지고 저장하는 것이다.
일반적으로 파일은 비휘발성의 자료이다.

데이터를 저장하는 목적으로만 파일을 사용하는 것이아니라,
리눅스에서는 다양한 장치들을 관리하기 위해서 파일(file)을 사용하기도 한다.
운영체제는 장치를 디바이스A, 디바이스B 등의 file로서 관리를 한다.
이런 file을 divice special file이라고 한다.

파일에 정의된 연산은 create, delete, read, write, open, close, reposition등의 연산이 있다.

파일을 읽거나 쓰면, 파일이 여러개의 바이트로 구성된다. 어느 위치를 읽는냐 쓰느냐를 가르키는 pointer가 있다. 필요에 따라서 다른 부분부터 읽거나 쓰고 싶은 경우 현재 접근 위치를 수정해주는 연산이 reposition이다.




MeteData

open의 역할은 파일을 디스크에서 메모리로 내용을 올리는게 아니다.
파일의 Meta데이터를 올리는 것을 open이라고 한다.

파일에는 파일자체의 내용말고 관리를 위한 정보가 있다.
파일의 이름, 파일의 유형, 디스크저장위치, 사이즈 등은 파일의 내용에 관련이 없는 파일의 Metadata이다.


File system

파일시스템이란 운영체제에서 파일을 관리하는 소프트웨어 부분이다.
파일시스템은 파일 자체의 내용도 관리해야하며, 파일의 Metadata도 관리해야한다.



Directory도 하나의 파일이다?

디렉토리도 하나의 파일이다.
디렉토리의 파일 내용은 디렉토리에 있는 어떤 파일이 있는지를 알려주는 내용을 가지는 파일이다.

디렉토리의 파일의 내용은 디렉토리 밑에 존재하는 파일이 무엇인지, 밑에있는 파일의 meta데이터를 포함해서 존재하는 파일이다.

디렉토리의 연산은 디렉토리의 파일 목록, 파일을 찾는것, 파일을 만드는 것, 파일을 지우는 것 등이 있다. 파일 시스템 전체를 탐색하는 연산 등도 있다.




운영체제는 어디를 보고있나?

논리적디스크 ? 물리적디스크?

파일시스템이 하드디스크에 저장되는데, 디스크는 논리적디스크, 물리적디스크가 있다. 운영체제가 보는 디스크를 논리적디스크이다.

논리적디스크를 파티션(Partition)이라고 한다.

하나의 디스크를 사서 c드라이브, d드라이브로 파티션으로 나누면 각 각이 논리적인 디스크가 된다.

논리적인 디스크에 파일시스템을 설치할수도 있고, Swap Area 용도로 사용할수 있다.

디스크의 용도를 크게 파일시스템의 용도, swap area용도로 두가지고 나누어 볼수 있다.




Open()을 하면 어떤식으로 구동할까?

Open()

open()은 파일의 메타데이터를 메모리에 올리는 것이다.
논리적디스크(오른쪽은 디스크)안에 파일시스템이 있으면 파일시스템 안에 파일의 메타데이터도 있고, 파일의 내용도 저장되어 있을 것이다.

메타데이터에는 파일의 저장위치가 있고, 이 정보를 포함한 meta데이터가 open()을 하게 되면 메모리에 올라가게 되는 것이다.

위의 예에서는 루트디렉토리부터 시작해서 c 라는 파일의 메타데이터를 찾아야 한다.

왼쪽이 물리적메모리, 오른쪽이 논리적디스크이다.

사용자프로그램이 open()을 하게되면 시스템콜을 한다. 그럼 cpu제어권이 운영체제로 넘어가게된다.

커널에는 프로세스별로 관리하는 pcb도 있고, global적인 open file data도 있다.

루트를 먼저 open한다.
루트의 meta데이터가 물리메모리에 올라가고, root의 파일에는 다른 파일의 metadata가 포함되므로 다시 디스크에서 a의 metadata를 찾고 a의 metadata가 메모리에 올라가고, 다시 b의 metadata를 찾아서 다시 디스크에 올린다.

시스템콜을 했기 때문에 반환을 하는데, 반환하는 것은 각 프로세스마다 오픈한 파일에 대한 metadata 포인터를 가지고 있는 배열이 있다. 배열에서 몇번쨰 인덱스 인지를 리턴해준다.

read를 하면 시스템콜을 하기 때문에 다시 a의 PCB에 가서 파일의 메타데이터에 해당하는 인덱스이 있는 것을 따라가서 읽어 오게 된다.
시작위치부터 읽어오게 된다.

읽어오게 되면 사용자 프로그램에 직접주는 것이 아니라.

운영체제가 자신의 메모리 공간 일부에 읽어 두고서 사용자 프로그램에게 카피해서 전달해준다.

만약에 동일한 프로그램 또는 다른 프로그램이 동일한 파일에 대한 요청이 오게되면 디스크까지 가는 것이 아니라 운영체제가 읽어 둔 것을 주게 된다. 이를 버퍼캐싱이라고 한다.

버퍼캐시에서는 LRU나 LFU가 사용될 수 있다.
버퍼캐시에 파일이 있든 없든 cpu 제어권이 운영체제에 넘어가게된다.
앞서 가상메모리의 페이지교체알고리즘에서는 운영체제가 페이지디폴트가 발생했을 경우만 관여하기때문에 LRU와 LFU가 불가능 했다. 하지만 버퍼캐스에서는 운영체제가 항상 관여하기 때문에 LRU와 LFU가 가능하다.




파일의 접근권한

파일의 여러 사용자, 프로그램이 사용할 수 있다.
그렇기 때문에 누구 한테 접근권한이 있는가 와 접근 연산이 어떤게 있는지 있어야 한다.

  • access control matrix
    링크드 리스트로 연결

  • grouping
    일반적인 운영체제에서는 grouping을 통해서 접근권한 나타낸다.

  • password




논리적디스크에서 논리적디스크로의 접근

하나의 물리적인 디스크를 파티션을 통해서 여러개의 논리적디스크로 나눌수 있다. 각각의 논리적디스크에 파일 시스템을 설치해서 사용할 수 있다.

다른 파티션에 설치되어 있는 파일시스템에 접근하려면 어떻게 해야 할까?

  • MountIng

루트 파일시스템의 특정 디렉토리이름에다가 또 다른 파티션에 있는 파일시스템을 마운트를 해주면 마운트된 디렉토리에 접근하면 또 다른 파티션의 루트디렉토리로 접근할 수 있다.




0개의 댓글