文章目录
进程和线程
一.进程
为什么要引入进程
为了深刻描述程序动态执行过程的性质,人们引入“进程”概念。
概念
进程是程序的一次执行过程,是系统进行资源分配和调度的独立单位。它是一个动态的概念。
一个进程实体由PCB,程序段,数据段三部分组成。PCB(进程控制块)是一种数据结构,它描述了进程的运行状态和基本信息。
进程状态
进程的三种基本状态和它们的转换如下所示:
1.就绪状态
当前进程已分配到除CPU以外的所有必要资源的状态,只要再获得CPU就可以立即执行。
2.运行状态
进程已获得CPU,其程序正在执行。
3.阻塞状态
正在执行的进程由于某件事而暂停无法继续执行的状态,IO,申请缓冲空间等都会使运行状态的进程变为阻塞状态。
三种基本状态的转换
就绪–(进程调度)–>执行
执行–(时间片用完)–>就绪
执行–(IO请求)–>阻塞
阻塞–(IO完成)–>就绪
在不少系统中进程只有上述三种状态,但在另一些系统中,又增加了一些新状态,最重要的是挂起状态。挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程。它们的转换关系如下:
进程调度算法
1.先来先服务算法
根据进程进入就绪状态的时间先后顺序进行进程调度,是最基本的调度算法。
2.短进程优先
选择就绪队列中执行时间(估计值)最短的进程。
优点:降低了短进程的等待时间,平均周转时间较小;提高了系统吞吐量。
缺点:长进程可能长时间得不到执行。
3.优先权调度算法
选择就绪队列中优先级最高的进程。
抢占式优先权算法可能会导致低优先权进程长时间得不到执行,但是可以通过动态优先权解决这个问题。例如高相应比优先算法,等待时间越长的进程优先权越高。
4.时间片轮转算法
先按照到来的时间顺序将进程加入就绪队列,就绪队列中的每个进程依次执行一个时间片的时间,时间片用完但还未执行完的进程加入就绪队尾等待下一次执行。
5.多级反馈队列调度算法
这种算法设置了多个就绪队列,这些就绪队列优先级逐级降低,分配的时间片逐级增长。一个进程进入就绪状态后,先按照先来先服务加入到队列一的末尾,如果时间片内未执行完则将其加入下一队列,依此类推,到最后一个队列时,会一直在此执行直到执行完毕。
优点:兼顾IO密集型和CPU密集型进程
缺点:算法相对复杂
二.线程
为什么要引入线程
1.在一个应用中往往同时发生着各种活动,比如网络请求,图片加载等等。将一个进程分解为许多并发执行的线程会使得程序设计更加简单。
2.使用线程可以节省系统资源。因为线程是“轻量级”的进程,它的创建和消耗消耗的资源相对进程较少。
3.线程可以提高程序的并发执行程度,提高系统吞吐量。
概念
线程是CPU任务调度和执行的基本单位。一个进程中可以有多个线程并发执行。
线程的运行状态
线程在运行时也有三种基本状态:执行状态,就绪状态和阻塞状态,它们和进程的三种基本状态类似,就不再赘述了。
三.线程和进程的区别和联系
区别
1.地址空间
进程间地址空间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2.通信方面
线程间通信可以通过共享进程中的数据实现,而进程间通信通过IPC机制,管道,Socket等方式。
3.资源
进程是资源分配的基本单位,而线程基本上不拥有资源,多个线程共享进程的资源。
4.系统开销
进程间切换代价较大,线程间切换代价较小。
联系
一个进程至少包含一个线程;
进程和线程都可以并发执行;
进程在执行过程中拥有独立的内存单元,其中的所有线程共享进程的内存。
参考资料
《计算机操作系统》