9 min read

OSTEP 40 File System Implementation

Table of Contents

이번 μž₯μ—μ„œλŠ” vsfs(Very Simple File System)라고 ν•˜λŠ” κ°„λ‹¨ν•œ 파일 μ‹œμŠ€ν…œμ— λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 이 파일 μ‹œμŠ€ν…œμ€ UNIX 파일 μ‹œμŠ€ν…œμ„ λ‹¨μˆœν™”ν•œ κ²ƒμœΌλ‘œ λ””μŠ€ν¬ 자료 ꡬ쑰와 μ ‘κ·Ό 방법, 그리고 λ‹€μ–‘ν•œ 파일 μ‹œμŠ€ν…œλ“€μ˜ 정책을 μ†Œκ°œν•˜κΈ° μœ„ν•΄ μ œμž‘λ˜μ—ˆλ‹€.

1. μƒκ°ν•˜λŠ” 방법

파일 μ‹œμŠ€ν…œμ— λŒ€ν•΄ ν•™μŠ΅ν•  λ•Œ 이런 λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜λ©΄ 도움이 λœλ‹€.

첫 λ²ˆμ§ΈλŠ” 파일 μ‹œμŠ€ν…œμ˜ 자료 ꡬ쑰이닀. 파일 μ‹œμŠ€ν…œμ΄ μžμ‹ μ˜ 데이터와 메타데이터λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ 자료 ꡬ쑰λ₯Ό μ‚¬μš©ν• κΉŒ? vsfs같은 파일 μ‹œμŠ€ν…œμ€ λΈ”λŸ­κ³Ό λ‹€λ₯Έ 객체듀을 λ°°μ—΄κ³Ό 같은 κ°„λ‹¨ν•œ 자료 ꡬ쑰둜 ν‘œν˜„ν–ˆμ§€λ§Œ XFS와 같은 파일 μ‹œμŠ€ν…œλ“€μ€ μ’€ 더 λ³΅μž‘ν•œ 트리 기반의 자료 ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€.

두 λ²ˆμ§ΈλŠ” μ ‘κ·Ό 방법이닀. ν”„λ‘œμ„ΈμŠ€κ°€ ν˜ΈμΆœν•˜λŠ” open(), read(), write() λ“±μ˜ λͺ…령듀은 파일 μ‹œμŠ€ν…œμ˜ 자료 ꡬ쑰와 μ–΄λ–€ 관련이 μžˆμ„κΉŒ? νŠΉμ • μ‹œμŠ€ν…œ μ½œμ„ μ‹€ν–‰ν•  λ•Œ μ–΄λ–€ 자료 ꡬ쑰듀이 읽힐까? μ–΄λ–€ 것듀이 μ“°μΌκΉŒ?

자료 ꡬ쑰와 μ ‘κ·Ό 방법에 λŒ€ν•΄ μ΄ν•΄ν•˜λ©΄ 파일 μ‹œμŠ€ν…œμ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€μ— λŒ€ν•œ κ°œλ…μ„ 잘 정립할 수 μžˆλ‹€.

2. 전체 ꡬ성

κ°€μž₯ λ¨Όμ € ν•΄μ•Ό ν•  것은 λ””μŠ€ν¬λ₯Ό λΈ”λŸ­(block) λ‹¨μœ„λ‘œ λ‚˜λˆ„λŠ” 것이닀. 단일 λΈ”λŸ­ 크기만 μ‚¬μš©ν•˜κ³ , 4KB둜 μ •ν•˜μž. N개의 4KB λΈ”λŸ­ 크기λ₯Ό κ°€μ§€λŠ” νŒŒν‹°μ…˜μ—μ„œ, λΈ”λŸ­μ€ 0λΆ€ν„° N-1κΉŒμ§€ μ£Όμ†Œλ₯Ό κ°€μ§€κ³  μžˆλ‹€. λΈ”λŸ­μ΄ 64개 μžˆλŠ” μž‘μ€ λ””μŠ€ν¬λ₯Ό μƒκ°ν•΄λ³΄μž.

이 λΈ”λŸ­μ— 무엇이 λ“€μ–΄κ°€μ•Ό ν• κΉŒ? κ°€μž₯ λ¨Όμ € λ– μ˜€λ₯΄λŠ” 것은 μ‚¬μš©μžμ˜ 데이터이닀. λŒ€λΆ€λΆ„μ˜ 곡간이 μ‚¬μš©μžμ˜ λ°μ΄ν„°λ‘œ μ±„μ›Œμ Έ μžˆλ‹€. 이λ₯Ό 데이터 μ˜μ—­ (data region) 이라고 ν•˜μž.

OSTEP 40 File System Implementation-1698691347509.jpeg

