🌌[Pintos] 4. FILE SYSTEM

μ΄κ°•μš±Β·2022λ…„ 12μ›” 19일
2

🌌 Pintos

λͺ©λ‘ 보기
5/6
post-thumbnail

λ§ˆμ§€λ§‰ ν”„λ‘œμ νŠΈκ°€ 끝났닀.
κ΅¬ν˜„ν•˜λ©΄μ„œ μ•Œκ²Œλœ λ‚΄μš©μ„ κ°„λ‹¨ν•˜κ²Œ 정리해 보렀고 ν•œλ‹€.

파일 μ‹œμŠ€ν…œμ€ 900개 ~ 1000κ°œκ°€ μ‘΄μž¬ν•  만큼 맀우 λ§Žλ‹€. FAT, NFTSλ‚˜ EXT4 같은 λŒ€ν‘œμ μΈ νŒŒμΌμ‹œμŠ€ν…œμ΄ μžˆμ§€λ§Œ, 이번 κΈ€μ—μ„œλŠ” μ’€ 더 일반적인 κ°œλ…μ„ 닀룬닀.

파일

  • I/O에 λŒ€ν•œ 좔상화.
  • μ½κ±°λ‚˜ μ“Έ 수 μžˆλŠ” 순차적인 λ°”μ΄νŠΈμ˜ λ°°μ—΄.
  • pathname (path + filename)으둜 식별될 수 μžˆλ‹€.
  • storage의 logical unit 이라고 λ³Ό μˆ˜λ„ μžˆλ‹€. OS λ‚΄μ˜ subsystem이 ν•΄λ‹Ή νŒŒμΌμ„ physical storage에 mapping ν•΄μ€€λ‹€. κ·Έ subsystem이 곧 νŒŒμΌμ‹œμŠ€ν…œ. 예λ₯Ό λ“€λ©΄, μœ μ €κ°€ νŒŒμΌμ— μ“°λ©΄ μš΄μ˜μ²΄μ œκ°€ storage에 써쀀닀.
  • 파일의 μœ ν˜•μ—λŠ” 일반 파일, 디렉터리, 심볼릭 링크 κ°€ μžˆλ‹€ (λŒ€ν‘œμ μœΌλ‘œ).
  • νŒŒμΌμ€ μœ μ € data (μ‹€μ œ data)에 ν•΄λ‹Ήν•˜κΈ° λ•Œλ¬Έμ—, κ·Έ dataλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ meta-dataκ°€ λ°˜λ“œμ‹œ ν•„μš”ν•˜λ‹€. μ΄λŠ” μ•„μ΄λ…Έλ“œ(inode)λΌλŠ” μžλ£Œκ΅¬μ‘°μ— μ €μž₯λœλ‹€.
  • μ•„μ΄λ…Έλ“œλŠ” νŒŒμΌλ§ˆλ‹€ κ³ μœ ν•˜κ²Œ κ°€μ§€λŠ” 메타데이터 μ €μž₯ μžλ£Œκ΅¬μ‘°μ΄λ‹€. μœ„μ˜ 3가지 μ’…λ₯˜μ˜ 파일 μ—­μ‹œ 각각 μžμ‹ μ˜ κ³ μœ ν•œ μ•„μ΄λ…Έλ“œλ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.

디렉터리

  • μƒμ‹μ μœΌλ‘œ μ•Œλ €μ Έ μžˆλ“―μ΄ 파일의 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 계측적인 ꡬ쑰이닀. κ°€μž₯ μ΅œμƒμœ„ 디렉터리인 root 디렉터리가 μ‘΄μž¬ν•œλ‹€.
  • "디렉터리도 λΈ”λ‘μœΌλ‘œ μ‘΄μž¬ν•œλ‹€."
  • 쑰금 더 ꡬ체적으둜 λ§ν•˜μžλ©΄, 디렉터리 μ•ˆμ—λŠ” 파일 λ˜λŠ” ν•˜μœ„ 디렉터리가 μ‘΄μž¬ν•  텐데, μ΄λŸ¬ν•œ 정보듀(directory entry λͺ©λ‘) λ˜ν•œ λΆ„λͺ… storage에 μ ν˜€μ•Ό ν•  것이닀. μ΄λŸ¬ν•œ 정보λ₯Ό storage에 μ €μž₯ν•˜κΈ° μœ„ν•΄, μ‹€μ œ data와(directory entry λͺ©λ‘) meta-data(μ•„μ΄λ…Έλ“œ)λ₯Ό 가진 파일처럼 디렉터리 λ˜ν•œ storage에 μ €μž₯ν•œλ‹€λŠ” 것이닀.
  • κ·Έλž˜μ„œ 디렉터리도 ν•˜λ‚˜μ˜ νŠΉμˆ˜ν•œ νŒŒμΌλ‘œμ„œ μ·¨κΈ‰λœλ‹€.
  • ν•˜λ‚˜μ˜ directory entryλŠ” ν•˜λ‚˜μ˜ <ν•­λͺ©μ˜ 이름, μ•„μ΄λ…Έλ“œ 번호> μŒμ΄λ‹€.
  • example.
    Root Directory
