复习笔记--操作系统中

第四章 线程

  • 概念:进程中代码执行的一个序列,是使用CPU的基本单元,由线程ID、程序计数器PC、寄存器组和栈构成。线程都是由用户程序创建的

  • 线程有2种实现方法:

    • 用户层的用户线程:受内核支持,但不需内核管理
    • 内核层的内核线程:由操作系统直接支持和管理
  • 多对一模型:
    用户级线程模型
    image_1b61pqmn2rth10rs11g1h881vid9.png-114kB

  • 一对一模型
    内核级线程模型
    image_1b61psc6gr24inpqm6o121dvsm.png-116.2kB

  • 与用户级相比,内核级主要工作仍是保存现场(内核栈),但是每个执行序列需要2个栈:内核栈(中断和系统调用)和用户栈(普通函数调用)

  • 多对多模型
    image_1b61q3g8a135a6o81t12103o139713.png-103.7kB

  • 它们的比较:
    image_1b61q5hvmem81uaks5g5l6fil1g.png-87.4kB

  • 线程库:为程序员提供的用来创建和管理线程的API,分为用户级线程库和内核级线程库。目前使用的线程库只要有3类:

    • POSIX Pthread: 可以提供用户和内核级的线程库
    • Win32线程库:应用于Windows OS的内核级线程库
    • Java线程库:允许在java程序中直接创建和管理线程,根据JVM运行在宿主OS中,使用宿主OS支持的线程库实现

第五章 CPU调度

  • 总原则:资源高效、公平合理

  • 标准有:

    • 提高CPU利用率
    • 提高系统运算的吞吐量(单位时间完成的任务数量)
    • 缩短进程的周转时间(从任务开始到任务结束的时间)
    • 缩短进程的等待时间
    • 缩短响应时间(用户输入到产生反应的时间)
  • 程序代码可以分成计算类代码和I/O类代码,进程执行过程由CPU执行和I/O等待周期组成,CPU约束型程序以计算为主,CPU区间会较多,还会有少量长的CPU区间。I/O约束型程序以I/O为主,但配合I/O处理会有大量短的CPU区间。

  • 调度情况分为非抢占式调度(因某些事件让出CPU或者进程任务完成自动退出)和抢占式调度(规定时间片到了或者出现了优先级更高的进程)

  • 吞吐量大=>上下文切换代价小=>时间片大=>响应时间长=>前台优先级不高,为了防止这系列的矛盾,可以让前台任务(交互式任务,注重响应时间)和后台任务(批处理任务,注重吞吐量)共存

  • CPU调度算法:

    • 先到先服务调度FCFS:非抢占,不适合交互式,未考虑任务特性

    • 最优作业优先调度SJF:可以保证最小的等待时间,SJF的可抢占版本SRJF,预测下一个CPU区间:
      image_1b61sfbl14iu1f6q1hlobbi1qd71t.png-84.1kB

    • 优先级调度:每个任务关联一个优先级,调度优先级最高的任务,但可能导致优先级低的任务无法得到执行

    • 转轮法调度RR:按时间片和任务到达顺序来轮转调度,优点:定时有响应,等待时间较短,适合交互式,缺点:上下文切换次数较多,且,时间片太大=>响应时间太长,时间片太小=>吞吐量变小,周转时间变长,折中:时间片10-100ms,切换时间0.1-1ms

    • 多级队列调度:混合多种调度算法,按照一定的规则建立多个进程队列,不同的队列有固定的优先级,不同的队列可以给出不同的时间片和采取不同的调度算法,存在问题:

      • 没法区分I/O bound和CPU bound
      • 存在一定的“饥饿”现象
    • 多级反馈队列调度:任务可以在队列之间移动,更细致的区分任务

  • Linux调度算法概论:

    • 采用优先权的、基于信用度的、可抢占的RR调度
      • 每个进程有一个信用度counter
      • 调度时选择信用度最大的进程
      • 每次定时器中断,运用进程信用度减一
      • 进程信用度为0时,进程暂停被抢占
      • 如果所有就绪进程的信用度都为0,则系统对所有进程(包括阻塞态)重新计算信用值counter=counter/2+priority
      • 进程的priority通过继承获得

