计算机操作系统 进程管理 -- 进程与线程进程状态的切换进程调度算法进程同步进程通信

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机操作系统 进程管理 -- 进程与线程进程状态的切换进程调度算法进程同步进程通信相关的知识,希望对你有一定的参考价值。

文章目录

1. 进程与线程


1.1 进程

进程是资源分配的基本单位。

进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。


1.2 线程

线程是独立调度的基本单位。

一个进程中可以有多个线程,它们共享进程资源。

微信 和 浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。


1.3 区别

拥有资源:

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

调度:

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换。不同进程的线程切换会引起进程切换。

系统开销:

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

通信:

线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC


2. 进程状态的切换

常见的有三态模型和五态模型:

三态指的是:

  • 就绪状态(ready):等待被调度
  • 运行状态(running)
  • 阻塞状态(waiting):等待资源

如果三态模型加上新建态和终止态就变为了五态模型。

应该注意以下内容:

  • 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
  • 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。

3. 进程调度算法

不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。


3.1 批处理操作系统

批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。这种采用批量处理作业技术的操作系统称为批处理操作系统。批处理操作系统分为单道批处理系统和多道批处理系统 。批处理操作系统不具有交互性,它是为了提高CPU的利用率而提出的一种操作系统。


3.1.1 先来先服务 first-come first-serverd(FCFS)

非抢占式的调度算法,按照请求的顺序进行调度。

有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。


3.1.2 短作业优先 shortest job first(SJF)

非抢占式的调度算法,按估计运行时间最短的顺序进行调度。

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。


3.1.3 最短剩余时间优先 shortest remaining time next(SRTN)

最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 最短剩余时间优先算法即在运作时,调度程序会记录每个进程的剩余时间,根据剩余时间长短,程序会先执行剩余运行时间最短的进程,剩余执行时间较长的程序则会暂时被挂起。

当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。


3.2 交互式操作系统

交互式计算机系统与操作人员以人机对话的方式一问一答,直至获得最后处理结果。采用这种方式,程序设计人员可以边设计,边调整,边修改,使错误和不足之处及时得到改正和补充。特别对于非专业的操作人员,系统能提供提示信息,逐步引导操作者完成所需的操作,得出处理结果。


3.2.1 时间片轮转

将所有就绪进程按 FCFS(First Come First Service,先来先服务) 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

  • 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
  • 如果时间片过长,那么实时性就不能得到保证。

3.2.2 优先级调度

为每个进程分配一个优先级,按优先级进行调度。

为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。


3.2.3 多级反馈队列

一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,.. 进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。


3.3 实时操作系统

实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

  • 实时系统要求一个请求在一个确定时间内得到响应。
  • 分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。

4. 进程同步


4.1 临界区

对临界资源进行访问的那段代码称为临界区。

为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。


4.2 同步与互斥

  • 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
  • 互斥:多个进程在同一时刻只有一个进程能进入临界区。(互斥也是同步的的一种形式

4.3 信号量

信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P (对应down操作)和 V(对应up操作)操作。

down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。

如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。


4.4 管程(进程同步的一种工具)

使用信号量机制实现的生产者消费者问题需要客户端代码需要做很多控制。而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。管程的特性保证了进程互斥,无须程序员自己实现互斥,从而降低了死锁发生的可能性。同时管程提供了条件变量,可以让程序员灵活地实现进程同步。

管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。

管程引入了 条件变量 以及相关的操作:wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。


5. 经典的同步问题


5.1 哲学家进餐问题

五个哲学家围着一张圆桌,每个哲学家面前放着食物。哲学家的生活有两种交替活动:吃饭以及思考。当一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子。


5.2 读者-写者问题

允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写操作同时发生。


6. 进程通信 IPC (InterProcess Communication)

进程同步与进程通信很容易混淆,它们的区别在于:

  • 进程同步:控制多个进程按一定顺序执行;
  • 进程通信:进程间传输信息。

进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。


6.1 管道

管道是通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写。

它具有以下限制:

  • 只支持半双工通信(单向交替传输);
  • 只能在父子进程或者兄弟进程中使用;

管道的本质就是内核在内存中开辟了一个缓冲区,这个缓冲区与管道文件相关联,对管道文件的操作,被内核转换成对这块缓冲区的操作


6.2 FIFO

也称为命名管道,去除了管道只能在父子进程或者兄弟进程中中使用的限制

所谓有名管道也就是提供一个路径名与之关联,这样,即使与创建有名管道的进程不存在亲缘关系的进程,只要可以访问该路径,就能够通过这个有名管道进行相互通信。


6.3 消息队列

消息队列的本质就是存放在内存中的消息的链表,而消息本质上是用户自定义的数据结构

相比于 FIFO,消息队列具有以下优点:

  • 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
  • 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
  • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。

6.4 信号量

它是一个计数器,用于为多个进程提供对共享数据对象的访问。


6.5 共享内存

两个不同进程的逻辑地址通过页表映射到物理空间的同一区域,它们所共同指向的这块区域就是共享内存。

共享内存允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。

需要使用信号量用来同步对共享存储的访问。


6.6 套接字(网络Socket)

与其它通信机制不同的是,它可用于不同机器间的进程通信



以上是关于计算机操作系统 进程管理 -- 进程与线程进程状态的切换进程调度算法进程同步进程通信的主要内容,如果未能解决你的问题,请参考以下文章

计算机操作系统 进程管理 -- 进程与线程进程状态的切换进程调度算法进程同步进程通信

计算机操作系统 进程管理 -- 进程与线程进程状态的切换进程调度算法进程同步进程通信

进程与线程的区别与联系

Java并发编程(01):线程的创建方式,状态周期管理

Java并发编程(01):线程的创建方式,状态周期管理

40.python全栈之路:进程与线程