[Computer Science]/[운영체제(OS)]

[운영체제(OS)] 13-1) 파일 시스템과 접근 방법

극꼼 2023. 4. 13. 01:21
반응형


<파일>

: 보조저장장치에 기록된 관련 정보의 집합으로, 프로그램(소스 프로그램과 목적 프로그램)자료(작성자와 사용자에 의해 의미가 정의된 비트, 바이트, 라인, 레코드들의 연속)를 나타냅니다. 

 

* 텍스트 파일 : 행, 페이지들로 구성되는 연속된 문자들

* 소스 파일 : 함수들의 연속

* 실행 파일 : 로더가 메모리로 가져와 실행시킬 수 있는 연속된 코드 부분들


<파일 속성>

1) 이름

2) 식별자 : 우리가 읽을 수 없는 파일의 이름. 보통 하나의 숫자로 되어 있음.

3) 유형

4) 위치

5) 크기

6) 보호 : 접근 제어 정보로, 누가 읽기, 쓰기, 실행 등을 할 수 있는지를 제어함.

7) 타임스탬프와 사용자 식별

 

몇몇 새로운 파일 시스템은 확장된 파일 속성도 지원하는데, 보안 정보를 포함합니다.

모든 파일에 대한 정보는 같은 장치에 있는 디렉토리 구조에 의해 유지됩니다. 디렉토리 항목은 파일의 이름과 고유의 식별자로 구성되는데, 식별자는 다른 파일 속성을 찾는데에 사용됩니다.


<파일 연산>

다음 7개의 연산은 파일 조작에 필요한 최소 연산입니다.

1) 파일 생성 : 파일을 저장할 공간을 파일 시스템 내에서 찾고(공간 할당) -> 생성된 파일에 대한 항목이 디렉토리에 만들어져야 합니다.

2) 파일 열기 : 생성, 삭제를 제외한 모든 연산은 파일 open연산을 합니다. open() 콜은 파일 핸들(다른 콜의 인자로 쓰임)을 반환합니다.

3) 파일 쓰기 : 열린 파일 핸들과 파일에 기록될 정보를 명시하는 시스템 콜을 실행합니다. 쓰기 포인터(write pointer)는 쓰기가 일어날 위치를 가리키며, 쓰기가 일어날 때마다 갱신됩니다.

4) 파일 읽기 : 파일 핸들과 파일이 읽혀야 할 블록의 위치를 기술하는 시스템 콜을 합니다. 읽기 포인터(read pointer)는 읽기가 일어날 파일의 위치를 가리킵니다. 프로세스는 일반적으로 파일 읽기나 쓰기 중 하나를 하고 있기 때문에 대부분의 시스템은 하나의 현재 파일 위치 포인터(읽기, 쓰기 연산 모두에 사용)를 가집니다.

5) 파일 안에서의 위치 재설정 : 열린 파일의 읽기, 쓰기 위치를 재설정합니다. 파일 탐색(seek)이라고도 합니다.

6) 파일 삭제 : 지정된 파일을 디렉토리에서 찾고 -> 모든 파일 공간을 해제 -> 디렉토리 항목에서 지우거나 사용가능으로 표시해서 다른 파일에서 재사용할 수 있게 합니다. 

  • 하드 링크 : 동일한 파일이 여러 개의 이름(디렉토리 항목)을 가질 수 있게 하며, 실제 파일 내용은 모든 링크가 삭제되어야 삭제됨.

