{ "sheetModels": [ { "title": "虚拟内存", "rootTopicKey": "7c599a7b-99fb-4b6c-827a-2d7bd96238cc", "editorRootTopicKey": "7c599a7b-99fb-4b6c-827a-2d7bd96238cc", "focusKey": "7c599a7b-99fb-4b6c-827a-2d7bd96238cc", "topics": [ { "key": "dfc1fb84-4f0f-477e-9994-b17e05c808f3", "parentKey": "ae107bba-8b84-40e3-bf75-52662e49eaa0", "subKeys": [ "1b6561fe-51d5-4a17-ab3b-c58cf58c9c4f" ], "collapse": true, "style": null, "blocks": [ { "type": "CONTENT", "data": "页表被存储在哪里?(AI)\n" } ] }, { "key": "4e819f25-c0aa-4bb7-b48b-1f755d33688e", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "地址翻译需要软件和硬件的配合" } ] }, { "key": "c27cb718-0f8e-4643-be55-0a0e9aa279a8", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页有一个固定的大小" } ] }, { "key": "20c0ef88-1e8b-4e08-8802-b267c2443747", "parentKey": "ae107bba-8b84-40e3-bf75-52662e49eaa0", "subKeys": [ "53cef449-ec1f-4354-a025-c5a0ee44135b" ], "collapse": true, "style": null, "blocks": [ { "type": "CONTENT", "data": "TLB(Translation Lookaside Buffer)是什么?(AI)\n" } ] }, { "key": "ae107bba-8b84-40e3-bf75-52662e49eaa0", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [ "dfc1fb84-4f0f-477e-9994-b17e05c808f3", "e415ec68-9fdf-41de-a25a-c5985f724083", "20c0ef88-1e8b-4e08-8802-b267c2443747" ], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页表" } ] }, { "key": "59df9b2d-f7fb-4ebd-b5ea-a803328de8dd", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页是物理内存和外部存储之间数据调度的基本单位" } ] }, { "key": "7c599a7b-99fb-4b6c-827a-2d7bd96238cc", "parentKey": null, "subKeys": [ "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6" ], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "虚拟内存" } ] }, { "key": "86750761-4b7f-4bcb-9674-58a125c9453c", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页表中保存了进程对一个地址的访问权限,以此可以实现多个进程共享数据,以此实现动态链接库" } ] }, { "key": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "parentKey": "7c599a7b-99fb-4b6c-827a-2d7bd96238cc", "subKeys": [ "2f5ac507-80e8-4c35-a0d3-e2ad7cd250c3", "a3473574-9f5f-4867-b95c-54c18c7a4105", "c27cb718-0f8e-4643-be55-0a0e9aa279a8", "59df9b2d-f7fb-4ebd-b5ea-a803328de8dd", "38083afc-ac41-43af-b71a-35e2c3322b9f", "87a9f5a7-27c3-497e-9bd5-b08ec764cd7c", "4e819f25-c0aa-4bb7-b48b-1f755d33688e", "86750761-4b7f-4bcb-9674-58a125c9453c", "ae107bba-8b84-40e3-bf75-52662e49eaa0" ], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页管理" } ] }, { "key": "38083afc-ac41-43af-b71a-35e2c3322b9f", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "每个进程都有一个页表(PTE是页表条目),管理虚拟地址和物理地址的映射关系" } ] }, { "key": "1b6561fe-51d5-4a17-ab3b-c58cf58c9c4f", "parentKey": "dfc1fb84-4f0f-477e-9994-b17e05c808f3", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "页表是操作系统用于管理虚拟内存的重要数据结构。它们映射虚拟地址到物理内存地址,使得程序在运行时能够使用虚拟地址空间。页表的存储位置和管理方式在不同的计算系统和架构中有所不同,但通常涉及以下几个方面:\n\n### 1. 存储在物理内存中\n页表本身通常存储在物理内存中。这是因为在处理任何内存请求时,硬件和操作系统需要能够快速访问这些表,以将虚拟地址转换为物理地址。存放在物理内存中使得访问速度最快。\n\n### 2. 处理器的内存管理单元(MMU)\n处理器内的内存管理单元(MMU)是负责处理地址转换的硬件部分。MMU使用页表来完成虚拟地址到物理地址的映射。在进行内存访问时,MMU查询页表,查看虚拟地址对应的物理内存位置。\n\n### 3. 页表基址寄存器\n在许多处理器架构中,页表的物理地址存储在一个特定的寄存器中,这个寄存器通常称为页表基址寄存器(例如,在x86架构中称为CR3寄存器)。这个寄存器告诉处理器页表在物理内存中的位置。\n\n### 4. TLB(翻译后备缓冲器)\n虽然页表存储在物理内存中,但为了加快地址转换的速度,现代处理器还使用了一个叫做翻译后备缓冲器(TLB)的高速缓存。TLB存储最近使用的页表条目,从而避免了每次都从物理内存中检索页表条目的开销。TLB显著提高了内存访问效率。\n\n### 5. 软件管理的页表\n在一些简单或者特殊的计算环境中(如某些嵌入式系统或早期的计算机系统),页表可能由软件完全管理而不是硬件。在这种情况下,操作系统负责所有页表的管理工作,包括其在内存中的位置和如何访问它们。\n\n### 总结\n总的来说,页表主要存储在物理内存中,由MMU管理,并通过诸如页表基址寄存器这样的硬件机制进行快速访问。TLB作为缓存机制,存储最近访问的页表条目,进一步加速了虚拟地址到物理地址的转换过程。这种结构和机制确保了虚拟内存系统的高效和快速响应。" } ] }, { "key": "2f5ac507-80e8-4c35-a0d3-e2ad7cd250c3", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "由操作系统管理" } ] }, { "key": "ba3ac53e-9550-4f29-8e7d-d2021207a20f", "parentKey": "e415ec68-9fdf-41de-a25a-c5985f724083", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "在计算机系统中,页大小(page size)是内存管理的一个基本单位。不同的操作系统有不同的方式来查询页大小。以下是如何在macOS和Windows系统上查询计算机的页大小的方法。\n\n### 在macOS上查询页大小\n\n在macOS上,可以使用`sysctl`命令来查询页大小。以下是具体的操作步骤:\n\n1. **使用终端命令**:\n\n 打开终端并输入以下命令:\n ```sh\n sysctl hw.pagesize\n ```\n\n 这将输出类似于以下的结果:\n ```\n hw.pagesize: 4096\n ```\n 这里的`4096`表示页大小为4096字节(4KB)。\n\n2. **使用Python脚本**:\n\n 你也可以使用Python脚本来查询页大小,方法如下:\n ```python\n import os\n\n page_size = os.sysconf('SC_PAGE_SIZE')\n print(f\"Page size: {page_size} bytes\")\n ```\n\n 运行这个脚本将输出页大小(通常是4096字节)。\n\n### 在Windows上查询页大小\n\n在Windows上,可以使用`GetSystemInfo`函数来查询页大小。以下是具体的操作步骤:\n\n1. **使用PowerShell命令**:\n\n 打开PowerShell并输入以下命令:\n ```powershell\n [System.Runtime.InteropServices.Marshal]::SizeOf([System.IntPtr]) -eq 8; $PageSize = [System.Runtime.InteropServices.Marshal]::ReadIntPtr(([System.IntPtr]::Zero -as [System.IntPtr]).ToPointer() + 44); $PageSize\n ```\n\n 这将输出类似于以下的结果:\n ```\n 4096\n ```\n 这里的`4096`表示页大小为4096字节(4KB)。\n\n2. **使用Python脚本**:\n\n 你也可以使用Python脚本来查询页大小,方法如下:\n ```python\n import ctypes\n\n class SYSTEM_INFO(ctypes.Structure):\n _fields_ = [\n (\"wProcessorArchitecture\", ctypes.c_ushort),\n (\"wReserved\", ctypes.c_ushort),\n (\"dwPageSize\", ctypes.c_uint),\n (\"lpMinimumApplicationAddress\", ctypes.c_void_p),\n (\"lpMaximumApplicationAddress\", ctypes.c_void_p),\n (\"dwActiveProcessorMask\", ctypes.c_void_p),\n (\"dwNumberOfProcessors\", ctypes.c_uint),\n (\"dwProcessorType\", ctypes.c_uint),\n (\"dwAllocationGranularity\", ctypes.c_uint),\n (\"wProcessorLevel\", ctypes.c_ushort),\n (\"wProcessorRevision\", ctypes.c_ushort)\n ]\n\n system_info = SYSTEM_INFO()\n ctypes.windll.kernel32.GetSystemInfo(ctypes.byref(system_info))\n\n page_size = system_info.dwPageSize\n print(f\"Page size: {page_size} bytes\")\n ```\n\n 运行这个脚本将输出页大小(通常是4096字节)。\n\n### 总结\n\n以上方法分别展示了在macOS和Windows系统上查询计算机页大小的具体操作步骤和相应的代码示例。你可以根据自己的需要选择使用命令行或者编程方式来查询页大小。" } ] }, { "key": "e415ec68-9fdf-41de-a25a-c5985f724083", "parentKey": "ae107bba-8b84-40e3-bf75-52662e49eaa0", "subKeys": [ "ba3ac53e-9550-4f29-8e7d-d2021207a20f" ], "collapse": true, "style": null, "blocks": [ { "type": "CONTENT", "data": "如何查询一台计算机的页大小,MACOS系统和Windows系统分别如何操作?(AI)" } ] }, { "key": "87a9f5a7-27c3-497e-9bd5-b08ec764cd7c", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "虚拟地址和物理地址不一定是一一对应的关系" } ] }, { "key": "a3473574-9f5f-4867-b95c-54c18c7a4105", "parentKey": "b60c4b65-a9e3-48c0-a807-d205fb6fbcf6", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "被缓存的内容被放在物理内存中,未被缓存的内容放在外部存储中" } ] }, { "key": "53cef449-ec1f-4354-a025-c5a0ee44135b", "parentKey": "20c0ef88-1e8b-4e08-8802-b267c2443747", "subKeys": [], "collapse": false, "style": null, "blocks": [ { "type": "CONTENT", "data": "翻译后备缓冲器(Translation Lookaside Buffer,TLB)是现代计算机处理器中的一个关键硬件组件,用于加速虚拟地址到物理地址的转换过程。TLB是一个缓存,存储了最近使用的页表条目,从而避免了每次内存访问都需要访问较慢的主内存来进行地址转换。\n\n### TLB的工作原理\n\n1. **虚拟地址请求**:当CPU需要访问内存时,它会生成一个虚拟地址。\n2. **查询TLB**:CPU首先会在TLB中查找该虚拟地址对应的物理地址。如果找到匹配的条目(称为TLB命中),则可以快速得到物理地址。\n3. **TLB未命中**:如果TLB中没有找到该虚拟地址的条目(称为TLB未命中),CPU会访问主内存中的页表来获取所需的映射信息。\n4. **更新TLB**:从页表中获取到映射信息后,CPU会将该条目添加到TLB中,以便将来的访问能够更快地完成。\n\n### TLB的组成和结构\n\nTLB通常由以下几个部分组成:\n\n- **标签(Tag)**:虚拟页号,用于标识虚拟地址的页部分。\n- **数据(Data)**:对应的物理页框号,用于实际的物理内存访问。\n- **标志位(Flags)**:包括有效位、权限位等,用于表示条目是否有效及其访问权限。\n\n### TLB的优点\n\n1. **提高性能**:通过缓存最近使用的页表条目,TLB显著减少了每次内存访问时进行页表查找的开销,提高了系统性能。\n2. **减少延迟**:TLB命中时,可以快速完成地址转换,减少了内存访问延迟。\n\n### TLB的类型\n\nTLB可以分为几种类型,具体取决于系统的架构:\n\n1. **数据TLB(dTLB)和指令TLB(iTLB)**:一些处理器将用于数据访问的TLB和用于指令访问的TLB分开,以提高性能。\n2. **一级TLB(L1 TLB)和二级TLB(L2 TLB)**:一些现代处理器具有多级TLB结构,一级TLB更小但速度更快,二级TLB较大但速度较慢。\n\n### TLB管理\n\nTLB的管理涉及以下几个方面:\n\n1. **TLB刷新**:当页表内容更改时(例如,进程切换、页表更新等),需要刷新TLB以确保一致性。这通常由操作系统或硬件自动完成。\n2. **TLB替换策略**:TLB是一个有限大小的缓存,需要替换策略来决定哪些旧条目被新的条目替换。常见的替换策略包括LRU(Least Recently Used,最近最少使用)和FIFO(First In First Out,先进先出)。\n\n### 示例\n\n下面是一个简单的示例,展示了TLB命中和未命中的基本流程:\n\n```plaintext\n1. CPU生成一个虚拟地址VA。\n2. 在TLB中查找VA的页表条目:\n - 如果找到(TLB命中),返回对应的物理地址PA。\n - 如果未找到(TLB未命中),从主内存中的页表获取VA对应的页表条目,更新TLB,并返回物理地址PA。\n```\n\n通过缓存最近使用的地址转换条目,TLB显著提高了虚拟内存系统的性能,使得程序能够更高效地访问内存。这是现代处理器实现高效虚拟内存管理的重要机制之一。" } ] } ], "config": { "viewMode": "MindMap", "readOnly": false, "allowUndo": true, "layoutDir": 0, "theme": { "name": "defaultTheme", "randomColor": false, "background": "#DDDDDD", "highlightColor": "#C31004", "marginH": 50, "marginV": 5, "contentStyle": { "lineHeight": "1" }, "linkStyle": { "lineRadius": 5, "lineWidth": "2px", "lineColor": "#595959", "lineType": "curve" }, "rootTopic": { "contentStyle": { "background": "#C31004", "color": "#fff", "fontSize": "34px", "borderRadius": "5px", "padding": "16px 18px 16px 18px" }, "subLinkStyle": { "lineType": "curve" } }, "primaryTopic": { "contentStyle": { "background": "#333", "borderRadius": "5px", "color": "#fff", "fontSize": "14px", "padding": "6px 10px 5px 10px" }, "subLinkStyle": { "hasUnderline": true, "lineType": "round" } }, "normalTopic": { "contentStyle": { "borderRadius": "5px", "background": "#fff0", "color": "#383833", "fontSize": "13px", "padding": "1px" }, "subLinkStyle": { "hasUnderline": true, "lineType": "round" } } } } } ], "extData": {}, "currentSheetIndex": 0, "formatVersion": "0.1" }