[{"data":1,"prerenderedAt":3109},["ShallowReactive",2],{"note:cs\u002Fos\u002Fnote\u002Fchap12":3,"site-search-catalogue":3108},{"id":4,"title":5,"body":6,"description":2991,"extension":3100,"meta":3101,"navigation":3103,"path":3104,"seo":3105,"stem":3106,"__hash__":3107},"notes\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap12.md","Chap. 12 Note",{"type":7,"value":8,"toc":2990},"minimark",[9,14,19,23,36,39,50,53,73,76,80,106,109,123,126,137,140,166,170,178,182,185,188,211,214,234,237,240,297,300,323,327,330,338,341,358,361,369,372,389,393,396,413,416,424,427,441,444,452,456,458,484,487,498,500,511,513,524,527,541,545,548,559,562,573,576,587,589,600,603,614,616,627,631,633,644,647,665,667,681,683,694,697,705,709,711,725,727,738,740,748,750,764,768,772,786,790,816,820,823,843,847,867,871,899,903,917,921,924,935,938,941,952,955,969,972,983,986,1012,1015,1032,1035,1039,1053,1056,1073,1076,1093,1096,1104,1108,1119,1123,1137,1141,1144,1152,1155,1158,1224,1227,1235,1238,1249,1252,1269,1273,1276,1287,1290,1293,1304,1307,1318,1321,1325,1342,1346,1360,1362,1370,1372,1383,1387,1397,1399,1407,1409,1417,1420,1431,1435,1438,1446,1449,1460,1464,1475,1477,1485,1487,1495,1499,1510,1514,1522,1525,1528,1542,1545,1559,1562,1588,1591,1595,1597,1608,1610,1621,1623,1634,1638,1640,1653,1655,1666,1668,1682,1686,1688,1699,1701,1715,1717,1728,1732,1735,1739,1762,1765,1770,1774,1785,1787,1795,1797,1808,1812,1826,1830,1855,1859,1873,1877,1880,1888,1891,1908,1911,1922,1926,1930,1992,1996,2010,2013,2048,2052,2069,2072,2109,2111,2122,2126,2137,2141,2144,2178,2182,2186,2200,2204,2224,2228,2262,2266,2269,2298,2301,2318,2322,2336,2340,2357,2361,2398,2402,2428,2432,2436,2444,2448,2515,2519,2551,2555,2566,2570,2573,2607,2611,2631,2635,2638,2704,2708,2711,2745,2748,2762,2766,2770,2778,2782,2793,2797,2832,2836,2850,2854,2865,2869,2886,2890,2893,2913,2916],[10,11,13],"h1",{"id":12},"chapter-12-file-management","Chapter 12 File Management",[15,16,18],"h2",{"id":17},"_121-overview文件与文件管理系统","12.1 Overview：文件与文件管理系统",[20,21,22],"h3",{"id":22},"文件系统的核心作用",[24,25,26,30,33],"ul",{},[27,28,29],"li",{},"文件系统是操作系统中用户最直接接触的部分之一。",[27,31,32],{},"文件用于长期保存输入、输出和程序运行结果。",[27,34,35],{},"文件具有独立于进程的生命周期：进程结束后文件仍可存在。",[20,37,38],{"id":38},"文件的三个重要性质",[24,40,41,44,47],{},[27,42,43],{},"长期存在：文件存储在磁盘等二级存储器上，不随用户注销或进程结束而消失。",[27,45,46],{},"可共享：文件有名字和访问权限，可被多个进程或用户受控共享。",[27,48,49],{},"有结构：文件内部可以有记录、字段等结构；文件之间也可通过目录形成层次结构。",[20,51,52],{"id":52},"文件系统常见操作",[24,54,55,58,61,64,67,70],{},[27,56,57],{},"Create：创建文件，并放入文件结构中。",[27,59,60],{},"Delete：删除文件。",[27,62,63],{},"Open：进程打开文件，之后才能读写。",[27,65,66],{},"Close：关闭文件，进程不再访问它。",[27,68,69],{},"Read：读取文件的全部或部分内容。",[27,71,72],{},"Write：写入或修改文件内容，可扩展文件大小。",[20,74,75],{"id":75},"文件属性",[77,78,79],"p",{},"文件系统通常维护以下属性：",[24,81,82,85,88,91,94,97,100,103],{},[27,83,84],{},"文件所有者",[27,86,87],{},"创建时间",[27,89,90],{},"最近修改时间",[27,92,93],{},"最近访问时间",[27,95,96],{},"文件大小",[27,98,99],{},"文件类型",[27,101,102],{},"访问权限",[27,104,105],{},"存储位置",[20,107,108],{"id":108},"数据层次结构",[24,110,111,114,117,120],{},[27,112,113],{},"Field 字段：最基本的数据元素，只包含一个值，如姓名、日期、传感器读数。",[27,115,116],{},"Record 记录：一组相关字段，可被应用程序作为一个单位处理。",[27,118,119],{},"File 文件：一组相似记录的集合，用户和程序按名字引用。",[27,121,122],{},"Database 数据库：相关数据的集合，强调数据之间关系明确，并可被多个应用共享。",[20,124,125],{"id":125},"文件与数据库的区别",[24,127,128,131,134],{},[27,129,130],{},"文件通常是一组相似记录的集合。",[27,132,133],{},"数据库不仅包含数据，还显式维护数据之间的关系。",[27,135,136],{},"数据库通常由独立的 DBMS 管理，但底层仍依赖操作系统文件管理功能。",[20,138,139],{"id":139},"文件可支持的典型记录级操作",[24,141,142,145,148,151,154,157,160,163],{},[27,143,144],{},"顺序检索所有记录。",[27,146,147],{},"检索单条记录。",[27,149,150],{},"检索下一条记录。",[27,152,153],{},"检索上一条记录。",[27,155,156],{},"插入新记录。",[27,158,159],{},"删除记录。",[27,161,162],{},"更新记录。",[27,164,165],{},"按条件检索多条记录。",[20,167,169],{"id":168},"unix-类系统的特殊点","UNIX 类系统的特殊点",[24,171,172,175],{},[27,173,174],{},"UNIX 内核把普通文件看作字节流。",[27,176,177],{},"字段、记录等逻辑结构由应用程序自己解释，不由操作系统强制规定。",[20,179,181],{"id":180},"文件管理系统-file-management-system","文件管理系统 File Management System",[77,183,184],{},"文件管理系统是一组系统软件，为用户和应用程序提供文件服务。",[77,186,187],{},"主要目标：",[24,189,190,193,196,199,202,205,208],{},[27,191,192],{},"满足用户的数据管理需求。",[27,194,195],{},"尽可能保证文件数据有效。",[27,197,198],{},"优化系统吞吐量和用户响应时间。",[27,200,201],{},"支持多种存储设备。",[27,203,204],{},"减少或避免数据丢失。",[27,206,207],{},"为用户进程提供标准 I\u002FO 接口。",[27,209,210],{},"在多用户系统中支持多用户文件访问。",[20,212,213],{"id":213},"文件管理系统的基本用户需求",[24,215,216,219,222,225,228,231],{},[27,217,218],{},"用户能创建、删除、读、写、修改文件。",[27,220,221],{},"用户可受控访问其他用户文件。",[27,223,224],{},"用户可控制别人对自己文件的访问类型。",[27,226,227],{},"用户可在文件之间移动数据。",[27,229,230],{},"用户可备份和恢复文件。",[27,232,233],{},"用户可通过文件名而非数字编号访问文件。",[20,235,236],{"id":236},"文件系统软件层次结构",[77,238,239],{},"从低到高：",[24,241,242,253,264,275,286],{},[27,243,244,245],{},"Device Drivers 设备驱动：\n",[24,246,247,250],{},[27,248,249],{},"直接与设备、控制器或通道通信。",[27,251,252],{},"启动 I\u002FO 操作并处理中断或完成事件。",[27,254,255,256],{},"Basic File System \u002F Physical I\u002FO 基本文件系统：\n",[24,257,258,261],{},[27,259,260],{},"处理磁盘或磁带上的数据块。",[27,262,263],{},"关心块的位置和内存缓冲，不理解文件内容。",[27,265,266,267],{},"Basic I\u002FO Supervisor 基本 I\u002FO 管理器：\n",[24,268,269,272],{},[27,270,271],{},"负责文件 I\u002FO 的启动和结束。",[27,273,274],{},"维护设备 I\u002FO、调度、文件状态、缓冲区和空间分配。",[27,276,277,278],{},"Logical I\u002FO 逻辑 I\u002FO：\n",[24,279,280,283],{},[27,281,282],{},"面向记录而不是物理块。",[27,284,285],{},"维护文件的基本数据。",[27,287,288,289],{},"Access Method 访问方法：\n",[24,290,291,294],{},[27,292,293],{},"最接近用户和应用。",[27,295,296],{},"为不同文件结构提供统一接口，如顺序访问、索引访问、散列访问。",[20,298,299],{"id":299},"文件管理主要功能",[24,301,302,305,308,311,314,317,320],{},[27,303,304],{},"目录管理：通过目录定位文件并维护属性。",[27,306,307],{},"访问控制：限制哪些用户可以怎样访问文件。",[27,309,310],{},"记录处理：把用户看到的记录映射到文件操作。",[27,312,313],{},"块管理：把逻辑记录组织为物理块。",[27,315,316],{},"二级存储管理：分配和回收磁盘块。",[27,318,319],{},"I\u002FO 调度：提升磁盘访问性能。",[27,321,322],{},"空闲空间管理：记录哪些磁盘块尚未使用。",[15,324,326],{"id":325},"_122-file-organization-and-access文件组织与访问","12.2 File Organization and Access：文件组织与访问",[20,328,329],{"id":329},"文件组织的含义",[24,331,332,335],{},[27,333,334],{},"文件组织指记录的逻辑结构，取决于记录的访问方式。",[27,336,337],{},"物理组织还受到记录阻塞和文件分配策略影响。",[20,339,340],{"id":340},"选择文件组织的重要标准",[24,342,343,346,349,352,355],{},[27,344,345],{},"访问时间短。",[27,347,348],{},"易于更新。",[27,350,351],{},"节省存储空间。",[27,353,354],{},"维护简单。",[27,356,357],{},"可靠性高。",[77,359,360],{},"这些标准可能冲突：",[24,362,363,366],{},[27,364,365],{},"索引能加快访问，但会增加冗余和空间开销。",[27,367,368],{},"顺序结构简单省空间，但随机访问慢。",[20,370,371],{"id":371},"五种基本文件组织",[24,373,374,377,380,383,386],{},[27,375,376],{},"Pile 堆文件。",[27,378,379],{},"Sequential File 顺序文件。",[27,381,382],{},"Indexed Sequential File 索引顺序文件。",[27,384,385],{},"Indexed File 索引文件。",[27,387,388],{},"Direct \u002F Hashed File 直接文件或散列文件。",[20,390,392],{"id":391},"pile-堆文件","Pile 堆文件",[77,394,395],{},"特点：",[24,397,398,401,404,407,410],{},[27,399,400],{},"最简单的文件组织。",[27,402,403],{},"数据按到达顺序收集。",[27,405,406],{},"每条记录可以字段不同、顺序不同。",[27,408,409],{},"字段通常需要自描述，包括字段名和值。",[27,411,412],{},"字段长度可通过分隔符、长度子字段或默认规则表示。",[77,414,415],{},"访问方式：",[24,417,418,421],{},[27,419,420],{},"没有结构，只能穷尽搜索。",[27,422,423],{},"查找某字段或某值时，可能必须扫描整个文件。",[77,425,426],{},"优点：",[24,428,429,432,435,438],{},[27,430,431],{},"易于插入和更新。",[27,433,434],{},"适合收集原始数据。",[27,436,437],{},"适合数据大小和结构变化很大的场景。",[27,439,440],{},"空间利用较好。",[77,442,443],{},"缺点：",[24,445,446,449],{},[27,447,448],{},"查找效率差。",[27,450,451],{},"不适合大多数需要快速检索的应用。",[20,453,455],{"id":454},"sequential-file-顺序文件","Sequential File 顺序文件",[77,457,395],{},[24,459,460,463,466,469,472,475,478,481],{},[27,461,462],{},"最常见的文件结构。",[27,464,465],{},"记录格式固定。",[27,467,468],{},"所有记录长度相同。",[27,470,471],{},"字段数量、字段顺序和字段长度固定。",[27,473,474],{},"只需存储字段值，字段名和字段长度作为文件结构属性保存。",[27,476,477],{},"通常有一个 key field 关键字段。",[27,479,480],{},"关键字段唯一标识记录。",[27,482,483],{},"记录按关键字段顺序存储。",[77,485,486],{},"适用场景：",[24,488,489,492,495],{},[27,490,491],{},"批处理应用。",[27,493,494],{},"每次处理全部或大部分记录，如工资、账单。",[27,496,497],{},"唯一容易同时存储在磁带和磁盘上的组织方式。",[77,499,426],{},[24,501,502,505,508],{},[27,503,504],{},"结构简单。",[27,506,507],{},"顺序处理效率高。",[27,509,510],{},"适合全文件扫描。",[77,512,443],{},[24,514,515,518,521],{},[27,516,517],{},"单条记录查询慢，需要顺序搜索。",[27,519,520],{},"插入新记录困难。",[27,522,523],{},"常用 log file \u002F transaction file 暂存新记录，再周期性批量合并。",[77,525,526],{},"链表式顺序文件：",[24,528,529,532,535,538],{},[27,530,531],{},"每个物理块保存一个或多个记录。",[27,533,534],{},"块中包含指向下一块的指针。",[27,536,537],{},"插入时只需修改指针。",[27,539,540],{},"代价是额外指针开销和处理开销。",[20,542,544],{"id":543},"indexed-sequential-file-索引顺序文件","Indexed Sequential File 索引顺序文件",[77,546,547],{},"核心思想：",[24,549,550,553,556],{},[27,551,552],{},"保留顺序文件按关键字排序的特点。",[27,554,555],{},"增加索引以支持随机访问。",[27,557,558],{},"增加溢出文件 overflow file 处理插入。",[77,560,561],{},"结构：",[24,563,564,567,570],{},[27,565,566],{},"主文件按关键字段顺序排列。",[27,568,569],{},"索引文件包含关键字段和指向主文件的指针。",[27,571,572],{},"溢出文件保存新插入但尚未合并进主文件的记录。",[77,574,575],{},"查找过程：",[24,577,578,581,584],{},[27,579,580],{},"先查索引，找到小于等于目标键的最大索引项。",[27,582,583],{},"根据指针进入主文件附近位置。",[27,585,586],{},"再顺序搜索少量记录。",[77,588,426],{},[24,590,591,594,597],{},[27,592,593],{},"比普通顺序文件大幅减少平均查找时间。",[27,595,596],{},"仍保留顺序处理能力。",[27,598,599],{},"可用多级索引进一步提升效率。",[77,601,602],{},"插入处理：",[24,604,605,608,611],{},[27,606,607],{},"新记录先放入溢出文件。",[27,609,610],{},"前驱记录维护指向溢出记录的指针。",[27,612,613],{},"定期把主文件和溢出文件批量合并。",[77,615,443],{},[24,617,618,621,624],{},[27,619,620],{},"溢出文件过大时性能下降。",[27,622,623],{},"需要定期重组。",[27,625,626],{},"主要仍围绕一个关键字段组织。",[20,628,630],{"id":629},"indexed-file-索引文件","Indexed File 索引文件",[77,632,547],{},[24,634,635,638,641],{},[27,636,637],{},"放弃单一关键字段和顺序性。",[27,639,640],{},"记录通过多个索引访问。",[27,642,643],{},"每个可能被搜索的字段都可有索引。",[77,645,646],{},"索引类型：",[24,648,649,657],{},[27,650,651,652],{},"Exhaustive Index 穷尽索引：\n",[24,653,654],{},[27,655,656],{},"每条记录都有一个索引项。",[27,658,659,660],{},"Partial Index 部分索引：\n",[24,661,662],{},[27,663,664],{},"只为包含某字段的记录建立索引。",[77,666,426],{},[24,668,669,672,675,678],{},[27,670,671],{},"可按多个属性高效查询。",[27,673,674],{},"记录位置不受限制。",[27,676,677],{},"支持变长记录。",[27,679,680],{},"适合查询频繁、实时性强的应用。",[77,682,443],{},[24,684,685,688,691],{},[27,686,687],{},"新增记录时必须更新相关索引。",[27,689,690],{},"索引维护成本高。",[27,692,693],{},"全文件顺序处理不如顺序文件自然。",[77,695,696],{},"典型应用：",[24,698,699,702],{},[27,700,701],{},"航空订票系统。",[27,703,704],{},"库存控制系统。",[20,706,708],{"id":707},"direct-hashed-file-直接文件或散列文件","Direct \u002F Hashed File 直接文件或散列文件",[77,710,395],{},[24,712,713,716,719,722],{},[27,714,715],{},"利用磁盘可直接访问已知地址块的能力。",[27,717,718],{},"每条记录仍需要关键字段。",[27,720,721],{},"不强调记录顺序。",[27,723,724],{},"对关键值应用散列函数，得到记录存储位置。",[77,726,426],{},[24,728,729,732,735],{},[27,730,731],{},"单条记录访问非常快。",[27,733,734],{},"适合固定长度记录。",[27,736,737],{},"适合每次只访问一条记录的场景。",[77,739,443],{},[24,741,742,745],{},[27,743,744],{},"不适合顺序处理。",[27,746,747],{},"需要处理散列冲突，通常配合溢出区。",[77,749,696],{},[24,751,752,755,758,761],{},[27,753,754],{},"目录。",[27,756,757],{},"价格表。",[27,759,760],{},"日程表。",[27,762,763],{},"名单。",[15,765,767],{"id":766},"_123-b-treesb-树","12.3 B-Trees：B 树",[20,769,771],{"id":770},"为什么需要-b-树","为什么需要 B 树",[24,773,774,777,780,783],{},[27,775,776],{},"大文件或数据库中，单级顺序索引仍然太慢。",[27,778,779],{},"多级索引可提高访问效率。",[27,781,782],{},"普通树若不平衡，会出现长短不一的搜索路径。",[27,784,785],{},"B 树是一种平衡的多路搜索树，适合作为大型索引结构。",[20,787,789],{"id":788},"b-树特点","B 树特点",[24,791,792,795,798,801,804,807,810,813],{},[27,793,794],{},"是树结构，没有闭环。",[27,796,797],{},"由节点和叶子组成。",[27,799,800],{},"每个节点包含若干关键字和指向子节点的指针。",[27,802,803],{},"节点内关键字按非降序排列。",[27,805,806],{},"每个节点最多有相同数量的关键字。",[27,808,809],{},"所有叶子在同一层。",[27,811,812],{},"树保持平衡，搜索路径长度稳定。",[27,814,815],{},"分支因子大，因此树通常很矮。",[20,817,819],{"id":818},"b-树的度-d","B 树的度 d",[77,821,822],{},"若 B 树最小度为 d：",[24,824,825,828,831,834,837,840],{},[27,826,827],{},"每个节点最多有 2d - 1 个关键字。",[27,829,830],{},"每个节点最多有 2d 个子指针。",[27,832,833],{},"除根节点外，每个内部节点至少有 d - 1 个关键字。",[27,835,836],{},"除根节点外，每个内部节点至少有 d 个子指针。",[27,838,839],{},"根节点至少有 1 个关键字和 2 个子节点。",[27,841,842],{},"有 k 个指针的非叶节点包含 k - 1 个关键字。",[20,844,846],{"id":845},"b-树查找","B 树查找",[24,848,849,852,855,858,861,864],{},[27,850,851],{},"从根节点开始。",[27,853,854],{},"若关键字在当前节点中，查找成功。",[27,856,857],{},"若目标小于当前节点最小关键字，走最左指针。",[27,859,860],{},"若目标大于当前节点最大关键字，走最右指针。",[27,862,863],{},"若目标位于两个相邻关键字之间，走中间指针。",[27,865,866],{},"重复直到找到或到达叶子。",[20,868,870],{"id":869},"b-树插入","B 树插入",[24,872,873,876,879,893,896],{},[27,874,875],{},"先按查找过程找到应插入的最低层节点。",[27,877,878],{},"若该节点未满，直接按顺序插入。",[27,880,881,882],{},"若节点已满：\n",[24,883,884,887,890],{},[27,885,886],{},"围绕中位关键字分裂节点。",[27,888,889],{},"中位关键字提升到父节点。",[27,891,892],{},"左右两边形成两个节点。",[27,894,895],{},"若父节点也满，继续向上分裂。",[27,897,898],{},"若根节点分裂，则产生新根，树高加 1。",[20,900,902],{"id":901},"b-树优点","B 树优点",[24,904,905,908,911,914],{},[27,906,907],{},"查找、插入、删除效率高。",[27,909,910],{},"树高低，磁盘访问次数少。",[27,912,913],{},"所有叶子同层，性能稳定。",[27,915,916],{},"广泛用于数据库和操作系统文件系统索引。",[15,918,920],{"id":919},"_124-file-directories文件目录","12.4 File Directories：文件目录",[20,922,923],{"id":923},"目录的作用",[24,925,926,929,932],{},[27,927,928],{},"目录保存文件信息，包括属性、位置、所有者等。",[27,930,931],{},"用户通过文件名引用文件，目录负责把文件名映射到实际文件。",[27,933,934],{},"目录本身也是一种文件，但通常只能通过系统例程间接访问。",[20,936,937],{"id":937},"文件目录中的信息",[77,939,940],{},"Basic Information 基本信息：",[24,942,943,946,949],{},[27,944,945],{},"文件名。",[27,947,948],{},"文件类型。",[27,950,951],{},"文件组织方式。",[77,953,954],{},"Address Information 地址信息：",[24,956,957,960,963,966],{},[27,958,959],{},"所在卷 volume。",[27,961,962],{},"起始地址。",[27,964,965],{},"已用大小。",[27,967,968],{},"已分配大小。",[77,970,971],{},"Access Control Information 访问控制信息：",[24,973,974,977,980],{},[27,975,976],{},"文件所有者。",[27,978,979],{},"授权用户信息。",[27,981,982],{},"允许的操作，如读、写、执行、网络传输。",[77,984,985],{},"Usage Information 使用信息：",[24,987,988,991,994,997,1000,1003,1006,1009],{},[27,989,990],{},"创建日期。",[27,992,993],{},"创建者身份。",[27,995,996],{},"最近读取日期。",[27,998,999],{},"最近读取者。",[27,1001,1002],{},"最近修改日期。",[27,1004,1005],{},"最近修改者。",[27,1007,1008],{},"最近备份日期。",[27,1010,1011],{},"当前使用状态，如是否打开、是否锁定、是否已在内存修改但尚未写回磁盘。",[20,1013,1014],{"id":1014},"目录操作",[24,1016,1017,1020,1023,1026,1029],{},[27,1018,1019],{},"Search：搜索目录以定位文件。",[27,1021,1022],{},"Create file：创建文件时添加目录项。",[27,1024,1025],{},"Delete file：删除文件时移除目录项。",[27,1027,1028],{},"List directory：列出目录内容和属性。",[27,1030,1031],{},"Update directory：文件属性变化时更新目录项。",[20,1033,1034],{"id":1034},"目录结构",[1036,1037,1038],"h4",{"id":1038},"简单列表目录",[24,1040,1041,1044,1047,1050],{},[27,1042,1043],{},"每个文件一个目录项。",[27,1045,1046],{},"文件名作为关键字。",[27,1048,1049],{},"实现简单。",[27,1051,1052],{},"缺点是搜索慢、命名冲突严重、不适合多用户和大量文件。",[1036,1054,1055],{"id":1055},"二级目录",[24,1057,1058,1061,1064,1067,1070],{},[27,1059,1060],{},"有一个主目录。",[27,1062,1063],{},"每个用户有自己的用户目录。",[27,1065,1066],{},"文件名只需在单个用户目录内唯一。",[27,1068,1069],{},"更容易做访问控制。",[27,1071,1072],{},"缺点是仍不能很好支持用户按项目、类型等组织文件。",[1036,1074,1075],{"id":1075},"树形目录",[24,1077,1078,1081,1084,1087,1090],{},[27,1079,1080],{},"几乎所有现代系统采用。",[27,1082,1083],{},"主目录下有用户目录。",[27,1085,1086],{},"用户目录下可有子目录和文件。",[27,1088,1089],{},"任意目录都可包含文件或子目录。",[27,1091,1092],{},"支持层次化组织、权限隔离和更自然的命名。",[20,1094,1095],{"id":1095},"目录内部组织",[24,1097,1098,1101],{},[27,1099,1100],{},"小目录可用顺序文件。",[27,1102,1103],{},"大目录若条目很多，用散列结构可减少搜索时间。",[20,1105,1107],{"id":1106},"pathname-路径名","Pathname 路径名",[24,1109,1110,1113,1116],{},[27,1111,1112],{},"从根目录到目标文件的一系列目录名加文件名组成 pathname。",[27,1114,1115],{},"同名文件可以存在于不同目录中，只要路径名唯一。",[27,1117,1118],{},"路径名解决全系统唯一命名问题。",[20,1120,1122],{"id":1121},"working-directory-工作目录","Working Directory 工作目录",[24,1124,1125,1128,1131,1134],{},[27,1126,1127],{},"进程或交互用户当前所在目录。",[27,1129,1130],{},"文件可相对于工作目录引用。",[27,1132,1133],{},"登录或进程创建时，默认工作目录通常是用户主目录。",[27,1135,1136],{},"用户可通过切换目录改变工作目录。",[15,1138,1140],{"id":1139},"_125-file-sharing文件共享","12.5 File Sharing：文件共享",[20,1142,1143],{"id":1143},"文件共享中的两个核心问题",[24,1145,1146,1149],{},[27,1147,1148],{},"Access Rights 访问权限。",[27,1150,1151],{},"Simultaneous Access 同时访问控制。",[20,1153,1154],{"id":1154},"访问权限层次",[77,1156,1157],{},"常见权限从弱到强：",[24,1159,1160,1168,1176,1184,1192,1200,1208,1216],{},[27,1161,1162,1163],{},"None：\n",[24,1164,1165],{},[27,1166,1167],{},"用户甚至不知道文件存在。",[27,1169,1170,1171],{},"Knowledge：\n",[24,1172,1173],{},[27,1174,1175],{},"用户知道文件存在和所有者。",[27,1177,1178,1179],{},"Execution：\n",[24,1180,1181],{},[27,1182,1183],{},"用户可加载并执行程序，但不能复制。",[27,1185,1186,1187],{},"Reading：\n",[24,1188,1189],{},[27,1190,1191],{},"用户可读取文件，包括复制和执行。",[27,1193,1194,1195],{},"Appending：\n",[24,1196,1197],{},[27,1198,1199],{},"用户可在文件末尾追加数据，但不能修改或删除已有内容。",[27,1201,1202,1203],{},"Updating：\n",[24,1204,1205],{},[27,1206,1207],{},"用户可修改、删除、添加文件内容。",[27,1209,1210,1211],{},"Changing Protection：\n",[24,1212,1213],{},[27,1214,1215],{},"用户可改变其他用户的访问权限。",[27,1217,1218,1219],{},"Deletion：\n",[24,1220,1221],{},[27,1222,1223],{},"用户可删除文件。",[77,1225,1226],{},"权限通常构成层次：",[24,1228,1229,1232],{},[27,1230,1231],{},"较强权限隐含较弱权限。",[27,1233,1234],{},"例如 Updating 通常隐含 Knowledge、Execution、Reading、Appending。",[20,1236,1237],{"id":1237},"用户分类",[24,1239,1240,1243,1246],{},[27,1241,1242],{},"Specific user：指定用户。",[27,1244,1245],{},"User groups：用户组。",[27,1247,1248],{},"All：所有用户，即公共文件。",[20,1250,1251],{"id":1251},"同时访问",[24,1253,1254,1257,1260,1263,1266],{},[27,1255,1256],{},"多个用户拥有 append 或 update 权限时，系统必须控制并发。",[27,1258,1259],{},"简单方法：更新时锁定整个文件。",[27,1261,1262],{},"更细粒度方法：只锁定被更新的记录。",[27,1264,1265],{},"本质上类似 readers\u002Fwriters problem。",[27,1267,1268],{},"必须处理互斥和死锁问题。",[15,1270,1272],{"id":1271},"_126-record-blocking记录阻塞","12.6 Record Blocking：记录阻塞",[20,1274,1275],{"id":1275},"记录与块",[24,1277,1278,1281,1284],{},[27,1279,1280],{},"记录是结构化文件的逻辑访问单位。",[27,1282,1283],{},"块是二级存储器 I\u002FO 的基本单位。",[27,1285,1286],{},"文件 I\u002FO 必须把记录组织成块。",[20,1288,1289],{"id":1289},"块大小的权衡",[77,1291,1292],{},"较大块的优点：",[24,1294,1295,1298,1301],{},[27,1296,1297],{},"一次 I\u002FO 可传输更多记录。",[27,1299,1300],{},"顺序处理时减少 I\u002FO 次数。",[27,1302,1303],{},"可能提升整体传输效率。",[77,1305,1306],{},"较大块的缺点：",[24,1308,1309,1312,1315],{},[27,1310,1311],{},"随机访问时可能读入大量无用记录。",[27,1313,1314],{},"需要更大的 I\u002FO 缓冲区。",[27,1316,1317],{},"缓冲管理更复杂。",[20,1319,1320],{"id":1320},"三种记录阻塞方式",[1036,1322,1324],{"id":1323},"fixed-blocking-固定阻塞","Fixed Blocking 固定阻塞",[24,1326,1327,1330,1333,1336,1339],{},[27,1328,1329],{},"使用定长记录。",[27,1331,1332],{},"一个块中存放整数个记录。",[27,1334,1335],{},"块末尾可能有未用空间。",[27,1337,1338],{},"未用空间称为内部碎片。",[27,1340,1341],{},"常用于定长记录的顺序文件。",[1036,1343,1345],{"id":1344},"variable-length-spanned-blocking-变长跨块阻塞","Variable-Length Spanned Blocking 变长跨块阻塞",[24,1347,1348,1351,1354,1357],{},[27,1349,1350],{},"使用变长记录。",[27,1352,1353],{},"记录紧密打包进块中，几乎不浪费空间。",[27,1355,1356],{},"一个记录可以跨越两个块。",[27,1358,1359],{},"需要指针指向后续块。",[77,1361,426],{},[24,1363,1364,1367],{},[27,1365,1366],{},"存储利用率高。",[27,1368,1369],{},"不限制记录大小。",[77,1371,443],{},[24,1373,1374,1377,1380],{},[27,1375,1376],{},"实现复杂。",[27,1378,1379],{},"跨块记录读取可能需要两次 I\u002FO。",[27,1381,1382],{},"更新困难。",[1036,1384,1386],{"id":1385},"variable-length-unspanned-blocking-变长非跨块阻塞","Variable-Length Unspanned Blocking 变长非跨块阻塞",[24,1388,1389,1391,1394],{},[27,1390,1350],{},[27,1392,1393],{},"记录不能跨块。",[27,1395,1396],{},"若剩余空间不足以放下下一条记录，则浪费该空间。",[77,1398,426],{},[24,1400,1401,1404],{},[27,1402,1403],{},"比跨块方式简单。",[27,1405,1406],{},"单条记录不会分散到多个块。",[77,1408,443],{},[24,1410,1411,1414],{},[27,1412,1413],{},"会产生空间浪费。",[27,1415,1416],{},"记录大小不能超过块大小。",[20,1418,1419],{"id":1419},"与虚拟内存的关系",[24,1421,1422,1425,1428],{},[27,1423,1424],{},"虚拟内存系统中，页通常是基本传输单位。",[27,1426,1427],{},"页较小，不适合直接作为大文件 I\u002FO 的块。",[27,1429,1430],{},"一些系统会把多个页组合为一个较大的文件 I\u002FO 块。",[15,1432,1434],{"id":1433},"_127-secondary-storage-management二级存储管理","12.7 Secondary Storage Management：二级存储管理",[20,1436,1437],{"id":1437},"两个基本任务",[24,1439,1440,1443],{},[27,1441,1442],{},"为文件分配磁盘空间。",[27,1444,1445],{},"跟踪哪些磁盘空间仍可分配。",[20,1447,1448],{"id":1448},"文件分配需要考虑的问题",[24,1450,1451,1454,1457],{},[27,1452,1453],{},"创建文件时是否一次分配最大空间？",[27,1455,1456],{},"分配单位是一个块、多个连续块，还是整个文件？",[27,1458,1459],{},"用什么数据结构跟踪文件已分配的部分？",[20,1461,1463],{"id":1462},"preallocation-预分配","Preallocation 预分配",[24,1465,1466,1469,1472],{},[27,1467,1468],{},"创建文件时声明最大大小。",[27,1470,1471],{},"一次分配所需空间。",[27,1473,1474],{},"适合能预估文件大小的场景，如编译输出、文件传输。",[77,1476,426],{},[24,1478,1479,1482],{},[27,1480,1481],{},"运行时分配开销小。",[27,1483,1484],{},"可提高连续性。",[77,1486,443],{},[24,1488,1489,1492],{},[27,1490,1491],{},"很多应用无法准确预测最大文件大小。",[27,1493,1494],{},"用户容易高估大小，造成空间浪费。",[20,1496,1498],{"id":1497},"dynamic-allocation-动态分配","Dynamic Allocation 动态分配",[24,1500,1501,1504,1507],{},[27,1502,1503],{},"文件增长时按需分配空间。",[27,1505,1506],{},"更灵活，减少预留浪费。",[27,1508,1509],{},"但可能导致文件分散，影响性能。",[20,1511,1513],{"id":1512},"portion-分配片段","Portion 分配片段",[24,1515,1516,1519],{},[27,1517,1518],{},"portion 是连续的一组已分配块。",[27,1520,1521],{},"可以小到一个块，大到整个文件。",[20,1523,1524],{"id":1524},"分配片段大小的权衡",[77,1526,1527],{},"大连续片段：",[24,1529,1530,1533,1536,1539],{},[27,1531,1532],{},"顺序访问性能好。",[27,1534,1535],{},"分配表小。",[27,1537,1538],{},"空间重用困难。",[27,1540,1541],{},"可能产生外部碎片。",[77,1543,1544],{},"小固定块：",[24,1546,1547,1550,1553,1556],{},[27,1548,1549],{},"灵活。",[27,1551,1552],{},"易于重用。",[27,1554,1555],{},"分配表可能很大。",[27,1557,1558],{},"连续性差，可能影响顺序访问。",[20,1560,1561],{"id":1561},"空闲空间分配策略",[24,1563,1564,1572,1580],{},[27,1565,1566,1567],{},"First Fit：\n",[24,1568,1569],{},[27,1570,1571],{},"选择第一个足够大的空闲连续块组。",[27,1573,1574,1575],{},"Best Fit：\n",[24,1576,1577],{},[27,1578,1579],{},"选择满足要求的最小空闲块组。",[27,1581,1582,1583],{},"Nearest Fit：\n",[24,1584,1585],{},[27,1586,1587],{},"选择离该文件上次分配位置最近的空闲块组，提高局部性。",[20,1589,1590],{"id":1590},"三种文件分配方法",[1036,1592,1594],{"id":1593},"contiguous-allocation-连续分配","Contiguous Allocation 连续分配",[77,1596,395],{},[24,1598,1599,1602,1605],{},[27,1600,1601],{},"文件创建时分配一整段连续块。",[27,1603,1604],{},"属于预分配。",[27,1606,1607],{},"文件分配表只需记录起始块和长度。",[77,1609,426],{},[24,1611,1612,1615,1618],{},[27,1613,1614],{},"顺序访问性能最好。",[27,1616,1617],{},"随机访问也简单。",[27,1619,1620],{},"第 i 个块的位置为 b + i - 1。",[77,1622,443],{},[24,1624,1625,1628,1631],{},[27,1626,1627],{},"必须预先知道文件大小。",[27,1629,1630],{},"会产生外部碎片。",[27,1632,1633],{},"可能需要磁盘紧缩 compaction。",[1036,1635,1637],{"id":1636},"chained-allocation-链式分配","Chained Allocation 链式分配",[77,1639,395],{},[24,1641,1642,1645,1648,1650],{},[27,1643,1644],{},"通常按单个块分配。",[27,1646,1647],{},"每个块包含指向下一块的指针。",[27,1649,1607],{},[27,1651,1652],{},"可预分配，但更常见的是按需分配。",[77,1654,426],{},[24,1656,1657,1660,1663],{},[27,1658,1659],{},"不需要连续空间。",[27,1661,1662],{},"没有外部碎片。",[27,1664,1665],{},"增长方便。",[77,1667,443],{},[24,1669,1670,1673,1676,1679],{},[27,1671,1672],{},"随机访问差，必须沿链查找。",[27,1674,1675],{},"指针占用空间。",[27,1677,1678],{},"局部性差，顺序读取可能频繁移动磁头。",[27,1680,1681],{},"可通过周期性文件整理改善局部性。",[1036,1683,1685],{"id":1684},"indexed-allocation-索引分配","Indexed Allocation 索引分配",[77,1687,395],{},[24,1689,1690,1693,1696],{},[27,1691,1692],{},"每个文件有一个索引。",[27,1694,1695],{},"索引中每项指向文件的一个块或一个片段。",[27,1697,1698],{},"文件分配表指向该文件的索引块。",[77,1700,426],{},[24,1702,1703,1706,1709,1712],{},[27,1704,1705],{},"支持顺序访问和直接访问。",[27,1707,1708],{},"避免连续分配的外部碎片问题。",[27,1710,1711],{},"比链式分配随机访问更好。",[27,1713,1714],{},"是最流行的分配方式之一。",[77,1716,443],{},[24,1718,1719,1722,1725],{},[27,1720,1721],{},"需要索引块。",[27,1723,1724],{},"小文件也有索引开销。",[27,1726,1727],{},"索引过大时需要多级索引。",[20,1729,1731],{"id":1730},"free-space-management-空闲空间管理","Free Space Management 空闲空间管理",[77,1733,1734],{},"为了分配文件块，系统必须知道哪些块空闲，因此需要 Disk Allocation Table。",[1036,1736,1738],{"id":1737},"bit-table-位表","Bit Table 位表",[24,1740,1741,1744,1747,1750,1753,1756,1759],{},[27,1742,1743],{},"每个磁盘块对应 1 位。",[27,1745,1746],{},"0 表示空闲，1 表示已使用。",[27,1748,1749],{},"空间开销最小。",[27,1751,1752],{},"易于查找连续空闲块。",[27,1754,1755],{},"若磁盘很大，位表也可能很大。",[27,1757,1758],{},"通常希望位表驻留内存，否则搜索成本高。",[27,1760,1761],{},"可用辅助摘要表记录每个范围的空闲块数量和最大连续空闲块长度。",[77,1763,1764],{},"位表大小公式：",[24,1766,1767],{},[27,1768,1769],{},"所需字节数 = disk size in bytes \u002F (8 × file system block size)",[1036,1771,1773],{"id":1772},"chained-free-portions-空闲片段链","Chained Free Portions 空闲片段链",[24,1775,1776,1779,1782],{},[27,1777,1778],{},"每个空闲片段保存指针和长度。",[27,1780,1781],{},"只需保存链表头指针和首片段长度。",[27,1783,1784],{},"空间开销小。",[77,1786,426],{},[24,1788,1789,1792],{},[27,1790,1791],{},"适合多种分配方法。",[27,1793,1794],{},"不需要完整磁盘分配表。",[77,1796,443],{},[24,1798,1799,1802,1805],{},[27,1800,1801],{},"磁盘用久后会碎片化。",[27,1803,1804],{},"分配一个块前可能要先读该空闲块以得到下一个指针。",[27,1806,1807],{},"大量分配和删除碎片文件时很慢。",[1036,1809,1811],{"id":1810},"indexing-索引法","Indexing 索引法",[24,1813,1814,1817,1820,1823],{},[27,1815,1816],{},"把空闲空间当成一个文件。",[27,1818,1819],{},"用索引表记录每个空闲片段。",[27,1821,1822],{},"通常按变长片段记录更高效。",[27,1824,1825],{},"能有效支持各种文件分配方法。",[1036,1827,1829],{"id":1828},"free-block-list-空闲块列表","Free Block List 空闲块列表",[24,1831,1832,1835,1838,1841,1852],{},[27,1833,1834],{},"每个块编号。",[27,1836,1837],{},"在磁盘保留区域维护所有空闲块编号列表。",[27,1839,1840],{},"比位表大很多，通常存磁盘上。",[27,1842,1843,1844],{},"可把列表的一小部分放入内存：\n",[24,1845,1846,1849],{},[27,1847,1848],{},"栈方式：分配 pop，释放 push。",[27,1850,1851],{},"FIFO 队列方式：从队首分配，释放到队尾。",[27,1853,1854],{},"后台线程可对内存中的空闲块号排序，以便连续分配。",[20,1856,1858],{"id":1857},"volume-卷","Volume 卷",[24,1860,1861,1864,1867,1870],{},[27,1862,1863],{},"卷是操作系统或应用可用于数据存储的一组可寻址扇区。",[27,1865,1866],{},"最简单情况：一个磁盘就是一个卷。",[27,1868,1869],{},"一个磁盘可分多个分区，每个分区是一个卷。",[27,1871,1872],{},"多个磁盘或多个分区也可组合成一个卷。",[20,1874,1876],{"id":1875},"reliability-可靠性","Reliability 可靠性",[77,1878,1879],{},"潜在问题：",[24,1881,1882,1885],{},[27,1883,1884],{},"系统为了效率把磁盘分配表和文件分配表缓存在内存中。",[27,1886,1887],{},"若内存表已更新但磁盘表未更新时系统崩溃，可能导致空间重复分配或文件损坏。",[77,1889,1890],{},"安全分配步骤：",[24,1892,1893,1896,1899,1902,1905],{},[27,1894,1895],{},"锁定磁盘上的磁盘分配表。",[27,1897,1898],{},"搜索空闲空间。",[27,1900,1901],{},"分配空间并更新磁盘分配表到磁盘。",[27,1903,1904],{},"更新文件分配表到磁盘。",[27,1906,1907],{},"解锁磁盘分配表。",[77,1909,1910],{},"性能问题：",[24,1912,1913,1916,1919],{},[27,1914,1915],{},"每次小分配都同步写磁盘会很慢。",[27,1917,1918],{},"可用批量分配减少开销。",[27,1920,1921],{},"崩溃后需清理已标记使用但未真正归属文件的空间。",[15,1923,1925],{"id":1924},"_128-unix-file-managementunix-文件管理","12.8 UNIX File Management：UNIX 文件管理",[20,1927,1929],{"id":1928},"unix-文件类型","UNIX 文件类型",[24,1931,1932,1943,1957,1965,1976,1984],{},[27,1933,1934,1935],{},"Regular \u002F Ordinary 普通文件：\n",[24,1936,1937,1940],{},[27,1938,1939],{},"包含任意数据。",[27,1941,1942],{},"文件系统不规定内部结构，只看作字节流。",[27,1944,1945,1946],{},"Directory 目录文件：\n",[24,1947,1948,1951,1954],{},[27,1949,1950],{},"包含文件名和 inode 指针。",[27,1952,1953],{},"目录按层次结构组织。",[27,1955,1956],{},"目录本质是特殊保护的普通文件。",[27,1958,1959,1960],{},"Special 特殊文件：\n",[24,1961,1962],{},[27,1963,1964],{},"用文件名映射物理设备。",[27,1966,1967,1968],{},"Named Pipes 命名管道：\n",[24,1969,1970,1973],{},[27,1971,1972],{},"用于进程间通信。",[27,1974,1975],{},"先进先出传输数据。",[27,1977,1978,1979],{},"Links 硬链接：\n",[24,1980,1981],{},[27,1982,1983],{},"已有文件的另一个名字。",[27,1985,1986,1987],{},"Symbolic Links 符号链接：\n",[24,1988,1989],{},[27,1990,1991],{},"一个数据文件，内容是被链接文件的名字。",[20,1993,1995],{"id":1994},"inode","Inode",[24,1997,1998,2001,2004,2007],{},[27,1999,2000],{},"inode 是 UNIX 管理文件的核心控制结构。",[27,2002,2003],{},"每个文件由一个 inode 控制。",[27,2005,2006],{},"多个文件名可以关联到同一个 inode。",[27,2008,2009],{},"文件名不在 inode 中，目录项负责把文件名映射到 inode。",[77,2011,2012],{},"inode 中通常包含：",[24,2014,2015,2018,2021,2024,2027,2030,2033,2036,2039,2042,2045],{},[27,2016,2017],{},"文件类型和访问模式。",[27,2019,2020],{},"所有者和用户组。",[27,2022,2023],{},"创建、读取、写入、inode 更新时间。",[27,2025,2026],{},"文件大小。",[27,2028,2029],{},"数据块指针。",[27,2031,2032],{},"文件使用的物理块数量。",[27,2034,2035],{},"指向该文件的目录项数量。",[27,2037,2038],{},"文件标志。",[27,2040,2041],{},"generation number，用于检测对已删除文件的旧引用。",[27,2043,2044],{},"块大小。",[27,2046,2047],{},"扩展属性。",[20,2049,2051],{"id":2050},"unix-文件分配","UNIX 文件分配",[24,2053,2054,2057,2060,2063,2066],{},[27,2055,2056],{},"按块动态分配。",[27,2058,2059],{},"不要求文件块连续。",[27,2061,2062],{},"使用索引分配。",[27,2064,2065],{},"inode 中保存部分索引。",[27,2067,2068],{},"inode 包含直接指针和间接指针。",[77,2070,2071],{},"典型结构：",[24,2073,2074,2085,2093,2101],{},[27,2075,2076,2077],{},"直接指针：\n",[24,2078,2079,2082],{},[27,2080,2081],{},"直接指向文件数据块。",[27,2083,2084],{},"小文件访问快。",[27,2086,2087,2088],{},"单级间接指针：\n",[24,2089,2090],{},[27,2091,2092],{},"指向一个保存数据块地址的块。",[27,2094,2095,2096],{},"二级间接指针：\n",[24,2097,2098],{},[27,2099,2100],{},"指向保存单级间接块地址的块。",[27,2102,2103,2104],{},"三级间接指针：\n",[24,2105,2106],{},[27,2107,2108],{},"指向保存二级间接块地址的块。",[77,2110,426],{},[24,2112,2113,2116,2119],{},[27,2114,2115],{},"inode 固定且较小，可长期留在内存。",[27,2117,2118],{},"小文件访问几乎不需要间接寻址。",[27,2120,2121],{},"最大文件大小可非常大。",[20,2123,2125],{"id":2124},"unix-目录","UNIX 目录",[24,2127,2128,2131,2134],{},[27,2129,2130],{},"目录是包含文件名和 inode 编号的文件。",[27,2132,2133],{},"目录项 dentry 包含文件名和 i-number。",[27,2135,2136],{},"i-number 用作 inode 表索引。",[20,2138,2140],{"id":2139},"unix-卷结构","UNIX 卷结构",[77,2142,2143],{},"一个 UNIX 文件系统通常包含：",[24,2145,2146,2154,2162,2170],{},[27,2147,2148,2149],{},"Boot block：\n",[24,2150,2151],{},[27,2152,2153],{},"启动操作系统所需代码。",[27,2155,2156,2157],{},"Superblock：\n",[24,2158,2159],{},[27,2160,2161],{},"文件系统属性，如分区大小、inode 表大小。",[27,2163,2164,2165],{},"Inode table：\n",[24,2166,2167],{},[27,2168,2169],{},"所有文件 inode 的集合。",[27,2171,2172,2173],{},"Data blocks：\n",[24,2174,2175],{},[27,2176,2177],{},"存放文件数据和子目录。",[15,2179,2181],{"id":2180},"_129-linux-virtual-file-systemlinux-虚拟文件系统","12.9 Linux Virtual File System：Linux 虚拟文件系统",[20,2183,2185],{"id":2184},"vfs-的目的","VFS 的目的",[24,2187,2188,2191,2194,2197],{},[27,2189,2190],{},"Linux 支持多种真实文件系统。",[27,2192,2193],{},"VFS 为用户进程提供统一文件系统接口。",[27,2195,2196],{},"各真实文件系统通过映射模块接入 VFS。",[27,2198,2199],{},"用户调用如 read、write、open 时，先进入 VFS，再被转换为具体文件系统操作。",[20,2201,2203],{"id":2202},"vfs-工作过程","VFS 工作过程",[24,2205,2206,2209,2212,2215,2218,2221],{},[27,2207,2208],{},"用户进程发出文件系统调用。",[27,2210,2211],{},"VFS 处理文件系统无关部分。",[27,2213,2214],{},"VFS 调用具体文件系统的映射函数。",[27,2216,2217],{},"具体文件系统把请求转换为设备操作。",[27,2219,2220],{},"设备驱动执行底层 I\u002FO。",[27,2222,2223],{},"结果沿相反路径返回用户。",[20,2225,2227],{"id":2226},"vfs-的四类核心对象","VFS 的四类核心对象",[24,2229,2230,2238,2246,2254],{},[27,2231,2232,2233],{},"Superblock object：\n",[24,2234,2235],{},[27,2236,2237],{},"表示一个已挂载文件系统。",[27,2239,2240,2241],{},"Inode object：\n",[24,2242,2243],{},[27,2244,2245],{},"表示一个具体文件。",[27,2247,2248,2249],{},"Dentry object：\n",[24,2250,2251],{},[27,2252,2253],{},"表示路径中的一个目录项。",[27,2255,2256,2257],{},"File object：\n",[24,2258,2259],{},[27,2260,2261],{},"表示一个进程打开的文件。",[20,2263,2265],{"id":2264},"superblock-object","Superblock Object",[77,2267,2268],{},"保存一个文件系统的信息：",[24,2270,2271,2274,2277,2280,2283,2286,2289,2292,2295],{},[27,2272,2273],{},"挂载设备。",[27,2275,2276],{},"文件系统基本块大小。",[27,2278,2279],{},"dirty 标志。",[27,2281,2282],{},"文件系统类型。",[27,2284,2285],{},"只读等标志。",[27,2287,2288],{},"根目录指针。",[27,2290,2291],{},"打开文件列表。",[27,2293,2294],{},"访问控制信号量。",[27,2296,2297],{},"superblock 操作函数列表。",[77,2299,2300],{},"常见操作：",[24,2302,2303,2306,2309,2312,2315],{},[27,2304,2305],{},"分配 inode。",[27,2307,2308],{},"写 inode 到磁盘。",[27,2310,2311],{},"卸载时释放 superblock。",[27,2313,2314],{},"获取文件系统统计信息。",[27,2316,2317],{},"重新挂载时更新挂载选项。",[20,2319,2321],{"id":2320},"inode-object","Inode Object",[24,2323,2324,2327,2330,2333],{},[27,2325,2326],{},"每个文件对应一个 inode object。",[27,2328,2329],{},"保存文件名和实际数据内容之外的文件信息。",[27,2331,2332],{},"包含所有者、组、权限、访问时间、大小、链接数等。",[27,2334,2335],{},"包含 inode operations，如创建文件、查找文件名、创建目录。",[20,2337,2339],{"id":2338},"dentry-object","Dentry Object",[24,2341,2342,2345,2348,2351,2354],{},[27,2343,2344],{},"表示路径中的一个组成部分。",[27,2346,2347],{},"可以是目录名或文件名。",[27,2349,2350],{},"加速路径查找。",[27,2352,2353],{},"用于 dentry cache。",[27,2355,2356],{},"包含指向 inode、superblock、父 dentry、子 dentry 的指针。",[20,2358,2360],{"id":2359},"file-object","File Object",[24,2362,2363,2366,2369,2372],{},[27,2364,2365],{},"表示进程已经打开的文件。",[27,2367,2368],{},"open 系统调用时创建。",[27,2370,2371],{},"close 系统调用时销毁。",[27,2373,2374,2375],{},"包含：\n",[24,2376,2377,2380,2383,2386,2389,2392,2395],{},[27,2378,2379],{},"对应 dentry。",[27,2381,2382],{},"所属文件系统。",[27,2384,2385],{},"使用计数。",[27,2387,2388],{},"用户 ID。",[27,2390,2391],{},"用户组 ID。",[27,2393,2394],{},"当前文件指针。",[27,2396,2397],{},"read、write、open、release、lock 等操作函数。",[20,2399,2401],{"id":2400},"vfs-缓存","VFS 缓存",[24,2403,2404,2412,2420],{},[27,2405,2406,2407],{},"Inode cache：\n",[24,2408,2409],{},[27,2410,2411],{},"缓存最近访问过的 inode。",[27,2413,2414,2415],{},"Directory cache：\n",[24,2416,2417],{},[27,2418,2419],{},"缓存目录名到 inode 编号的映射。",[27,2421,2422,2423],{},"Buffer cache：\n",[24,2424,2425],{},[27,2426,2427],{},"缓存物理块数据，减少重复磁盘读取。",[15,2429,2431],{"id":2430},"_1210-windows-file-systemwindows-ntfs","12.10 Windows File System：Windows NTFS",[20,2433,2435],{"id":2434},"ntfs-目标","NTFS 目标",[24,2437,2438,2441],{},[27,2439,2440],{},"面向高端工作站和服务器。",[27,2442,2443],{},"支持大型文件、可靠恢复、安全访问和网络应用。",[20,2445,2447],{"id":2446},"ntfs-关键特性","NTFS 关键特性",[24,2449,2450,2464,2475,2483,2491,2499,2507],{},[27,2451,2452,2453],{},"Recoverability 可恢复性：\n",[24,2454,2455,2458,2461],{},[27,2456,2457],{},"崩溃或磁盘故障后恢复卷到一致状态。",[27,2459,2460],{},"文件系统修改被视为事务。",[27,2462,2463],{},"事务要么完成，要么回滚。",[27,2465,2466,2467],{},"Security 安全性：\n",[24,2468,2469,2472],{},[27,2470,2471],{},"使用 Windows 对象模型。",[27,2473,2474],{},"文件对象带有安全描述符。",[27,2476,2477,2478],{},"Large disks and large files：\n",[24,2479,2480],{},[27,2481,2482],{},"高效支持大磁盘和大文件。",[27,2484,2485,2486],{},"Multiple data streams：\n",[24,2487,2488],{},[27,2489,2490],{},"一个文件可有多个数据流。",[27,2492,2493,2494],{},"Journaling 日志：\n",[24,2495,2496],{},[27,2497,2498],{},"记录卷上文件变化。",[27,2500,2501,2502],{},"Compression and encryption：\n",[24,2503,2504],{},[27,2505,2506],{},"支持透明压缩和加密。",[27,2508,2509,2510],{},"Hard links and symbolic links：\n",[24,2511,2512],{},[27,2513,2514],{},"支持硬链接、符号链接和挂载点。",[20,2516,2518],{"id":2517},"ntfs-存储概念","NTFS 存储概念",[24,2520,2521,2529,2540],{},[27,2522,2523,2524],{},"Sector 扇区：\n",[24,2525,2526],{},[27,2527,2528],{},"磁盘最小物理存储单位，通常 512 字节。",[27,2530,2531,2532],{},"Cluster 簇：\n",[24,2533,2534,2537],{},[27,2535,2536],{},"一个或多个连续扇区。",[27,2538,2539],{},"NTFS 的基本分配单位。",[27,2541,2542,2543],{},"Volume 卷：\n",[24,2544,2545,2548],{},[27,2546,2547],{},"一个逻辑分区，由一个或多个簇组成。",[27,2549,2550],{},"可位于单磁盘或跨多个磁盘。",[20,2552,2554],{"id":2553},"cluster-的意义","Cluster 的意义",[24,2556,2557,2560,2563],{},[27,2558,2559],{},"NTFS 不直接按扇区分配，而按簇分配。",[27,2561,2562],{},"簇大小越大，管理项越少，适合大磁盘。",[27,2564,2565],{},"文件的簇不必连续，因此可产生碎片。",[20,2567,2569],{"id":2568},"ntfs-卷布局","NTFS 卷布局",[77,2571,2572],{},"NTFS 卷主要包括：",[24,2574,2575,2583,2591,2599],{},[27,2576,2577,2578],{},"Partition boot sector：\n",[24,2579,2580],{},[27,2581,2582],{},"卷布局、文件系统结构、启动信息和代码。",[27,2584,2585,2586],{},"Master File Table，MFT：\n",[24,2587,2588],{},[27,2589,2590],{},"保存该卷所有文件和文件夹的信息。",[27,2592,2593,2594],{},"System files：\n",[24,2595,2596],{},[27,2597,2598],{},"包括 MFT 镜像、日志文件、簇位图、属性定义表等。",[27,2600,2601,2602],{},"File area：\n",[24,2603,2604],{},[27,2605,2606],{},"存放普通文件数据。",[20,2608,2610],{"id":2609},"mft-主文件表","MFT 主文件表",[24,2612,2613,2616,2619,2622,2625,2628],{},[27,2614,2615],{},"NTFS 的核心。",[27,2617,2618],{},"MFT 是由 1024 字节记录组成的表。",[27,2620,2621],{},"每行描述一个文件或文件夹。",[27,2623,2624],{},"MFT 自身也被当作文件。",[27,2626,2627],{},"小文件可完全存放在 MFT 记录中。",[27,2629,2630],{},"大文件内容溢出到其他簇，MFT 记录保存指针。",[20,2632,2634],{"id":2633},"ntfs-文件属性","NTFS 文件属性",[77,2636,2637],{},"文件和目录由属性集合定义，包括：",[24,2639,2640,2648,2656,2664,2672,2680,2688,2696],{},[27,2641,2642,2643],{},"Standard information：\n",[24,2644,2645],{},[27,2646,2647],{},"访问属性、时间戳、链接计数等。",[27,2649,2650,2651],{},"Attribute list：\n",[24,2652,2653],{},[27,2654,2655],{},"属性列表，适用于属性无法放入单个 MFT 记录的情况。",[27,2657,2658,2659],{},"File name：\n",[24,2660,2661],{},[27,2662,2663],{},"文件或目录名。",[27,2665,2666,2667],{},"Security descriptor：\n",[24,2668,2669],{},[27,2670,2671],{},"所有者和访问控制信息。",[27,2673,2674,2675],{},"Data：\n",[24,2676,2677],{},[27,2678,2679],{},"文件内容，可有默认未命名数据流和命名数据流。",[27,2681,2682,2683],{},"Index root \u002F Index allocation：\n",[24,2684,2685],{},[27,2686,2687],{},"用于实现文件夹。",[27,2689,2690,2691],{},"Volume information：\n",[24,2692,2693],{},[27,2694,2695],{},"卷版本、卷名等。",[27,2697,2698,2699],{},"Bitmap：\n",[24,2700,2701],{},[27,2702,2703],{},"表示 MFT 或文件夹中记录使用情况。",[20,2705,2707],{"id":2706},"ntfs-可恢复性","NTFS 可恢复性",[77,2709,2710],{},"关键组件：",[24,2712,2713,2721,2729,2737],{},[27,2714,2715,2716],{},"I\u002FO Manager：\n",[24,2717,2718],{},[27,2719,2720],{},"包含 NTFS 驱动，处理 open、close、read、write。",[27,2722,2723,2724],{},"Log File Service：\n",[24,2725,2726],{},[27,2727,2728],{},"记录文件系统元数据修改日志。",[27,2730,2731,2732],{},"Cache Manager：\n",[24,2733,2734],{},[27,2735,2736],{},"缓存文件读写，提高性能。",[27,2738,2739,2740],{},"Virtual Memory Manager：\n",[24,2741,2742],{},[27,2743,2744],{},"将缓存文件映射到虚拟内存。",[77,2746,2747],{},"重要考点：",[24,2749,2750,2753,2756,2759],{},[27,2751,2752],{},"NTFS 恢复的是文件系统元数据，不保证用户文件内容完全恢复。",[27,2754,2755],{},"NTFS 使用日志。",[27,2757,2758],{},"修改文件系统的重要子操作要先写日志，再写磁盘结构。",[27,2760,2761],{},"崩溃后可根据日志 redo 或 undo 未完成事务。",[15,2763,2765],{"id":2764},"_1211-android-file-managementandroid-文件管理","12.11 Android File Management：Android 文件管理",[20,2767,2769],{"id":2768},"android-文件系统","Android 文件系统",[24,2771,2772,2775],{},[27,2773,2774],{},"Android 使用 Linux 的文件管理能力。",[27,2776,2777],{},"目录结构类似 Linux，但有 Android 特有目录。",[20,2779,2781],{"id":2780},"system-目录","system 目录",[24,2783,2784,2787,2790],{},[27,2785,2786],{},"包含操作系统核心部分。",[27,2788,2789],{},"包括系统二进制文件、系统库、配置文件和基础应用。",[27,2791,2792],{},"系统镜像通常只读。",[20,2794,2796],{"id":2795},"data-目录","data 目录",[24,2798,2799,2802,2805,2808,2827],{},[27,2800,2801],{},"应用保存私有数据的主要位置。",[27,2803,2804],{},"包含用户数据，如联系人、短信、设置、安装的应用。",[27,2806,2807],{},"恢复出厂设置会清除此分区。",[27,2809,2810,2811],{},"安装应用时：\n",[24,2812,2813,2816,2824],{},[27,2814,2815],{},".apk 放入 \u002Fdata\u002Fapp。",[27,2817,2818,2819,2823],{},"应用私有库放入 ",[2820,2821,2822],"code",{},"\u002Fdata\u002Fdata\u002F\u003Capplication name>","。",[27,2825,2826],{},"建立应用相关文件和数据库。",[27,2828,2829,2831],{},[2820,2830,2822],{}," 是应用沙箱，其他应用不可访问。",[20,2833,2835],{"id":2834},"cache-目录","cache 目录",[24,2837,2838,2841,2844,2847],{},[27,2839,2840],{},"用于操作系统临时存储。",[27,2842,2843],{},"保存频繁访问的数据和应用组件。",[27,2845,2846],{},"清除 cache 不影响用户个人数据。",[27,2848,2849],{},"缓存会随着使用自动重建。",[20,2851,2853],{"id":2852},"mntsdcard-目录","mnt\u002Fsdcard 目录",[24,2855,2856,2859,2862],{},[27,2857,2858],{},"表示 SD 卡或用户可读写存储空间。",[27,2860,2861],{},"用于音频、视频和用户数据。",[27,2863,2864],{},"在有内置和外置 SD 卡的设备上，\u002Fsdcard 通常指内置 SD 卡。",[20,2866,2868],{"id":2867},"sqlite","SQLite",[24,2870,2871,2874,2877,2880,2883],{},[27,2872,2873],{},"Android 广泛使用 SQLite。",[27,2875,2876],{},"SQLite 是基于 SQL 的轻量级关系数据库引擎。",[27,2878,2879],{},"适合嵌入式和内存受限系统。",[27,2881,2882],{},"SQLite 不是独立数据库服务器进程。",[27,2884,2885],{},"SQLite 库直接链接进应用程序，成为应用的一部分。",[15,2887,2889],{"id":2888},"_1212-summary本章总结","12.12 Summary：本章总结",[20,2891,2892],{"id":2892},"总体脉络",[24,2894,2895,2898,2901,2904,2907,2910],{},[27,2896,2897],{},"文件管理系统为用户和应用提供文件访问、目录维护和访问控制。",[27,2899,2900],{},"文件由记录组成，记录访问方式决定文件逻辑组织。",[27,2902,2903],{},"文件目录提供文件命名、定位、层次组织和访问控制基础。",[27,2905,2906],{},"记录与磁盘块大小通常不一致，因此需要记录阻塞策略。",[27,2908,2909],{},"磁盘空间管理包括文件分配和空闲空间管理。",[27,2911,2912],{},"现代文件系统还必须考虑并发访问、可靠性、安全性和缓存性能。",[20,2914,2915],{"id":2915},"易考判断点",[24,2917,2918,2921,2924,2927,2930,2933,2936,2939,2942,2945,2948,2951,2954,2957,2960,2963,2966,2969,2972,2975,2978,2981,2984,2987],{},[27,2919,2920],{},"文件是相似记录的集合，不是字段的集合。",[27,2922,2923],{},"字段是最基本数据元素，记录是相关字段集合。",[27,2925,2926],{},"数据库强调数据关系显式，并服务于多个应用。",[27,2928,2929],{},"堆文件按到达顺序存储，不是排序存储。",[27,2931,2932],{},"顺序文件的关键字段必须唯一。",[27,2934,2935],{},"顺序文件最适合全文件批处理。",[27,2937,2938],{},"索引顺序文件增加索引和溢出文件。",[27,2940,2941],{},"一般索引文件可有多个索引，并支持变长记录。",[27,2943,2944],{},"直接文件使用对关键值的散列。",[27,2946,2947],{},"目录的访问控制信息包含所有者、访问用户和允许动作。",[27,2949,2950],{},"working directory 是当前目录。",[27,2952,2953],{},"文件共享需要处理互斥和死锁。",[27,2955,2956],{},"固定阻塞可能产生内部碎片。",[27,2958,2959],{},"连续分配必须预分配，易产生外部碎片。",[27,2961,2962],{},"链式分配无外部碎片，但随机访问差。",[27,2964,2965],{},"索引分配支持顺序和直接访问。",[27,2967,2968],{},"空闲空间管理需要磁盘分配表。",[27,2970,2971],{},"bit table 中每个块对应一位。",[27,2973,2974],{},"UNIX 普通文件是字节流。",[27,2976,2977],{},"UNIX 使用 inode 保存文件控制信息。",[27,2979,2980],{},"Linux VFS 提供统一文件接口。",[27,2982,2983],{},"NTFS 的最小物理单位是 sector，但基本分配单位是 cluster。",[27,2985,2986],{},"NTFS 核心结构是 MFT。",[27,2988,2989],{},"NTFS 日志主要恢复元数据，不保证用户数据内容。",{"title":2991,"searchDepth":2992,"depth":2992,"links":2993},"",2,[2994,3009,3019,3027,3036,3042,3048,3061,3068,3078,3088,3096],{"id":17,"depth":2992,"text":18,"children":2995},[2996,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008],{"id":22,"depth":2997,"text":22},3,{"id":38,"depth":2997,"text":38},{"id":52,"depth":2997,"text":52},{"id":75,"depth":2997,"text":75},{"id":108,"depth":2997,"text":108},{"id":125,"depth":2997,"text":125},{"id":139,"depth":2997,"text":139},{"id":168,"depth":2997,"text":169},{"id":180,"depth":2997,"text":181},{"id":213,"depth":2997,"text":213},{"id":236,"depth":2997,"text":236},{"id":299,"depth":2997,"text":299},{"id":325,"depth":2992,"text":326,"children":3010},[3011,3012,3013,3014,3015,3016,3017,3018],{"id":329,"depth":2997,"text":329},{"id":340,"depth":2997,"text":340},{"id":371,"depth":2997,"text":371},{"id":391,"depth":2997,"text":392},{"id":454,"depth":2997,"text":455},{"id":543,"depth":2997,"text":544},{"id":629,"depth":2997,"text":630},{"id":707,"depth":2997,"text":708},{"id":766,"depth":2992,"text":767,"children":3020},[3021,3022,3023,3024,3025,3026],{"id":770,"depth":2997,"text":771},{"id":788,"depth":2997,"text":789},{"id":818,"depth":2997,"text":819},{"id":845,"depth":2997,"text":846},{"id":869,"depth":2997,"text":870},{"id":901,"depth":2997,"text":902},{"id":919,"depth":2992,"text":920,"children":3028},[3029,3030,3031,3032,3033,3034,3035],{"id":923,"depth":2997,"text":923},{"id":937,"depth":2997,"text":937},{"id":1014,"depth":2997,"text":1014},{"id":1034,"depth":2997,"text":1034},{"id":1095,"depth":2997,"text":1095},{"id":1106,"depth":2997,"text":1107},{"id":1121,"depth":2997,"text":1122},{"id":1139,"depth":2992,"text":1140,"children":3037},[3038,3039,3040,3041],{"id":1143,"depth":2997,"text":1143},{"id":1154,"depth":2997,"text":1154},{"id":1237,"depth":2997,"text":1237},{"id":1251,"depth":2997,"text":1251},{"id":1271,"depth":2992,"text":1272,"children":3043},[3044,3045,3046,3047],{"id":1275,"depth":2997,"text":1275},{"id":1289,"depth":2997,"text":1289},{"id":1320,"depth":2997,"text":1320},{"id":1419,"depth":2997,"text":1419},{"id":1433,"depth":2992,"text":1434,"children":3049},[3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060],{"id":1437,"depth":2997,"text":1437},{"id":1448,"depth":2997,"text":1448},{"id":1462,"depth":2997,"text":1463},{"id":1497,"depth":2997,"text":1498},{"id":1512,"depth":2997,"text":1513},{"id":1524,"depth":2997,"text":1524},{"id":1561,"depth":2997,"text":1561},{"id":1590,"depth":2997,"text":1590},{"id":1730,"depth":2997,"text":1731},{"id":1857,"depth":2997,"text":1858},{"id":1875,"depth":2997,"text":1876},{"id":1924,"depth":2992,"text":1925,"children":3062},[3063,3064,3065,3066,3067],{"id":1928,"depth":2997,"text":1929},{"id":1994,"depth":2997,"text":1995},{"id":2050,"depth":2997,"text":2051},{"id":2124,"depth":2997,"text":2125},{"id":2139,"depth":2997,"text":2140},{"id":2180,"depth":2992,"text":2181,"children":3069},[3070,3071,3072,3073,3074,3075,3076,3077],{"id":2184,"depth":2997,"text":2185},{"id":2202,"depth":2997,"text":2203},{"id":2226,"depth":2997,"text":2227},{"id":2264,"depth":2997,"text":2265},{"id":2320,"depth":2997,"text":2321},{"id":2338,"depth":2997,"text":2339},{"id":2359,"depth":2997,"text":2360},{"id":2400,"depth":2997,"text":2401},{"id":2430,"depth":2992,"text":2431,"children":3079},[3080,3081,3082,3083,3084,3085,3086,3087],{"id":2434,"depth":2997,"text":2435},{"id":2446,"depth":2997,"text":2447},{"id":2517,"depth":2997,"text":2518},{"id":2553,"depth":2997,"text":2554},{"id":2568,"depth":2997,"text":2569},{"id":2609,"depth":2997,"text":2610},{"id":2633,"depth":2997,"text":2634},{"id":2706,"depth":2997,"text":2707},{"id":2764,"depth":2992,"text":2765,"children":3089},[3090,3091,3092,3093,3094,3095],{"id":2768,"depth":2997,"text":2769},{"id":2780,"depth":2997,"text":2781},{"id":2795,"depth":2997,"text":2796},{"id":2834,"depth":2997,"text":2835},{"id":2852,"depth":2997,"text":2853},{"id":2867,"depth":2997,"text":2868},{"id":2888,"depth":2992,"text":2889,"children":3097},[3098,3099],{"id":2892,"depth":2997,"text":2892},{"id":2915,"depth":2997,"text":2915},"md",{"order":3102},12,true,"\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap12",{"title":5,"description":2991},"source\u002Fcs\u002Fos\u002Fnote\u002Fchap12","aMmAAhyW35le_3xgHe2vKUFVo16g9Y-E3DlgvUZ7ScI",null,1784032891791]