7) 파일 절단 : 파일의 내용만 지우고 속성은 남기는 것입니다. 파일의 길이가 0으로 재설정되고 파일이 가지고 있던 공간은 해제될 수 있습니다. 

 

  • 열린 파일 테이블(open-file table) : 운영체제가 가지고 있는 모든 열린 파일에 대한 정보를 가진 테이블. 파일 연산을 할 때 반복적인 탐색을 피할 수 있습니다.
    • 파일이 더이상 사용되지 않으면 프로세스에 의해 닫히고, 열린 파일 테이블에서 삭제합니다. create(), delete()는 닫힌 파일을 대상으로 동작하는 시스템 콜입니다.
    • 열린 파일 테이블은 파일을 연 프로세스의 수를 가리키는 open count를 각 파일에 연관해 두고 있습니다. open count는 파일을 close하면 감소하고, 파일이 열리면 증가하며, 0이 되면 열린 파일 테이블에서 제거됩니다.
  • open() : 일부 시스템에서 파일을 첫번째 참조할 때 암묵적으로 실행되거나, 프로그래머가 파일을 사용하기 전에 명시적으로 호출합니다. 열린 파일 테이블 항목에 대한 포인터를 리턴해줍니다.
  • 여러 프로세스가 동시에 파일을 열 수 있는 환경에서는 운영체제는 프로세스 별 테이블, 범 시스템 테이블의 2단계 내부 테이블을 사용합니다.
    • 프로세스 별 테이블 : 각 프로세스가 연 모든 파일을 기록하고, 각 항목은 다시 범 시스템 열린 파일 테이블들을 가리킵니다.
    • 범 시스템 테이블 : 프로세스에 독립적인 정보(디스크 상의 파일 위치, 접근 날짜, 파일 크기)를 가집니다. 
  • 열린 파일이 가진 정보
    • 파일 포인터 : 읽기, 쓰기 시스템 콜의 일부분. 현재 파일 위치 포인터로, 가장 최근의 읽기/쓰기 위치를 추적해야 합니다. 포인터는 프로세스당 하나씩 만들어지므로 디스크상의 파일 속성과는 분리되어 유지되어야 합니다.
    • open count 
    • 파일의 위치
    • 접근 권한
  • locking : 하나의 프로세스가 파일을 잠그고 다른 프로세스가 접근하지 못하게 하는 것입니다. 
    • 공유 락(shared lock) : 여러 프로세스가 동시에 락을 획득할 수 있습니다. 읽기 락(reader lock)과 그런 점에서 비슷합니다.
    • 배타적인 락(exclusive lock) : 한 번에 한 프로세스만 락을 획득할 수 있습니다. 쓰기 락(write lock)과 그런 점에서 비슷합니다.
    • 강제적 락(mandatory lock) : 어떤 프로세스가 배타적 락을 획득하면 운영체제가 다른 프로세스가 접근하는 것을 막습니다.
    • 권고적 락(advisory lock) : 락을 획득하고 해제하는 것은 개발자의 몫이 됩니다.

<파일 유형>

운영체제가 파일 유형을 인식하고 지원하는 방법 중 가장 잘 알려진 방법은 파일 이름의 한 부분에 유형을 나타내도록 하는 것입니다.

(ex) .com, .exe, .sh와 같은 확장자


<파일 구조>

파일의 유형으로 내부 구조 형태를 짐작할 수 있고, 각각의 파일은 그 파일을 다루는 프로그램이 인식할 수 있는 내부 구조를 일정하게 가지고 있습니다. 운영체제가 여러 파일 구조를 지원할 경우 운영체제의 크기가 커지고 관리하기 힘들어진다는 단점이 있습니다. 그러나 운영체제에서 지원하지 않는 파일을 필요로 하는 응용 프로그램은 심각한 문제를 발생시키므로 모든 파일은 운영체제에서 지원하는 파일 유형 중 하나로만 정의되는 것이 필요합니다. 


<파일 접근 방법>

1) 순차 접근 : 가장 간단한 파일 접근 방법입니다. 저장되어 있는 레코드 순서로 접근하며, 파일에 대한 대부분의 연산이 읽기와 쓰기입니다. 

2) 직접 접근 : 파일은 고정 길이의 논리 레코드 집합으로 정의되고, 직접 접근 파일은 어떤 블록이라도 직접 접근할 수 있습니다. 대규모의 정보를 다루는 데 유용합니다.

직접 접근을 위해서는 파일 연산이 블록 번호 파라미터를 포함할 수 있도록 수정되어야 합니다. (ex) read(n), write(n)

* 상대 블록 번호 : 통상 파일의 시작은 0으로 보고 계산한 레코드의 위치입니다. (ex) 실제 디스크 주소가 14703, 3192인 블록이 각각 있어도 파일의 첫번째 상대 블록은 0이고, 그 다음은 1.

3) 색인(index) : 여러 부분에 대한 포인터를 제공하며, 찾고자 하는 레코드가 있으면 색인부터 찾아 그에 대응한느 포인터를 얻고, 그 포인터를 사용해 파일에 직접 접근합니다.

 

반응형