파일 μ‹œμŠ€ν…œμ€ 각 νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό κ΄€λ¦¬ν•œλ‹€. κ·Έ 정보가 λ©”νƒ€λ°μ΄ν„°μ˜ 핡심이닀. νŒŒμΌμ„ κ΅¬μ„±ν•˜λŠ” 데이터 λΈ”λŸ­λ“€, κ·Έ 파일의 크기, μ†Œμœ μž, μ ‘κ·Ό κΆŒν•œ, μ ‘κ·Όκ³Ό λ³€κ²½ μ‹œκ°„ λ“±κ³Ό 같은 정보가 메타데이터이닀. 파일 μ‹œμŠ€ν…œμ€ μ΄λŸ¬ν•œ 정보λ₯Ό μ•„μ΄λ…Έλ“œ(inode) 라고 λΆ€λ₯΄λŠ” 자료 ꡬ쑰에 μ €μž₯ν•œλ‹€.

이 μ•„μ΄λ…Έλ“œλ“€μ€ μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ— μ €μž₯λœλ‹€. μ•„μ΄λ…Έλ“œλ‹Ή 256bytesλ₯Ό κ°€μ •ν•˜λ©΄ 4KB λΈ”λŸ­ ν•˜λ‚˜μ— 16개의 μ•„μ΄λ…Έλ“œλ₯Ό μ €μž₯ν•  수 μžˆλ‹€. 우리 λ””μŠ€ν¬ νŒŒν‹°μ…˜μ—λŠ” 80개의 μ•„μ΄λ…Έλ“œλ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

OSTEP 40 File System Implementation-1698691362740.jpeg

아직 더 ν•„μš”ν•œ 정보가 남아 μžˆλ‹€. μ•„μ΄λ…Έλ“œλ‚˜ 데이터 λΈ”λŸ­μ˜ μ‚¬μš© 여뢀에 κ΄€ν•œ 정보이닀. ν• λ‹Ή ꡬ쑰(allocation structure) κ°€ ν•„μš”ν•˜λ‹€.

λΈ”λŸ­μ΄ μ‚¬μš© 쀑인지 μ•„λ‹Œμ§€λ₯Ό ν‘œν˜„ν•˜λŠ” λ°μ—λŠ” λ‹€μ–‘ν•œ 방법이 μžˆλ‹€. free listλ₯Ό μ‚¬μš©ν•΄μ„œ, μ‚¬μš© 쀑이 μ•„λ‹Œ λΈ”λŸ­λ“€μ„ μ—°κ²° 리슀트둜 κ΄€λ¦¬ν•˜λŠ” 방법도 μžˆλ‹€. μ•„μ΄λ…Έλ“œλŠ” 첫 번째 프리 λΈ”λŸ­μ˜ μœ„μΉ˜λ§Œ κΈ°μ–΅ν•˜λ©΄ λœλ‹€. μš°λ¦¬λŠ” λ‹¨μˆœν•œ λΉ„νŠΈλ§΅μ„ μ‚¬μš©ν•œλ‹€. 데이터 λΉ„νŠΈλ§΅μœΌλ‘œ 데이터 μ˜μ—­μ΄ μ‚¬μš© 쀑인지, μ•„μ΄λ…Έλ“œ λΉ„νŠΈλ§΅μœΌλ‘œ μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ— μžˆλŠ” μ•„μ΄λ…Έλ“œλ“€μ΄ μ‚¬μš© 쀑인지λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λΉ„νŠΈλ§΅μ€ λΉ„νŠΈλ“€μ˜ 배열이닀. 각 λΉ„νŠΈλŠ” ν•΄λ‹Ή λΈ”λŸ­μ΄λ‚˜ 객체가 μ‚¬μš© 쀑인지(in-use: 1) μ‚¬μš© 쀑이 μ•„λ‹Œμ§€(free: 0)λ‚˜νƒ€λ‚Έλ‹€.

OSTEP 40 File System Implementation-1698692494348.jpeg

남은 ν•œ λΈ”λŸ­μ€ μŠˆνΌλΈ”λŸ­(superblock) 을 μœ„ν•œ 곡간이닀 (S둜 λ‚˜νƒ€λƒ„). μŠˆνΌλΈ”λŸ­μ€ 이 파일 μ‹œμŠ€ν…œ 전체에 λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 파일 μ‹œμŠ€ν…œμ— λͺ‡ 개의 μ•„μ΄λ…Έλ“œμ™€ 데이터 λΈ”λŸ­μ΄ μžˆλŠ”μ§€, μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ€ μ–΄λ””μ„œ μ‹œμž‘ν•˜λŠ”μ§€μ™€ 같은 정보λ₯Ό κ°€μ§€κ³  μžˆλ‹€. 파일 μ‹œμŠ€ν…œμ„ 식별할 수 μžˆλŠ” 맀직 λ„˜λ²„λ„ κ°€μ§€κ³  μžˆλ‹€. 파일 μ‹œμŠ€ν…œμ΄ κΉ¨μ§„λ‹€λŠ” 것은, μŠˆνΌλΈ”λŸ­μ΄ μ €μž₯된 λ””μŠ€ν¬ λΈ”λŸ­μ΄ ν›Όμ†λ˜λŠ” 것이닀. 일반적으둜 파일 μ‹œμŠ€ν…œμ€ μŠˆνΌλΈ”λŸ­μ„ λͺ‡ 개 볡사해둔닀.

