复习
关于计算机操作系统的一些看法:事实上,计算机只不过是一个硬件的集成,而人们要更加方便的对计算机下达命令并且让计算机去执行这些命令,在计算机发展伊始,当时还没有操作系统的出现的时候,人们给计算机下达命令,或者从计算机上获取结果,都是用纸带的方式然后进行翻译,这种方式显得过于复杂,而且效率也比较低下,在历史记载以来,世界上第一个操作系统是GM-NAA I/O操作系统,这个操作系统可以执行批处理进程,也就是一个进程执行完毕后还可以去执行下一个进程,这个操作系统还提供了统一的共享接口,事实上,操作系统最常用也是使用人数最多的操作系统就是Windows操作系统,Linux,UNIX只有一些开发运维的人员才会深入的去玩这个,但是Linux操作系统事实上却是很棒,速度也很快,例如我正在用的deepin操作系统。
【进程管理】
进程是操作系统中最基本的概念,并且进程是资源分配的基本单位,并且一个进程可以搞成许多的线程,或者理解为轻量化的进这样比较形象一些,并且线程的执行是在内核态下进行执行,而且无论有没有引进线程这个概念,进程都是资源分配的基本单位,进程是一个抽象的概念,或者你可以这样理解进程就是计算机中正在运行的程序,假设在Windows操作系统的环境下我们打开资源管理器:
会发现,后台上有许多正在运行的程序,当在手机操作系统中的时候——也叫嵌入式操作系统,一般来说,都会支持打开后台程序管理,这时候你打开的界面上的App就是正在运行的进程,进程在计算机上执行的时候也分为用户态和内核态,用户态就相当于你在计算机上面打开程序,内核态则是你发出一个命令,或者系统调用,或者中断的处理,cpu会进入到内核态去处理你的命令,这里有必要谈论一下内核的概念。
【内核】
在现代计算机的构成的时候,你在买计算机的时候,常常会听到核心这个说法,这时候你就要分辨出来这个是真核心还是假核心(线程数),拿cpu来看,cpu是一个硬件集成的东西,你把cpu拆开后就会发现一个cpu被分成了多个内核,这个分割是物理上的分割,和操作系统无关,而操作系统根据分配算法还有设计上的不同就可以给不同的内核上面分配多少个进程。
【EXample】:假设cpu是4核心的,这个时候来了10个线程,根据不同分配,把线程分配到所有的核心上进行运行,但是OS肯定为了性能考虑会选择最优的分配策略。
事实上,查看电脑cpu核心和线程数有一种最简单的方法:
1.win+R打开命令控制
2.输入wmic
3.进入这个界面:
4.输入“cpu get”命令
然后就可以查看cpu的核心数和其他的一些参数:
(小声嘀咕:电脑太垃圾)
内核是运行线程的物理装置,但是决定一个内核上面可以运行多少个线程的数量这个是可以人为控制的,所以就出现了市面上说的多少多少核心事实上是线程的数量来欺骗消费者。
下面继续谈进程的关系,现代计算机都是多进程一起并发的执行,这就导致了一个问题,计算机有很多的进程,但是一次只允许一个进程上处理机进行处理(一般说,当然还有多处理机的情况,处理机和处理器之间的区别在于,处理机包括处理器,处理机加上外围设备就构成了计算机),而决定些进程的处理的顺序往往影响着计算机的性能,这就引出了调度的概念:
一般来说有三种调度(按照调度的层次进行划分):
1.作业调度
2.内存调度
3.进程的调度
根据调度的层次不同,采用的调度策略也不同,常见的几种调度算法有:
1.短作业优先:事实上就是看作业在处理机上的运行时间,哪一个作业的时间更短,就让哪一个上处理机,但是这个会导致一个缺点:如果不断有短作业上处理机运行,那么时间长的作业迟迟不上处理机运行,这就使得发生了饥饿状态。
2.先来先服务:顾名思义,就是哪一个作业先来,根据作业的先后顺序执行,但是综合考虑下来,只利于cpu繁忙但是不利于Io繁忙。
3.优先级调度算法(静态):根据进程的就绪队列,提前设置好进程的优先级,在进程上处理机运行的时候,这个优先级不发生任何的改变。
4.高响应比调度算法:
响应比p=(等待时间+要求服务的时间)/(要求服务时间)
事实上,这个算法兼顾了短作业和长作业达到了一种平衡。
不会发生饥饿现象。
5.多级反馈
6.时间片轮转算法:对于就绪队列上的每一个进程,都设置一个固定的时间,在这个固定的时间进程上处理机运行,当时间片上的时间用完的时候,不管进程有没有运行结束,都变成就绪态,让下一个进程上处理机进行运行。
【进程的同步和互斥】
就进程的同步而言,打个很简单的例子:比如说,你去吃饭,你向收银员先给钱(给钱拿钱这个过程相当于传递一个缓冲区),然后你才能拿到饭,达成了吃饭这个需求。
而互斥更简单:好比于很多人在户外上厕所,但是这个厕所每次只允许一个进入。这就是互斥的概念。
【死锁】
有了进程的互斥和同步的概念,我们谈谈死锁的概念,先举一个例子:
假设有两个人和5个糖,每个人需要三个糖才会离开这家店,但是这个店不能空并且只有他们吃掉一个后才会做新的糖,现在每个人手里有两个糖,都只差一个才会走,但是都不吃掉自己手中的糖,这就发生了死锁。
课本的概念总结的更加概括一些:多个进程因为竞争资源而造成的一种僵局(等待),如果没有外力作用(比如撤销掉某些进程),这些进程都没有办法继续执行下去。
[原因]:死锁产生的必要条件:
1.循环等待
2.互斥
3.请求和保持
4.不剥夺
从死锁产生的必要条件入手,破坏其中一个就可以破坏死锁,但是这也引出了一个问题,如果每次都是在发生死锁后然后进行处理未免显得过于麻烦了一些,有没有一种可以提前确定好进程执行顺序,按照这个顺序就一定不会发生死锁,这就引出了一个新的算法——银行家算法
【注】;银行家算法是预防死锁的算法
这里给出一个王道书上的例子:
并且有一个当前操作系统的资源数量A=(3,3,2)
Claim1:
我们首先用max矩阵—allocation矩阵的到一个need矩阵如下:
比较向量A我们知道可以满足p1和p3进程的需求
假设是p1得到满足。用(3,3,2)+(2,0,0)=(5,3,2)
循环这个过程就得到了一个安全序列:p1 p3 p4 p2 p0
按照这个顺序执行下去就一定不会发生死锁。
【remark】:
总的来说,进程管理对操作系统起着至关重要的作用,这里结合一下计算机组成原理谈一下进程管理,我们都知道我们的计算机都是时分复用的计算机,即就是在一个时钟周期内,通过执行不同程序的不同指令,来达到宏观上看起来是一起在计算机上执行,但是事实上是一个一个的去执行的,程序在执行的过程就是进程,进程管理通过出厂的时候装好的策略或者是人为的去给他设置某种进程管理的算法,连同cpu一起提升计算机的性能。