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

news2024/9/27 21:25:35

【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.coloradmin.cn/o/853623.html

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

相关文章

MyCat概述

1.MyCat概述 MyCat是阿里巴巴的产品,他是开源的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用mycat,对于开发人员来说根本感觉不到mycat的存在。 MyCat下载地址:http://dl.mycat.org.cn/ MyCat官网:http:/…

Django入门 - 路由Route的基本使用

文章目录 1. 直接访问视图函数,没有使用子路由2. 使用子路由 urls.py 我们一般叫它根路由 1. 直接访问视图函数,没有使用子路由 MyDjangoPro2\views.py 代码 from django.shortcuts import renderfrom django.http import HttpResponse# 视图函数Views …

Minio使用及整合起步依赖

说明:Minio是开源的对象存储服务器,相当于免费版的OSS,本文介绍在Linux环境下部署Minio服务器,并在SpringBoot中使用,最后将Minio的代码打包成一个起步依赖。 安装&启动 第一步:下载 首先&#xff0…

使用vue-grid-layout时 You may need an appropriate loader to handle this file type.

使用vue-grid-layout时 You may need an appropriate loader to handle this file type. node版本不匹配 我的node v14.16.0 vue-gride-layout 需要用 v 2.3.7的版本 卸载后重新安装即可

诺瓦星云面试汇总

1、C语言向一个内存地址写值, int main() {int value 42;int *ptr (int *)0x12345678; // Replace with the desired memory address*ptr value 2、申请释放内存 申请内存int *dynamicArray (int*)malloc(size *sizeof(int));释放内存 free(dynamicArray)…

哪些国家可以申请访问学者?

根据知识人网的小编了解,许多国家都允许外国学者申请访问并参与学术交流。这些国家提供了丰富多样的研究机会,有助于促进全球学术合作与知识交流。以下是一些允许申请访问学者的国家: 1. 美国:作为全球科研领域的重要一员&#xf…

远景智能PMO负责人严晓婷受邀为第十二届中国PMO大会演讲嘉宾

上海远景科创智能科技有限公司PMO负责人严晓婷女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:能源物联网产品标准项目和非标准项目的并行管理。大会将于8月12-13日在北京举办,敬请关注! 议题简要&#xff1…

《合成孔径雷达成像算法与实现》Figure3.6

代码复现如下: clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; …

【回眸】AurixTC397的MPS8875A开发之展频篇

目录 前言 【回眸】AurixTC397的MPS8875A开发之展频篇 知识储备 看懂芯片手册 调整寄存器写入值 修改写入寄存器代码 修改主函数代码 验证和测量 前言 因公需要,大半年来一直对AurixTC397进行开发。实物板子特别大,有很多很多芯片,具…

2023-08-09 ssh-add id_rsa 提示Permissions 0777 for ‘id_rsa‘ are too open

一、ssh-add id_rsa 提示Permissions 0777 for id_rsa are too open Permissions 0777 for id_rsa are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.二、意思是说公钥文件权限太宽了,需…

【校招VIP】java语言考点之基本数据类型

考点介绍: 基本数据类型的长度、自动升级、JVM存储和封装类的相关考点,是校招常见考点。基础考点不能出错 一、考点题目 1、JAVA 中的几种基本数据类型是什么,各自占用多少字节解答:先了解2个单词先:1、bit --位&am…

Kubernetes集群部署 集群网络未部署

环境 > 192.168.50.53 k8s-master > 192.168.50.51 k8s-node1 > 192.168.50.50 k8s-node2 必须不能少于两核两G 所有主机共同操作 主机初始化配置 所有主机配置禁用防火墙和selinux [rootserver ~]# setenforce 0 [rootserver ~]# iptables -F [rootserver ~]…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

使用无监督机器学习进行客户细分 -- 机器学习项目基础篇(11)

在今天的时代&#xff0c;公司努力工作&#xff0c;使他们的客户满意。他们推出新的技术和服务&#xff0c;以便客户可以更多地使用他们的产品。他们试图与每一个客户保持联系&#xff0c;以便他们能够相应地提供货物。但实际上&#xff0c;与每个人保持联系非常困难和不现实。…

Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

项目开发阶段&#xff0c;mybatis的SQL打印有占位符&#xff0c;调试起来还是有点麻烦&#xff0c;随想整合P6Spy打印可以直接执行的SQL&#xff0c;方便调试&#xff0c;用的Durid连接池。 Springboot项目集成Durid <dependency><groupId>com.alibaba</group…

【Matlab】极限学习机遗传算法(ELM-GA)函数极值寻优——非线性函数求极值

往期博客&#x1f449; 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 【Matlab】Elman神经网络遗…

栈和队列 (以及实现)

文章内容 1.栈 2.队列 文章内容 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last I…

软件测试还是测试开发,二者如何选择?

各位小伙伴大家好, 今天和大家分享的是测试和测试开发的选择&#xff0c;相信很多小伙伴在这个问题上也都有过自己的想法&#xff0c;闲言少叙, 咱们进入正题。 一.企业需要哪种人才&#xff1f; 一名优秀的测试工程师是市面上不可多得的人才, 拥有理论和实操能力的测试工程师…

“代言人+合伙人“模式,彻底改变传统的一对一代言活动

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 当今…

MyBatis 实战指南:探索灵活持久化的艺术

文章目录 前言一、初识 MyBatis1.1 什么是 MyBatis1.2 为什么学习 MyBatis 二、MyBatis 在软件开发框架中的定位三、基于 Spring Boot 创建 MyBatis 项目3.1 添加 MyBatis 框架的支持3.2 配置数据库连接信息和映射文件的保存路径&#xff08;Mapper XML&#xff09; 四、MyBati…