운영체제 ch13. FileSystem Interface

오영선·2022년 7월 27일
0

파일 시스템은 가장 사용자에게 많이 노출 되는 운영체제의 부분이다. 파일 시스템은 운영체제와 사용자의 데이터, 프로그램을 온라인으로 저장하고 접근하는 기법을 제공한다.

파일시스템은 두 부분으로 나눌 수 있다.
1) 파일의 집합체
2) 파일에 관한 정보를 제공하는 디렉터리 구조
로 나눌 수 있고, 파일 시스템은 저장장치 상에서 구현된다.

13. 1 파일 개념

파일이란?
논리적 저장 단위(물리적 특징이 추상화됨.) 운영체제에 의해서 실제 물리 장치들로 사상되며, 비 휘발성이다.
또는 논리적 보조저장장치에 기록된 관련 정보의 집합으로 정의할 수 있다. (가장 작은 할당 요소) 즉, data는 파일 안에 존재해야지만 기록될 수 있다.

파일은 워낙 일반적인 용도로 사용되어, 원래 사용범위를 넘어 다른 용도로도 사용된다. UNix는 시스템 정보에 대한 액세스를 제공하기 위해 파일 인터페이스를 사용한다.(proc)

파일은 data와, program으로 구분된다. 파일 내의 정보는 작성자에 의해 다양한 유형으로 저장되고, 유형에 따라 특별히 정의된 구조를 가지고 있다.
텍스트 파일은 행들로 구성되는 연속된 문자ㄷㄹ이고,
소스파일이란 함수들의 연속, 각 함수는 선언과 실행문의 순서로 구성된다.
실행파일이란 로더가 메모리로 가져와 실행시킬 연속된 코드 부분들이다.

13.1.1 파일 속성

example.c 와 같이 사용자의 편의를 위해 이름을 부여한다.
파일이 일단 만들어지면 그 파일을 생성한 프로세스, 사용자, 시스템으로 독립한다. 즉 다른 사용자나 다른 프로세스, 다른 시스템(온라인 너머)로도 복제, 편집이 가능해진다.

파일의 속성으로는

  • 이름
  • 식별자
  • 유형
  • 위치
  • 크기
  • 보호 : 접근 제어 정보. rwx
  • 타임스태프와 사용자 식별
    이 있다.

모든 파일의 정보는 파일 자신과 같은 장치에 상주하는 디렉터리 구조에 의해 유지된다. 보통 디렉터리에는 파일의 이름과 식별자로 구성되는데, 식별자는 다시 다른 파일 속성을 찾는데 사용된다. 디렉터리는 파일의 휘발성과 일치하므로 파일과 같이 장치에 저장되고, 필요할떄마다 메모리로 불러들인다.

13.1.2 파일 연산

  • 파일 생성
  • 파일 열기 : 생성, 삭제를 제외하고 모든 연산에서 실행된다.

position pointer가 필요한 연산

  • 파일 쓰기
  • 파일 읽기
  • 파일 위치 재설정
  • 파일 삭제
  • 파일 절단(내용만 다시 쓰기)

파일 Copy 등 다른 연산들은 위의 연산들의 조합으로 이루어진다.
copy :
create(copy)
read(origin)
write(copy)

운영체제는 모든 열린 파일에 대한 정보(open-file table)을 유지해 open()이 호출된 파일번호를 저장한다.
파일 이름 : open() 시스템 콜이 호출되면, 파일 이름으로 디렉터리를 찾고 디렉터리의 항목을 열린파일테이블로 복사한다. 또한 접근모드 정보를 받아 파일의 권한과 대조한다. 요구하는 모드가 허용이 되면 프로세스를 위해 파일포인터를 되돌려 준다. (파일명을 줘서 탐색과정을 거치지 않고 포인터를 사용해 단순화함)

여러개의 프로세스가 동시에 파일을 여는 구현은 더 복잡하다.
보통 운영체제는 두 단계의 내부테이블을 사용하는데, 바로 프로세스 별 테이블과 general 시스템 테이블이다.

  • 프로세스 테이블 : 각 프로세스가 연 모든 파일을 기록한다.
    프로세스가 파일을 어떻게 사용하는지. (각 파일에 대한 현재 파일 포인터) 등등
  • 범 시스템 테이블 : 디스크상의 파일 위치, 접근 날짜, 파일 위치 등..

