欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 操作系统Lesson6 - 进程切换和线程调度

操作系统Lesson6 - 进程切换和线程调度

2024/10/22 22:36:31 来源:https://blog.csdn.net/2301_78981471/article/details/143166105  浏览:    关键词:操作系统Lesson6 - 进程切换和线程调度

文章目录

  • 进程终止
    • 进程运行的状态
  • 进程体系
  • 进程状态
    • 三态
      • 例子
    • 五态、七态
  • 线程
    • 例子
    • 线程的多种调度


进程终止

echo $?		# 获取上一个进程的退出信息

Linux中有许多内置符号,?就是其一,作用是返回上一个进程的退出状态,0为正常退出。

终止分四种:

  • 正常退出(自愿的)
  • 错误退出(自愿的)
  • 严重错误(非自愿的)
  • 被其他进程杀死(非自愿的)

进程运行的状态

键入top指令,能看到众多进程,每个进程都有一个状态标识:

  • D:不可打断的睡眠(比如正在跟I/O进行交互)。
  • R:正在运行的程序。
  • S:可中断的睡眠。

进程体系

Linux的进程体系是树状的,在一开始会创建一个 init 进程,init 进程作为所有其他进程的根,负责系统的初始化和后续进程的创建。例如, init 会根据系统配置读取信息,为每个可用的终端创建一个新的进程,这些进程通常用于等待用户登录。一旦用户成功登录,登录进程会启动一个shell环境,用户便可以在其中输入命令来启动新的进程。这些命令的执行可能会进一步触发更多进程的创建,从而形成一个以 init 为根的庞大进程树。

相比之下,Windows操作系统并不采用UNIX中的进程层次结构模型。在Windows中,所有进程都
被视为平等的实体,它们之间不存在直接的父子关系或层次结构。

也就是说,在Linux上,子进程的父进程死了,这个进程会变为孤儿进程,之后会由操作系统回收。但是Windows中死了就直接断联了,变为僵尸进程。


进程状态

三态

在这里插入图片描述

  • a: 任务从就绪队列中取出,由OS的调度算法送往CPU的运行态。
  • b: 由于时间片等原因从运行态返回就绪队列。
  • c: 因慢速等待事件发生,CPU将进程送往阻塞态:
    • 阻塞态中,每一个事件各一个队列。
  • d: 阻塞态事件被唤醒送往就绪态准备。

例子

在这里插入图片描述
上层应用需要读取键盘输入,所以用了scanf():

  • scanf()调用OS的键盘驱动,驱动会去读取缓存区的数据,如果没有数据,这个进程就会被阻塞(睡眠),放入了休眠队列中,渴望一个中断来打断他。
  • 不知道什么时刻,键盘被摁下了,此时出发了中断,CPU跳转就会处理这个中断,操作是将这个按键数据放入缓存区中保存,然后唤醒休眠队列。
  • 进程被唤醒,读取到缓存区数据了,于是将这个数据返回给scanf()。
  • scanf()再返回给上层空间。

五态、七态

在这里插入图片描述
五态加入了创建态和终止态,七态加入挂起阻塞和挂起就绪态。


线程

进程里有许多数据结构记录着重要的数据:

  • 任务调度
  • 内存映射表
  • 资源空间

在这里插入图片描述
当切换任务的时候,我们需要花费许多资源去更改这些数据,但是有时候这是没有必要的,所以就有了线程。

线程和进程的区别就是:一个共享资源,一个独享资源。
在这里插入图片描述

例子

当我们需要一个web服务器时,为了响应多个用户的请求,所以需要频繁切换任务。
但是对于需求高的html资源来说,我们可以将其放入缓存以便快速响应,而如果用进程来访问这块资源,会导致不必要的浪费,所以用线程共享这块资源。

在这里插入图片描述

线程的多种调度

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com