NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[TOC] ## pv 操作 "**PV操作**" 是操作系统中的一个经典术语,特别用于 **并发控制和进程同步**,最早由计算机科学家 **Edsger Dijkstra** 提出。 code ``` // 生产者: P(S); // 等待资源 // 生产数据; V(S); // 释放资源 // 消费者: P(S); // 等待资源 //消费数据; V(S); // 释放资源 ``` ## 进程 **三状态模型** ``` +-------+ +-------+XAD DF | 运行 |----->| 就绪 | +-------+<-----| | | +-------+ | V +-------+ | 阻塞 | +-------+ | V +-------+ | 就绪 | +-------+ ``` > 阻塞态为当一个**进程请求的资源暂时不可用**(如等待I/O完成、等待消息、等待信号量),它就会从运行态或就绪态转换为**阻塞态** **PCB** - 进程通常由程序、数据集合、进程控制块PCB组成。 - PCB是种数据结构,是进程存在的唯一标识 **PCB管理方式** - **线性方式** 把所有PCB組織在一張線性表中,每次查找是需要掃描全表。 - **链接方式** 把具有同一狀態的 PCB,用其中的鏈接字鏈接成一個隊列,PCB存儲在一個連續的區域。 - **索引方式** 同一狀態的進程歸入一個索引表,多個狀態對應多個不同的索引表。 ## 前驱图 前驱图是一个有向无循环图,由节点和有向边组成,节点代表各程序段的操作,而节点间的有向边表示两个程序段操作之间存在的前趋关系。用于这种图可以描述多个程序或进程之间的执行顺序关系。 ## 内存 **地址重定位** 地址重定位是指将程序中的地址虚拟地址(逻辑地址)变换成内存的真实地址(物理地址)的过程。 - 逻辑地址 相对地址。CPU所生成的地址。逻辑地址是内部和编程使用的、并地址不唯一。 - 物理地址 绝对地址。加载到内存地址寄存器中的地址,内存单元的真正地址。 **静态重定位** 绝对地址=相对地址+程序存放的内存起始地址 特点 - 程序运行前就确定映射关系 - 程序装入后不能移动 - 程序占用连续的内存空间 **动态重定位** 对地址=重定位寄存器的值(B)+逻辑地址寄存器的值(VR) 特点 - 程序占用的内存空间可动态变化 - 程序不要求连续的内存空间 - 便于多个进程共享代码 ### 分区存储管理 把主存的用户区划分成若干个区域,每个区域分配给一个用户作业使用,并限定它们只能在自己的区域中运行。分为,可重定位分区,可变分区,固定分区 **固定分区** ![](https://img.kancloud.cn/1e/d3/1ed3eeef2af7533e9d1170e7b5883e82_946x657.png) **可变分区** ![](https://img.kancloud.cn/d2/1b/d21b767215bc7825de975da19835ced8_892x420.png) **可重定位分区(最常用)** 跟磁盘整理一样,把已使用的分区都放到一块 ### 分页存储管理 将一个进程的地址空间划分成若干个大小相等的区,称为页。相应地,将主存空间划分成与页相同大小的若干个物理块,称为块或页框 ![](https://img.kancloud.cn/cf/a7/cfa7ba9ded2b71a8e608317080098d35_774x438.png) > 页表控制器:将进程中的**虚拟页号(Virtual Page Number, VPN)**映射为**物理页号(Physical Page Number, PPN)** 逻辑地址=页号+页内地址 物理地址=块号+块内地址 <br/> 如果一个系统的分页大小为512直接,说明页内地址是512,9位地址,如果一个程序的逻辑地址为1111(十进制),转二进制为10001010111,是11位,也就是后9位是页内的hi在,前两个是10是页号,即逻辑页号位2 另一种简单换算是11111/512=2.169921875,即逻辑页号是2 <br/> **问题1** 假设页和物理块的大小均为1024B.逻辑地址为2100,物理地址是什么 页表为 | 页号|物理块号| |---|---| |0|3| |1|6| |2|8| |3|9| 页号=2100/1024=2 页内地址=2100%1024=52 物理地址=8×1024+52=8244 答为 8244 **问题2** 某计算机系统页面大小为4K,若进程的页面变换表如下所示,逻辑地址为十六进制1D16H。该地址经过变换后,其物理地址应为十六进制()。 | 页号|物理块号| |---|---| |0|1| |1|3| |2|4| |3|6| 解答:4k=2^12,而1D16H16进制,后三位刚好是2^12,表示页内地址,第一位1为页号,映射为物理块的3,所以是 3D16H ### 分段存储管理 分段式存储管理系统中,为每个段分配一个连续的分区,而进程中的各个段可以离散地分配到主存的不同分医中。在系统中为每个进程建立一张段映射表,简称为“段表”。每个段在表中占有一个表项,在其中记录了该段在主存中的起始地址(又称为“基址”)和段的长度。进程在执行时,通过查段表来找到每个段所对应的主存区 ![](https://img.kancloud.cn/9a/64/9a640faec96c74fe04bea06e05df3550_642x355.png) |段号|基地址|段长| |---|---|---| |0|1100|800| |1|3310|50| 比如逻辑地址(0,790表示),0号段,段长为790,能放到段长800中, ### 段页式存储管理 段页式系统的基本原理是先将整个主存划分成大小相等的存储块(页框),将用户程序按程序的逻辑关系分为若干个段,再将每个段划分成若干页,以页框为单位离散分配。在段页式系统中,其地址结构由段号、段内页号和页内地址三部分组成。 ![](https://img.kancloud.cn/b4/dd/b4dde6eddde7a70c01b5ed0ae990dc29_791x367.png) ### 虚拟存储管理 在前面介绍的存储管理方案中,必须为每个作业分配足够的空间,以便装入全部信息。当主存空间不能满足作业要求时,作业无法装入主存执行。如果一个作业只部分装入主存便可开始启动运行,其余部分暂时留在磁盘上,在需要时再装入主存,这样可以有效地利用主存空间。从用户角度看,该系统所具有的主存容量将比实际主存容量大得多,人们把这样的存储器称为虚拟存储器。 ## 设备管理 **程序控制** - 无条件传送:/O端口总是准备好,cpu在需要时随时直接利用访问相应的/O端口。 - 程序查询: CPU必须不停地测试/O设备的状态端口。CPU与I/O设备是**串行工作**的。 **中断** - 某个进程要启动某个设备时,CPU就向相应的设备控制器发出一条设备引/O启动指令,然后CPU又返回做原来的工作。CPU与I/O设备可以**并行工作**。 - 中断类型 | 类型 | 说明 | 示例 | | --- | --- | --- | | **外部中断(硬件中断)** | 由外部设备触发 | 键盘敲击、鼠标移动、网络包到达、硬盘数据到位 | | **内部中断(异常)** | CPU 执行指令时发生错误或特殊状态 | 除零错误、非法指令、系统调用 | | **软件中断** | 程序主动触发中断 | `int 0x80`(Linux 系统调用) | **DMA(直接内存存取)** - DMA(Direct Memory Access,直接内存访问)是一种让外设(如网卡、硬盘)可以绕过 CPU,直接访问内存的技术,用于提升数据传输效率、减少 CPU 开销 - 通过DMA控制器直接进行批量数据交换,除了在据传输开始和结束时,整个过程无须CPU的干预。 例子: 假设你要从硬盘读取 1GB 文件到内存: **没有 DMA(传统方式)**:CPU 一边读硬盘,一边写内存,相当于你手动搬砖,CPU 非常累。 **有了 DMA**:你雇了个“苦力”(DMA 控制器)替你搬砖,CPU 只发出命令,剩下的传输由 DMA 完成,自己可以干别的。 ## 文件存储管理 ![](https://img.kancloud.cn/13/1f/131f6890f9b7bc4fe0c7b4eebb2671ad_730x490.png) > 0-9 为直接索引,10为一级索引节点,11 为二级索引节点,12 为三级索引节点 > 11 节点,指向了n 个节点,n个节点又指向了n 个节点,索引 一共又n*n个节点 示例: 如果文件索引节点0-5为直接索引,6为一级索引,7 为二级索引,每个地址项为4字节,每个磁盘索引块和磁盘数据库大小均为4kB 求最大文件: - 那么最大单文件是直接索引大小为`6×4KB=24KB`,加上一级`(4KB/4B*4KB=4096KB)`,三级`(4KB/4B*4KB/4B*1024=4194304KB)`,总大小为4198424, - **难点**为,每项是4B,磁盘索引块为4KB,那么可以存放1024 个地址,每个地址可指向4KB,所以,一级为(1024*4KB),二级为1024*1024*4KB 求每个范围的逻辑块号范围 - 直接索引块号为0-5,一级索引逻辑块号我为6到6到(6+1024)即6-1029,二级为1030及以上