zoukankan      html  css  js  c++  java
  • 《信息安全系统设计与实现》学习笔记10

    一.学习笔记

    1.块设备I/O缓冲区

    与内存访问相比,磁盘I/O速度较慢,所以不希望在每次执行读写文件操作时都执行磁盘I/O。因此,大多数文件系统使用I/O缓冲来减少进出存储设备的物理I/O数量

    I/O缓冲的基本原理:

    • 文件系统使用一系列I/O缓冲区作为块设备的缓存内存。
    • 当进程试图读取(dev, blk)标识的磁盘块时,它首先在缓冲区缓存中搜索分配给磁盘块的缓冲区。
    • 如果该缓冲区存在并且包含有效数据,那么它只需从缓冲区中读取数据,而无须再次从磁盘中读取数据块。
    • 如果该缓冲区不存在,它会为磁盘块分配一个缓冲区,将数据从磁盘读入缓冲区,然后从缓冲区读取数据,当某个块被读入时,该缓冲区将被保存在缓冲区缓存中,以供任意进程对同一个块的下一次读/写请求使用。
    • 当进程写入磁盘块时,它首先会获取一个分配给该块的缓冲区。然后,它将数据写入缓冲区,将缓冲区标记为脏,以延迟写入,并将其释放到缓冲区缓存中 由于脏缓冲区包含有效的数据,因此可以使用它来满足对同一块的后续读/写清求,而不会引起实际磁盘I/O,脏缓冲区只有在被重新分配到不同的块时才会写入磁盘。

    物理块设备I/O :每个设备都有一个I/O队列,其中包含等待I/O操作的缓冲区。

    2.Unix I/O缓冲区

    Unix缓冲区管理子系统由以下几部分组成

    (1)I/O缓冲区

          内核中的一系列NBUF缓冲区用作缓冲区缓存。每个缓冲区用一个结构体表示。缓冲区结构体由两部分组成:用于缓冲区管理的缓冲头部分和用于数据块的数据部分。

    (2)设备表

          每个块设备用一个设备表结构表示.每个设备表都有一个dev_list,包含当前分配给该设备的I/O缓冲区,还有一个io_ queue,包含设备上等待I/O操作的缓冲区。I/O队列的组织方式应确保最佳I/O操作。

    (3)缓冲区初始化

    当系统启动时,所有I/O缓冲区都在空闲列表中,所有设备列表和I/O队列均为空。

    (4)缓冲区列表

    当缓冲区分配给(dev, blk)时,它会被插入设备表的dev_list中.

    (5)getblk/brelse 算法

    getblk和brelse构成了Unix缓冲区管理方案的核心

    3.Unix算法的优缺点

    优点:简洁
    缺点:

    • 效率低下:该算法依赖于重试循环
    • 缓存效果不可预知
    • 可能会出现饥饿
    • 该算法使用只适用丁单处理器系统的休眠/唤醒操作

    4.使用信号量的缓冲区管理算法

    PV算法:


    二、问题与解决办法

    问题

    自学的时候不太了解PV算法,搞不懂是干嘛的

    解决办法

    通过对书上知识点的消化,我发现这个PV算法和操作系统中的PV原语很像。

          PV两个字母是荷兰文 Passeren(通过),Vrijgeven(释放)的简称。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。所谓信号量,实际上就是用来控制进程状态的一个代表某一资源的存储单元。例如,P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放。执行V 操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程。对P1和P2可定义两个信号量S1和S2,初值分别为1和0。进程P1在向缓冲B送入数据前执行P操作P(S1),在送入数据后执行V操作V(S2)。进程P2在从缓冲B读取数据前先执行P操作P(S2),在读出数据后执行V操作V(S1)。当P1往缓冲B送入一数据后信号量S1之值变为0,在该数据读出后S1之值才又变为1,因此在前一数未读出前后一数不会送入,从而保证了P1和P2之间的同步。PV操作属于进程的低级通信。

    P、V原语的具体操作如下:

    P(S)将信号量S的值减1,即S=S-1;如果S≥0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。

    V(S)将信号量S的值加1,即S=S+1;如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

    还有一个比较易混淆的东西就是互斥和同步,那么他们两个又有什么区别?

    互斥:(一般来说是两个进程间或进程内对同一资源(会访问临界资源),不能同时进行,就用互斥)
    ⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
    ⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
    ⑶互斥信号量的初值一般为1。

    同步:(两个进程间,可以同时进行,但有共享资源,两者需要竞争(需要等待,必须有个执行先后顺序)就用同步,其实就是基本思想,所以说互斥就特殊的同步)
    (1)、同步信号量一般不出现在同一进程中。
    (2)、同步的P操作应出现在互斥的P操作前。

    关于PV操作有一个经典问题,就是生产者-消费者问题

    经过分析可以得出以下算法,可以看出运用的就是PV算法

    三、学习感悟与收获

          自学完这一章最大的感悟是要学会进行联想,当遇到不懂的知识的时候,要学会把别的科目的知识拿出来辅助理解。再一个就是脑子要灵活,操作系统也学了很久了,以前一直没把这两门课联系在一起,现在想想Linux学起来不过也就是一个操作系统罢了,虽然和Windows不一样,但是抽象起来都是一个模式,以前学的进程和线程、同步等知识在操作系统课上都学过,只是一直没有意识把两门课放到一起学。在以后我还要多多培养这方面的能力,学一门课有不止一门课的收获,做到事半功倍。

  • 相关阅读:
    把git项目放到个人服务器上
    关于fcitx无法切换输入法的问题解决
    博客变迁通知
    (欧拉回路 并查集 别犯傻逼的错了) 7:欧拉回路 OpenJudge 数据结构与算法MOOC / 第七章 图 练习题(Excercise for chapter7 graphs)
    (并查集) HDU 1856 More is better
    (并查集 不太会) HDU 1272 小希的迷宫
    (并查集 注意别再犯傻逼的错了) HDU 1213 How Many Tables
    (最小生成树 Kruskal算法) 51nod 1212 无向图最小生成树
    (并查集) HDU 1232 畅通工程
    (最小生成树 Prim) HDU 1233 还是畅通工程
  • 原文地址:https://www.cnblogs.com/ffffatal/p/15563359.html
Copyright © 2011-2022 走看看