[TIL/크래프톤 정글] DAY 76

배재준·2025년 5월 24일

크래프톤 정글 - TIL

목록 보기
68/93
post-thumbnail

2025.05.24

TIL(TODAY I LEARN)


  • 오늘한 내용 : PintOS - Project2: UserProgram - System calls
    파일 디스크립터 이해 중
  • WEEK 11 : 정글 끝까지(PintOS) - UserProgram

파일 디스크립터(file descriptor)

1. struct file (파일 핸들)

  • 정의 위치: filesys/file.h
struct file 
  {
    struct inode *inode;   /* 실제 데이터·메타데이터를 담은 inode 구조체로의 포인터 */
    off_t pos;             /* 다음에 읽기/쓰기를 수행할 파일 오프셋(바이트 단위) */
    bool deny_write;       /* true면 다른 프로세스가 이 파일에 쓰지 못하도록 막음 */
  };
  1. inode 포인터
    • 디스크 상의 실제 파일 내용을 관리하는 inode 구조체(및 그 하위 디스크 포맷)를 가리킴.
    • 하나의 파일을 여러 프로세스가 열면, 각자 struct file을 갖되 같은 inode를 가리켜 공유.
  2. pos (파일 오프셋)
    • file_read() / file_write() 호출 시 현재 커서 위치를 나타냄.
    • 읽거나 쓸 때 이 위치에서 시작해 바이트 수만큼 진행되고, 호출 후 자동으로 증가.
  3. deny_write
    • 이 파일 핸들이 활성화된 동안 다른 프로세스나 핸들이 이 파일에 쓰지 못하게 막을지(true/false)를 나타냄.
    • 주로 실행 중인 실행 파일을 다른 프로세스가 덮어쓰지 못하게 할 때 사용.

2. struct inode (디스크-메타데이터)

  • 정의 위치: filesys/inode.h (및 filesys/inode-disk.h)
struct inode
  {
    struct list_elem elem;         /* 메모리상에 열린 모든 inode 리스트 연결자 */
    block_sector_t sector;         /* 디스크 상의 “디스크 inode”가 저장된 섹터 번호 */
    int open_cnt;                  /* 열린 핸들 수 */
    bool removed;                  /* unlink()로 삭제 요청된 상태인지 */
    int deny_write_cnt;            /* 쓰기 금지 요청 횟수 */
    struct inode_disk data;        /* 디스크에 저장될 실제 메타데이터 */
  };
  1. sector
    • inode가 디스크의 어느 블록(섹터)에 대응하는지를 기록.
  2. open_cnt
    • 현재 메모리상에 몇 개의 struct file 또는 struct inode 핸들이 이 파일을 열고 있는지 셈.
  3. removed
    • 파일이 remove()(unlink) 되었으나 아직 열린 핸들이 남아 있어 디스크에서는 삭제 대기 중인 상태를 나타냄.
    • 모든 핸들이 닫히면 실제로 디스크 블록을 해제.
  4. deny_write_cnt
    • deny_write 요청이 겹치는 정도를 세어, 0이 되어야 다시 쓰기가 허용.
  5. struct inode_disk data
    • 온디스크(디스크 블록)에 저장되는 파일 메타데이터 구조체.
    • 대표 필드:
      struct inode_disk
      {
      	block_sector_t start;      /* 파일 데이터가 시작되는 블록 번호 */
      	off_t length;              /* 파일 크기(바이트 단위) */
      	unsigned magic;            /* 무결성 검사용 매직 넘버 */
      	
      	일반적인 구조체
      	------------------------------------------------------------
      	block_sector_t indirect;   /* 간접 블록을 가리키는 블록 번호 */
      	block_sector_t double_indirect; /* 이중 간접 블록 번호 */
      	
      	pintos는 block_sector_t 없고 아래 패딩만 존재.
      	------------------------------------------------------------
      	uint32_t unused[125];               /* Not used. */
      };
    • Pintos Proejct 2 과제에서는 직접 블록 포인터(start) + (싱글)간접 블록 + 이중 간접 블록 방식을 통해 파일 크기와 블록 구조를 관리.

3. 계층 관계

┌────────────┐          ┌────────────┐        ┌────────────────────┐
│ user prog │  open    │ struct file│       │ struct inode     │
│           │ ──────▶ │ (pos,deny…)│  ───▶ │ (in‐memory state) │
└────────────┘          └────────────┘        └────────────────────┘
				                                          ▲ 
		                                                  │
		                                                  ▼
		                                         ┌─────────────────────┐
		                                         │ struct inode_disk │
		                                         │ (on‐disk metadata)│
		                                         └─────────────────────┘
  • file_*() 호출
    1. thread_current()->fd_table[fd]struct file *을 가져와
    2. file->inode에 접근해 실제 데이터 읽기/쓰기
    3. inode_disklength와 블록 포인터를 활용
  • 여러 핸들 공유
    • inode는 열리는 횟수만큼 open_cnt가 증가하고, close 시 감소.
    • 마지막 핸들이 닫힐 때 디스크 블록 해제(만약 removed == true라면)

요약

  • struct file
    • 프로세스별 열린 파일 핸들: 읽기/쓰기 위치(pos), 쓰기 금지(deny_write) 등의 런타임 상태를 보관.
  • struct inode
    • 파일의 공통 메타데이터(디스크 위치, 열림 카운트, 삭제 여부)를 관리.
  • struct inode_disk
    • 디스크에 저장되는 순수 메타데이터(크기, 블록 포인터)를 정의.

이 구조를 바탕으로, 각 프로세스는 openinode를 공유·추적하고, read/writeinode_disk의 블록 정보를 참조하며, close 시 리소스를 해제합니다. 이후 FD 구현을 통해 open/read/write/close 시스템 콜을 연결.

0개의 댓글