OSTEP 40 File System Implementation-1698692641707.jpeg

μš΄μ˜μ²΄μ œκ°€ μš°μ„  μŠˆνΌλΈ”λŸ­μ„ μ½μ–΄λ“€μ—¬μ„œ 파일 μ‹œμŠ€ν…œμ˜ μ—¬λŸ¬ μš”μ†Œλ“€μ„ μ΄ˆκΈ°ν™”ν•˜κ³ , κ·Έ ν›„ 각 νŒŒν‹°μ…˜μ„ 파일 μ‹œμŠ€ν…œ νŠΈλ¦¬μ— λΆ™μ΄λŠ” μž‘μ—…μ„ 톡해 파일 μ‹œμŠ€ν…œμ„ λ§ˆμš΄νŠΈν•œλ‹€.

3. 파일 ꡬ성: μ•„μ΄λ…Έλ“œ

파일 μ‹œμŠ€ν…œμ˜ 자료 ꡬ쑰 쀑 κ°€μž₯ μ€‘μš”ν•œ 것은 μ•„μ΄λ…Έλ“œμ΄λ‹€. index node의 μ€„μž„λ§μ΄λ‹€.

각 μ•„μ΄λ…Έλ“œλŠ” 숫자 inumber둜 ν‘œν˜„λœλ‹€. vsfsμ—μ„œλŠ” μ•„μ΄λ„˜λ²„λ₯Ό 톡해 ν•΄λ‹Ή μ•„μ΄λ…Έλ“œκ°€ λ””μŠ€ν¬ 어디에 μžˆλŠ”μ§€λ₯Ό μ§μ ‘μ μœΌλ‘œ 계산할 수 μžˆλ‹€. μœ„μ—μ„œ μ‚¬μš©ν•œ μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”λ‘œ κ³„μ‚°ν•΄λ³΄μž. μ•„μ΄λ…Έλ“œ μ˜μ—­μ€ 크기가 20KB이고 80개의 μ•„μ΄λ…Έλ“œ(각 256bytes)둜 이루어져 μžˆλ‹€. μ•„μ΄λ…Έλ“œ μ˜μ—­μ€ 12KB μœ„μΉ˜λΆ€ν„° μ‹œμž‘ν•œλ‹€.

OSTEP 40 File System Implementation-1698692990523.jpeg

32번 μ•„μ΄λ…Έλ“œλ₯Ό 읽기 μœ„ν•΄ 파일 μ‹œμŠ€ν…œμ€ μ•„μ΄λ…Έλ“œ μ˜μ—­μ—μ„œμ˜ μ˜€ν”„μ…‹μ„ κ³„μ‚°ν•œλ‹€. κ·Έν›„ μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ˜ μ‹œμž‘ μœ„μΉ˜λ₯Ό λ”ν•˜λ©΄ μ›ν•˜λŠ” μ•„μ΄λ…Έλ“œ λΈ”λŸ­μ˜ μ •ν™•ν•œ λ°”μ΄νŠΈ μ£Όμ†Œλ₯Ό 계산할 수 μžˆλ‹€.

λ””μŠ€ν¬λŠ” λ°”μ΄νŠΈ λ‹¨μœ„λ‘œλŠ” 접근이 λΆˆκ°€λŠ₯ν•˜λ©°, λŒ€μ‹ μ— 512λ°”μ΄νŠΈ 크기λ₯Ό κ°–λŠ” μ„Ήν„°λ‘œ μ΄λ£¨μ–΄μ‘Œλ‹€. 32번 μ•„μ΄λ…Έλ“œκ°€ μ‘΄μž¬ν•˜λŠ” λΈ”λŸ­μ„ κ°€μ Έμ˜€κΈ° μœ„ν•΄ 파일 μ‹œμŠ€ν…œμ€ μ„Ήν„° μ£Όμ†Œλ₯Ό κ³„μ‚°ν•˜μ—¬ 읽기 μš”μ²­μ„ ν•œ ν›„ ν•΄λ‹Ή μ•„μ΄λ…Έλ“œ λΈ”λŸ­μ„ κ°€μ Έμ˜¨λ‹€.

blk = (inumber * sizeof(inode_t)) / blockSize;
sector = ((blk * blockSize) + inodeStartAddr) / sectorSize;

μ•„μ΄λ…Έλ“œμ—λŠ” νŒŒμΌμ— λŒ€ν•œ 정보가 λ‹€ λ“€μ–΄μžˆλ‹€. 파일의 μ’…λ₯˜, 크기, ν• λ‹Ήλœ λΈ”λŸ­ 수, 보호 정보, μ‹œκ°„ 정보와 λ”λΆˆμ–΄ 데이터 λΈ”λŸ­μ΄ λ””μŠ€ν¬ 어디에 μ‘΄μž¬ν•˜λŠ”μ§€(ν¬μΈν„°μ˜ 일쒅) λ“±κ³Ό 같은 정보듀이 담겨 μžˆλ‹€.

OSTEP 40 File System Implementation-1698720772308.jpeg