ν•­λͺ©μ˜ μ΄λ¦„μ•„μ΄λ…Έλ“œ 번호파일 μœ ν˜•(μ‹€μ œ μ €μž₯ x)
.2디렉터리
..2디렉터리
hello10일반 파일
hello210일반 파일 (ν•˜λ“œ 링크)
hello312심볼릭 링크 (hello3->hello)

ν•˜λ“œ 링크 vs 심볼릭 링크

  • νŒŒμΌμ„ 생성할 λ•Œ, 두 가지 μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.
    1. κ³ μœ ν•œ μ•„μ΄λ…Έλ“œλ₯Ό λ§Œλ“€κΈ°.
    2. μ•„μ΄λ…Έλ“œμ— μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 이름을 μ—°κ²°ν•˜κ³  <ν•­λͺ©μ˜ 이름(파일 이름), μ•„μ΄λ…Έλ“œ 번호>, κ·Έ μ—°κ²° 정보λ₯Ό 디렉터리에 μƒμ„±ν•˜κΈ°.
  • κ³ μœ ν•œ μ•„μ΄λ…Έλ“œλ₯Ό κ°€μ§€λŠ” ν•˜λ‚˜μ˜ νŒŒμΌμ— λŒ€ν•΄μ„œ,
    • ν•˜λ“œ λ§ν¬λŠ” 좔가적인 연결정보이닀. 즉, μœ„μ˜ 두 가지 μž‘μ—… 쀑 2번 μž‘μ—…λ§Œ μˆ˜ν–‰ν•˜λŠ” 것이닀.
      link()μ‹œμŠ€ν…œ 콜둜 생성할 수 μžˆλ‹€. μƒˆλ‘­κ²Œ λ§ν¬ν•˜λ €λŠ” 이름 ν•­λͺ©μ„ 디렉터리에 μƒμ„±ν•˜κ³ , μ›λž˜ 파일과 같은 μ•„μ΄λ…Έλ“œ 번호λ₯Ό 가리킀도둝 ν•œλ‹€.
    • 심볼릭 λ§ν¬λŠ” ν•΄λ‹Ή νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” μƒˆλ‘œμš΄ νŒŒμΌμ΄λ‹€. κ·Έλž˜μ„œ μœ„μ˜ 두 가지 μž‘μ—… λͺ¨λ‘κ°€ λ‹€μ‹œ μΌμ–΄λ‚œλ‹€.
      κ·Έ μƒˆλ‘œμš΄ 파일의 λ‚΄μš©μ—λŠ” μ›λž˜ 파일의 경둜λͺ…이 μ €μž₯λœλ‹€.
  • κ²°κ΅­ ν•˜λ“œ 링크, 심볼릭 λ§ν¬λŠ”, 같은 νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” μ—¬λŸ¬ 개의 μ„œλ‘œ λ‹€λ₯Έ, μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 이름을 λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
  • example.
    hello : original file
    hello2 : hard link to hello
    hello3 : symbolic link to hello

파일 μ‚­μ œ

  • 파일 μ‚­μ œλŠ” unlink 일 뿐이닀.
  • νŒŒμΌμ„ μ‚­μ œν•  λ•Œ μž…λ ₯ν•˜λŠ” λͺ…λ Ήμ–΄ rm은 λ‚΄λΆ€μ μœΌλ‘œ unlink() μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•œλ‹€.
  • μ•žμ„œ ν•˜λ“œ 링크λ₯Ό 생성할 λ•Œ ν˜ΈμΆœν–ˆλ˜ link()λŠ” μ›λž˜ 파일의 μ•„μ΄λ…Έλ“œμ˜ μ°Έμ‘° 횟수(reference count or link count)λ₯Ό μ¦κ°€μ‹œν‚¨λ‹€. 심볼릭 링크의 linkλŠ” μ°Έμ‘° νšŸμˆ˜μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  • unlink()κ°€ 호좜되면 이름과 ν•΄λ‹Ή μ•„μ΄λ…Έλ“œ 번호 κ°„μ˜ "μ—°κ²°" 을 끊고(ν•΄λ‹Ή directory entryλ₯Ό μ œκ±°ν•¨) μ°Έμ‘° 횟수λ₯Ό ν•˜λ‚˜ 쀄인닀.
  • μ—¬κΈ° μ €κΈ°μ„œ ν•΄λ‹Ή 파일과 κ΄€λ ¨ν•œ unlink()κ°€ ν˜ΈμΆœλ˜μ–΄, κ²°κ΅­ μ°Έμ‘° 횟수λ₯Ό 0으둜 λ§Œλ“œλŠ” unlink() 호좜이 λ°œμƒν•˜λŠ” κ·Έ μˆœκ°„μ—, 파일 μ‹œμŠ€ν…œμ€ κ·Έμ œμ„œμ•Ό λΉ„λ‘œμ†Œ μ•„μ΄λ…Έλ“œμ™€ κ΄€λ ¨λœ 데이터 λΈ”λŸ­μ„ ν•΄μ œν•˜λ©΄μ„œ μ§„μ •μœΌλ‘œ νŒŒμΌμ„ "μ‚­μ œ" ν•œλ‹€.
  • κ²°κ΅­ 파일의 κ³ μœ ν•œ 정체성은 μ•„μ΄λ…Έλ“œκ°€ 가지고 μžˆλŠ” κ²ƒμœΌλ‘œ μ΄ν•΄ν•˜λ©΄ λœλ‹€.

