[Week13] πŸ’Ύ File Descriptor πŸ’½

ellaΒ·2023λ…„ 5μ›” 26일
0

πŸŒ³μ •κΈ€ 6기🌳

λͺ©λ‘ 보기
37/39
post-thumbnail

πŸŒΈπŸŒΈπŸŒΈλΈ”λ‘œκ·Έ 글은 볡슡 κ²Έ gitbook의 μˆœμ„œμ— 따라 λ²ˆμ—­ 및 κ΄€λ ¨ λ‚΄μš©μ— JKν”Όμ…œμ„ 달아 정리할 μ˜ˆμ •μ΄λ‹€. λ§κ·ΈλŒ€λ‘œ JKν”Όμ…œμΈ 칸큼 100%λ§žλŠ” 말은 아닐 수 μžˆλ‹€λŠ” κ±° μ°Έκ³ ν•΄μ£ΌκΈΈ λ°”λž€λ‹€.

πŸ“– Gitbook λ‚΄μš© πŸ“–

μ΄λ²ˆμ£Όμ°¨λ„ gitbook을 찬찬히 μ½μœΌλ©΄μ„œ osλ₯Ό μ΄ν•΄ν•΄λ³΄μž.

Introduction

μ΄μ „μ˜ 두 κ³Όμ œμ—μ„œλŠ” 파일 μ‹œμŠ€ν…œμ΄ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ”μ§€μ— λŒ€ν•΄ 신경쓰지 μ•Šκ³  κ΄‘λ²”μœ„ν•˜κ²Œ μ‚¬μš©ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. 이번 λ§ˆμ§€λ§‰ κ³Όμ œμ—μ„œλŠ”, 당신은 파일 μ‹œμŠ€ν…œμ˜ κ΅¬ν˜„μ„ λ°œμ „μ‹œν‚€κ²Œ 될 κ²λ‹ˆλ‹€. filesys λ””λ ‰ν† λ¦¬μ—μ„œ 주둜 μž‘μ—…ν•˜κ²Œ 될 κ²λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ2 λ˜λŠ” ν”„λ‘œμ νŠΈ3λ₯Ό λ°”νƒ•μœΌλ‘œ ν”„λ‘œμ νŠΈ4λ₯Ό μ§„ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€. 각각의 경우, ν”„λ‘œμ νŠΈ2μ—μ„œ κ΅¬ν˜„ν–ˆλ˜ λͺ¨λ“  κΈ°λŠ₯이 filesysλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ˜‘κ°™μ΄ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½, ν”„λ‘œμ νŠΈ 3을 λ°”νƒ•μœΌλ‘œ μ§„ν–‰ν–ˆλ‹€λ©΄ ν”„λ‘œμ νŠΈ3μ—μ„œ κ΅¬ν˜„ν•œ κΈ°λŠ₯ μ—­μ‹œ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ VM κΈ°λŠ₯을 ν™œμ„±ν™”μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” Β filesys/Make.vars 을 μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. VM κΈ°λŠ₯이 λΉ„ν™œμ„±ν™”μ‹œμΌ°λ‹€λ©΄ 10% 감점할 μ˜ˆμ •μž…λ‹ˆλ‹€. νŽ˜μ΄μ§€ μΊμ‹œλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„  VMκΈ°λŠ₯이 ν•„μš”ν•©λ‹ˆλ‹€.

Indexed and Extensible Files

κΈ°λ³Έ 파일 μ‹œμŠ€ν…œμ€ νŒŒμΌλ“€μ„ 단일 면적에 ν• λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€ λ‹¨νŽΈν™”μ— μ·¨μ•½ν•©λ‹ˆλ‹€. 즉, n개 블둝이 λΉ„μ–΄ μžˆλŠ”λ°λ„ λΆˆκ΅¬ν•˜κ³  (μ™ΈλΆ€ λ‹¨νŽΈν™”κ°€ λ˜μ–΄ μ„œλ‘œ λ–¨μ–΄μ Έ μžˆλ‹€λ©΄) n개 길이의 블둝이 할당될 수 μ—†λ‹€λŠ” λ§μž…λ‹ˆλ‹€.
이 말은 μ‹€μ œ κ΅¬ν˜„μ—μ„œ 직접, κ°„μ ‘, 이쀑 κ°„μ ‘ 블둝듀을 μ‚¬μš©ν•˜λŠ” 인덱슀 ꡬ쑰λ₯Ό μ‚¬μš©ν•΄μ•Ό 할지도 λͺ¨λ₯Έλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 이전 ν•™κΈ°μ—μ„œλŠ”, 당신이 β€˜λ©€ν‹°λ ˆλ²¨ 인덱싱을 μ‚¬μš©ν•˜λŠ” Berkeley μœ λ‹‰μŠ€ FFS’라고 λ°°μ› λ˜ 방식 λΉ„μŠ·ν•œ 것을 λŒ€λΆ€λΆ„μ˜ 학생듀이 μ±„νƒν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹Ήμ‹ μ˜ 삢을 보닀 μ‰½κ²Œ λ§Œλ“€μ–΄μ£ΌκΈ° μœ„ν•΄μ„œ, μ €ν¬λŠ” 더 μ‰¬μš΄ λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•˜κ²Œλ” ν–ˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ FAT이죠. 당신은 λ°˜λ“œμ‹œ 주어진 μŠ€μΌˆλ ˆν†€ μ½”λ“œλ‘œ FAT을 κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ‹Ήμ‹ μ˜ μ½”λ“œλŠ” λ©€ν‹°λ ˆλ²¨ 인덱싱 (κ°•μ˜μ—μ„œ FFS둜 λ°°μ› λ˜)을 ν¬ν•¨ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. 그러면 file growth νŒŒνŠΈμ—μ„œ 0점을 받을 κ²λ‹ˆλ‹€.
μ•Œμ•„λ‘μ„Έμš”:
당신은 파일 μ‹œμŠ€ν…œ νŒŒν‹°μ…˜μ΄ 8MB보닀 크지 μ•Šμ„ 것이라고 가정해도 μ’‹μŠ΅λ‹ˆλ‹€.
λ‹Ήμ‹ μ˜ κ΅¬ν˜„μ€ 메타데이터λ₯Ό μ œμ™Έν•œ νŒŒν‹°μ…˜ 크기만큼의 큰 νŒŒμΌλ“€μ„ 지원해야 ν•©λ‹ˆλ‹€.
(FILESIZE) ≀ (PARTITION SIZE) - (METADATA)
각 inodeλŠ” ν•˜λ‚˜μ˜ λ””μŠ€ν¬ 섹터에 μ €μž₯λ©λ‹ˆλ‹€. κ·Έ μ„Ήν„°κ°€ 담을 수 μžˆλŠ” 만큼으둜 블둝 ν¬μΈν„°μ˜ μˆ˜κ°€ μ œν•œλ©λ‹ˆλ‹€.

Indexing large files with FAT (File Allocation Table)

κ²½κ³  : 이 λ¬Έμ„œλŠ” μ—¬λŸ¬λΆ„μ΄ κ°•μ˜λ₯Ό 톡해 일반적인 파일 μ‹œμŠ€ν…œκ³Ό FAT의 κΈ°λ³Έ 이둠을 μ΄ν•΄ν–ˆλ‹€λŠ” κ°€μ •ν•˜μ— μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•œ 이해가 μ—†λ‹€λ©΄, κ°•μ˜ λ…ΈνŠΈλ‘œ λŒμ•„κ°€μ„œ 파일 μ‹œμŠ€ν…œκ³Ό FATκ°€ 무엇인지 μ΄ν•΄ν•˜μ‹­μ‹œμ˜€.

