코드네임 :

⚙️ 운영체제 - 파일시스템과 파일 ⚙️ 본문

컴퓨터와 함께해요/운영체제

⚙️ 운영체제 - 파일시스템과 파일 ⚙️

비엔 Vien 2024. 11. 25. 20:31

[ 파일 ]

: 사용자 및 응용프로그램의 관점으로는 정보를 저장하고 관리하는 논리적 단위

: 컴퓨터 시스템 관점으로는 정보를 저장하는 컨테이너이며 0과 1의 데이터 덩어리, 바이트의 시퀀스

- 운영체제는 파일의 모든 과정을 제어하기에 반드시 필요!

 

[섹터, 트랙, 실린더, 블록]

섹터 : 플래터에 정보가 저장되는 최소 단위, 512바이트 혹은 4096바이트

트랙 : 플래터에 정보가 저장되는 하나의 동심원, 여러 개의 섹터들을 포함

실린더 : 같은 반지름을 가진 모든 트랙 집합 (ex 헤드가 8개인 디스크에서 8개의 트랙을 묶어 실린더라 부름)

블록 : 운영체제가 파일 데이터를 입출력하는 논리적 단위, 몇개의 섹터로 구성됨

 

 

[파일 입출력 주소]

응용프로그램 : 파일 내 바이트 주소 (offset)

  • 응용프로그램은 파일의 데이터를 **"파일 내 바이트 단위의 오프셋(offset)"**으로 접근합니다.
    • 예를 들어, 파일에서 100번째 바이트 데이터를 읽으려면, 파일의 시작 주소를 기준으로 100번째 위치의 데이터를 요청합니다.

운영체제 : 논리 블록 주소 (LBA) - 1차원의 연속된 데이터 블록, 모든블록은 0번 부터 시작하는 블록번호

  • 운영체제는 **LBA(Logical Block Address)**를 사용해 데이터를 관리합니다.
    • LBA란?
      디스크를 1차원의 연속된 데이터 블록 번호로 추상화한 주소 체계입니다.
      • 모든 데이터 블록은 0부터 시작하는 블록 번호로 관리됩니다.
      • 운영체제는 파일 데이터를 논리 블록 단위로 처리하며, 이를 통해 파일의 특정 위치를 디스크 블록에 매핑합니다.
    • 예를 들어, 파일 내의 100번째 바이트는 운영체제 입장에서 LBA 20번 블록의 일부일 수 있습니다.

디스크장치 : 디스크 물리 주소 - CHS(Cylinder-Head-Sector) 물리 주소, 디스크의 섹터 위치를 나타내는 주소

  • 디스크는 데이터를 물리적으로 **CHS(Cylinder-Head-Sector)**라는 방식으로 관리합니다.
    • CHS란? 디스크의 물리적인 구조를 기반으로 데이터를 위치시키는 주소 체계입니다. 디스크는 다음 세 가지 정보로 물리 주소를 정의합니다:
      1. Cylinder (실린더): 디스크 플래터에서 트랙(원형 경로)의 번호.
      2. Head (헤드): 읽기/쓰기 헤드의 번호(디스크 플래터의 각 면에 존재).
      3. Sector (섹터): 트랙을 나눈 작은 단위.
    • CHS 주소는 물리적으로 디스크의 어느 위치에 데이터가 저장되어 있는지를 나타냅니다.

 

 

 

 

 

[파일 시스템]

: 저장 매체에 파일을 생성하고 저장하고 읽고 쓰는 운영체제의 기능을 통칭

파일 시스템의 논리 구조 : 수십만 개의 파일들을 다루기 위한 계층 구조 (트리형)

저장소에 파일 시스템 구축 : 저장하는 방법과 위치 구성, 빈블록 유지 관리

    - 파일 시스템은 파일 데이터를 디스크와 같은 저장 장치에 저장하기 위해 물리적인 저장 방법 위치 정보를 관리합니다.

커널 내 파일 입출력 구현 : 파일을 읽고 쓰는 등의 기능

    - 파일 입출력(I/O) 작업은 응용 프로그램이 직접 디스크에 접근하지 않고, 운영체제 커널이 이를 처리합니다.

응용프로그램을 위한 파일 시스템 인터페이스 (시스템 콜)

 

 

 

1. 파일 작업 관련 주요 시스템 콜

(1) 파일 생성 및 열기

  • open()
    • 파일을 열거나 새 파일을 생성합니다.
    • 파일을 열 때, 운영체제는 파일의 메타데이터(위치, 크기 등)를 참조하고 파일 디스크립터(File Descriptor)를 반환합니다.
    • 예:
      c
      코드 복사
      int fd = open("file.txt", O_RDWR | O_CREAT, 0644);
      • "file.txt" 파일을 읽기/쓰기 모드로 열거나 없으면 생성합니다.
      • 0644: 파일 권한 (읽기/쓰기 설정).

(2) 파일 읽기 및 쓰기

  • read()
    • 파일에서 데이터를 읽습니다.
    • 반환값: 읽은 바이트 수.
    • 예:
      c
      코드 복사
      char buffer[100]; int bytes_read = read(fd, buffer, 100);
  • write()
    • 파일에 데이터를 씁니다.
    • 반환값: 기록된 바이트 수.
    • 예:
      c
      코드 복사
      const char *data = "Hello, World!"; int bytes_written = write(fd, data, strlen(data));

(3) 파일 위치 제어

  • lseek()
    • 파일 내의 읽기/쓰기 **오프셋(offset)**을 변경합니다.
    • 예:
      c
      코드 복사
      lseek(fd, 0, SEEK_SET); // 파일의 시작으로 이동 lseek(fd, 100, SEEK_CUR); // 현재 위치에서 100 바이트 앞으로 이동

(4) 파일 닫기

  • close()
    • 파일 디스크립터를 닫고, 운영체제에서 파일 관련 리소스를 해제합니다.
    • 예:
      c
      코드 복사
      close(fd);