随笔分类 - OS
摘要:#目录与文件系统 我们并不是一使用一个个的文件,而是会用多层的文件形式,这就引出了最后一层抽象:将整个磁盘变成一个文件树! 我们的文件使用方式:目录树! 如何使用?给了一个路径名,找到最后文件的FCB。 如何做到? 最基本的思考:在每个父节点下存储每个子节点的文件名和FCB。 但是FCB太大了,我们
阅读全文
摘要:#从生磁盘到文件 我们是如何使用磁盘的?反正不是根据盘块号,而是根据文件。这里引出了问题:如何从文件得到盘块号呢? 这是第三层抽象,也就是将盘块号抽象为文件,这层抽象后叫做cooked disk。 用户眼中的文件就是一堆字符~,所以要建立字符流到盘块的映射关系。 连续结构下的文件:字符在盘块上连续存
阅读全文
摘要:#生磁盘的使用 磁盘具有更复杂的结构,在操作系统内有着更为复杂的抽象层次,这里的生(raw)是让disk跑起来的意思。 可以将磁盘的结构理解为多个原片叠起来的柱面,我们用以下的参数取描述一个磁盘: 柱面(cyl),实际上就是圆柱的半径, 磁头(head),实际上就是圆柱的高度, 扇区(sec),是磁
阅读全文
摘要:#键盘 处理键盘=中断处理函数。 最核心就是一条in的指令,从键盘的缓冲区中读入。 根据不同的扫描码,在key_table中找到对应的ASCII码向上传递。
阅读全文
摘要:#IO与显示器 核心问题,printf是如何打印到显示器上的呢? 如何让外设工作?CPU通过控制总线(PCI)对对应外设的控制卡发送信息,对应的REG接受下指令后,就让外设做相应的一些工作了。这些最终反映为OUT指令。等外设工作结束后,写中断处理指令。这两部分就构成了CPU控制外设工作的方法。向设备
阅读全文
摘要:#内存换出 有换入就应该有换出!等价交换! 必须要选择一个页换出,选择哪一页淘汰emm? 下面介绍淘汰算法。 一、FIFO 先来的先走。 二、MIN 内存当中,将来最久没有使用过的page滚蛋。 效果很好,但是我们做不到,我们不知道将来会有什么东西过来。 三、LRU 用过去的历史预测我来,选最近最长
阅读全文
摘要:#内存换入与请求调页 为了实现虚拟内存,就应该有换入换出。 用户可以随意使用该内存,如char *p, p=3G,实际上就是使用该地址,而后续该内存如何映射到物理内存是对用户透明的。 如果逻辑地址空间比物理地址空间更大怎么办?这就引入了换入。 先把东西放到disk上,要用到的时候再放到内存当中来。
阅读全文
摘要:#段页结合的实际内存管理 底层希望段管理,用户希望页管理...如何结合呢? 这就引出了虚拟内存的概念。 我们设置一种地址空间,称之为虚拟内存,向上,可以为用户提供段;向下,将段映射到物理帧上。 对用户来说,是段的使用,对物理内存来说,是页的使用。 寻址: 用户给出CS: IP,先查段表,访问某个段内
阅读全文
摘要:#多级页表与快表 分页会有问题,为了提高利用率,页应该小吧,但这样页表项就会增加==,到后面就会膨胀得很厉害。例如,4k的页,4G的物理,那么就会有4G/4k=4M个页表项!。不仅如此,每个进程的pcb都要保存一份页表。。。 但实际上大部分逻辑地址根本不会用到,能不能把页表压缩? 第一种尝试:只存放
阅读全文
摘要:#内存分区与分页 如何在内存中找出一段空闲的区域?如何分割内存? 简单点,固定分区,内存等分成K个分区。但是有问题,每个程序需要的段大小都不一样,这样造成浪费。 所以,一般采用可变分区,其核心结构是表,记录空闲的内存与已经分配的内存。 如果某次申请的时候,有两个分区都满足要求,那么应该pick谁?下
阅读全文
摘要:#内存使用与分段 计算机如何工作?从内存中取址,cpu执行指令,从内存中取址,cpu执行指令...... 内存使用:将程序放在内存当中,并令程序执行起来。但是让程序进入内存时,会发生一些问题,汇编指令的调转地址与物理地址必须一致,如果有两段汇编都要将程序放到0-40的地方,怎么办?这就会发生一些矛盾
阅读全文
摘要:#死锁处理 一个死锁的栗子,来源于用户对信号量的错误使用,形成一种信号量需求环路,相互依赖,导致谁也无法向下进行。更坏的情况是,锁住的资源越来越多,导致最后cpu不工作了。 (这里应该是先使用P(mutex),再P(empty))先使用了mutex,然后由于empty不够则producer被阻塞,另
阅读全文
摘要:#信号量的代码实现 申请信号量,这个在内核中实现,因为信号量中具有pcb。 每个信号量具有唯一的标识,内核根据标识在信号量表中查询信号量。 这里用开关中断来保证原子性。 具体逻辑是,在做相关操作之前,调用wait函数,判断当前信号量的值,判断自己是否要进入等待队列,如果要就schedule。 如果不
阅读全文
摘要:#信号量临界区保护 共同修改一个变量,可能会发生问题。 这种情况称为Race Condition,不是编程的问题,是系统调度的问题。 解决问题的直观想法:给信号量上锁。一个程序在操作信号量的时候,确保信号量不能被别人修改。 我们定义临界区:一次只允许一个进程进入的该进程的那一段代码。其他地方叫剩余区
阅读全文
摘要:#进程同步与信号量 引例: 多进程合作要沟通好。 总不能售票员还在卖票的时候就开车。 在停车的时候,司机在等售票员的一个信号,这样他才可以开车。 在开车的时候,售票员也在等司机的一个信号,这样他才可以开门。 形成一种合理有序向前推进的工作。 进程同步的核心:等!等信号! 但是,只发信号还是解决不了全
阅读全文
摘要:#一个实际的schedule函数 Linux 0.11的调度函数schedule函数 注释: 在这里,counter有两个含义,一是优先级,二是时间片。简单理解就是,时间片多的,优先级高。 然后每次调度的时候,找到counter最大的就绪任务,也就是优先级最高的就绪任务去执行。 如果没有找到,那么就
阅读全文
摘要:#CPU调度策略 调度需要折中考虑一些问题。 阻塞了,现在2、3谁上? 最直观的想法: FIFO? 谁先来谁上 Priority? 谁重要谁上 要让进程满意,就是要让用户满意,就是要尽快结束任务,用户操作响应的时间短,系统内耗时间少。 但发生了矛盾,例如: 吞吐量和响应时间是一对矛盾量,响应时间短-
阅读全文
摘要:#核心级线程 核心级线性的重要性: 多核想要充分发挥作用,一定要支持核心级线程。 多个线性要能被MMU分配到多个内核当中,同时运行,这就是并行,与之前的并发是相对的。 并行是说,可以同时吃饭和吃面 并发是说,吃一下饭,吃一下面。 与用户级线程相比,核心级线程具有不同: 用户级线程用两个栈 而核心级线
阅读全文
摘要:#用户级线程 核心问题:操作系统是如何切换起来的? 先引出线程的概念: 一个程序下面还有一些小程序,这些小程序共享一块内存块,因此切换的时候不改变映射表,所以切换起来特别快。 切换=指令(pc)切换+资源切换 线程的实际作用: 浏览器进程: thread1从服务器接收数据 thread2负责显示文本
阅读全文
摘要:#多进程图像 启动多个程序-》多个进程推进-》操作系统记录进程、分配资源、进行调度。 操作系统根据PCB来进行管理的。 问题:多进程如何组织? Process Control Blocck是用来记录进程信息的数据结构。 就绪队列:有一些进程在等待执行。 磁盘等待队列:有一些进程在等待资源。 ...
阅读全文

浙公网安备 33010602011771号