당신이 이전 ν”„λ‘œμ νŠΈλ“€μ—μ„œ μ‚¬μš©ν–ˆλ˜ κΈ°λ³Έ νŒŒμΌμ‹œμŠ€ν…œμ—μ„œλŠ”, 파일이 μ—¬λŸ¬ λ””μŠ€ν¬ 섹터에 걸친 μ—°μ†λœ 단일 덩어리에 μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μ—°μ†λœ 덩어리λ₯Ό ν΄λŸ¬μŠ€ν„° 라고 λΆ€λ¦…μ‹œλ‹€.
μ™œλƒν•˜λ©΄ ν΄λŸ¬μŠ€ν„°(덩어리)λŠ” ν•˜λ‚˜ μ΄μƒμ˜ μ—°μ†λœ λ””μŠ€ν¬ μ„Ήν„°λ₯Ό 담을 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ΄€μ μ—μ„œ, κΈ°λ³Έ 파일 μ‹œμŠ€ν…œμ—μ„œ ν΄λŸ¬μŠ€ν„°μ˜ μ‚¬μ΄μ¦ˆλŠ” 곧 ν΄λŸ¬μŠ€ν„°μ— μ €μž₯된 파일의 크기λ₯Ό μ˜λ―Έν–ˆμŠ΅λ‹ˆλ‹€.

μ™ΈλΆ€ λ‹¨νŽΈν™”λ₯Ό κ²½κ°μ‹œν‚€κΈ° μœ„ν•΄, μš°λ¦¬λŠ” ν΄λŸ¬μŠ€ν„°μ˜ μ‚¬μ΄μ¦ˆλ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€ (가상 λ©”λͺ¨λ¦¬μ—μ„œμ˜ νŽ˜μ΄μ§€ μ‚¬μ΄μ¦ˆλ₯Ό λ– μ˜¬λ €λ³΄μ„Έμš”). λ‹¨μˆœν™”λ₯Ό μœ„ν•΄, 우리의 μŠ€μΌˆλ ˆν†€ μ½”λ“œμ— μžˆλŠ” ν΄λŸ¬μŠ€ν„° λ‚΄μ˜ μ„Ήν„° 개수λ₯Ό 1둜 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 이런 μž‘μ€ ν΄λŸ¬μŠ€ν„°λ₯Ό μ“°λ©΄, 전체 νŒŒμΌμ„ λ‹΄κΈ°μ—λŠ” ν΄λŸ¬μŠ€ν„°μ˜ 크기가 μΆ©λΆ„μΉ˜ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우, μš°λ¦¬λŠ” ν•œ νŒŒμΌμ„ μœ„ν•œ μ—¬λŸ¬ 개의 ν΄λŸ¬μŠ€ν„°λ₯Ό ν•„μš”λ‘œ ν•˜λ©°, κ·Έλ ‡κΈ° λ•Œλ¬Έμ— inode에 μžˆλŠ” νŒŒμΌμ„ μœ„ν•œ ν΄λŸ¬μŠ€ν„°λ₯Ό μΈλ±μ‹±ν•˜κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
κ°€μž₯ μ‰¬μš΄ 방법은 λ§ν¬λ“œ 리슀트 (체인이라고도 λΆˆλ¦¬λŠ”)λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. inodeλŠ” 파일의 첫번째 λΈ”λ‘μ˜ μ„Ήν„° λ„˜λ²„λ₯Ό 포함할 수 있고, 첫 번째 블둝은 두 번째 λΈ”λ‘μ˜ μ„Ήν„° λ„˜λ²„λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ λ§Œμ•½ μš°λ¦¬μ—κ²Œ ν•„μš”ν•œ 블둝이 λ§ˆμ§€λ§‰ 블둝 뿐일지라도, 파일의 λͺ¨λ“  블둝을 읽어야 ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
이것을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄, FAT (File Allocation Table, 파일 ν• λ‹Ή ν…Œμ΄λΈ”)을 μ‚¬μš©ν•˜λŠ”λ°, μ΄λ ‡κ²Œ ν•˜λ©΄ 각 블둝듀이 μžμ‹ μ˜ ꡬ쑰 μ•ˆμ— 연결정보λ₯Ό λ‹΄λŠ” λŒ€μ‹ μ— κ³ μ • 크기의 FAT에 λΈ”λ‘λ“€μ˜ 연결정보λ₯Ό μ €μž₯ν•˜κ²Œ λ©λ‹ˆλ‹€. FAT이 μ‹€μ œ 데이터가 μ•„λ‹Œ 연결정보 κ°’λ§Œ λ‹΄κ³  있기 λ•Œλ¬Έμ—, DRAM에 μΊμ‹œλ  수 μžˆμ„ 만큼 μΆ©λΆ„νžˆ μž‘μ€ 크기λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ, μš°λ¦¬λŠ” ν…Œμ΄λΈ”μ—μ„œ μƒμ‘ν•˜λŠ” μ—”νŠΈλ¦¬λ§Œ 읽으면 되게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

당신은 inode 인덱싱을 filesys/fat.c에 μ œκ³΅λ˜λŠ” μŠ€μΌˆλ ˆν†€ μ½”λ“œμ™€ ν•¨κ»˜ κ΅¬ν˜„ν•˜κ²Œ 될 κ²ƒμž…λ‹ˆλ‹€. 이번 μ„Ήμ…˜μ—μ„œλŠ” fat.c에 이미 κ΅¬ν˜„λœ ν•¨μˆ˜λ“€κ³Ό 당신이 μ•žμœΌλ‘œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” λ‚΄μš©λ“€μ— λŒ€ν•΄ κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

μš°μ„ , fat.c에 μžˆλŠ” 6개의 ν•¨μˆ˜λ“€ (i.e.Β fat_init(),Β fat_open(),Β fat_close(),Β fat_create(), andΒ fat_boot_create())은 λΆ€νŒ… μ‹œμ— λ””μŠ€ν¬λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  ν¬λ§·ν•˜κΈ° λ•Œλ¬Έμ—, 이듀을 μˆ˜μ •ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 당신은 fat_fs_init() ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜κ³ , 이듀이 ν•˜λŠ” 일이 μ–΄λ–€ 도움이 될지λ₯Ό κ°„λž΅ν•˜κ²Œ 이해해야 ν•  κ²λ‹ˆλ‹€.

FAT 파일 μ‹œμŠ€ν…œμ„ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 당신은 fat_fs의 fat_length와 data_start ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. fat_lengthλŠ” νŒŒμΌμ‹œμŠ€ν…œμ— λͺ‡ 개의 ν΄λŸ¬μŠ€ν„°κ°€ μžˆλŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•˜κ³ , data_startλŠ” μ–΄λ–€ μ„Ήν„°μ—μ„œ 파일 μ €μž₯을 μ‹œμž‘ν•  수 μžˆλŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 당신은 μ–΄μ©Œλ©΄ fat_fs->bs 에 μ €μž₯된 값을 μ΄μš©ν•˜κ³  μ‹Άμ–΄μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 이 ν•¨μˆ˜μ—μ„œ λ‹€λ₯Έ μœ μš©ν•œ 데이터λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  μ‹Άμ–΄μ§ˆμˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

cluster_t fat_fs_init (void);

clst 인자(ν΄λŸ¬μŠ€ν„° 인덱싱 λ„˜λ²„)둜 νŠΉμ •λœ ν΄λŸ¬μŠ€ν„° 뒀에 λ‹€λ₯Έ ν΄λŸ¬μŠ€ν„°λ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ 체인을 μ—°μž₯ν•©λ‹ˆλ‹€.
λ§Œμ•½ clstκ°€ 0이라면, μƒˆλ‘œμš΄ 체인을 λ§Œλ“­λ‹ˆλ‹€.
μƒˆλ‘­κ²Œ ν• λ‹Ήλœ ν΄λŸ¬μŠ€ν„°μ˜ λ„˜λ²„λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

cluster_t fat_create_chain (cluster_t clst);