일단 파일이 하나의 프로세스에 의해 열리면 다른 프로세스는 단순히 general시스템 테이블 내에 있는 해당 파일을 가리키는 새로운 항목이 타른 프로세스들의 열림파일테이블에 더해진다.

  • 파일 포인터 : 가장 최근의 읽기/쓰기 추척
  • 파일 열린 계수 : open()은 +1, close()는 -1tlzlsek.
  • 파일의 위치
  • 접근 권한

몇 운영체제는 열린 파일을 locking하는 기능을 제공한다. 파일 락은 여러 프로세스에 의해 사용되고, 수정되는 시스템파일같이 공유되는 파일에 유용하다.
shared lock : reader lock과 비슷하게 여러 프로세스가 동시에 락을 획득한다.
exclusive lock : 한번에 하나의 프로세스만 락을 획득한다. wirter lock과 비슷

또한 파일의 락 방법으로는 mandatory, advisory가 있다.
강제적으로는 배타적 락이 해제될때까지 접근을 막는다. 락 무결정을 보장하는 것이다.
권고적 락에는 락이 획득되고 해제되는 것이 개발자의 몫이다. lock의 경우 데드락상태가 되지 않도록 주의해야한다.

13.1.3 파일 유형

파일 유형이란, .sh, .docx처럼 이름 뒤 확장자라고 불리는 부분이다.
운영체제에게 파일 유형을 인식 시킬것인가?

  • 인식 시킨다 : 시스템이 엉뚱한 유형으로 연산을 수행하는 경우를 방지할 수 있다. 동작하는 파일이 어떤 파일인지 "힌트"를 주는 것이다.
    사용자가 확장자를 지정해주지 않는다면 운영체제는 가장 비슷한 확장자를 찾는다.

13.1.4 파일 구조

파일의 유형을 알면 파일의 내부 구조 형태를 짐작할 수 있다. 하지만, 운영체제가 여러 파일 구조를 지원하는 경우에는 운영체제의 크기가 커지고 관리하기 힘들어질 수 있다.
또, 모든 파일이 운영체제에서 지원하는 파일 유형 중 하나로만 정의되어야 할 수도 있다.

ex) 운영체제가 텍스트파일과 실행파일 각각 유형 두가지만 지원할때 보안비트로 인코딩 할 경우 운영체제는 이 파일을 사용할 수 없어진다.

Unix, Windows는 파일의 내용이나 구조에 관여하지 않는다. 파일 유형지원은 상대적으로 적어지지만 유연성이 극대화된다.
그렇다 하더라도 모든 운영체제는 반드시 한가지 파일 구조는 지원하는데, 바로 실행파일의 구조이다.

13.1.5 파일의 내부 구조

한 파일 내의 특정 위치를 찾는 것은 복잡할 수 있다. 디스크 시스템은 섹터에 따른 동일한 블록 크기를 가진다. 각 물리 블록 내에는 몇개의 논리 블록이 들어갈 수도 있다. 디스크는 공간을 항상 블록단위로 할당하기 때문에 각 파일의 마지막 블록의 일부는 낭비된다. 모든 파일 시스템은 내부 단편화 문제를 가졌고 블록크기가 클수록 내부 단편화가 커진다.

13.2 접근 방법

파일은 정보를 저장하고, 정보에 접근하는 방법은 한가지만 제공될 수 도, 여러가지가 제공될수도 있다.

13.2.1 순차 접근

편집기나 컴파일러의 방식. 대부분의 연산이 읽기와 쓰기이다. 이 작업이 한번 실행될떄마다 파일 포인터(offset)이 자동 증가한다. 테이프 모델 기반이다.

  • read_next()
  • write_next()

13.2.2 직접 접근(상대접근)