μ•„μ΄λ…Έλ“œ μ„€κ³„μ‹œ κ°€μž₯ μ€‘μš”ν•œ λΆ€λΆ„ 쀑 ν•˜λ‚˜λŠ” 데이터 λΈ”λŸ­μ˜ μœ„μΉ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 방법이닀. κ°„λ‹¨ν•œ 방법은 μ•„μ΄λ…Έλ“œ 내에 μ—¬λŸ¬ 개의 직접 포인터λ₯Ό λ‘λŠ” 것이닀. 각 ν¬μΈν„°λŠ” 파일의 λ””μŠ€ν¬ λΈ”λŸ­ ν•˜λ‚˜λ₯Ό 가리킨닀. 이 λ°©λ²•μ—λŠ” 파일 크기의 μ œν•œμ΄ μžˆλ‹€. 파일 크기가 ν¬μΈν„°μ˜ 개수 Γ—\times λΈ”λŸ­ 크기둜 μ œν•œλœλ‹€.

λ©€ν‹° 레벨 인덱슀

파일 크기 μ œν•œμœΌλ‘œ 인해, 파일 μ‹œμŠ€ν…œ κ°œλ°œμžλ“€μ€ μ•„μ΄λ…Έλ“œ 내에 λ‹€λ₯Έ 자료 ꡬ쑰λ₯Ό μΆ”κ°€ν–ˆλ‹€. μΌλ°˜μ μœΌλ‘œλŠ” κ°„μ ‘ 포인터λ₯Ό μ‚¬μš©ν•œλ‹€. κ°„μ ‘ ν¬μΈν„°λŠ” 데이터 λΈ”λŸ­μ„ 가리킀지 μ•Šκ³ , 데이터 λΈ”λŸ­μ„ κ°€λ¦¬ν‚€λŠ” 포인터듀이 μ €μž₯된 λΈ”λŸ­μ„ 가리킨닀.

λΈ”λŸ­μ΄ 4KB이고 λ””μŠ€ν¬ μ£Όμ†Œκ°€ 4λ°”μ΄νŠΈλΌκ³  ν•˜λ©΄ 1024개의 포인터듀을 μΆ”κ°€ν•  수 있게 λœλ‹€. μ΅œλŒ€ 파일 ν¬κΈ°λŠ” (12+1024)Γ—4(12 + 1024) \times 4KB κ°€ λœλ‹€. μ—¬κΈ°μ„œ 12λŠ” μ •ν•΄μ§„ 수의 직접 포인터이닀.

μ € μ‚¬μ΄μ¦ˆκ°€ λͺ¨μžλΌλ©΄ 이쀑, 삼쀑 κ°„μ ‘ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” 만큼 큰 νŒŒμΌμ„ ν‘œν˜„ν•  수 μžˆλ‹€.

μ΄μ œκΉŒμ§€ μ„€λͺ…ν•œ 것을 μ’…ν•©ν•˜λ©΄, λ””μŠ€ν¬ λΈ”λŸ­λ“€μ€ 트리 ν˜•νƒœλ‘œ κ΅¬μ„±λ˜μ–΄ ν•˜λ‚˜μ˜ νŒŒμΌμ„ 이룬닀. μ΄λŸ¬ν•œ ꡬ성 방식을 λ©€ν‹° 레벨 인덱슀 기법이라 ν•œλ‹€.

이 λ•Œ 트리의 ν˜•νƒœλŠ” 편ν–₯된 νŠΈλ¦¬μ΄λ‹€. 파일의 μ‹œμž‘ 뢀뢄을 μ΄λ£¨λŠ” λΈ”λŸ­λ“€μ€ ν•œ 번의 ν¬μΈν„°λ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜μ§€λ§Œ, 파일의 끝뢀뢄에 μžˆλŠ” λΈ”λŸ­λ“€μ€ 포인터λ₯Ό μ„Έ 번 따라가야 μ‹€μ œ λΈ”λŸ­μ„ 읽을 수 μžˆλ‹€. μ΄λ ‡κ²Œ μ„€κ³„λœ μ΄μœ λŠ” λŒ€λΆ€λΆ„μ˜ 파일의 ν¬κΈ°λŠ” μž‘λ‹€ λΌλŠ” 사싀에 κΈ°μΈν•œ 것이닀.

4. 디렉터리 ꡬ쑰

vsfs의 λ””λ ‰ν„°λ¦¬λŠ” κ°„λ‹¨ν•œλ‹€. λ””λ ‰ν„°λ¦¬λŠ” (ν•­λͺ©μ˜ 이름, μ•„μ΄λ…Έλ“œ 번호) 쌍의 λ°°μ—΄λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. λ””λ ‰ν„°λ¦¬μ˜ 데이터 λΈ”λŸ­μ—λŠ” λ¬Έμžμ—΄κ³Ό μˆ«μžκ°€ 쌍으둜 μ‘΄μž¬ν•˜λ©° λ¬Έμžμ—΄ 길이에 λŒ€ν•œ 정보도 μžˆλ‹€.