clstλ‘œλΆ€ν„° μ‹œμž‘ν•˜μ—¬, μ²΄μΈμœΌλ‘œλΆ€ν„° ν΄λŸ¬μŠ€ν„°λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. pclstλŠ” μ²΄μΈμ—μ„œμ˜ clst 직전 ν΄λŸ¬μŠ€ν„°μ—¬μ•Ό ν•©λ‹ˆλ‹€. 이 말은, 이 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  λ‚˜λ©΄ pclstκ°€ μ—…λ°μ΄νŠΈλœ 체인의 λ§ˆμ§€λ§‰ μ›μ†Œκ°€ 될 κ±°λΌλŠ” λ§μž…λ‹ˆλ‹€. 만일 clstκ°€ 체인의 첫 번째 μ›μ†ŒλΌλ©΄, pclst의 값은 0이어야 ν•  κ²λ‹ˆλ‹€.

void fat_remove_chain (cluster_t clst, cluster_t pclst);

ν΄λŸ¬μŠ€ν„° λ„˜λ²„ clst κ°€ κ°€λ¦¬ν‚€λŠ” FAT μ—”νŠΈλ¦¬λ₯Ό val둜 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€. FAT에 μžˆλŠ” 각 μ—”νŠΈλ¦¬λŠ” μ²΄μΈμ—μ„œμ˜ λ‹€μŒ ν΄λŸ¬μŠ€ν„°λ₯Ό 가리킀고 있기 λ•Œλ¬Έμ— (λ§Œμ•½ μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έλ ‡λ‹€λŠ” κ±°κ³ , λ‹€μŒ ν΄λŸ¬μŠ€ν„°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ EOChain (End Of Chain)μž…λ‹ˆλ‹€), 이 ν•¨μˆ˜λŠ” 연결관계λ₯Ό μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

void fat_put (cluster_t clst, cluster_t val);

clstκ°€ κ°€λ¦¬ν‚€λŠ” ν΄λŸ¬μŠ€ν„° λ„˜λ²„λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

cluster_t fat_get (cluster_t clst);

ν΄λŸ¬μŠ€ν„° λ„˜λ²„ clstλ₯Ό μƒμ‘ν•˜λŠ” μ„Ήν„° λ„˜λ²„λ‘œ λ³€ν™˜ν•˜κ³ , κ·Έ μ„Ήν„° λ„˜λ²„λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

disk_sector_t cluster_to_sector (cluster_t clst);

당신은 이 ν•¨μˆ˜λ“€μ„ filesys.c와 inode.cμ—μ„œ κΈ°λ³Έ 파일 μ‹œμŠ€ν…œμ˜ κΈ°λŠ₯을 μ¦λŒ€μ‹œν‚€κΈ° μœ„ν•΄ μ΄μš©ν•˜κ³  싢을지도 λͺ¨λ¦…λ‹ˆλ‹€.

File Growth

크기λ₯Ό μ¦κ°€μ‹œν‚¬ 수 μžˆλŠ” νŒŒμΌμ„ κ΅¬ν˜„ν•˜μ„Έμš”. κΈ°λ³Έ 파일 μ‹œμŠ€ν…œμ—μ„œλŠ” 파일의 생성 μ‹œμ— 파일 크기가 νŠΉμ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ ν˜„λŒ€ 파일 μ‹œμŠ€ν…œμ—μ„œλŠ” νŒŒμΌμ€ 크기 0으둜 μƒμ„±λ˜κ³ , 파일의 λμ—μ„œ μ“°κΈ°κ°€ μ΄λ£¨μ–΄μ§ˆ λ•Œλ§ˆλ‹€ ν™•μž₯λ©λ‹ˆλ‹€.

파일 크기 μ œν•œμ„ 미리 정해두지 말아야 ν•©λ‹ˆλ‹€. λ¬Όλ‘  메타데이터λ₯Ό μ œμ™Έν•œ 파일 μ‹œμŠ€ν…œμ˜ 크기λ₯Ό λ„˜μ–΄μ„œμ§€ μ•ŠλŠ” 선에 ν•œν•΄μ„œμž…λ‹ˆλ‹€. μ§€κΈˆμ€ 16개 파일둜 μ œν•œλ˜μ–΄ μžˆλŠ” 루트 디렉토리 νŒŒμΌλ„, μ΄μ œλŠ” 더 증가될 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μœ μ € ν”„λ‘œκ·Έλž¨λ“€μ€ ν˜„μž¬ 파일의 끝(EOF)을 λ„˜μ–΄μ„œλŠ” 탐색(seek)을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 탐색 μžμ²΄λ‘œλŠ” 파일이 μ¦κ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. EOFλ₯Ό λ„˜μ–΄μ„  μœ„μΉ˜μ— writeν•˜λ©΄ κ·Έ μœ„μΉ˜κΉŒμ§€ νŒŒμΌμ„ μ¦κ°€μ‹œν‚€λ©°, 이전 EOFμ—μ„œλΆ€ν„° write의 μ‹œμž‘μœ„μΉ˜ μ‚¬μ΄μ˜ 빈 곡간은 0으둜 μ±„μ›Œμ Έμ•Ό ν•©λ‹ˆλ‹€.
EOFλ₯Ό λ„˜μ–΄μ„  μœ„μΉ˜μ—μ„œ read ν•˜λŠ” 것은 μ–΄λ–€ λ°”μ΄νŠΈλ„ λ¦¬ν„΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

EOFλ₯Ό ν•œμ°Έ λ„˜μ–΄μ„œμ„œ write ν•˜λŠ” 것은 μˆ˜λ§Žμ€ 블둝듀을 μ™„μ „νžˆ 0으둜 λ§Œλ“€μ–΄ 버릴 κ²λ‹ˆλ‹€. μ–΄λ–€ 파일 μ‹œμŠ€ν…œλ“€μ€ 이런 λ¬΅μ‹œμ μΈ 0으둜 이루어진 블둝듀을 μ‹€μ œλ‘œ ν• λ‹Ήν•˜κ³  write ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ‹€λ₯Έ μ–΄λ–€ 파일 μ‹œμŠ€ν…œλ“€μ€ λͺ…μ‹œμ μœΌλ‘œ write되기 μ „κΉŒμ§€λŠ” κ·Έ 블둝듀을 ν• λ‹Ήν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν›„μžμ˜ 파일 μ‹œμŠ€ν…œλ“€μ€ β€œsparse files (밀도가 ν¬λ°•ν•œ 파일)”을 μ§€μ›ν•œλ‹€κ³  λΆˆλ¦½λ‹ˆλ‹€. 당신은 μ΄λŸ¬ν•œ 파일 μ‹œμŠ€ν…œμ˜ ν• λ‹Ή μ „λž΅ 두가지 쀑 μ–΄λ–€ μͺ½μ΄λ“  채택해도 λ©λ‹ˆλ‹€.

Subdirectories

각 ν”„λ‘œμ„ΈμŠ€λŠ” β€œν˜„μž¬ 디렉터리”λ₯Ό λ³„λ„λ‘œ μœ μ§€ν•©λ‹ˆλ‹€. (ν”„λ‘œμ„ΈμŠ€κ°€)μ‹œμž‘ν•  λ•Œ, ν”„λ‘œμ„ΈμŠ€μ˜ β€œν˜„μž¬ 디렉터리” μ΄ˆκΈ°κ°’μ€ root λ””λ ‰ν„°λ¦¬λ‘œ μ„€μ •ν•˜μ„Έμš”. ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ fork μ‹œμŠ€ν…œ 콜둜 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œμž‘ν•˜κ²Œ ν•˜λ©΄, κ·Έλ ‡κ²Œ λ§Œλ“€μ–΄μ§„ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ β€œν˜„μž¬ 디렉터리”λ₯Ό 상속 λ°›μŠ΅λ‹ˆλ‹€.
fork 이후에, 두 ν”„λ‘œμ„ΈμŠ€μ˜ β€œν˜„μž¬ 디렉터리”듀은 μ„œλ‘œ λ…λ¦½μ μ΄λ―€λ‘œ, 각 ν”„λ‘œμ„ΈμŠ€κ°€ μžμ‹ μ˜ β€œν˜„μž¬ 디렉터리”λ₯Ό λ³€κ²½ν•˜λŠ”κ²ƒμ€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (이것이 λ°”λ‘œ Unixμ—μ„œμ˜ cd λͺ…λ Ήμ–΄κ°€ μ™ΈλΆ€ ν”„λ‘œκ·Έλž¨μ΄ μ•„λ‹Œ 셸에 λ‚΄μž₯λ˜μ–΄μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€.)

