【Linux进程篇】进程概念(2)

【Linux进程篇】进程概念(2)

目录

  • 【Linux进程篇】进程概念(2)
      • 进程状态
        • Linux对进程的说法
          • linux中的信号
      • 进程状态查看
        • Z(zombie)——僵尸进程
          • 僵尸进程的危害
        • 孤儿进程
      • 进程优先级
        • 基本概念
        • 查看系统进程
          • PRI (优先级priority)和 NI(优先级的修正数据nice)
          • PRI 和 NI 的比较
        • 查看进程优先级的命令
          • 用top命令更改已存在进程的nice(更改优先级需要使用root用户):
        • 其他概念

作者:爱写代码的刚子
时间:2023.8.7
前言:这篇博客将继续介绍进程部分的知识——进程状态。

进程状态

Linux对进程的说法

  • 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
    在这里插入图片描述

三大进程状态(不同的操作系统有不同的实现方案):

  • 运行状态:并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • 阻塞状态:当一个进程需要从设备中读取数据时,但是该设备没有就绪状态是不可读的,该进程就自动将该进程PCB链入对应设备的等待队列(处于等待队列就叫做阻塞状态)(每一个设备都有等待队列),如果已经可读了,该进程就会将自己放入运行队列。进程唤醒就是将该进程的阻塞状态改为R状态,然后将该进程放入运行队列。
  • 挂起状态:如果一个进程一直在等待队列中,操作系统内部的内存资源严重不足了,保证正常的情况下,要省出来内存资源,操作系统就会将该进程的PCB保留,然后将该进程的代码和数据交换到外设当中。(换出),当该进程运行时需要从磁盘中读取数据。(换入 )(现在介绍的挂起状态全称其实就是阻塞挂起状态)

下面的状态在kernel源代码里定义:

  • R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠,浅度睡眠(interruptible sleep))(阻塞状态)。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态,深度睡眠(uninterruptible sleep),在这个状态的进程通常会等待IO的结束,不响应操作系统的任何请求。(进程在等待磁盘写入完毕期间,这个进程不能被任何人杀掉,当写入完毕时该进程由D状态变为R状态。当系统长时间出现D状态时,说明磁盘的压力非常大了,系统快崩溃了)(也是阻塞状态的一种)(可以使用dd命令模拟高IO的情况往磁盘中写入,这样就可以查看D状态)
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。(等待某种资源时可以理解为阻塞状态)
  • t追踪状态(tracing stop):“跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作,比如在gdb中对被跟踪的进程添加一个断点。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

不同的进程状态决定了进程要做什么事情
只要PCB还在,不管代码数据在不在,该进程依旧存在

linux中的信号
  • kill -l查看所有信号

在这里插入图片描述

进程状态查看

  • ps aux / ps axj 指令
    在这里插入图片描述

  • 前台运行在这里插入图片描述

  • 后台运行
    在这里插入图片描述

  • 如过要杀死后台运行的程序ctrl + c是不起效果的,需要输入kill -9 该进程PID
    在这里插入图片描述

Z(zombie)——僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

也就是说:进程一般退出的时候,如果父进程没有主动回收子进程的信息,子进程会一直让自己处于Z状态(占用资源),进程的相关资源尤其是task_struct结构体不能被释放!

ptrace系统调用追踪进程运行

僵尸进程的危害
  • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),父进程如果一直不读取,那子进程就一直处于Z状态。
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护。
  • 父进程如果创建了很多子进程,如果不回收,就会造成内存资源的浪费(内存泄漏)。因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间。
  • 造成内存泄漏。

孤儿进程

  • 父进程先退出,子进程就称之为“孤儿进程”

  • 孤儿进程被1号init(systemd)进程领养,由init(systemd)进程回收。

  • 父进程先退出示例:
    在这里插入图片描述

在这里插入图片描述

  • 杀死父进程后子进程变成了后台进程,子进程的PPID变为了1(即操作系统)

  • 查看PID为1的进程:
    在这里插入图片描述
    在这里插入图片描述

  • 为什么bash进程不能回收孙子进程,因为孙子进程不是由bash创建的,没有回收孙子进程的逻辑,而操作系统在内核方面就能回收。

进程优先级

补充:Linux中使用了大量的强转使不同类型的节点也能链接并访问其成员
例:用start指针找到该节点的初始地址来访问其他成员:
请添加图片描述
如果想要将该节点放入不同的数据结构中,只需要添加相应的指针即可。

基本概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可能改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

    • 因为资源是有限的,进程是多个的,注定了进程之间是竞争关系,操作系统必须保证大家良性竞争所以需要确认优先级。——竞争性
    • 如果我们进程长时间得不到CPU资源,该进程的代码长时间无法得到推进——该进程的饥饿问题

查看系统进程

在Linux或者unix系统中,用ps -l命令则会类似输出以下几个内容:

在这里插入图片描述
在这里插入图片描述