fsync ( )

  • μ•žμ„œ λ§ν–ˆλ“―, μœ μ €κ°€ νŒŒμΌμ— μ“°λ©΄ μš΄μ˜μ²΄μ œκ°€ storage에 써쀀닀. λ‹€λ₯Έ 말둜, 'μœ μ €λŠ” ν•΄λ‹Ή 데이터λ₯Ό κ°€κΉŒμš΄ λ―Έλž˜μ— μ˜μ† μ €μž₯ μž₯μΉ˜μ— 기둝해 달라고 파일 μ‹œμŠ€ν…œμ—κ²Œ μš”μ²­ν•œλ‹€'.
  • ν•˜μ§€λ§Œ μ„±λŠ₯μƒμ˜ 이유둜 파일 μ‹œμŠ€ν…œμ€ μ“°κΈ°λ₯Ό 일정 μ‹œμž‘λ™μ•ˆ λ©”λͺ¨λ¦¬μ— λͺ¨μ€λ‹€ : 버퍼링. 즉 write() μ‹œμŠ€ν…œ 콜의 정상적인 return이, disk에 μ“°κΈ°κ°€ μ™„λ£Œλ˜μ—ˆμŒμ„ μ˜λ―Έν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.
  • μ—¬κΈ°μ„œ persistence(μ˜μ†μ„±) κ³Ό performance μ‚¬μ΄μ˜ λ”œλ ˆλ§ˆκ°€ λ°œμƒν•œλ‹€. 버퍼링을 μ‚¬μš©ν•˜λ‹€ 보면 μ„±λŠ₯은 κ°œμ„ λ  수 μžˆμœΌλ‚˜, crash consistency λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. λ²„νΌμ—λ§Œ 데이터가 적히고 disk에 commit λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μ˜ˆμƒμΉ˜ λͺ»ν•œ crushκ°€ λ°œμƒν•˜μ—¬ 데이터가 μœ μ‹€λ  수 μžˆλŠ” 것이닀.
  • λ”°λΌμ„œ μ‘μš©ν”„λ‘œκ·Έλž¨μ΄ λͺ…μ‹œμ μœΌλ‘œ μžμ‹ μ˜ write() μš”μ²­λ“€μ„ disk에 commit(flush) ν•  수 μžˆλŠ” APIκ°€ μ œκ³΅λœλ‹€ : fsync()
  • ν”„λ‘œμ„ΈμŠ€κ°€ νŠΉμ • 파일 λ””μŠ€ν¬λ¦½ν„°μ— λŒ€ν•΄ fsync()λ₯Ό ν˜ΈμΆœν•˜λ©΄ 파일 μ‹œμŠ€ν…œμ€ μ§€μ •λœ 파일의 λͺ¨λ“  dirty 데이터 (κ°±μ‹ λœ 데이터) 듀을 disk에 κ°•μ œλ‘œ 내렀보낸닀. 이 λͺ¨λ“  μ“°κΈ°κ°€ 처리된 후에 fsync()κ°€ μ •μƒμ μœΌλ‘œ return λœλ‹€.
  • μ–΄λ–€ κ²½μš°μ—λŠ” 파일 fooκ°€ μ‘΄μž¬ν•˜λŠ” 디렉터리도 fsync() ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 디렉터리도 파일의 ν˜•νƒœλ‘œ disk에 μ €μž₯되기 λ•Œλ¬Έμ΄λ‹€.

참고자료

  • Operating System : Three Easy Pieces
  • κΆŒμ˜μ§„ κ΅μˆ˜λ‹˜ κ°•μ˜ 자료
  • linux man page
profile
I think I think too much.

2개의 λŒ“κΈ€

comment-user-thumbnail
2022λ…„ 12μ›” 20일

μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€~🀣

1개의 λ‹΅κΈ€