기쑴의 μ‹œμŠ€ν…œ μ½œμ„ μˆ˜μ •ν•΄μ„œ, ν˜ΈμΆœμžκ°€ μ „λ‹¬ν•œ file name이 μ ˆλŒ€ λ˜λŠ” μƒλŒ€ 경둜인 이름을 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜μ„Έμš”. 디렉터리λ₯Ό κ΅¬λΆ„ν•˜λŠ” λ¬ΈμžλŠ” μŠ¬λž˜μ‹œ(’/’) μž…λ‹ˆλ‹€. λ˜ν•œ μ—¬λŸ¬λΆ„μ€ Unixμ—μ„œμ™€ λ™μΌν•œ 의미의 νŠΉλ³„ν•œ 파일 이름듀인 β€˜.’ κ³Ό β€˜..’ 도 지원해야 ν•©λ‹ˆλ‹€.

open μ‹œμŠ€ν…œ 콜이 디렉터리도 μ—΄ 수 μžˆλ„λ‘ μˆ˜μ •ν•˜μ„Έμš”. κΈ°μ‘΄ μ‹œμŠ€ν…œ 콜 쀑 디렉터리에 λŒ€ν•œ 파일 μ‹λ³„μž(fd)λ₯Ό μ•Œμ•„μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ”κ²ƒμ€ close λΏμž…λ‹ˆλ‹€.

remove μ‹œμŠ€ν…œ 콜이 일반 파일 외에 λΉ„μ–΄μžˆλŠ” 디렉터리(root μ œμ™Έ)도 μ‚­μ œν•  수 있게 μˆ˜μ •ν•˜μ„Έμš”.
λ””λ ‰ν„°λ¦¬λŠ” ν•˜μœ„ 파일 λ˜λŠ” ν•˜μœ„ 디렉터리(’.’ 및 β€˜..’ μ œμ™Έ)λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ μ—΄μ–΄λ‘” λ””λ ‰ν„°λ¦¬λ‚˜, ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μž‘μ—… 디렉터리λ₯Ό μ‚­μ œν•˜λŠ”κ²ƒμ„ ν—ˆμš©ν•  것인지 μ—¬λΆ€λŠ” μ—¬λŸ¬λΆ„μ΄ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ ν—ˆμš©ν•˜κ²Œλœλ‹€λ©΄, μ‚­μ œλœ 디렉터리 μ•ˆμ—μ„œ 파일(’.’ 및 β€˜..’ 포함)을 μ—΄κ±°λ‚˜ μƒˆλ‘œμš΄ νŒŒμΌμ„ λ§Œλ“œλŠ” μ‹œλ„λŠ” ν—ˆμš©λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ μ½œλ“€μ„ κ΅¬ν˜„ν•˜μ„Έμš”:

ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μž‘μ—… 디렉터리λ₯Ό μƒλŒ€ λ˜λŠ” μ ˆλŒ€ 경둜인 dir 둜 λ°”κΏ‰λ‹ˆλ‹€. μ„±κ³΅ν–ˆλ‹€λ©΄ trueλ₯Ό, 그렇지 μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€

bool chdir (const char *dir);

μ ˆλŒ€ λ˜λŠ” μƒλŒ€ 경둜인 디렉터리 dirλ₯Ό λ§Œλ“­λ‹ˆλ‹€. μ„±κ³΅ν–ˆλ‹€λ©΄ trueλ₯Ό, 그렇지 μ•ŠμœΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ§Œμ•½ dir 이 이미 μ‘΄μž¬ν•˜κ±°λ‚˜, λ§ˆμ§€λ§‰ 디렉터리 μ΄μ™Έμ˜ 디렉터리 이름이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우 μ‹€νŒ¨ν•©λ‹ˆλ‹€. 이 말은, mkdir(”a/b/c”) λŠ” /a/b κ°€ 이미 μ‘΄μž¬ν•˜λ©΄μ„œ /a/b/c κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ μ„±κ³΅ν•œλ‹€λŠ” 뜻 μž…λ‹ˆλ‹€.

bool mkdir (const char *dir);

디렉터리λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 파일 μ‹λ³„μž fd μ—μ„œ directory entryλ₯Ό μ½μŠ΅λ‹ˆλ‹€. μ„±κ³΅ν•œλ‹€λ©΄, null둜 λλ‚˜λŠ” 파일 이름을, READDIR_MAX_LEN + 1Β bytes의 곡간이 μžˆλŠ” name 에 μ €μž₯ν•˜κ³  trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 만일 디렉터리에 남은 ν•­λͺ©μ΄ μ—†λ‹€λ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
readdir μ—μ„œ . κ³Ό .. 을 λ°˜ν™˜ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€. 만일 디렉터리가 μ—΄λ €μžˆλŠ” λ™μ•ˆ λ³€κ²½λœλ‹€λ©΄, 일뢀 entry듀을 μ „ν˜€ 읽지 μ•Šκ±°λ‚˜ μ—¬λŸ¬λ²ˆ μ½λŠ” 것이 ν—ˆμš©λ©λ‹ˆλ‹€. 그렇지 μ•Šλ‹€λ©΄(μ—΄λ € μžˆλŠ” λ™μ•ˆ λ³€κ²½λ˜μ§€ μ•Šμ•˜λ‹€λ©΄), 각 directory entryλŠ” μˆœμ„œμ— 관계없이 ν•œλ²ˆλ§Œ 읽어야 ν•©λ‹ˆλ‹€.
READDIR_MAX_LEN λŠ” lib/user/syscall.h 에 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 파일 μ‹œμŠ€ν…œμ΄ κΈ°λ³Έ 파일 이름보닀 더 κΈ΄ 파일 이름을 μ§€μ›ν•œλ‹€λ©΄, μ—¬λŸ¬λΆ„μ€ READDIR_MAX_LEN 의 값을 기본값인 14μ—μ„œ 더 λŠ˜λ €μ•Ό ν•©λ‹ˆλ‹€.

bool readdir (int fd, char *name);

fd κ°€ 디렉터리λ₯Ό λ‚˜νƒ€λ‚΄λ©΄ trueλ₯Ό, 일반 νŒŒμΌμ„ λ‚˜νƒ€λ‚΄λ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

bool isdir (int fd);

일반 파일 λ˜λŠ” 디렉터리에 λŒ€ν•œ fd 와 μ—°κ΄€λœ inode의 inode numberλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
inode numberλŠ” 파일 λ˜λŠ” 디렉터리λ₯Ό 영ꡬ적으둜 μ‹λ³„ν•˜λ©°, μ΄λŠ” 파일이 μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ κ³ μœ ν•©λ‹ˆλ‹€. Pintosμ—μ„œ, inode의 μ„Ήν„° λ²ˆν˜Έκ°€ inode number둜 μ‚¬μš©λ˜κΈ°μ— μ ν•©ν•©λ‹ˆλ‹€.

int inumber (int fd);

ν•€ν† μŠ€μ—μ„œ soft link λ§€μ»€λ‹ˆμ¦˜μ„ κ΅¬ν˜„ν•˜μ„Έμš”. Soft link(일λͺ… Symbolic link)λŠ” λ‹€λ₯Έ νŒŒμΌμ΄λ‚˜ 디렉터리λ₯Ό μ°Έμ‘°ν•˜λŠ” μœ μ‚¬ 파일 κ°μ²΄μž…λ‹ˆλ‹€. 이 νŒŒμΌμ€ μ§€μ •λœ 파일의 μ ˆλŒ€ λ˜λŠ” μƒλŒ€ 경둜의 λ°©μ‹μ˜ 경둜 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 상황을 κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

/
β”œβ”€β”€ a
β”‚   β”œβ”€β”€ link1 -> /file
β”‚   β”‚
β”‚   └── link2 -> ../file
└── file