我们很容易注意到其中的几个重要信息,有下:

    • UID : 代表执行者的身份
      在这里插入图片描述
    • PID : 代表这个进程的代号
    • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
    • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
    • NI :代表这个进程的nice值
PRI (优先级priority)和 NI(优先级的修正数据nice)
  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
  • 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)(默认都为80)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20至19,一共40个级别。

【问题】那我们能不能随意修改nice值来改变我们进程的优先级呢?
技术上可以做到,但是Linux不想过多的让用户参与优先级的调整,调度器需要保证每个进程相对公平地利用CPU的资源,所以只让我们在对应的范围内做优先级的调整。nice:[-20,19] ; PRI:[60,99]

PRI 和 NI 的比较
  • 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
  • 可以理解nice值是进程优先级的修正修正数据

查看进程优先级的命令

用top命令更改已存在进程的nice(更改优先级需要使用root用户):
  • top
  • 进入top后按“r”->输入进程PID->输入nice值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

当我们输入的NI值过大或者过小时,NI只会取其最大或者最小值,并不会让用户过分的调整。

【问题】:操作系统是如何根据优先级开展的调度呢?
通过位图结构:
请添加图片描述
(之后C++内容会提到)

请添加图片描述
【问题】如果running队列里的进程处理完了,我们也需要waiting队列里的进程运行,如何做到?
runqueue里面还维护了task_struct **run;和task_struct **run;两个指针,利用这两个指针可以将running和waiting进行交换,也就是进程调度( swap(&run , &wait); )。
所以判断队列是否为空,只能遍历数组(hash表),所以该struct runqueue还维护了bitmap isempty,定义了一个char bit[5];(含40个bit位 )所以我们可以用每一个bit位的位置来表示对应的队列是否为空。近乎大O(1)的时间复杂度,从众多进程中挑选一个来调度,称之为Linux内核2.6的O(1)调度算法

其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高
    效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行(计算机配置高才能并行)
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间(时间片)之内,让多个进程都得以推进,称之为并发(基于进程切换基于时间片轮转的调度算法)用两个队列来保证进程就算被切下来也保证不同优先级之间的调度顺序不变。(运行完的进程将排在另一个队列中,防止该进程因为中断而导致不同优先级之间进程的相对顺序改变)

附:CPU中的寄存器:
return a -> mov eax 10
程序计数器(pc指针,eip):记录当前进程正在执行指令的下一行指令的地址(与选择、循环、跳转语句有关)
通用寄存器:eax,ebx,ecx,edx
栈帧寄存器:ebp,esp,eip
状态寄存器:status

  1. 为了提高效率,将进程的高频数据放入寄存器中,CPU内的寄存器保存的是进程相关的(临时)数据——进程的上下文数据。
  2. 进程在被切换的时候有两个动作(1. 保存上下文 2. 恢复上下文 )(这两种动作软硬件方面都有相应的处理,可以当做扩展(全局段描述符、局部段描述符等一些硬件方面的概念))

对Linux系统熟悉并不是对自己的代码数据更熟悉(C++),而是对进程相关的数据结构更熟悉。
推荐一个搜书的网站:
《深入理解Linux内核》(推荐水平高了再研究)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在java中操作redis_Data

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.配置Redis数据源 redis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sk…

快速引流推广,快速引流推广策略分享,教你精准引流

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 在当今互联网的快速发展中&#xff0c;短视频脱颖而出&#xff0c;成为互联网的新秀&#xf…

用python做一个小游戏代码,用python制作一个小游戏

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;如何用python编写一个简单的小游戏&#xff0c;用python做一个小游戏代码&#xff0c;今天让我们一起来看看吧&#xff01; 今天呢&#xff0c;给大家展示一下Python有趣的小地方&#xff0c;展示给大家看看&#xff0c…

Ansible Playbook快速部署一主多从MySQL集群

部署目标&#xff1a; 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构&#xff1a; rootmaster:/opt/mysql# tree . . ├── group_vars │ └── all.yml ├── hosts ├── mysql.yml └── roles└── mys…

php实现登录的例子

界面&#xff1a; 登录界面login.html代码&#xff1a; <!DOCUMENT html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"…

ARM微架构

一、流水线 二、指令流水线 指令流水线 指令流水线 指令流水线 ARM指令流水线 ARM7采用3级流水线 ARM9采用5级流水线 Cortex-A9采用8级流水线 注1&#xff1a;虽然流水线级数越来越多&#xff0c;但都是在三级流水线的基础上进行了细分 PC的作用&#xff08;取指&#xff09; …

flutter开发实战-video_player视频播放功能及视频缓存

flutter开发实战-video_player视频播放功能及视频缓存 最近开发过程中video_player播放视频&#xff0c; 一、引入video_player 在pubspec.yaml引入video_player video_player: ^2.7.0在iOS上&#xff0c;video_player使用的是AVPlayer进行播放。 在Android上&#xff0c;…

python-docx常用方法总结