第六章 进程同步

  • 互斥与临界区问题:

    • 竞争条件:多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关
    • 临界区:
      • 临界资源:把一次仅允许一个进程使用的资源称为临界资源
      • 临界区:在每个进程中,访问临界资源的那段程序称为临界区
  • 临界区问题的解决方案,必须满足下面条件

    • 互斥进入:如果一个进程在临界区中执行,则其他进程不允许进入,为基本原则
    • 有空让进:若干进程要求进入空闲临界区时,应一定能使某个进程进入临界区
    • 有限等待:从进程发出进入请求到允许进入,不能无限等待
  • 进程代码结构
    image_1b637ghp31ugokk2h5a4tv1i7m1c.png-22.1kB

  • 解决方案

    • 一般软件方法:
      • 轮转法:
        image_1b637hbf01njgq0rmmc1q2b1cd11p.png-75.7kB
      • 标记法:
        image_1b637ih5p1t1s1cts1pfo63gnr426.png-91.9kB
      • Peterson算法
        image_1b637juni1sku1vu41r54e4f212j.png-159.9kB
      • 面包店算法
        image_1b638jjhh1pcq7ho1kd8l7d1ivh30.png-149.8kB
    • 关中断方法:
      image_1b638p5gc21o4t5149916o58gl3d.png-70.6kB
    • 硬件原子指令方法:
      image_1b638q0nehke461rhegdut9a3q.png-98.7kB
  • 前面三种方法小结:

    • 一般软件方法、关中断方法、硬件原子指令方法
    • 只是解决了临界区进出互斥的问题
    • 都为解决“忙等待”情况
    • 用来解决多进程同步问题还很复杂、不方便
  • 信号量方法:一个数据结构+2个基本操作
    image_1b639h6sh146jbk9175m9o1csb47.png-59.5kB

  • 信号量是一个确定的二元组(s,q),s是一个具有非负初值的整形变量,当其大于等于0时,表示系统中当前可用资源的数目,小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目,q是一个初始状态为空的队列,信号量的值仅能由P和V操作更改

  • 例子:
    image_1b639pplf1gq0qpbiku19ud10oa4k.png-10.1kB


    image_1b639sqh3ll5vq7cio1l6ju7h51.png-169.7kB

第七章 死锁

  • 概念:多个进程因循环等待资源而造成无法执行的现象

  • 一次只能让一个进程使用的资源称为互斥访问资源

  • 资源分配图模型

    • 一个进程集合(P1,P2...)
    • 一资源类型集合(R1,R2...)
    • 资源类型Ri有Wi个实例
    • 资源请求边:有向边Pi->Rj
    • 资源分配边:有向边Ri->Pk
      image_1b63cqb89ihn31qcan5v16d45e.png-7.1kB
      image_1b63cqorft38ouiv41vd05ge5r.png-5.8kB
      image_1b63csphhktgjpi47g1v7a1b9j68.png-94.5kB
  • 死锁的4个必要条件

    • 互斥使用:至少有一个资源互斥使用
    • 不可抢占:资源只能自愿放弃
    • 请求和保持:进程必须占有资源,再去申请
    • 循环等待:在资源分配图中存在一个环路
  • 消除死锁的方法

    • 死锁预防:破坏死锁的必要条件
    • 死锁避免:检测每个资源请求,如果造成死锁就拒绝
      • 安全状态定义:如果系统中所有进程存在一个可完成的执行序列,则称该系统处于安全状态,安全序列为P1,P2...
    • 死锁检测+恢复:检测到死锁出现时,剥夺一些进程的资源。只要可用资源足够,就分配,发现问题再解决
    • 死锁忽略:就好像没有出现死锁一样
posted @ 2017-06-26 23:41  va_chester  阅读(567)  评论(0编辑  收藏  举报