计算机系统

操作系统的主要功能:1、向上提供更高层次的抽象; 2、向下管理各种硬件。

进程模型,如果只考虑3种状态,那么存在四种转化关系;如果考虑挂起,会增加六种转化关系。

含挂起状态的进程状态转换

计算机系统包括硬件和系统软件,计算机硬件包括I/O总线,如果IO设备需要与CPU通信,需要使用控制器或适配器接入I/O总线。

C语言源程序需要经历4个阶段(预处理cpp、编译器、汇编器、链接)最终转化为可执行目标文件,链接之前称为可重定位目标文件。  --by《深入理解计算机系统》

编译之后的文件称之为目标文件,链接库文件之后,称为可执行文件。  --by《C++程序设计教程》钱能

编译器作用,能够使不同编译器编译出来的不同高级语言得到统一的输出。一个字长是系统级的参数,可能是4字节(32位)或者8字节(64位)。

CPU含有PC(程序计数器、一个字长)、寄存器(多个字长)、计算和逻辑运算单元。

每个进程都需要对应一个PCB,PCB描述和控制进程,多个PCB的组织方式可以通过顺序表、链接表、索引表。PCB需要存储程序暂停时的现场信息。

操作系统三级调度:

  1. 高级调度 任务调度
  2. 中级调度 换入换出
  3. 低级调度 进程调度 也就是CPU调度

操作系统采用何种调度算法取决于系统的设计目标。

评价CPU调度算法的性能,可以从两个角度,系统角度有吞吐量,CPU利用率,各个资源平衡利用,公平性;用户角度有作业周转时间、截止时间。

批处理系统,看重吞吐量;

分时系统,看重响应时间和调度公平性,常用时间片轮转调度算法;

实时系统,抢占式调度,高优先级的进程期望得到立刻响应。

6种调度算法,FCFS,先到先服务,有利于长任务(进程),不利于短任务(进程),有利于CPU繁忙的进程,不利于IO繁忙的进程;

SJF/SPF,短任务/短进程优先,需要预估作业(进程)运行时间,长任务(作业)可能长时间得不到运行;

高响应比优先调度算法,响应比=1+等待时间/运行时间,可以平衡短任务(进程)与长任务(进程),但是同样需要预估运行时间,每次都需要计算响应比;

RR,时间片轮转;优先级调度算法,可以设置静态优先级,动态优先级;多级反馈队列调度算法。

就作业平均周转时间而言,FCFS最长,高响应比优先次之,SJF最短。

CPU在两种情况下会切换,运行态->阻塞态,运行态->就绪态。进程自身只能控制自己由运行态->阻塞态,不能控制其他状态转换。

作业周转时间=等待时间+运行时间;带权作业周转时间=1+等待时间/运行时间。

传统进程,充当资源管理实体调度和分派实体。支持线程的进程,线程作为调度和分派的实体,进程只作为资源管理实体。进程下的所有线程共享内存,共享地址空间。

线程的实现方式有:1、内核态实现,优点是比较简单,操作系统实现这一切,缺点是每次切换都需要陷入内核态,占用宝贵的内核态内存;2、用户态实现,优点是切换效率较高,缺点是需要改写操作系统,在每次进程阻塞切换时,首先查看进程中有没有没有阻塞的线程可以执行,就是所谓的“第二次机会”,另外最大的问题是违背软件原则,下层的程序(操作系统)调用了上层的服务(执行系统线程);3、目前的方式是采用混合实现,阻塞线程在内核态进行管理,其他线程在用户态管理。


 

进程互斥同步,多个进程需要抢占同一个互斥资源,产生间接制约关系,是互斥;多个进程需要按照一定的顺序执行,产生直接制约关系,是同步。互斥可以认为是同步的一种特殊情况,各个进程在互斥的基础上,通过同步的方式向前推进。每个进程独立的、以不可预测的方式向前推进,在某些时间点需要进行同步。互斥的实现会产生的两个问题,饥饿和死锁,死锁可以理解为两个进程各占有一部分资源然后彼此在等待获取对方占有的资源

互斥资源被称为临界资源,访问临界资源的代码叫做临界区。在进入临界区之前先进入进入区,临界区执行完后进入退出区。

实现互斥访问资源的四个原则:1、空闲进入 2、忙则等待 3、有限等待 4、等待让权,所谓等待让权就是进程在等待的时候不要占用CPU,导致CPU“忙转”。

实现互斥和同步的本质是处理好设置进入区和退出区。硬件方式,使用专用机器指令(该指令不能被中断),1、开关中断指令 2、标志测试指令 3、交换指令。前一个指令的问题是只适合单CPU并且有些进程可能执行时间过长,后两个指令的问题是进入临界区之前需要不断测试全局变量s和局部变量key,CPU处于“忙转”。软件方式,采用二标志,T1=1标示进程1(下面以P1表示)占用资源,T2=1标示P2占用资源,可能会产生P1、P2都进入临界区或都不能进入临界区的问题。采用三标志T1,T2,T,用T标示哪个进程实际进入临界区,以进程P1为例,在进入临界区之前设置T1=1,T=2,然后执行while循环测试while(T2=1&&T=2),如果P2同时到达,那么此时T2=1,当P2执行T=1后,P1退出循环,进入临界区;若P2能获得执行同理。该方式同样存在循环测试,CPU“忙转”的问题。

信号量,分为整型信号量,结构体信号量,在结构体信号量s中存在一个整型分量和一个PCB指针分量。整型信号令需要循环测试,现在都是使用结构体信号量。信号量分为资源信号量(互斥资源的申请和释放)和控制信号量(进程的互斥和同步)。资源信号量,整型分量用来表示剩余资源的数量,如果小于0,绝对值与阻塞的进程数相等;控制信号量,整型分量表示的是一个同步信号,大于0的时候无需进行同步,小于0的时候需要进行阻塞同步。设s为信号量,提供P(s)、V(s)原语操作,P(s)先对s.value执行-1操作,s.value<0需要将进程进阻塞队列;V(s)先对s.value执行+1操作,s.value<=0,需要将一个进程出阻塞队列。

经典进程同步问题,进程同步可能会产生死锁、饥饿问题。

1、生产者-消费者问题(使用数组作为循环队列实现有限缓冲池,每个数组元素是一个缓冲区)

  生产者有信号量empty标示有多个空的缓冲区,消费者有信号量full标示有多少个满的缓冲区,同时使用信号量mutex来实现互斥访问共享的缓冲池。多个P调用时候,先执行私有信号量,再执行公用信号量,如果顺序颠倒,可能会产生死锁。

2、哲学家进餐问题(5个哲学家围成一个圈,每个哲学家分别左手右手有一只筷子,哲学家左右手都拿起筷子后可以吃饭)

  死锁:5个人都拿起了左手的筷子,等待拿右手的筷子;

  饥饿:5个人都拿起左手的筷子,然后等待右手的筷子,没拿到,又都放下左手的筷子,一段时间后,再次都拿起了左手的筷子,如此循环往复。

  解决的方式有3种:

  • 只允许四个人同时拿起左手的筷子;
  • 使用AND信号量,将拿左手的筷子和拿右手的筷子操作合并;
  • 编号,奇数的哲学家拿左手的筷子,偶数的哲学家拿右手的筷子。

3、读者-写者问题

 

posted @ 2020-10-29 21:20  逸夫ABC  阅读(277)  评论(0)    收藏  举报