由于最近有任务需要自动生成word报告&#xff0c;因此学习了一些python-docx的使用方法&#xff0c;在此总结。 目前网上相关的资料不算太多&#xff0c;且大多数都很简单。有一些稍微复杂的需求往往找不到答案&#xff0c;很多想要的方法这个库似乎并没有直接提供。在git上看…

Dockerfile定制Tomcat镜像

Dockerfile中的打包命令 FROM &#xff1a; 以某个基础镜像作为此镜像的基础 RUN &#xff1a; RUN后面跟着linux常用命令&#xff0c;如RUN echo xxx >> xxx,注意&#xff0c;RUN 不能用于执行命令&#xff0c;因为每个RUN都是独立运行的&#xff0c;RUN 的cd对镜像中的…

PHP8的循环控制语句-PHP8知识详解

我们在上一节讲的是条件控制语句&#xff0c;本节课程我们讲解循环控制语句。循环控制语句中&#xff0c;主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时&#xff0c;经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务&#xff0c;而不是…

利用MMPose进行姿态估计(训练、测试全流程)

前言 MMPose是一款基于PyTorch的姿态分析开源工具箱&#xff0c;是OpenMMLab项目成员之一&#xff0c;主要特性&#xff1a; 支持多种人体姿态分析相关任务&#xff1a;2D多人姿态估计、2D手部姿态估计、动物关键点检测等等更高的精度和更快的速度&#xff1a;包括“自顶向下”…

力扣初级算法(二分查找)

力扣初级算法(二分法)&#xff1a; 每日一算法&#xff1a;二分法查找 学习内容&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 2.二分查找流程&…

Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支

导读Mageia 9 首个 RC 已发布。公告写道&#xff0c;自 2023 年 5 月发布 beta 2 以来&#xff0c;Mageia 团队一直致力于解决许多顽固问题并提供安全修复和新特性。 新版本的控制中心添加了用于删除旧内核的新功能&#xff0c;该功能在 Mageia 9 中默认自动启用&#xff0c;用…

探秘手机隐藏的望远镜功能:开启后,观察任何你想看的地方

当今的智能手机不仅仅是通信工具&#xff0c;它们蕴藏着各种隐藏的功能&#xff0c;其中之一就是让你拥有望远镜般的观察能力。是的&#xff0c;你没有听错&#xff01;今天我们将探秘手机中隐藏的望远镜功能&#xff0c;这项神奇的功能可以让你打开后&#xff0c;轻松观察任何…

Spring Boot读取yml或者properties配置信息

文章目录 Spring Boot读取yml或者properties配置信息方法一&#xff1a;Value获取基本信息&#xff0c;适用于少量信息方法二&#xff1a;通过注解ConfigurationProperties(prefix "spring.datasource")方法三&#xff1a;通过api Environment Spring Boot读取yml或…

小兔鲜项目 uniapp (1)

目录 项目架构 uni-app小兔鲜儿电商项目架构 小兔鲜儿电商课程安排 创建uni-app项目 1.通过HBuilderX创建 2.通过命令行创建 pages.json和tabBar案例 uni-app和原生小程序开发区别 用VS Code开发uni-app项目 拉取小兔鲜儿项目模板代码 基础架构–引入uni-ui组件库 操…

SSM个人博客项目

文章目录 SSM个人博客系统实现项目介绍 一、准备工作0. 创建项目添加对应依赖1. 数据库设计2. 定时实体类 二、功能实现1.统一功能处理统一返回格式统一异常处理定义登录拦截器 2. 注册登录实现生成获取验证码密码加盐实现注册功能登录功能注销功能 3.登录用户博客列表获取登录…

机器学习笔记之优化算法(十)梯度下降法铺垫:总体介绍

机器学习笔记之优化算法——梯度下降法铺垫&#xff1a;总体介绍 引言回顾&#xff1a;线搜索方法线搜索方法的方向 P k \mathcal P_k Pk​线搜索方法的步长 α k \alpha_k αk​ 梯度下降方法整体介绍 引言 从本节开始&#xff0c;将介绍梯度下降法 ( Gradient Descent,GD ) …

SpringCloud Gateway获取请求响应body大小

前提 本文获取请求、响应body大小方法的前提 : 网关只做转发逻辑&#xff0c;不修改请求、相应的body内容。 SpringCloud Gateway内部的机制类似下图&#xff0c;HttpServer&#xff08;也就是NettyServer&#xff09;接收外部的请求&#xff0c;在Gateway内部请求将会通过Htt…

RISC-V基础之函数调用(四)非叶函数调用(包含实例)

叶函数是指不调用其他函数&#xff0c;也不改变任何非易失性寄存器的函数2。叶函数通常是一些简单的操作&#xff0c;如数学运算或逻辑判断。叶函数的特点是可以通过模拟返回来展开&#xff0c;即不需要保存或恢复寄存器的状态。 非叶函数是指调用其他函数或改变非易失性寄存器…