/a 에 μœ„μΉ˜ν•˜λŠ” link1 μ΄λΌλŠ” μ΄λ¦„μ˜ soft-linkλŠ” /file 을 (μ ˆλŒ€ 경둜둜)가리킀고 있고, /a 에 μœ„μΉ˜ν•˜λŠ” link2 λŠ” ../file 을 (μƒλŒ€ 경둜둜)가리킀고 μžˆμŠ΅λ‹ˆλ‹€. link1 μ΄λ‚˜ link2λ₯Ό μ½λŠ”λ‹€λŠ” 것은 /file 을 μ½λŠ”κ²ƒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄ target을 ν¬ν•¨ν•˜λŠ” linkpath λΌλŠ” μ΄λ¦„μ˜ symbolic linkλ₯Ό λ§Œλ“œμ„Έμš”. 성곡 ν•œλ‹€λ©΄ 0이 λ°˜ν™˜λ˜κ³ , μ‹€νŒ¨ ν•œλ‹€λ©΄ -1이 λ°˜ν™˜λ©λ‹ˆλ‹€.

int symlink (const char *target, const char *linkpath);

πŸ’― 이둠 곡뢀 πŸ’―

μ •κΈ€ μ„ λ°°μ˜ μžλ£Œμ™€ 카이슀트 κ°•μ˜μžλ£Œλ₯Ό κ³΅λΆ€ν•΄μ„œ μ •λ¦¬ν•œ λ‚΄μš©μ΄λ‹€.

File system component

μ €μž₯ μž₯μΉ˜λŠ” HDD, SSD, CD-ROM, USB λ“±λ“±, 그리고 λ§ˆκ·Έλ„€ν‹±, κ΄‘ν•™, λ°˜λ„μ²΄ λ“± μ’…λ₯˜κ°€ μ—¬λŸ¬κ°€μ§€μ΄λ‹€. μ΄λ ‡κ²Œ λ‹€μ–‘ν•œ μ €μž₯ μž₯μΉ˜λ“€μ— 정보λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” 정보λ₯Ό 읽고 μ“Έ 수 μžˆλŠ” 방법이 μ •λ¦¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 이λ₯Ό 파일 μ‹œμŠ€ν…œμ΄λΌκ³  ν•œλ‹€.

특히 파일과 λ””λ ‰ν† λ¦¬λΌλŠ” 두 개의 κ°œλ…μœΌλ‘œ μ €μž₯ μž₯치λ₯Ό 좔상화할 수 μžˆλ‹€. 즉, μ €μž₯ μž₯μΉ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 파일과 λ””λ ‰ν† λ¦¬λΌλŠ” κ°œλ…μ„ μ΄μš©ν•œλ‹€.

file

UNIXμ—μ„œμ˜ 파일의 μ •μ˜λŠ” νŒŒμΌμ€ λ°”μ΄νŠΈμ˜ μ„ ν˜• 배열이닀.λ‹€λ₯Έ μ‹œμŠ€ν…œμ—μ„œλŠ” 파일이 λ ˆμ½”λ“œ 집합, λ°μ΄ν„°λ² μ΄μŠ€ λ ˆμ½”λ“œ λ˜λŠ” ν‚€-κ°’ 쌍으둜 μ •μ˜λ  μˆ˜λ„ μžˆλ‹€.

UNIX 운영 체제의 파일 μ‹œμŠ€ν…œμ—μ„œ νŒŒμΌμ€ 맀우 κ°„λ‹¨ν•˜κ²Œ 'λ°”μ΄νŠΈ λ°°μ—΄'이라고 μ •μ˜ λœλ‹€. 각 νŒŒμΌμ€ ν•˜μœ„ μ΄λ¦„μœΌλ‘œ inode 번호λ₯Ό 가진닀. λ”°λΌμ„œ λ‚΄λΆ€μ μœΌλ‘œ 각 νŒŒμΌμ€ 번호λ₯Ό 가지고 μžˆλ‹€. ν•˜μ§€λ§Œ μ‚¬μš©μžλŠ” νŒŒμΌμ„ 숫자둜 보지λͺ»ν•˜κ³  "hello.c"와 같은 λ¬Έμžμ—΄λ‘œ λ³Έλ‹€.

directory

디렉터리도 파일이며 νŠΉμˆ˜ν•œ νŒŒμΌμ΄λ‹€. λ””λ ‰ν„°λ¦¬λŠ” 파일 이름과 inode 번호의 쌍으둜 κ΅¬μ„±λœ λͺ©λ‘μ΄λ©°, λ””λ ‰ν„°λ¦¬μ˜ κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ νŒŒμΌλ“€μ„ 계측 ꡬ쑰둜 쑰직화할 수 μžˆλ‹€.

file interface


μΈν„°νŽ˜μ΄μŠ€λž€ νŒŒμΌμ„ μ‘°μž‘ν•˜λŠ” ν•¨μˆ˜μ˜ 집합을 λ§ν•œλ‹€. νŒŒμΌμ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ μ‹œμž‘ν•œλ‹€. νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 방법은 O_CREAT ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ open μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜λŠ” 것이닀. "foo"λΌλŠ” μ΄λ¦„μ˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³  O_CREAT ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜λ©° μ“°κΈ° μ „μš©(write only)으둜 μƒμ„±ν•˜λ©° 초기 ν¬κΈ°λŠ” 0으둜 μ„€μ •ν•œλ‹€. 그리고 open μ‹œμŠ€ν…œ μ½œμ€ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ°˜ν™˜ν•œλ‹€.

각 ν”„λ‘œμ„ΈμŠ€λŠ” 파일 λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ”μ΄λΌλŠ” μ •μˆ˜ 배열을 가지고 μžˆλ‹€. 파일 λ””μŠ€ν¬λ¦½ν„°λŠ” 이 ν…Œμ΄λΈ”μ—μ„œμ˜ μΈλ±μŠ€λ‹€. μœ„μ— κ΅μˆ˜λ‹˜μ΄ κ·Έλ €μ€€ 그림을 μ°Έκ³ ν•˜λ©΄ 각 μ—”λ“œλ¦¬μ˜ 0, 1, 2, 3, 4κ°€ file descriptor이닀. 이 ν…Œμ΄λΈ”μ˜ 각 entryλŠ” μ‹€μ œλ‘œ μ–΄λ–€ λ°μ΄ν„°λ‚˜ 객체λ₯Ό 가리킨닀.
파일 κ°μ²΄μ—λŠ” offsetμ΄λΌλŠ” λ³€μˆ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€. λ˜ν•œ 파일 κ°μ²΄μ—λŠ” inodeλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터도 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
파일 κ°μ²΄λŠ” 파일의 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” offsetκ³Ό κ΄€λ ¨λœ κ°€μž₯ μ€‘μš”ν•œ 데이터 ꡬ쑰이닀. offset은 파일 λ‚΄μ—μ„œ 읽기 및 μ“°κΈ° μ‹œμŠ€ν…œ 호좜이 μ μš©λ˜λŠ” μœ„μΉ˜λ‹€. μ΄λŠ” pintOSμ—μ„œ struct file에 ν•΄λ‹Ήν•œλ‹€. 각 운영 μ²΄μ œλŠ” 파일 λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ”μ—μ„œμ˜ μ΅œλŒ€ 파일 λ””μŠ€ν¬λ¦½ν„° 수λ₯Ό μ •μ˜ν•œλ‹€. μ΄λŠ” μ»€λ„μ˜ μ „μ—­ λ³€μˆ˜μ΄λ©° 변경될 수 μžˆμ§€λ§Œ, 졜근의 Linuxμ—μ„œλŠ” 파일 λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ”μ˜ 크기가 256μž…λ‹ˆλ‹€.

strace