파일은 고정 길이 논리 레코드 집합으로 정의 되고, 어떠한 블록이라도 직접 액세스 할 수 있다. 읽기나 쓰기의 순서의 제약이 없어 대규모 DB등에 유용하다.
Ex) 항공ㅇ 713편에 ㅏ는 승객의 정보는 블록 713에 저장됨4
해시함수를 쓰기도 한다.

  • read(n)
  • write(n) // n은 블록 번호
순차 접근으로 직접접근 구현 - 비효율적
while :
	position_file(n)
read_next()

블록 번호n은 시작위치(0)에서 부터 세기 때문에 상대적 블록 번호이다.

13.2.3 기타 접근 방법

index를 이용하기 (목차)

컴퓨터 구조에서 캐시의 구조처럼 큰 파일을 비교적 적은 입출력으로도 탐색할 수 있게 해준다. 파일이 아주 커지면 index파일도 커지기 때무넹, 2차 index파일을 만들기도 한다.

13.3 디렉터리 구조

디렉터리는 파일 이름을 파일 제어 블록으로 바꾸는 심볼 테이블이다.

디렉터리의 연산으로는

  • 파일 찾기
  • 파일 생성
  • 파일 삭제
  • 디렉터리 나열
  • 파일의 재명명(rename)
  • 파일 시스템 순회

다음으로는 디렉터리의 논리적 구조가 있다.

1단계 디렉터리

  • 가장 간단한 디렉터리 구조
  • 다수의 사용자가 될 경우 심각한 제약이 생긴다.
  • 모든 파일이 한개의 디렉터리 밑에 존재한다.
  • 같은 디렉터리 내에 모든 파일이 존재하므로 모든 파일 이름은 유일해야한다.

2단계 디렉터리

  • 각 사용자는 각자 UFD디렉터리를 가지고 각 디렉터리가 오직 한 사람의 파일만 저장한다.
  • 접속하면 마스터 파일MFD를 먼저 탐색해 해당 사용자 이름(USERFILE)디렉터리로 접근한다.
  • 각 파일 내에서면 고유한 이름을 가지면 되지만, 두 사용자가 한 파일을 공유하기가 어려워진다.
  • 이경우에는 각자 접근을 허용하는데 이때 반드시 특정 파일을 유일하게 지칭하기 위해 사용자의이름과 파일 이름 모두 주어야 한다.
  • 높이 2의 트리(역트리)로 간주할 수 있다.
  • 사용자의 이름, 파일 이름이 경로명이 된다.

    탐색 경로
    디렉터리 시스템에서 시스템 파일을 검색할때, 모든 시스템 파일을 각각의 UFD에 복사하는 것은 비효율적이므로 검색 절차를 복잡하게 한다.
    운영체제는 파일 이름이 주어지면 UFD에서 검색하고 파일을 찾지 못하면 특수한 사용자 디렉터리를 탐색한다.

트리 구조 디렉터리

  • 일반 사용자들도 얼마든지 서브 디렉터리를 가진다.

  • 루트 디렉터리가 있고, 시스템 내의 모든 파일이 고유 경로명을 가진다.

  • 디렉터리가 디렉터리나 파일을 가질 수 있다. 이떄 디렉터리는 파일과 같지만 단지 특별 취급을 받는 파일이라고 생각한다.

  • 각 프로세스는 ㅍ현재 디엙터리를 가지고 있다. 파일의 참조가 일어나면 탐색 경로를 사용하거나 다른 디렉터리로 이동하는데, change directory(cd)를 이용해 바꿀 수 있다.

  • 경로 명에는 절대 경로명, 상대 경로명이 있다.
    절대 경로명이란 루트("/") 부터 시작하고, 상대 경로명은 현재 디렉토리부터의 목표파일까지의 경로를 출력한다.

  • 이 구조에서는 디렉터리의 삭제 문제가 생긴다. 디렉터리가 비어있지 않을때 두가지 방법이 있는데

  1. 삭제하지 않는것 (밑의 디렉토리를 모두 지워야하는 번거로움)
  2. 한번에 삭제 (복구의 위험이 있다.)