dirμ΄λΌλŠ” 디렉터리 μ•ˆμ— foo, bar, foobar λΌλŠ” 3개의 파일이 있고 각각의 μ•„μ΄λ…Έλ“œ λ²ˆν˜Έκ°€ 12, 13, 24라고 ν•˜μž. dir의 데이터 λΈ”λŸ­μ€ μ•„λž˜μ™€ 같은 λ‚΄μš©μ„ κ°€μ§€κ³  μžˆμ„ 것이닀.

OSTEP 40 File System Implementation-1698694041519.jpeg

μ•„μ΄λ…Έλ“œ 번호, λ ˆμ½”λ“œ 길이(이름에 μ‚¬μš©λœ 총 λ°”μ΄νŠΈ + 남은 곡간), 이름 길이, ν•­λͺ©μ˜ μ΄λ¦„μœΌλ‘œ 이루어져 μžˆλ‹€.

.은 ν˜„μž¬ 디렉터리, ..은 λΆ€λͺ¨ 디렉터리λ₯Ό 가리킨닀.

unlink() λ“±μ˜ 호좜둜 파일이 μ‚­μ œλ˜λ©΄ 디렉터리 쀑간에 빈 곡간이 λ°œμƒν•œλ‹€. μ˜μ—­μ΄ λΉ„μ—ˆλ‹€λŠ” 것을 ν‘œμ‹œν•  방법이 ν•„μš”ν•˜λ‹€(ex: μ•„μ΄λ…Έλ“œ 번호 0은 λΉ„μ—ˆλ‹€λŠ” 뜻). ν•­λͺ©μ˜ 길이λ₯Ό λͺ…μ‹œν•˜λŠ” 이유 쀑 ν•˜λ‚˜κ°€ 쀑간에 빈 곡간이 생기기 λ•Œλ¬Έμ΄λ‹€. μƒˆλ‘œμš΄ 디렉터리 ν•­λͺ©μ„ 생성할 λ•Œ 빈 곡간에 μœ„μΉ˜μ‹œν‚¬ 수 μžˆλ‹€.

λ””λ ‰ν„°λ¦¬λŠ” λŒ€μ²΄ 어디에 μ €μž₯λ˜λŠ” 걸까? λŒ€λΆ€λΆ„ 파일 μ‹œμŠ€ν…œμ—μ„œ λ””λ ‰ν„°λ¦¬λŠ” νŠΉμˆ˜ν•œ μ’…λ₯˜μ˜ 파일둜 κ°„μ£Όν•œλ‹€. λ””λ ‰ν„°λ¦¬λŠ” μžμ‹ μ˜ μ•„μ΄λ…Έλ“œλ₯Ό κ°€μ§€λ©°, μ•„ μ•„μ΄λ…Έλ“œλŠ” μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ— μ‘΄μž¬ν•œλ‹€. λ””λ ‰ν„°λ¦¬λŠ” μžμ‹ μ˜ 데이터 λΈ”λŸ­μ„ κ°€μ§€κ³  있으며 이듀 λΈ”λŸ­μ˜ μœ„μΉ˜λŠ” 일반 파일과 λ§ˆμ°¬κ°€μ§€λ‘œ μ•„μ΄λ…Έλ“œμ— λͺ…μ‹œλ˜μ–΄ μžˆλ‹€.

5. 빈 κ³΅κ°„μ˜ 관리

vsfsμ—μ„œλŠ” 두 개의 λΉ„νŠΈλ§΅μ„ μ‚¬μš©ν•΄μ„œ 빈 곡간을 κ΄€λ¦¬ν•œλ‹€.

파일 생성 μ‹œ μ•„μ΄λ…Έλ“œλ₯Ό ν• λ‹Ήν•΄μ•Ό ν•œλ‹€. μ•„μ΄λ…Έλ“œ λΉ„νŠΈλ§΅μ„ νƒμƒ‰ν•˜μ—¬ λΉ„μ–΄ μžˆλŠ” μ•„μ΄λ…Έλ“œλ₯Ό μ°Ύμ•„ νŒŒμΌμ— ν• λ‹Ήν•œλ‹€. 파일 μ‹œμŠ€ν…œμ€ ν•΄λ‹Ή μ•„μ΄λ…Έλ“œλ₯Ό μ‚¬μš© 쀑 (1) 둜 ν‘œκΈ°ν•˜κ³  λ””μŠ€ν¬ λΉ„νŠΈλ§΅λ„ 적절히 κ°±μ‹ ν•œλ‹€. 데이터 λΈ”λŸ­μ„ ν• λ‹Ήν•  λ•Œλ„ 이와 λΉ„μŠ·ν•˜λ‹€.

데이터 λΈ”λŸ­μ„ ν• λ‹Ήν•  λ•Œλ„ κ³ λ €ν•  사항이 μžˆλ‹€. 데이터 λΈ”λŸ­ ν• λ‹Ή μ‹œ κ°€λŠ₯ν•˜λ‹€λ©΄ μ—¬λŸ¬ 개의 λΈ”λŸ­λ“€μ΄ μ—°μ†μ μœΌλ‘œ λΉ„μ–΄ μžˆλŠ” 곡간을 ν• λ‹Ήν•œλ‹€. 이λ₯Ό 톡해 ν•΄λ‹Ή 파일의 μž…μΆœλ ₯ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆλ‹€. 이λ₯Ό μ„ ν• λ‹Ή(pre-allocation) 정책이라 ν•œλ‹€.