straceλŠ” λ¦¬λˆ…μŠ€μ—μ„œ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μ‹œμŠ€ν…œ 콜(trace system call)을 μΆ”μ ν•˜κ³  κΈ°λ‘ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°μ΄λ‹€. straceλ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–€ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜λŠ”μ§€, ν•΄λ‹Ή μ‹œμŠ€ν…œ 콜의 μΈμžμ™€ λ°˜ν™˜ 값을 확인할 수 μžˆλ‹€. 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ λΆ„μ„ν•˜κ³  λ””λ²„κΉ…ν•˜λŠ” 데 도움이 λœλ‹€. straceλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰ 흐름과 κ΄€λ ¨λœ μ‹œμŠ€ν…œ 콜 정보λ₯Ό 좜λ ₯ν•˜λ―€λ‘œ, λ””λ²„κΉ…μ΄λ‚˜ μ„±λŠ₯ 뢄석 λ“± λ‹€μ–‘ν•œ μš©λ„λ‘œ ν™œμš©λœλ‹€.

μ‹œμŠ€ν…œ 콜 link()μ—μ„œ λ³Ό 수 μžˆλ“―μ΄, λ™μΌν•œ νŒŒμΌμ„ μ ‘κ·Όν•  수 μžˆλŠ” μƒˆλ‘œμš΄ 경둜λͺ…을 λ§Œλ“€μ–΄μ£ΌλŠ” μž‘μ—…μ΄λ‹€.

파일 μ‹œμŠ€ν…œμ—μ„œ ν•˜λ‚˜μ˜ νŒŒμΌμ€ ν•˜λ‚˜μ˜ μ•„μ΄λ…Έλ“œλ‘œ λŒ€ν‘œλœλ‹€. 기본적으둜 νŒŒμΌμ€ μ•„μ΄λ…Έλ“œμ™€μ˜ 연결이라고 ν•  수 μžˆλ‹€.

μƒˆλ‘œμš΄ ν•­λͺ©μ„ 디렉터리에 μƒμ„±ν•˜κ³  μ›λž˜ 파일과 같은 μ•„μ΄λ…Έλ“œ 번호λ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•œλ‹€. 즉, μƒˆ νŒŒμΌμ„ μƒμ„±ν•˜κ³  기쑴의 μ•„μ΄λ…Έλ“œμ™€ μ—°κ²°μ‹œν‚€λŠ” 것이닀.

ν•˜λ“œ λ“œλΌμ΄λΈŒμ˜ μ–΄λ–€ νŠΉμ •ν•œ ꡬ역(μ•„μ΄λ…Έλ“œ)을 가리킨닀. λ”°λΌμ„œ μ—¬λŸ¬ νŒŒμΌλ“€μ΄ ν•œ λ””μŠ€ν¬ ꡬ역을 ν•˜λ“œ λ§ν¬ν•œλ‹€κ³  ν–ˆμ„ λ•Œ, 그쀑 ν•œ 파일의 데이터λ₯Ό λ°”κΎΈλ©΄ λ‹€λ₯Έ νŒŒμΌλ“€μ˜ 데이터도 따라 λ°”λ€Œκ²Œ λœλ‹€. κΈ°μ‘΄ 파일이 λ³΅μ‚¬λ˜λŠ” 것이 μ•„λ‹ˆλ‹€.

ν•˜λ“œ 링크가 되면 ν•΄λ‹Ή μ•„μ΄λ…Έλ“œμ˜ reference countλ₯Ό 1 μ˜¬λ €μ€€λ‹€.

ν•˜λ“œ 링크된 νŒŒμΌμ„ μ‚­μ œν•œλ‹€λŠ” 말은 μ•„μ΄λ…Έλ“œμ™€ μ—°κ²°λœ 파일과의 연결을 λŠμ–΄λ²„λ¦°λ‹€λŠ” 것이닀.

μ• μ΄ˆμ— μ•„μ΄λ…Έλ“œλŠ” ν•˜λ‚˜μ˜ 파일 μ‹œμŠ€ν…œ λ‚΄μ—μ„œλ§Œ μœ μΌν•˜κ²Œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, ν•˜λ“œ 링크도 λ§ˆμ°¬κ°€μΉ˜λ‘œ 같은 파일 μ‹œμŠ€ν…œ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€. 즉 μ„œλ‘œ λ‹€λ₯Έ λ””μŠ€ν¬ νŒŒν‹°μ…˜μ— μžˆλŠ” νŒŒμΌμ—κ²ŒλŠ” ν•˜λ“œ 링크λ₯Ό κ±Έ μˆ˜κ°€ μ—†λ‹€. κ²Œλ‹€κ°€ 디렉토리에 λŒ€ν•΄μ„œλŠ” ν•˜λ“œ 링크λ₯Ό κ±Έ μˆ˜κ°€ μ—†λ‹€. 디렉토리 ꡬ쑰가 사이클을 μ΄λ£¨λŠ” 것을 막기 μœ„ν•΄μ„œλ‹€.

마치 λ°”λ‘œκ°€κΈ°μ™€ κ°™λ‹€ ν•˜λ“œ 링크의 κ²½μš°μ—λŠ” ν•˜λ‚˜μ˜ νŒŒμΌμ— μ ‘κ·Όν•  수 μžˆλŠ” 연결을 ν•˜λ‚˜ 더 λ§Œλ“œλŠ” 것일 뿐이닀. 이에 λ°˜ν•΄ 심볼릭 λ§ν¬λŠ” μƒˆλ‘œμš΄ μœ ν˜•μ˜ νŒŒμΌμ„ μƒˆλ‘œ λ§Œλ“€κ³ , 심볼릭 링크 μžμ‹ μ΄ 자체적인 μ•„μ΄λ…Έλ“œλ₯Ό 가진닀.

μƒˆ νŒŒμΌμ„ λ§Œλ“€κ³  μ—°κ²°ν•˜λŠ” 파일의 경둜λͺ…을 μ €μž₯ν•œλ‹€. 즉, μ•„μ΄λ…Έλ“œλ₯Ό κ°€λ¦¬ν‚€λŠ” 것이 μ•„λ‹ˆλΌ 원본 파일의 이름을 가리킨닀.

λ”°λΌμ„œ 심볼릭 λ§ν¬λŠ” 원본 파일의 μ•„μ΄λ…Έλ“œμ˜ reference count에 영ν–₯을 주지 μ•ŠλŠ”λ‹€. λ‹€μ‹œ 말해, 심볼릭 링크가 μ‚­μ œλœλ‹€κ³  해도 원본 νŒŒμΌμ—λŠ” λ³€ν™”κ°€ μ—†λ‹€.

μ†Œν”„νŠΈ λ§ν¬λŠ” 파일뿐만 μ•„λ‹ˆλΌ 디렉터리도 링킹 κ°€λŠ₯ν•˜λ‹€. λ˜ν•œ μžμ‹ μ˜ 파일 μ‹œμŠ€ν…œ λ°”κΉ₯의 파일 ν˜Ήμ€ 디렉터리도 링크할 수 μžˆλ‹€.

ν•˜λ“œ 링크둜 λ§Œλ“  파일의 경우 μ›λž˜ 원본 파일이 μ§€μ›Œμ Έλ„ μ–΄μ°¨ν”Ό μ•„μ΄λ…Έλ“œ 자체λ₯Ό 가리킀기 λ•Œλ¬Έμ— 데이터에 μ ‘κ·Όν•˜λŠ” 데에 변함이 μ—†λ‹€. ν•˜μ§€λ§Œ μ†Œν”„νŠΈ 링크의 경우 원본 νŒŒμΌμ„ μ§€μš°λ©΄ μ†Œν”„νŠΈ 링크가 κ°€λ¦¬ν‚€λŠ” 파일이 μ—†μ–΄μ§€λŠ” κ²ƒμ΄λ―€λ‘œ 데이터에 μ ‘κ·Όν•  μˆ˜λ„ μ—†κ²Œ λœλ‹€. μ΄λ ‡κ²Œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ κ°€λ¦¬ν‚€λŠ” μ†Œν”„νŠΈ 링크λ₯Ό orphaned, μ•„λ‹ˆλ©΄ dangling link라고 λΆ€λ₯Έλ‹€.

VFS(Virtual File System)

