[운영체제] 10 File Systems

gramm·2021년 2월 14일
0

운영체제

목록 보기
11/14
post-thumbnail
post-custom-banner

내용 출처

KOCW 반효경 교수님 <운영체제> 강의


반효경 교수님의 <운영체제> 강의 내용을 기반으로 정리했으며,

이 포스팅의 모든 이미지는 <운영체제> 강의에서 가져왔습니다.



파일과 파일 시스템

메모리는 주소를 통해서 접근하는 반면, 파일은 이름을 통해서 접근한다.

  • File

    • “A named collection of related information”
    • 일반적으로 비휘발성의 보조기억장치에 저장한다.
    • 운영체제는 다양한 저장 장치를 file이라는 동일한 논리적 단위로 볼 수 있게 해준다.
    • operation (연산)
      • create, read, write, reposition(lseek), delete, open, close 등
      • reposition(lseek) : 파일을 시작 부분이 아니라 다른 부분부터 읽고 싶을 때, 현재 접근하는 위치를 수정한다.
      • open : 파일의 메타 데이터를 메모리로 올려놓는다.
  • File Attribute (파일의 meta data)

    • 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들
      • 파일 이름, 유형, 저장된 위치, 파일 사이즈
      • 접근 권한 (읽기/쓰기/실행), 시간 (생성/변경/사용), 소유자 등
  • File System

    • 운영체제에서 파일을 관리하는 부분
    • 파일 및 파일의 메타데이터, 디렉토리 정보 등을 관리한다.
    • 파일의 저장 방법을 결정하고 파일을 보호한다.



디렉토리와 논리적 디스크

  • Directory

    • 파일의 메타데이터 중 일부를 보관하고 있는 일종의 특별한 파일
    • 그 디렉토리에 속한 파일의 이름 및 파일의 attribute들
    • operation
      • search for a file, create a file, delete a file
      • list a directory, rename a file, traverse the file system
  • Partition = Logical Disk

    • 하나의 (물리적) 디스크 안에 여러 파티션을 두는 것이 일반적이다.
    • 여러 개의 물리적 디스크를 하나의 파티션으로 구성하기도 한다.
    • (물리적) 디스크를 파티션으로 구성한 뒤, 각각의 파티션에 파일 시스템을 깔거나 swapping 등 다른 용도로 사용할 수 있다.
      (디스크의 용도 : 파일 시스템용 / swap area용)



open()

파일의 메타 데이터를 메모리에 올려 놓는 것

메타 데이터 중에는 파일의 저장 위치도 포함된다. 그래서 파일의 내용을 가리키는 포인터도 같이 저장되어 있다.

이 파일을 open()하면 이 파일의 메타 데이터가 메모리로 올라오게 된다.


open(“/a/b/c/”)

  • 디스크로부터 파일 c의 메타 데이터를 메모리로 가지고 온다.
  • 이를 위하여 directory path를 search한다.
  • directory path의 search에 너무 많은 시간이 소요된다.
    • 그래서 open을 read / write와 별도로 두고, 한번 open한 파일은 read / write 시 directory search를 불필요하게 한다.
  • Open File Table
    • 현재 open된 파일들의 메타 데이터 보관소 (in memory)
    • 디스크의 메타데이터에 몇 가지 정보가 추가된다.
      • open한 프로세스의 수
      • file offset : 파일의 어느 위치에 접근 중인지 표시한다. (별도 테이블 필요)
  • file descriptor
    • open file table에 대한 위치 정보 (프로세스 별)

왼쪽 : 물리적 메모리 / 오른쪽 : 논리적 디스크

fd = open("/a/b")의 과정

open() 함수는 시스템 콜을 하여, CPU가 운영체제로 넘어간다.

루트 디렉토리의 메타 데이터를 먼저 메모리에 올린다. 그런데 메타 데이터 중에는 파일의 위치 데이터가 포함되어 있다. 그래서 root의 메타 데이터를 열면 루트 디렉토리의 실제 내용의 위치를 알 수 있다. root는 디렉토리 파일이므로, 그 내용은 디렉토리 밑에 있는 파일들의 메타 데이터를 가지고 있다.

그중 a라는 파일의 메타 데이터가 있으면, a의 메타 데이터를 메모리에 올린다. 같은 방식으로 a의 위치를 알 수 있고, a라는 디렉토리 아래에 있는 b의 메타 데이터를 찾을 수 있다. b의 메타 데이터를 다시 메모리에 올려놓으면 open이 마무리 되게 된다.

