小林coding 图解系统 chapter4
chapter 4 进程与线程
(先mark住开题之前的小故事,看完之后再来看这个小故事可能会有不同的收获!!!)
4.1 进程
![](https://img2022.cnblogs.com/blog/2487966/202206/2487966-20220603112218561-934574205.png)
1个cpu交替处理不同的进程,称作并发;
好几个cpu做着不同的任务,称为并行!!!
![](https://img2022.cnblogs.com/blog/2487966/202206/2487966-20220604102734077-1503885279.png)
但是,除了链表的方式之外,还有索引的方式;不过为了方便数据的增删改查,还是使用链表比较方便!!!
进程的控制 :1、创建进程,2、终止进程,3、阻塞进程,4、唤醒进程
创建进程:为新的进程申请一个新的进程标识符,再申请一个空白的PCB(PCB是有限的,若申请失败则创建进程失败)
终止进程:有三种方式终止进程:正常结束,异常结束和被kill掉
先找到想要结束的进程的PCB
若处于执行状态,则立即终止他的运行状态,把资源还给cpu
若其还有子进程,则需要立即终止其子进程,将资源全部返还给操作系统或者父进程
将PCB从所在队列中剔除
阻塞进程:找到想要阻塞的进程的PCB
若其正在运行,保护其现场,将其状态改为阻塞态
将PCB插入到阻塞队列当中去
唤醒进程:找到想唤醒的进程的PCB
从阻塞队列中移除,标志状态改为就绪态
将PCB插入到就绪队列当中去
进程的上下文切换:表示的是PCB的切换,因为进程的环境就是PCB。通常进程会把信息保存在PCB中,通过PCB来实现环境的切换!!
cpu的上下文切换:表示的是cpu寄存器和程序计数器(PC)所依赖的环境,这两个代表了cpu运行的环境------> 环境的切换,就是cpu上下文的切换!!!
线程:线程就是进程的一条执行流程!!
线程的优点:
1、不同线程可以并发执行
2、一个进程当中可以有多个线程
3、各个线程之间可以共享资源
线程的缺点:
一个线程挂了,所有线程都挂了!!!
如果两个线程不是同一个进程的话,那么线程切换就是上下文切换;
如果两个线程是一个进程的话,那么线程的切换就是进程内部的切换:只需要切换私有数据就可以了。
线程主要有三类:
用户级线程,内核级线程和轻量级线程
调度算法:
调度算法分成两类:一种是抢占式调度算法,一种式非抢占式调度算法
抢占式调度算法是指:挑选一个进程,设置一定长时间的时间片,如果时间片结束之后该进程依然没有执行完毕,则该进程被挂起,OS选择其他的进程来运行
非抢占式调度算法:运行一个进程,如果他的运行时间片用完或者是运行结束之后,才会调用另外的进程!!!
为了实现一个优秀的调度类算法,我们需要做的就是考虑上述5个问题的实现效率!!!
调度算法的分类:
1、FCFS(first come first serve)----> 先来先服务
这很简单,就是先来的进程会优先服务,运行处理完之后,再运行or处理下一个进程
2、SJF(shortest job first)-----> 短作业优先法则
这也很简单,就是谁的运行时间最短,就优先服务谁。
3、HRRN(highest response radio next)(为什么不用first,不理解TAT)高相应比优先
相应比 = (等待时间+运行时间)/(运行时间),相对的,运行时间越少,或者等待时间越多则相应比就越高!!!
所以这种方法是 短任务优先+会服务长进程的算法(因为长进程肯定要等待很久来能轮到,所以客观上有利于长进程的运行!!!)
4、RR(Round Robin) ----> 时间片轮转调度法
每一个进程分配一个时间片(最理想的时间片应该是20ms--50ms)
如果一个进程在时间片所规定的时间之内用完了时间片,但是进程依然没有处理完成的话,则进程被挂起把cpu的性能释放出来,为下一个进程做服务!!!
如果在规定的时间片的时间内,进程已经运行完毕了,那么操作系统会将cpu立即切换到其他的进程!!!
5、HPF(highest processing first)最高优先级调度法
进程的优先级:静态进程优先级+动态进程优先级
静态优先级是创建进程的时候已经分配好的,优先级是不变的
动态优先级是会随着时间的流逝而改变的;根据进程的动态变化调整优先级,⽐如如果进程运⾏时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升⾼其优先级,也就是随着时间的推移增加等待进程的优先级。
最高优先调度法依然会有抢占式和非抢占式
抢占式:当就绪队列中出现优先级较高的进程的时候,优先处理,将当前运行的进程挂起,优先运行优先级较高的进程
非抢占式:依次按照顺序来处理
6、MFQ(Multilevel Feedback Queue)多级反馈队列
多级:就是有多个就绪队列,每个队列的优先级从高到低,优先级越高时间片越小
反馈:就是有优先级较高的进程加入队列,那么应该立即停止当前运行的进程,转而去运行优先级较高的进程!!!
上述的6种调度算法必须要记得挺牢!!!
4.2 进程之间的通信
我们知道,进程的用户空间是不能被独立的,一般而言是不能被访问的,但是内核态确实可以共享的!!!
Linux内核提供了不少的通信方法:
1、管道;2、消息;3、信号;4、信号量;5、共享内存;6、socket(插座)(现在的我只是把他背下来了)23333
1)管道:管道的传输是单向的,如果要想实现相互通信的话,需要两个管道!!!
效率太地下了
2)消息队列:消息队列是保存在内核中的消息链表!!!(类似于回邮件,你回我一封信,我回你一封信)
缺点:通信不及时,传输信息有大小要求!!!
3) 共享内存:消息队列会有用户态空间与内核态空间相互拷贝的问题(我也不太懂为什么)
拿出一块虚拟内存来来,映射到相同的物理地址当中去。这样就不需要互相拷贝了,就会共享了!!!
4)信号量:共享内存之后,如果同一时间多个进程同时修改一个共享内存,那么势必会引发冲突,所以信号量正是需要的所谓的保护机制!!!
P操作:用在共享资源之前;信号量减去1,如果信号量>=0,则还可以继续分配;若信号量<0则不可以进行分配
V操作:用在共享资源之后:信号量加上1,
5)信号:上述方式都是正常状态下进行的通信,那么不正常的状态下进行的通信该怎么去操作呢?
6)socket:表示跨网络在不同主机上进行通信!!!(socket没怎么看全,知道其中有tcp,udp和本机进程通信)
4.3多线程同步
多线程当中,如果共享资源没有上锁的话,那么多线程之间的竞争会非常的可怕,同时可能会让进程崩溃!!!
所以多线程同步本质上就是解决共享资源分配的问题!
互斥进程 :
互斥不只是针对对线程的,也可以对多进程竞争共享资源的时候,可以使用,避免造成资源混乱!!!
上述图片就是互斥的本质!!!
线程同步:
在一些关键点上需要线程之间相互通信,相互等待。这种相互通信,相互等待就称为线程同步!!!
加锁 or 设置信号量!!!
原子操作:原子操作是要么全部执行,要么全不执行,不可以出现执行一半的情况!!!
![](https://img2022.cnblogs.com/blog/2487966/202206/2487966-20220606205235278-1945038432.png)
没理解哲学家就餐问题(TAT)
哲学家就餐问题放到之后回答!!!
4.4 死锁
两个线程一直都在等待对方释放锁,没有外力的作用下,这些线程就会一直等待,这就是死锁!!!