6. μ‹€ν–‰ 흐름: 읽기와 μ“°κΈ°

파일 μ‹œμŠ€ν…œμ€ λ§ˆμš΄νŠΈλ˜μ—ˆκ³  μŠˆνΌλΈ”λŸ­μ€ λ©”λͺ¨λ¦¬ 상에 μœ„μΉ˜ν•œλ‹€κ³  κ°€μ •ν•˜μž. λ‹€λ₯Έ λͺ¨λ“  것 (μ•„μ΄λ…Έλ“œ, 디렉터리)듀은 λ””μŠ€ν¬μ— μ‘΄μž¬ν•œλ‹€. λ©”λͺ¨λ¦¬μ—λŠ” 아직 νƒ‘μž¬λ˜μ§€ μ•Šμ•˜λ‹€.

λ””μŠ€ν¬μ—μ„œ 파일 읽기

open("/foo/bar", O_RDONLY) μ‹œμŠ€ν…œ μ½œμ„ ν•˜λ©΄ 파일 μ‹œμŠ€ν…œμ€ λ¨Όμ € 파일 bar에 λŒ€ν•œ μ•„μ΄λ…Έλ“œλ₯Ό μ°Ύμ•„μ„œ νŒŒμΌμ— λŒ€ν•œ 기본적인 정보λ₯Ό νšλ“ν•΄μ•Ό ν•œλ‹€. 전체 경둜λͺ…을 κ°€μ§€κ³  있기 λ•Œλ¬Έμ— 파일 μ‹œμŠ€ν…œμ€ 경둜λ₯Ό 따라 μ›ν•˜λŠ” μ•„μ΄λ…Έλ“œλ₯Ό μ°ΎλŠ”λ‹€.

경둜λͺ…을 λ”°λΌκ°€λŠ” 것은 항상 파일 μ‹œμŠ€ν…œμ˜ λ£¨νŠΈμ—μ„œ μ‹œμž‘ν•œλ‹€. /둜 ν‘œκΈ°λœλ‹€.

루트 λ””λ ‰ν„°λ¦¬μ˜ μ•„μ΄λ…Έλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€. 루트 λ””λ ‰ν„°λ¦¬μ˜ μ•„μ΄λ…Έλ“œ λ²ˆν˜ΈλŠ” 보톡 2둜 μ •μ˜λ˜μ–΄ μžˆλ‹€. 파일 μ‹œμŠ€ν…œμ€ μ•„μ΄λ„˜λ²„ 2κ°€ ν¬ν•¨λœ λΈ”λŸ­μ„ μ½λŠ”λ‹€.

파일 μ‹œμŠ€ν…œμ€ 읽어듀인 μ•„μ΄λ…Έλ“œμ—μ„œ 데이터 λΈ”λŸ­μ˜ 포인터λ₯Ό μΆ”μΆœν•œλ‹€. 이 포인터듀을 μ‚¬μš©ν•˜μ—¬ 디렉터리 정보λ₯Ό 읽고, foo λΌλŠ” ν•­λͺ©μ„ μ°ΎλŠ”λ‹€. 디렉터리에 λ§Žμ€ ν•­λͺ©μ΄ λ“€μ–΄μžˆμœΌλ©΄ μ—¬λŸ¬ 개의 데이터 λΈ”λŸ­μ΄ ν•„μš”ν•  수 μžˆλ‹€. 이듀을 λͺ¨λ‘ μ½μ–΄μ„œ fooλ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.

foo 파일의 디렉터리 ν•­λͺ©μ„ μ°Ύμ•„μ„œ, foo의 μ•„μ΄λ…Έλ“œ 번호λ₯Ό νŒŒμ•…ν•œλ‹€. 44번이라고 ν•˜μž. 이λ₯Ό 톡해 bar에 λŒ€ν•œ μ•„μ΄λ…Έλ“œ λ²ˆν˜Έλ„ μ°Ύμ•„λ‚Ό 수 μžˆλ‹€.

open()을 톡해 bar에 λŒ€ν•œ μ•„μ΄λ…Έλ“œλ₯Ό λ©”λͺ¨λ¦¬μ— μ μž¬ν•œλ‹€. 파일 μ‹œμŠ€ν…œμ—μ„œλŠ” μ΅œμ’…μ μœΌλ‘œ ν•΄λ‹Ή νŒŒμΌμ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ ν™•μΈν•˜κ³ , 이 ν”„λ‘œμ„ΈμŠ€μ˜ open file tableμ—μ„œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό ν• λ‹Ήλ°›μ•„ μ‚¬μš©μžμ—κ²Œ λ¦¬ν„΄ν•œλ‹€.