가상 파일 μ‹œμŠ€ν…œ(Virtual File System, VFS)은 운영 μ²΄μ œμ—μ„œ λ‹€μ–‘ν•œ 파일 μ‹œμŠ€ν…œμ„ ν†΅ν•©ν•˜μ—¬ μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 계측이닀. VFSλŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ 파일 및 디렉터리λ₯Ό μ‘°μž‘ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” ν‘œμ€€ μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

  • λ‹€μ–‘ν•œ 파일 μ‹œμŠ€ν…œ 지원: VFSλŠ” μ—¬λŸ¬ 파일 μ‹œμŠ€ν…œμ„ μ§€μ›ν•˜λ―€λ‘œ λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 파일 μ‹œμŠ€ν…œμ— λŒ€ν•΄ μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€. 즉, 이λ₯Ό 톡해 μ‘μš© ν”„λ‘œκ·Έλž¨μ€ 파일 μ‹œμŠ€ν…œ μ’…λ₯˜μ— ꡬ애받지 μ•Šκ³  λ™μΌν•œ λ°©μ‹μœΌλ‘œ νŒŒμΌμ„ λ‹€λ£° 수 μžˆλ‹€.
  • ν™•μž₯μ„±: μƒˆλ‘œμš΄ 파일 μ‹œμŠ€ν…œμ„ μΆ”κ°€ν•˜κΈ° μœ„ν•΄ κΈ°μ‘΄ VFS μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ κ°„λ‹¨ν•˜κ²Œ 지원할 수 μžˆλ‹€.
  • 파일 μ‹œμŠ€ν…œ κ°„μ˜ μƒν˜Έ μš΄μš©μ„±: VFSλŠ” λ‹€μ–‘ν•œ 파일 μ‹œμŠ€ν…œ κ°„μ˜ μƒν˜Έ μš΄μš©μ„±μ„ μ œκ³΅ν•œλ‹€. 즉, μ„œλ‘œ λ‹€λ₯Έ 파일 μ‹œμŠ€ν…œμ— μ†ν•œ νŒŒμΌλ“€μ„ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 ν†΅ν•©ν•˜μ—¬ λ‹€λ£° 수 μžˆλ‹€.

VFSλŠ” λ‹€μ–‘ν•œ 운영 μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λ©°, 각 운영 μ²΄μ œμ— 맞게 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ¦¬λˆ…μŠ€μ—μ„œλŠ” VFSλ₯Ό 톡해 ext4, NTFS, FAT λ“±μ˜ 파일 μ‹œμŠ€ν…œμ„ μ§€μ›ν•˜λ©°, 각 파일 μ‹œμŠ€ν…œμ€ VFS의 ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ μΌκ΄€λœ λ°©μ‹μœΌλ‘œ 파일 μ‘°μž‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

FAT(File Allocation Table) File System

FAT 기반 파일 μ‹œμŠ€ν…œλ“€μ€ 파일 μ‹œμŠ€ν…œ λ‚΄λΆ€μ˜ λͺ¨λ“  ν΄λŸ¬μŠ€ν„° ν•˜λ‚˜ν•˜λ‚˜μ— λŒ€ν•œ ν•­λͺ©μ„ FAT ν…Œμ΄λΈ”μ—μ„œ κ΄€λ¦¬ν•œλ‹€. 이λ₯Ό 톡해 각각의 ν΄λŸ¬μŠ€ν„°μ— μ €μž₯λ˜μ–΄ μžˆλŠ” 정보가 무엇인지 μ•Œ 수 μžˆλ‹€.

FAT ν…Œμ΄λΈ”μ€ ν•˜λ‚˜μ˜ 단일 리슀트(λ°°μ—΄)둜 κ΄€λ¦¬λ˜λ©°, 이 ν…Œμ΄λΈ”μ„ 톡해 μ–΄λ–€ ν΄λŸ¬μŠ€ν„°κ°€ μ–΄λ–€ νŒŒμΌμ—μ„œ μ‚¬μš©λ˜λŠ”μ§€, ν˜Ήμ€ μ–΄λ–€ 디렉토리가 μ‘΄μž¬ν•˜λŠ”μ§€ 등을 μ•Œ 수 μžˆλ‹€.

파일의 메타데이터가 μ €μž₯λ˜λŠ” 방식

  • FAT 디렉토리 ν…Œμ΄λΈ”μ˜ 각 μ—”νŠΈλ¦¬
    • 파일 이름
    • μ‹œμž‘ ν΄λŸ¬μŠ€ν„° 번호
    • 길이
  • FAT ν…Œμ΄λΈ”
    • ν΄λŸ¬μŠ€ν„°μ˜ ν• λ‹Ή μ—¬λΆ€
    • ν•΄λ‹Ή ν΄λŸ¬μŠ€ν„° μ‚¬μš© 파일

μž₯점

  1. μƒˆλ‘œμš΄ νŒŒμΌμ„ λ§Œλ“€κΈ°κ°€ 쉽닀. λΆ€λͺ¨ 디렉토리 ν…Œμ΄λΈ”κ³Ό FAT의 Busy ν•„λ“œ λ‚΄μš©λ§Œ μˆ˜μ •ν•˜λ©΄ λœλ‹€.
  2. 파일의 크기λ₯Ό ν‚€μš°λŠ” 것도 쉽닀. FAT의 Next ν•„λ“œλ§Œ μˆ˜μ •ν•΄μ£Όλ©΄ λœλ‹€.
  3. 곡간 ν™œμš©μ„±λ„ 높아진닀. νŒŒμΌμ„ μ„Ήν„° λ‹¨μœ„λ‘œ μͺΌκ°œμ–΄ ν™œμš©ν•  수 μžˆμ–΄μ„œ μ™ΈλΆ€ λ‹¨νŽΈν™”λ₯Ό μ˜ˆλ°©ν•  수 μžˆλ‹€.
  4. 막 κ·Έλ ‡κ²Œ λΉ λ₯΄μ§„ μ•Šλ”λΌλ„ Random Accessκ°€ κ°€λŠ₯ν•˜λ‹€.

단점

  1. λͺ¨λ“  λ””μŠ€ν¬ 블둝듀이 각각 ν•˜λ‚˜μ˜ FAT ν•­λͺ©μ„ 가지고 μžˆμœΌλ―€λ‘œ, λ§Œμ•½ ꡉμž₯히 μš©λŸ‰μ΄ 큰 λ””μŠ€ν¬μ˜ κ²½μš°μ—λŠ” FAT의 크기도 ꡉμž₯히 컀질 수 μžˆλ‹€.
  2. 이λ₯Ό 막기 μœ„ν•΄μ„œ 블둝 ν•˜λ‚˜μ˜ 크기λ₯Ό ν‚€μšΈ 수 μžˆμ§€λ§Œ, κ·Έλ ‡κ²Œ 되면 λ‚΄λΆ€ λ‹¨νŽΈν™”κ°€ μ‹¬ν•΄μ§ˆ 수 μžˆλ‹€.

FFS (Fast File System)

초기 λ²„μ „μ˜ UNIX 운영 μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λ˜ 파일 μ‹œμŠ€ν…œμ΄λ‹€. 주둜 4.2BSD와 4.3BSD 운영 μ²΄μ œμ—μ„œ μ‚¬μš©λ˜μ—ˆμœΌλ©°, 이후 λ‹€λ₯Έ 파일 μ‹œμŠ€ν…œμœΌλ‘œ λŒ€μ²΄λ˜μ—ˆλ‹€. FFSλŠ” λ””μŠ€ν¬μ˜ 블둝 ꡬ쑰, 파일 ν• λ‹Ή 방식 및 메타데이터 ꡬ성 등을 효율적으둜 μ„€κ³„ν•˜μ—¬ λΉ λ₯Έ 파일 μ‹œμŠ€ν…œ μ„±λŠ₯을 μ œκ³΅ν•˜λŠ” 것이 λͺ©ν‘œμ˜€λ‹€.

