这里写目录标题
1、进程的状态
1. 创建:操作系统为进程分配资源,初始化PCB
2、就绪 :万事俱备,只欠cpu
3、运行:占有cpu,并在cpu上运行
4、阻塞:为了提高cpu利用率,需要各种资源准备好才能开始,而不能占用cpu以后再去获取资源。这里的资源,比如说打印机等外部设备
5、终止:回收进程资源,撤销PCB
2、进程状态转换
注意:阻塞态不能直接到运行态
3、操作系统层面是怎么实现原子操作的?
在java中cas就是常见的原子操作,底层是一条cmpxchg指令。
在操作系统中原子操作也叫原语。是利用开中断和关中断指令实现的。
当关中断以后,外部的中断信号不会打断指令的执行,因此执行的操作就是原子的,当原子操作执行完以后,打开中断,此后的指令就有可能被中断信号中断了。
(由于开关中断的指令权限非常大,因此原语运行在核心态)
4、管道通信中半双工的含义?
首先半双工通信是指每次只能一个方向进行数据通信,比如对讲机,必须等一个人讲完挂掉以后,另一方才能占据信道。
因此在普通管道通信中,一个时间段内只能进行单向传输,但是并不是只能一个方向的传输。
另外管道通信中,只有写满了管道,才能开始读数据,如果没读空管道,也不允许写。
5、操作系统为什么要引入线程?
如果没有线程只有进程的话,那么一个应用(进程)一个时间点只能做一件事情,比如我们的qq,就不能一边进行视频,一边文字聊天。因此引入线程来增加并发度,引入线程后,线程成为程序执行流的最小单位(进程是程序资源分配的最小单位)。
6、系统吞吐量
吞吐量=总共完成了多少道作业/总共花了多少时间
7、什么是饥饿?
注意饥饿和死锁的概念不一样,饥饿是有可能一直获取不到cpu。可能只有一个线程发生饥饿,但是死锁一定是两个或两个以上线程死锁。
7、调度算法
区分是作业的调度还是进程的调度;抢占式还是非抢占式;会不会造成饥饿?
1、先来先服务FCFS
顾名思义,任务先到达的先获取cpu进行服务。非常公平,用于作业调度时,考虑的是那个作业先到达任务队列,用于进程调度时,考虑的是那个进程先到达就绪队列。非抢占式,不会饥饿。
缺点:对长作业有利,对短作业不利(排队买奶茶,前面的人一次买20杯。。。)
2、短作业优先
顾名思义,执行时间短的先执行。是非抢占式的
也可改造成抢占式的,最短剩余时间优先算法:每当有进程到达就绪队列,就要进行调度,判断当前到达的进程执行时间是否少于目前执行进程的剩余时间,是的话新进程抢占cpu;
追求的是最少的平均等待时间,既可用于作业调度也可进程调度。可抢占式也可非抢占式。
不公平的,对长作业不利,对短作业有利,可能产生饥饿(当一直有源源不断的短作业到来时)
3、高响应比优先
响应比=(等待时间+要求服务时间)/要求服务时间;
从公式可看出,等待时间越久,相对更容易获得cpu。即可用于作业调度,也可用于进程调度。非抢占式,也可看出不会造成饥饿。
4、时间片轮转调度算法
公平的轮流的让每个进程执行一个时间片,比如100ms,如果进程在时间片内没有执行完就剥夺cpu,让进程重新进入就绪队列的队尾。响应快,适用于分时操作系统。
抢占式的、公平的、不会饥饿,但是由于频繁的切换进程,开销会比较大。
5、优先级调度算法
根据优先级是否可以动态改变,分为静态优先级和动态优先级。抢占式和非抢占式都有,会导致饥饿
6、多级反馈队列算法
最后补充:在java中的线程调度算法是基于操作系统的调度算法。
8、注意区分临界区和临界资源
临界资源是线程互斥访问的资源,而临界区是访问临界资源的代码段(程序)
9、死锁的四个必要条件
互斥条件、不可剥夺条件、请求和保持条件、循环等待条件;
这里重点讲下循环等待条件,因为这点最不好理解。也就是说,我们的线程发生死锁,一定会有循环等待,可能是两个线程,可能是多个,在互相等待对方持有的资源。
但是,发生循环等待时未必会死锁,比如五个线程循环等待,但是其中的一个线程等待两个资源,而其中一个资源的持有线程并不在环路中,这样当这个线程获取了另一个资源就使得环路不再封闭。见下图中的变化:
10、死锁的处理策略
1、预防死锁
破坏死锁产生的四个必要条件中的一个或多个,一般写代码时候主要是预防第四个条件的发生。
2、避免死锁
银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量(这里就避免了等待资源)。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。
3、死锁的检测和解除
允许死锁的发生,但是操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
11、未完待续
也欢迎访问我的个人博客网站,了解更多其他知识