open() μ΄ν›„μ—λŠ” read() μ‹œμŠ€ν…œ μ½œμ„ 톡해 νŒŒμΌμ„ μ½λŠ”λ‹€. 이 λ•Œ 첫 번째 읽기 μž‘μ—…μ΄λ―€λ‘œ 첫 번째 λΈ”λŸ­μ„ 읽게 될 것이고, λ§ˆμ§€λ§‰μœΌλ‘œ 읽은 μ‹œκ°„μ„ μ•„μ΄λ…Έλ“œμ— κΈ°λ‘ν•œλ‹€. read()λŠ” open file tableμ—μ„œ ν•΄λ‹Ή 파일 λ””μŠ€ν¬λ¦½ν„°μ— λŒ€ν•œ μ˜€ν”„μ…‹μ„ κ°±μ‹ ν•œλ‹€. λ‹€μŒ 읽기 μž‘μ—…μ„ ν•  λ•Œ μ˜€ν”„μ…‹ λ‹€μŒλΆ€ν„° 읽게 ν•  것이닀.

μ–΄λŠ μ‹œμ μ΄ 되면 νŒŒμΌμ„ λ‹«μ•„μ•Ό ν•˜λŠ”λ° 이건 κ·Έλƒ₯ ν• λ‹Ήλœ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό ν•΄μ œν•˜λ©΄ λœλ‹€. λ””μŠ€ν¬ I/OλŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

OSTEP 40 File System Implementation-1698695920532.jpeg

이 κ·Έλ¦Όμ—μ„œλŠ” νŒŒμΌμ„ μ—¬λŠ” κ³Όμ • 쀑에 파일의 μ•„μ΄λ…Έλ“œλ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ μ—¬λŸ¬ 번의 읽기가 μΌμ–΄λ‚˜λŠ” 것을 보여주고 μžˆλ‹€. κ·Έ 뒀에 각 λΈ”λŸ­μ„ 읽기 μœ„ν•΄μ„œ 파일 μ‹œμŠ€ν…œμ€ λ¨Όμ € μ•„μ΄λ…Έλ“œλ₯Ό 읽고 λΈ”λŸ­μ„ μ½λŠ”λ‹€. 그리고 μ•„μ΄λ…Έλ“œμ˜ λ§ˆμ§€λ§‰ μ ‘κ·Ό μ‹œκ°„μ„ κ°±μ‹ ν•œλ‹€. 무슨 일이 λ°œμƒν•˜λŠ”μ§€ λ‹€μ‹œ ν•œ 번 μ°¨λΆ„νžˆ 이해해 보자.

I/O λ°œμƒ νšŸμˆ˜λŠ” 경둜의 길이에 λΉ„λ‘€ν•œλ‹€. 디렉터리가 λ§Žμ•„μ§€λ©΄ 더 였래 κ±Έλ¦°λ‹€.

λ””μŠ€ν¬μ— μ“°κΈ°

λ””μŠ€ν¬μ— 쓰기도 λΉ„μŠ·ν•œ 과정이닀.

λ¨Όμ € νŒŒμΌμ„ μ—΄κ³ , write()λ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒˆλ‘œμš΄ λ‚΄μš©μœΌλ‘œ νŒŒμΌμ„ κ°±μ‹ ν•œλ‹€. μ΅œμ’…μ μœΌλ‘œλŠ” νŒŒμΌμ„ λ‹«λŠ”λ‹€.

μ½κΈ°μ™€λŠ” λ‹€λ₯΄κ²Œ 파일 μ“°κΈ°λŠ” λΈ”λŸ­ 할당을 ν•„μš”λ‘œ ν•  수 μžˆλ‹€. μƒˆλ‘œμš΄ νŒŒμΌμ— μ“Έ λ•ŒλŠ” write()λŠ” 데이터λ₯Ό λ””μŠ€ν¬μ— 기둝해야 ν•  뿐만 μ•„λ‹ˆλΌ, νŒŒμΌμ— μ–΄λŠ λΈ”λŸ­μ„ ν• λ‹Ήν•΄μ•Ό ν•  μ§€λ₯Ό κ²°μ •ν•΄μ•Ό ν•˜κ³ , 그에 따라 데이터 λΉ„νŠΈλ§΅, μ•„μ΄λ…Έλ“œ 등을 κ°±μ‹ ν•΄μ•Ό ν•œλ‹€.

κ·ΈλŸ¬λ―€λ‘œ νŒŒμΌμ— λŒ€ν•œ μ“°κΈ° μš”μ²­μ€ λ…Όλ¦¬μ μœΌλ‘œ 5번의 I/Oλ₯Ό μƒμ„±ν•œλ‹€.

  1. 데이터 λΉ„νŠΈλ§΅ 읽기
  2. 데이터 λΉ„νŠΈλ§΅ μ“°κΈ°
  3. μ•„μ΄λ…Έλ“œ 읽기
  4. μ•„μ΄λ…Έλ“œ μ“°κΈ°
  5. μ‹€μ œ λΈ”λŸ­μ— 기둝

