Advertisement

1.4操作系统总结(二)

阅读量:

第四章 线程

  1. 定义:进程中的代码执行的一个连续段落,在CPU核心上运行的基本操作单元。Pthread()函数用于创建新的子线程。
  2. 每个进程至少分配一个独立的线程,并包含以下组成部分:唯一标识该线程的ID字段;反映当前执行位置的PC寄存器;一组用于临时数据存储的寄存器;以及用于保存上下文切换信息的关键结构(即栈)。

TCB:线程控制块,线程不需记忆代码,执行的是进程部分代码
3、不用子进程+IPC的原因:每个进程必须有一个完整的映像、大量重复存储、频繁的IPC过程、子进程之间调度切换代价大(现场、栈、页表)
4、多线程编程优点:响应度高、资源共享、经济快捷(消耗资源少、切换少量现场,速度快)、方便多CPU处理(充分考虑任务有效分离)
5、线程2种实现方法:用户线程(受内核支持,不需要内核管理)、内核线程(OS直接支持管理,每个执行序列有两个栈,用户栈和内核栈,在内核栈保存现场)
6、用户线程与内核线程关联关系:多对一(同一进程的线程不能运行在不同CPU上。一个线程阻塞,整个进程阻塞。内核无感知进程内线程管理。线程表在进程中,在用户空间)、一对一(用户通过系统调用创建。一个线程阻塞,允许CPU切换给其他线程,并发能力更好。一个进程多个线程可在不同CPU上运行,多CPU并行处理。内核线程数量影响系统性能,OS会限制线程总量。进程表、内核表均在内核空间)、多对多(轻量级进程)
7、线程库:为程序员创建和管理线程的API(两种方法实现:用户线程库,本地函数调用、内核线程库,系统调用)

第五章 CPU调度

  1. 基于计算的类型:主要处理计算任务,在这些任务中CPU时间较长且频繁地切换到其他计算任务。
  2. 基于I/O的任务:主要处理输入输出操作,在这些操作中CPU时间短暂且频繁切换。
  3. 非抢占调度机制:当进程等待资源时会等待其他进程完成当前任务,并在完成时自动终止。
  4. 抢占式时间片调度:每个进程分配固定的时间片,在此期间优先级较高的进程有机会使用 CPU。
  5. PickNext()函数负责选择下一个运行的任务(进程或线程),并分配 CPU 资源(进程和线程统称为任务)。
  6. CPU调度策略的设计准则是公平性(合理安排 CPU)、响应时间和吞吐量三个维度;其中存在响应时间和公平性之间的矛盾关系以及吞吐量与响应时间之间的权衡关系。
  7. 采用平均等待时间作为评估指标来比较不同算法的表现:
    (1) FIFO算法具有良好的公平性和简单性特点;
    (2) SJF算法能够保证最小平均等待时间;
    (3) SRJF算法是在SJF基础上发展起来的一种可抢占型调度算法;
  8. SJF与SRJF均采用指数平滑法来进行下一时刻作业大小的最佳预测。

(4)SJF一般化:优先权调度,调度优先权最高的任务
优先级太低任务一直就绪产生饥饿现象,处理方法:优先级动态调整
常用方法:“老化”(aging)技术,优先级随等待时间增长而不断增高
(5)RR(“轮叫”算法):适合交互式的调度,按时间片来轮转调度,最常用,定时有响应,等待时间较短,但上下文切换次数较多,当时间片足够大(>=7ms)时退化为FCFS
(6)多级队列调度:实用性不强

(7) 多级反馈队列:最为普遍使用的调度方案
8. 在Linux系统中,默认的调度算法包括基于优先级、基于信用度以及可抢占轮转分配(RR)机制
每个进程都分配一个信用计数器,在计数器耗尽为零时会暂时让出CPU以便被抢占,并根据计数器值最高者优先处理
当所有就绪态进程均无可用资源时(即它们的credit counter均为零),系统将重新计算所有进程(包括阻塞态进程)的credit counter值
其中Process priority值通过继承的方式获得;并且最高credit value设定为max=2倍Process priority
9. 在Linux系统中,默认的调度触发事件分为两类:一类是由用户操作引发的任务(如启动新进程或调用wait等系统调用),另一类是由内核触发的任务(如时钟中断、资源锁获等)

第六章 进程同步

本节介绍标记法的基本概念。本节将说明如何设置两个全局标志变量。当flag[0]和flag[1]同时为真时,在这两个标志的两端均陷入死锁状态,并导致系统长时间停滞不前。

Peterson算法通过定义三个全局变量来实现对多进程中互斥问题的解决。然而,在这种算法中,并非适用于所有情况——仅适用于两个进程的场景。该算法还存在一种称为"优先权倒置"的现象。具体来说,在P1占用一个进程时(即P1被分配了时间片),flag[1]被设置为true;随后在时间片交换过程中(即被分配时间片),P0由于拥有更高的优先权而获得该进程的时间片控制权。然而由于这一机制导致了P0陷入死循环状态无法进入临界区——必须等待P1完成其当前的任务块后才能继续运行——从而引发系统性能上的显著下降。

一般软件法总结:从机器语言角度看,在临界区之外的进入区与退出区代码同样属于临界区范围,并需判断循环条件以避免死循环的发生以及防止出现"忙等待"现象而导致CPU资源过度消耗的问题。
(2)中断方法:阻止调度可能导致另一个进程无法执行而暂时关闭中断功能。这种方法操作简单但会导致系统出现死机状态,并非明智的选择。
(3)硬件原子指令:通过修改硬件配置来实现加锁机制并确保一次完成操作的同时减少硬件依赖带来的不便性。
前三种方法仅解决了进入互斥的问题并未解决"忙等待"现象导致的资源浪费问题且难以满足多进程同步需求。
(4)信号量机制:由一个数据结构及其相关的两个基本操作组成能够实现互斥无"busy waiting"现象且能处理多进程同步问题。
其中:
semaphore struct包含一个计数值域与一个用于存储等待该信号量的进程队列域;
P操作函数将计数值减一若计数小于零则将当前进程加入队列否则继续执行;
V操作函数将计数值增一若计数小于零则从队列中移除第一个进程将其恢复到就绪状态并返回当前进程继续执行;
注意:一旦进入等待队列不是忙等待而是阻塞状态。
6、同步控制:多个进程需按确定的协作顺序依次执行例如生产者-消费者模型采用互斥与同步控制机制;任何时刻必须满足空缓冲+满缓冲=缓冲大小的关系才能确保系统的正常运行。

例:哲学家进餐问题:若同时拿左边筷子则产生死锁

避免死锁的方法:最多允许多个人同时用餐 奇数编号者优先拿取左侧餐具 偶数编号者优先拿取右侧餐具 只有当获取到两双餐具时才能用餐

全部评论 (0)

还没有任何评论哟~