进程
定义
- 进程是指在系统中正在运行的一个应用程序,程序一旦运行就是进程
- 进程可以认为是程序执行的一个实例,进程是系统进行资源分配的最小单位,且每个进程 拥有独立的地址空间
- 一个进程无法直接访问另一个进程的变量和数据结构,如果希望一个进程去访问另一个进 程的资源,需要使用进程间的通信,比如:管道、消息队列等
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行,时间片结束后也会进入到就绪态
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。
进程的调度算法
先来先服务(FCFS)调度算法
- 在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分给它,使之投入运行。
- FCFS属于不可剥夺(抢占)算法。
- 算法简单,但是效率低下;对长作业较为有利,对短作业不利;利于CPU繁忙型作业,不利于I/O繁忙型作业。
短作业优先(SJF)调度算法
短作业优先调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行
- 该算法对长作业不利,中长作业的周转时间会增加。长作业长期饥饿。
- 完全没有考虑作业的紧迫程度,因而不能保证紧迫的作业会被及时处理。
- 平均等待时间、平均周转时间最少。
优先级调度算法
该算法的优先级用于描述作业运行的紧迫程度。在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。
根据新的更高的优先级进程能否抢占正在执行的进程,可将该调度算法分为如下两种:
- 非剥夺(抢占)式优先级调度算法
- 剥夺式优先级调度算法
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为一下两种:
- 静态优先级:优先级是在创建进程时确定的,并且进程的整个运行期间保持不变。
- 动态优先级:在进程运行过程中,根据进程情况的变化动态调整优先级。
高响应比优先调度算法
主要用于作业调度,是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑了每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
响应比的变化规律可描述为:
响应比Rp = (等待时间+要求服务时间)/要求服务时间
根据公式可知:
①作业的等待时间相同时,要求服务时间约旦,响应比越高,有利于短作业。
②要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务。
③对于长作业,作业的响应比可以随等待时间的增加而提高,等待时间足够长时,其响应比便可升到很高,从而可以获得处理机,不会饿死。
时间片轮转调度算法
时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务的原则,但是仅能运行一个时间片。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被抢占)处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队,等候再次运行。
多级反馈队列调度算法
多级反馈队列调度算法是时间片轮转算法和优先级调度算法的综合与发展。通过动态调整进程优先级和时间片的大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为了提高系统吞吐量和缩短平均周转时间而照顾短进程;为了获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必实现估计进程的执行时间。
进程与线程的区别
- 进程是操作系统分配资源的基本单位,线程是任务执行和调度的基本单位。
- 同一进程的线程共享进程的地址空间,而进程之间则是独立的地址空间;
- 进程切换,消耗的资源大。线程切换开销小。所以涉及到频繁的切换,使用线程要好于进程;
- 一个进程崩溃后,一般不会对其他进程产生影响,但是一个线程崩溃整个进程崩 溃,所以多进程比多线程健壮;
- 一个进程中包含多个线程,线程的运行依赖于进程,而进程可以独立运行。
多进程和多线程的优缺点
多进程优点
- 每个进程相互独立,不影响主程序的稳定性,子程序崩溃没关系;
- 编程相对容易;通常不需要考虑锁和同步资源的问题。
- 每个子进程都有独立的地址空间和相关资源,个体能够达到的性能上限高。
多进程缺点
- 多进程逻辑控制、通信相对复杂
- 多进程调度切换开销比较大
多线程优势
- 多线程调度切换开销小,创建销毁速度快
- 多线程通信方便 ,同一个进程所有线程可以直接共享内存和变量等
多线程缺点
- 一个线程的崩溃可能影响到整个程序的稳定性
- 线程之间的同步和加锁控制比较麻烦
- 每个线程与主进程共用地址空间,受限于地址空间大小限制
两者的应用场景
- 多进程
- 多机分布
- 很少创建和销毁
- CPU切换不频繁
- 多线程
- 多核分布
- 频繁创建和销毁
- 大量并行计算,CPU切换频繁
为什么线程开销比进程小?
- 创建开销小:线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们。
- 销毁开销小:线程的终止时间比进程快,因为线程释放的资源相比进程少很多。
- 切换开销小:同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的
- 通信开销小:由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了
协程
协程与线程的区别
- 线程是操作系统的资源,线程的创建、切换、停止等都非常消耗资源,而创建协程不需要调用操作系统的功能,编程语言自身就能完成,所以协程也被称为用户态线程,协程比线程轻量很多;
- 线程在多核环境下是能做到真正意义上的并行,而协程是为并发而产生的;
- 一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行;
- 线程进程都是同步机制,而协程则是异步;
- 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力;
- 操作系统对于线程开辟数量限制在千的级别,而协程可以达到上万的级别。