비순환 그래프 디렉터리

  • 두 명 이상이 모두 하나의 서브 디렉토리를 자신의 디렉터리에 위치시키고 싶을떄 : 공유 서브 디렉토리
  • 트리구조는 공유를 허용하지 않기 떄문에, 비순환 그래프에서 공유를 허용하는 구조를 가진다.
  • 공유를 위해 디렉토리나 파일을 공유하지 않는다.
  • 물리적으로 한 파일을 공유함으로써 하나의 파일이 변경되면 다른 사용자가 즉시 볼 수 있다.
  • link(다른 파일을 가리키는 포인터)를 resolve(해석)하는 방식으로 구현된다. 링크는 쉽게 구분되고 간접적 포인터로 지칭된다.
  • 또는 디렉터리들이 동일한 항목 내용을 복사해서 가지고 있는다. 그러나 복사본과 원본이 구분이 안되기 때문에, 일관성 문제가 발생한다. (???)
  • 융통성이 있지만 더 복잡하다.

일반 그래프 디렉터리

비순환 그래프 트리 구조는 순환이 발생하지 않도록 보장해야 한다.

  • 기존 트리에서 새로 링크를 추가하면 트리 구조는 파괴되고 일반적인 그래프 구조가 된다.
  • 파일 참조의 존재여부 결정이간단해진다.
  • 공유 부분을 두번 순회해서는 안된다. 한가지 해결책은 한번에 탐색할 디렉터리의 숫자를 제한하는 것이다.
  • 파일을 삭제할때 참조 계수가 0이 되지 않을 수도 있다. 이때는 garbage-collexction 기법이 필요하다.

13.4 보호

물리적인 손상(신뢰성)
부적절한 접근(보호)
해결하는 것이 목표이다.

신뢰성의 경우 규칙적인 간격으로 자동으로 디스크파일을 복사한다. (11장)

13.4.1 접근 유형

통제된 접근 방법으로 파일을 보호한다.

  • read
  • write
  • excute
  • append
  • delete
  • list
  • attribute change(속성 변경)

13.4.2 접근 제어

사용자에 따라 특정 파일에 대한 접근 허용 여부를 결정한다.
파일과 디렉토리에 ACL (acess-control list)를 연관시켜 누가 어떤 연산을 사용할 수 있는지 기술한다.
but,

  • 리스트의 길이가 가변적이다(사용자 수 만큼) 특히 우리는 시스템 사용자 리스트를 미리알 수 없다.

  • 고정크기인 디렉토리 항목이 가변적이 되어 공간관리가 복잡해진다.

    따라서 시스템은 모든 사용자를 세가지로 분류한다.

  • Owner

  • group

  • other
    에 맞춰 rwxrwxrwx 3필드를 사용한다. 보호비트를 위해 파일당 9비트를 사용한다.

13.4.3 다른 보호 방법

각 파일에 접근할 때 암호를 요구한다.

  • 장점 : 암호를 알고있는 사람으로 접근을 제한한다.
  • 단점 : 1. 파일마다 독자적인 암호를 가지면 외울 것이 많아진다.
    2. 그렇다고 모두 같은 암호를 쓰면 보호가 전부 되거나 전부 되지 않는다.

13.5 메모리 사상파일

좀만 더 힘내,,,....
파일에 액세스 하는 또 다른 방법 : 메모리를 참조하는 메모리 사상
프로세스의 가상 공간 중 일부를 관련 파일에 할당한다. 성능향상에 도움된다.

13.5.1 기본 기법

프로세스 페이지 중 일부분을 디스크에 있는 파일의 블록에 사상한다.
첫 접근은 요구 페이징 과정에 따라 페이지 폴트가 발생해 파일 시스템-> 메모리 페이지로 파일 내용을 읽어온다. 이후로는 read/write는 메모리 액세스처럼 처리되고, 시스템은 파일을 닫을때만 메모리에서의 변경사항에 따라 파일을 업데이트한다. 파일이 닫히면 모든 메모리 사상된 데이터가 보조저장장치의 파일에 다시쓰이고 프로세스의 가상 메모리에서 제거된다.

또 여러 프로세스가 데이터를 공유하기 위해 파일을 공유할 수도 있다.
이 경우 한 프로세스가 공유중인 메모리 사상파일에write하면 다른 모든 프로세스도 그 변경사항을 볼 수 있다.

0개의 댓글