[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] 파일시스템

inu 2020. 6. 3. 16:23
반응형

파일의 개념

  • 파일 : 정보의 집합체. 정보란 비트, 바이트, 행, 레코드 등을 모두 포함한다. 파일 작성자나 사용자가 해당 정보를 정의한다.
  • 파일은 보조기억장치에 저장되어 있고, 주로 프로그램파일 혹은 데이터 파일이다.
  • 프로그램 파일 : 원시 프로그램(C,C++), 오브젝트(바이너리) 프로그램
  • 데이터 파일 : 수를 포함해 문자 또는 ASCII 코드로 된 문자 혹은 숫자로 구성되어 있다. 내용 면에서는 텍스트 파일처럼 비정형화된 자유형식일 수도 있고, 데이터베이스처럼 엄격히 정형화된 형태일 수도 있다. 또한 동영상, 이미지, 소리 등 정해진 포멧을 따르고 있을 수도 있다.
  • 어떤 파일이든 하드디스크와 같은 저장장치에 저장될 때 섹터 단위로 저장된다. 즉, 하나의 파일이 디스크 내 여러개의 섹터로 구성되는 것이다. 섹터는 논리적으로는 블록에 해당되고, 일반적 PC에서 한 섹터의 크기는 512바이트이다.

파일 추상화와 파일시스템

  • 파일은 섹터단위로 저장되어 있는 정보의 집합체라고 할 수 있다.
  • 파일은 추상화라는 과정을 통해 그 용도나 기능을 확장한다.
  • 가상메모리는 추상화기법에 기반한다. 오브젝트 파일을 프로세스와 연관시키기 위해 추상화를 사용한다. EXE 파일을 구성하는 블록들을 페이지로 맵핑시켜 하나의 프로세스로 나타나도록 한다.
  • cf. 오브젝트 파일 : 컴파일러나 어셈블러가 소스 코드 파일을 컴파일 또는 어셈블해서 생성하는 파일
  • 시스템 내부 입출력 장치를 파일이라는 개념으로 추상화해줌으로써 프로세스의 장치 접근에 일관성을 유지,지원한다.
  • 이런 추상화를 실현하기 위해 파일 시스템이 존재한다.

파일시스템

  • 저장장치는 선형적 주소를 가진 바이트의 블록만을 저장한다. 이러한 블록은 섹터에 저장된다.
  • 파일 시스템은 저장장치와 응용프로그램 사이의 자료구조 차이점을 해결해준다. 데이터 파일을 예로 들어보자.
  • 파일 시스템이 섹터로 조각나서 산재되어 있는 블록들을 관리해 바이트의 연속인 하나의 파일, 즉 바이트 스트림 파일로 보이도록 만들어준다. 응용프로그램은 이러한 바이트 스트림 파일을 용도에 맞추어 레코드 혹은 구조체 등의 형태로 재구성함으로서 구조화된 레코드 파일(structed-record file)로 보이도록 한다.
  • Stream-block Translation : 기억장치의 블록을 음수가 아닌 정수값을 갖는 연속된 주소의 바이트 집합(바이트 스트림)으로 변환
  • Record-stream Translation : 응용프로세스에 맞는 자료구조(레코드 혹은 구조체)로 변환
  • 저장장치에서 오브젝트 파일(실행 파일)로 저장되어 있던 것을 파일시스템이 Stream-block Translation와 Record-stream Translation로 가상메모리에 적절하도록 추상화해준다.
  • 장치제어기와 응용 프로그램에 따른 추상화는 파일 시스템이 응용 프로그램에게 장치 접근을 위한 파일 API를 제공함으로서 추상화를 제공한다.

바이트 스트림 파일

  • 파일 시스템은 바이트 스트림 파일을 효과적으로 다루기 위해 파일마다 file descriptor라는 구조체를 구비하고 해당 구조체에 파일에 해당하는 이름, 현재상태, 권한, 크기, 생성시간, 수정시간 등의 각종 정보를 보관한다.
  • 이러한 파일 디스크립터의 정보는 파일 내부에 저장되고, 일부 내용은 파일 검색 지원을 위해 폴더에도 수록된다. (이러한 이유로 파일이나 폴더의 포멧이 그리 단순하지는 않다.)
  • 만약 파일이 임의의 프로세스에 의해 open되면 파일 디스크립터에 해당 상태와 추가 정보(파일 입출력이 이루어지는 위치인 file position 등)를 수록한다. 그에 따라 파일 디스크립터 정보의 일부가 메모리에 로딩되기도 한다. open된 파일에 대한 접근을 신속하게 처리하기 위함이다.
  • 파일에 관한 정보의 복제본이 여러곳에 존재하는 '분산 시스템'의 경우 일관성 유지를 위해 다양한 문제를 해결해야 하는데, 이는 보다 고차원의 문제이다.

디렉토리 시스템

  • 디렉토리 : 자신에게 속하는 모든 파일과 부 디렉토리의 목록을 가진 자료구조 파일. 폴더라고도 한다.
  • 즉, 디렉토리도 하나의 파일이며 디렉토리 파일이라는 파일을 통해 디렉토리 기능을 제공하는 것이 된다.
  • 단단계 디렉토리 : 가장 간단한 구조의 디렉토리이다. 모든 파일이 한 디렉토리 내부에 있어 유지와 이해가 쉽다. 하지만 모두 유일한 파일명이 가져야한다는 제역사항이 존재한다.
  • 그래프 디렉토리 : 임의 파일이나 디렉토리가 서로 다른 두 개 이상의 디렉토리를 부모로 가질 수 있고, 사이클을 형성할 수도 있다. 사이클이 없다면 비순환 그래프가 되어 일종의 트리 구조가 되기도 한다. 융통성은 좋지만 구조가 매우 복잡하여 다양한 경우의 수를 고려해 문제를 해결해야 한다. 또한 하나의 파일이 완전한 경로이름을 가지고 있으므로 서로 다른 경로 이름이 같은 파일을 가리키는 경우도 있다. 파일의 삭제과정에서 연결이 끊기면서 고아 포인터(dangling pointer)가 발생할 수 있다.
  • 계층 구조 디렉토리 : 하나의 root 디렉토리가 다른 디렉토리나 파일을 포인트한다. 한 디렉토리는 부 디렉토리를 포인트하며 계층이 내려간다. 하지만 이 역시 한 디렉토리의 부모 디렉토리는 상위 계층 상의 여러 디렉토리가 될 수 있어서 관리와 사용에 복잡성이 존재한다.
  • 트리 구조 : 계층 구조 디렉토리를 단순화하여 표현할 수 있는 것이 트리구조이다. 모든 디렉토리와 파일은 단지 한 개의 상위 디렉토리에 의해서만 포인트된다. 가장 상취가 되는 root 디렉토리는 부모 디렉토리가 없다.
  • 절대경로 : root에서부터 지정된 파일까지의 모든 경로가 명시된 것.
  • 상대경로 : 현 디렉토리를 기준으로 지정된 파일까지의 경로를 명시한 것. 리눅스에서는 현 디렉토리를 '.'으로 부모 디렉토리를 '..'으로 표현한다.
반응형