open()은 시스템 콜을 했으므로 값을 리턴한다. 각 프로세스마다 그 프로세스가 open한 파일들의 메타 데이터 포인터를 가지고 있는 배열이 있다. (이를 per-process file descriptor table이라고 한다.) 그 배열 어딘가에 b의 메타 데이터를 가리키는 포인터가 만들어지고, 이 포인터가 배열의 몇 번째 인덱스인지의 값이 b의 file descripter가 되어, 그 값을 사용자 프로세스에게 리턴한다.

사용자 프로세스는 이제 file descripter 숫자로 read/write 요청을 할 수 있다. 예를 들어, b라는 파일에서 무언가를 읽어오고 싶다면 read(fd...)와 같이 시스템 콜을 요청하면 된다. 이를 요청하면 배열의 인덱스를 통해 b의 내용을 읽어올 수 있다. 그런데 이때 읽어온 내용을 사용자 프로그램에 직접 주는 것이 아니라, 운영체제가 자신의 메모리 공간 일부에 먼저 읽어놓는다. 그 다음 사용자 프로그램에 그 내용을 copy해서 전달하면 read 작업이 마무리된다.

왜 copy를 하는가? 만약 동일한 파일의 동일한 위치를 read 시스템 콜을 하면, 디스크까지 갈 필요없이 이미 운영체제가 읽어온 내용을 바로 전달할 수 있기 때문이다. 이를 buffer cache라고 한다.

페이징 시스템에서는 LRU/LFU 알고리즘을 쓸 수 없다. 반면 버퍼 캐싱 환경에서는 모든 정보를 운영체제가 알고 있기 때문에, LRU/LFU 알고리즘을 사용할 수 있다.


open file table은 시스템 전체에 하나만 있으므로 system-wide open file table이라고 한다.



파일의 접근 권한


  • 각 파일에 대해 누구에게 어떤 유형의 접근(read/wirte/execution)을 허락할 것인가?

파일에 대한 protection은 이 파일을 여러 프로그램이 같이 사용할 수 있으므로, 파일의 접근 권한이 누구에게 있는지, 그리고 어떤 연산이 가능한지의 2가지 정보를 같이 가지고 있어야 한다.

  • 접근 제어 방법

    • Access Control Matrix

    행렬로 접근 권한을 표시한다. 그런데 행렬의 경우 메모리 낭비가 크므로, 연결 리스트로 만들 수 있다. 아래의 2가지 방법이 있다.

    • Access control list : 파일별로 누구에게 어떤 접근 권한이 있는지 표시
    • Capability : 사용자별로 자신이 접근 권한을 가진 파일 및 해당 권한 표시

    하지만 연결 리스트로 구현하더라도, 여전히 오버헤드가 너무 크다. 그래서 일반적인 운영체제에서는 grouping을 사용한다.

    • Grouping
      • 전체 user를 owner, group, public의 세 그룹으로 구분한다.
      • 각 파일에 대해 세 그룹의 접근권한(rwx)을 3비트씩으로 표시한다.

    예시 : rwxr--r-- (9비트만으로 접근 권한 표시 가능)
    owner는 read/write/execution 모두 가능 / group, public은 read만 가능

    • Password
      • 파일마다 password를 두는 방법 (디렉토리 파일에 password를 두는 방법도 가능)
      • 모든 접근 권한에 대해 하나의 password를 두어야 한다.
      • 접근 권한별 password : 암기 문제, 관리 문제



Mounting


다른 파티션에 설치되어 있는 파일 시스템을 어떻게 접근할 것인가?

루트 파일 시스템의 특정 디렉토리 이름에 또 다른 파티션에 있는 파일 시스템을 mounting해준다. 그러면 그 mount된 디렉토리에 접근했을 때 또 다른 파일시스템의 루트 디렉토리에 접근하는 꼴이 된다. 이러한 방식으로 서로 다른 파티션에 존재하는 파일 시스템에 접근할 수 있다.



파일 접근 방법

  • 시스템이 제공하는 파일 정보의 접근 방식

    • 순차 접근 (sequential access)

      • 카세트 테이프를 사용하는 방식처럼 접근한다.
      • 읽거나 쓰면 offset은 자동적으로 증가한다.
    • 직접 접근 (direct access, random access)

      • LP 레코드 판과 같이 접근하도록 한다.
      • 파일을 구성하는 레코드를 임의의 순서로 접근할 수 있다.
profile
I thought I introduced
post-custom-banner

0개의 댓글