FFSλŠ” 기본적으둜 μ•„μ΄λ…Έλ“œ 기반 파일 μ‹œμŠ€ν…œμœΌλ‘œ, 파일과 λ””λ ‰ν„°λ¦¬μ˜ 메타데이터와 데이터 블둝을 μ•„μ΄λ…Έλ“œμ— μ €μž₯ν•œλ‹€. μ•„μ΄λ…Έλ“œλŠ” 파일의 속성 (크기, μ†Œμœ μž, κΆŒν•œ λ“±)을 μ €μž₯ν•˜κ³ , 데이터 λΈ”λ‘μ˜ μœ„μΉ˜λ₯Ό 가리킨닀. FFSλŠ” μ—¬λŸ¬ 개의 μ•„μ΄λ…Έλ“œλ₯Ό κ°–λŠ” 파일 μ‹œμŠ€ν…œμ„ μ§€μ›ν•˜λ©°, μ•„μ΄λ…Έλ“œλ₯Ό 인덱슀둜 μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ— λŒ€ν•œ 접근을 κ°€λŠ₯ν•˜κ²Œν•œλ‹€.

EXT (Extended File System)

λ¦¬λˆ…μŠ€ 운영 μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λŠ” 파일 μ‹œμŠ€ν…œμ΄λ‹€. 초기 버전인 EXT와 이후 κ°œμ„ λœ 버전인 EXT2, EXT3, EXT4κ°€ μžˆμŠ΅λ‹ˆλ‹€. EXT2λΆ€ν„°λŠ” 저널링(journaling) κΈ°λŠ₯이 λ„μž…λ˜μ–΄ 파일 μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±κ³Ό 볡ꡬ κΈ°λŠ₯이 ν–₯μƒλ˜μ—ˆλ‹€.

EXT 파일 μ‹œμŠ€ν…œμ€ 블둝 κ·Έλ£Ή(block group)μ΄λΌλŠ” λ‹¨μœ„λ‘œ λ””μŠ€ν¬λ₯Ό κ΄€λ¦¬ν•œλ‹€. 각 블둝 그룹은 μ—¬λŸ¬ 개의 블둝 κ·Έλ£Ή λ””μŠ€ν¬λ¦½ν„°, μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”, 데이터 블둝 그룹으둜 κ΅¬μ„±λœλ‹€. μ•„μ΄λ…Έλ“œ ν…Œμ΄λΈ”μ€ 파일과 λ””λ ‰ν„°λ¦¬μ˜ 메타데이터λ₯Ό μ €μž₯ν•˜κ³ , 데이터 블둝 그룹은 μ‹€μ œ 파일의 데이터λ₯Ό μ €μž₯ν•œλ‹€.

EXT 파일 μ‹œμŠ€ν…œμ€ 저널링을 톡해 파일 μ‹œμŠ€ν…œμ˜ 일관성과 볡ꡬ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 저널링은 파일 μ‹œμŠ€ν…œμ˜ λ³€κ²½ 사항을 둜그 ν˜•μ‹μœΌλ‘œ κΈ°λ‘ν•˜μ—¬ μ‹œμŠ€ν…œμ΄ κ°‘μž‘μŠ€λŸ½κ²Œ μ’…λ£Œλ˜λŠ” λ“±μ˜ μƒν™©μ—μ„œλ„ λ°μ΄ν„°μ˜ 손싀을 μ΅œμ†Œν™”ν•  수 μžˆλ„λ‘ ν•œλ‹€. 이λ₯Ό 톡해 파일 μ‹œμŠ€ν…œμ˜ μ‹ λ’°μ„±κ³Ό μ•ˆμ •μ„±μ΄ ν–₯μƒλ˜μ—ˆλ‹€.

EXT 파일 μ‹œμŠ€ν…œμ€ 기본적으둜 λ””μŠ€ν¬ μ‚¬μš©λŸ‰, 파일 μ‹œμŠ€ν…œ 크기, 파일 및 λ””λ ‰ν„°λ¦¬μ˜ μ œν•œ λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯κ³Ό μ˜΅μ…˜μ„ μ§€μ›ν•œλ‹€. κ°œμ„ λœ 버전인 EXT4λŠ” EXT3의 κΈ°λŠ₯을 ν™•μž₯ν•˜κ³  μ„±λŠ₯을 κ°œμ„ ν•˜μ˜€λ‹€.

LFS(Log-structured File System)

LFS(Log-structured File System)λŠ” λ””μŠ€ν¬μ˜ 효율적인 μ‚¬μš©μ„ μœ„ν•΄ μ„€κ³„λœ 파일 μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. LFSλŠ” 기쑴의 파일 μ‹œμŠ€ν…œκ³ΌλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•œλ‹€.

LFS의 μ£Όμš” μ•„μ΄λ””μ–΄λŠ” 둜그 ꡬ쑰화닀. LFSλŠ” λͺ¨λ“  파일 μ‹œμŠ€ν…œ μž‘μ—…μ„ 둜그둜 κΈ°λ‘ν•˜κ³  순차적으둜 λ””μŠ€ν¬μ— μ €μž₯ν•œλ‹€. 이 λ‘œκ·ΈλŠ” μ‹œμŠ€ν…œμ˜ λͺ¨λ“  파일 μ‹œμŠ€ν…œ μž‘μ—…(예: 파일 생성, μˆ˜μ •, μ‚­μ œ)을 κΈ°λ‘ν•˜λŠ” 순차적인 μ—°μ†λœ 데이터 블둝이닀.

μž₯점

  • 순차적인 λ””μŠ€ν¬ μ•‘μ„ΈμŠ€: LFSλŠ” 데이터λ₯Ό 순차적으둜 κΈ°λ‘ν•˜κ³  순차적으둜 μ½μ–΄μ˜€λ―€λ‘œ λ””μŠ€ν¬ μ•‘μ„ΈμŠ€ νŒ¨ν„΄μ΄ μˆœμ°¨μ μž…λ‹ˆλ‹€. μ΄λŠ” λ””μŠ€ν¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” μž₯점을 κ°€μ§‘λ‹ˆλ‹€.
  • 가비지 μ»¬λ ‰μ…˜μ— μ˜ν•œ μ™ΈλΆ€ λ‹¨νŽΈν™” κ°μ†Œ: 가비지 μ»¬λ ‰μ…˜μ„ 톡해 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 데이터λ₯Ό μ •λ¦¬ν•˜λ―€λ‘œ μ™ΈλΆ€ λ‹¨νŽΈν™”λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λΉ λ₯Έ 파일 μ‹œμŠ€ν…œ μž‘μ—…: LFSλŠ” 둜그둜 λͺ¨λ“  μž‘μ—…μ„ κΈ°λ‘ν•˜κΈ° λ•Œλ¬Έμ— 파일 μ‹œμŠ€ν…œ μž‘μ—…μ΄ λΉ λ₯΄κ²Œ μˆ˜ν–‰λ  수 μžˆμŠ΅λ‹ˆλ‹€.

단점

  • 읽기 μ„±λŠ₯: LFSλŠ” 순차적인 λ””μŠ€ν¬ μ•‘μ„ΈμŠ€ νŒ¨ν„΄μ„ κ°€μ§€λ―€λ‘œ 랜덀 읽기 μ•‘μ„ΈμŠ€μ—μ„œλŠ” μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 가비지 μ»¬λ ‰μ…˜ μ˜€λ²„ν—€λ“œ: 가비지 μ»¬λ ‰μ…˜ μž‘μ—…μ€ μ‹œμŠ€ν…œ μžμ›μ„ μ†Œλͺ¨ν•˜λ―€λ‘œ 일뢀 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 메타데이터 관리: LFSμ—μ„œ 메타데이터 κ΄€λ¦¬λŠ” μ€‘μš”ν•œ μΈ‘λ©΄μž…λ‹ˆλ‹€. 효율적인 메타데이터 관리λ₯Ό μœ„ν•΄ 좔가적인 λ…Έλ ₯이 ν•„μš”ν•©λ‹ˆλ‹€.
profile
^^*

0개의 λŒ“κΈ€