파일 생성과 같은 λ‹¨μˆœ μž‘μ—…μ—λ„ λ§Žμ€ μ–‘μ˜ μ“°κΈ°κ°€ λ°œμƒν•œλ‹€.

  1. μ•„μ΄λ…Έλ“œ λΉ„νŠΈλ§΅ 읽기
  2. μ•„μ΄λ…Έλ“œ λΉ„νŠΈλ§΅ μ“°κΈ°
  3. μ•„μ΄λ…Έλ“œ μ“°κΈ°
  4. λ””λ ‰ν„°λ¦¬μ˜ 데이터 λΈ”λŸ­μ— μ“°κΈ°
  5. 디렉터리 μ•„μ΄λ…Έλ“œ 읽기
  6. 디렉터리 μ•„μ΄λ…Έλ“œ μ“°κΈ°

λ‹€μŒμ€ /foo/barλ₯Ό μƒμ„±ν•˜κ³  κ·Έ μ•ˆμ— μ„Έκ°œμ˜ λΈ”λŸ­μ„ μ“°λŠ” 과정이닀.

OSTEP 40 File System Implementation-1698696548926.jpeg

파일 생성이 μ–Όλ§ˆλ‚˜ λŒ€ν˜• μž‘μ—…μΈμ§€λ₯Ό μ•Œ 수 μžˆλ‹€. 경둜λͺ…을 λ”°λΌκ°€μ„œ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 데 10번의 I/Oκ°€ λ°œμƒν–ˆλ‹€. 그리고 write() ν•œ λ²ˆλ§ˆλ‹€ 5번의 I/Oκ°€ λ°œμƒν–ˆλ‹€. μƒˆλ‘œμš΄ 파일 λΈ”λŸ­μ„ ν•„μš”λ‘œ ν•˜λŠ”λ° 이λ₯Ό allocating write라 ν•œλ‹€.

7. 캐싱과 버퍼링

I/Oκ°€ λ„ˆλ¬΄ 많이 λ°œμƒν•œλ‹€. μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•΄ λŒ€λΆ€λΆ„ 파일 μ‹œμŠ€ν…œμ€ 자주 μ“°λŠ” λΈ”λŸ­λ“€μ„ λ©”λͺ¨λ¦¬μ— μΊμ‹±ν•œλ‹€. 가상 λ©”λͺ¨λ¦¬μ—μ„œ ν–ˆλ˜ 것 처럼, LRU와 기타 μΊμ‹œ ꡐ체 정책듀을 κ³ λ €ν•΄μ•Ό ν•œλ‹€.

캐싱과 ν•¨κ»˜ν•˜λŠ” 파일 μ—΄κΈ°

  1. 디렉터리 μ•„μ΄λ…Έλ“œμ™€ λ°μ΄ν„°λ‘œ 인해 λ§Žμ€ I/O λ°œμƒ
  2. 같은 νŒŒμΌμ„ μ—΄λ©΄ μΊμ‹œμ—μ„œ νžˆνŠΈκ°€ 되기 λ•Œλ¬Έμ— μΆ”κ°€ I/O λ°œμƒν•˜μ§€ μ•ŠμŒ

캐싱과 ν•¨κ»˜ν•˜λŠ” 파일 μ“°κΈ°

  • 읽기 I/OλŠ” μΊμ‹œκ°€ μΆ©λΆ„νžˆ 크면 λŒ€λΆ€λΆ„ 제거 κ°€λŠ₯
  • λ©”λͺ¨λ¦¬μ— μ“΄ 경우, μ˜μ†μ„±μ„ μœ„ν•΄ 이걸 λ””μŠ€ν¬λ‘œ λ‚΄λ € 보내야 ν•œλ‹€.
  • μΊμ‹œλŠ” μ“°κΈ° μ‹œμ μ„ μ—°κΈ°ν•  수 μžˆλ‹€ -> μ“°κΈ° 버퍼링
    • λ‹€μˆ˜ μž‘μ—… 배치 처리
    • μŠ€μΌ€μ€„λ§
    • λ§Œλ“€κ³  λ°”λ‘œ μ‚­μ œν•˜λŠ” 경우 μ•„μ˜ˆ μ—†λ˜ 일둜 ν•  수 있음

DB μ‹œμŠ€ν…œ 등은 λ²„νΌλ§μœΌλ‘œ λ°œμƒν•˜λŠ” λ¬Έμ œμ μ„ μš©λ‚©ν•˜μ§€ μ•ŠλŠ”λ‹€. 방금 μž…κΈˆν–ˆλŠ”λ° 컴퓨터가 κΊΌμ Έμ„œ λ””μŠ€ν¬μ— 기둝이 λ˜μ§€ μ•Šμ•˜λ‹€λ©΄? 이런 일을 ν”Όν•˜κΈ° μœ„ν•΄ fsync()λ₯Ό μ‚¬μš©ν•œλ‹€. 이λ₯Ό ν˜ΈμΆœν•˜λ©΄ κ°±μ‹ λœ λ‚΄μš©μ΄ λ””μŠ€ν¬μ— κ°•μ œμ μœΌλ‘œ κΈ°λ‘λœλ‹€. μΊμ‹œλ₯Ό μ•„μ˜ˆ μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.