【Linux】进程

----------------| 本文目录 |----------------

  • 1. 进程
    • 1.1 基本概念
    • 1.2 描述进程 - PCB
      • 1.2.1 task_struct - PCB的一种
      • 1.2.2 task_struct 内容分类
    • 1.3 组织进程
    • 1.4 查看进程
    • 1.5 通过系统调用获取进程标示符
    • 1.6 通过系统调用创建进程 - fork初识
  • 2. 进程状态
    • 2.1 看看Linux内核源代码怎么说
    • 2.2 进程状态查看
    • 2.3 Z(zombie) - 僵尸进程
    • 2.4 僵尸进程危害
    • 2.5 进程状态总结
    • 2.6 孤儿进程
  • 3. 进程优先级
    • 3.1 基本概念
    • 3.2 查看系统进程
      • 3.2.1 PRI and NI
      • 3.2.2 PRI vs NI
    • 3.3 查看进程优先级的命令
      • 3.3.1 用 top 命令更改已存在进程的 nice
    • 3.4 其他概念

在这里插入图片描述

1. 进程

1.1 基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等。
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

1.2 描述进程 - PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为 PCB(process control block),Linux 操作系统下的 PCB 是:task_struct

1.2.1 task_struct - PCB的一种

  • 在 Linux 中描述进程的结构体叫做 task_struct。
  • task_struct 是 Linux 内核的一种数据结构,它会被装载到 RAM(内存)里并且包含着进程的信息。

1.2.2 task_struct 内容分类

  • 标示符:描述本进程的唯一标示符,用来区别其他进程。
  • 状态:任务状态,退出代码,退出信号等。
  • 优先级:相对于其他进程的优先级。
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
  • 上下文数据:进程执行时处理器的寄存器中的数据。
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。
  • 其他信息…

1.3 组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。

1.4 查看进程

进程的信息可以通过 /proc 系统文件夹查看。

  • 如:要获取 PID 为 1 的进程信息,你需要查看 /proc/1 这个文件夹。

在这里插入图片描述

  • 大多数进程信息同样可以使用 top 和 ps 这些用户级工具来获取。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{while (1){sleep(1);}return 0;
}

在这里插入图片描述

1.5 通过系统调用获取进程标示符

  • 进程 id(PID)
  • 父进程 id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

在这里插入图片描述

1.6 通过系统调用创建进程 - fork初识

  • 运行 man fork 认识 fork
  • fork 有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{int ret = fork();printf("hello proc: %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}

在这里插入图片描述

  • fork 之后通常要用 if 进行分流
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{int ret = fork();if (ret < 0){perror("fork");return 1;}else if (ret == 0){// child                                                                       printf("I am child: %d!, ret: %d\n", getpid(), ret);}else{// fatherprintf("I am father: %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

在这里插入图片描述

2. 进程状态

2.1 看看Linux内核源代码怎么说

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

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

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  • R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中,要么在运行队列里。
  • S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped):可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2.2 进程状态查看

ps aux / ps axj 命令

在这里插入图片描述

2.3 Z(zombie) - 僵尸进程

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

创建一个维持30秒的僵尸进程例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main()
{pid_t id = fork();if (id < 0){perror("fork");return 1;}else if (id > 0){// parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);                                                      }else{// childprintf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}

编译并在另一个终端下启动监控

在这里插入图片描述

开始测试

在这里插入图片描述

看到结果

在这里插入图片描述

2.4 僵尸进程危害

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

2.5 进程状态总结

  • 至此,值得关注的进程状态全部讲解完成,下面来认识另一种进程。

2.6 孤儿进程

  • 如果父进程提前退出,子进程后退出,进入 Z 状态后,该如何处理呢?
  • 父进程先退出,子进程就称之为“孤儿进程”。
  • 孤儿进程被 1 号 init 进程领养,当然要由 init 进程回收。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main()
{pid_t id = fork();if (id < 0){perror("fork");return 1;}  else if (id == 0){  // childprintf("I am child, pid: %d\n", getpid());sleep(10);                                             }else{  // parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}

在这里插入图片描述

3. 进程优先级

3.1 基本概念

  • CPU 资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 Linux 很有用,可以改善系统性能。
  • 还可以把进程运行到指定的 CPU 上,这样一来,把不重要的进程安排到某个 CPU,可以大大改善系统整体性能。

3.2 查看系统进程

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

在这里插入图片描述

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

  • UID:代表执行者的身份
  • PID:代表这个进程的代号
  • PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行
  • NI:代表这个进程的 nice 值

3.2.1 PRI and NI

  • PRI 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高。
  • 那 NI 呢?就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值。
  • PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new) = PRI(old) + nice。
  • 这样,当 nice 值为负的时候,该程序会将优先级值变小,即:其优先级会变高,会更快的被执行。
  • 所以,调整进程优先级,在 Linux 下,就是调整进程 nice 值。
  • nice 其取值范围为: -20 ~ 19,一共 40 个级别。

3.2.2 PRI vs NI

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

3.3 查看进程优先级的命令

3.3.1 用 top 命令更改已存在进程的 nice

  1. 使用 top 命令

在这里插入图片描述

  1. 进入 top 后按 “r”

在这里插入图片描述

  1. 输入进程 PID

在这里插入图片描述

  1. 输入 nice 值

在这里插入图片描述

3.4 其他概念

  • 竞争性:系统进程数目众多,而 CPU 资源只有少量,甚至 1 个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  • 并行:多个进程在多个 CPU 下分别、同时进行运行,这称之为并行。
  • 并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

END

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

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

相关文章

【贪心+循环队列】Dota2 参议院

/** 贪心循环队列* 思路&#xff1a;当每一个参议员行驶禁止权利时&#xff0c;都禁止即将行驶权利的敌方参议员。* 使用两个循环队列&#xff0c;队列中存放位置下标。因此只需要比较两个队列中* 处于队头元素的大小&#xff0c;谁小谁执行权利* auther start* cr…

数字孪生+可视化技术 构建智慧新能源汽车充电站监管平台

前言 充电基础设施为电动汽车提供充换电服务&#xff0c;是重要的交通能源融合类基础设施。近年来&#xff0c;随着新能源汽车产业快速发展&#xff0c;我国充电基础设施持续增长&#xff0c;已建成世界上数量最多、服务范围最广、品种类型最全的充电基础设施体系。着眼未来新…

自行车商城网站网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea

【自行车商城网站网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea】 https://www.bilibili.com/video/BV1wT4y1p7jq/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

AP5153 低压差 线性降压恒流IC 手电筒LED电源驱动

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

Leo赠书活动-15期 语义解析:自然语言生成SQL与知识图谱问答实战

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程

小米机型目前限制了解锁bl的机制。从以前单一的绑定解锁到目前绑定账号必须小米社区5级的条件限制。切必须要答题分数够才可以申请解锁。限制的根本原因也在为消费者提供更好的服务。避免刷机小白无基础常识解锁bl后第三方固件或者软件造成的故障。另外一方面也在于市场格机脚本…

2024年阿里云优惠活动清单_优惠代金券领取大全

阿里云服务器优惠活动大全包括&#xff1a;云服务器新人特惠、云小站、阿里云免费中心、学生主机优惠、云服务器精选特惠、阿里云领券中心等&#xff0c;活动上阿里云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;…

机器学习 —— 自用整理期末复习笔记

一、绪论 机器学习术语 假设空间 p5 监督学习&#xff08;supervised learning&#xff09;的任务是学习一个模型&#xff0c;使模型能够对任意给定的输入&#xff0c;对其相应的输出做出一个好的预测。模型属于由输入空间到输出空间的映射的集合&#xff0c;这个集合就是假设空…

电子化以后如何申请软件著作权

​ 申请地址&#xff1a;中国版权登记业务平台 附件&#xff1a; 软件著作权设计说明书模板&#xff08;含填写说明&#xff09;.docx 软件著作权源程序模板.docx 软件著作权前期开发说明、合作开发协议、版本说明、法人证明、授权书模板.docx 注册、登录和实名认证 首先访问…

查看服务器的yum 源

1、cd /etc/yum.repos.d 2、编辑 CentOS-Stream-Sources.repo 3、 查看里面的yum源地址 4、更新yum源&#xff0c;执行下面指令 yum clean all # 清除系统所有的yum缓存 yum makeacache # 生成新的yum缓存 yum repolist

firewall防火墙(二)

一、IP伪装与端口转发&#xff1a; 当用户数据包经过NAT设备时&#xff0e;NAT设备将源地址替换为公网P地址&#xff0e;而返回的数据包就可以被路由&#xff0c;NAT技术一般都是在企业边界路由器或者防火墙上来配置. Firewaild支持两种类型的NAT;P地址伪装和端口转发. 1.1 I…

牛客网-JAVA(错题集)-1

1 Java的抽象类和接口不可以进行实例化 2 知识点&#xff1a; 1、不论如何 finally里面的代码是一定会执行的 2、finally里面的代码块比return早执行 3、多个return是按顺序执行的&#xff0c;只执行一次 public abstract class Test {public static void main(String[] ar…

Spring配置类以及扫描过程源码解析

书接上文 文章目录 一、 拾遗1. 回顾2. 源码分析 二、 配置类扫描源码分析1. 源码分析2. BeanDefinition覆盖问题3. full配置类和lite配置类的区别 一、 拾遗 1. 回顾 前面我们分析了Spring框架器启动过程要做的事情&#xff0c;着重分析了ApplicationContext的refresh方法。…

乐鑫ESP32与SD NAND的协同应用|MK-米客方德

SD NAND在乐鑫ESP32上的作用 SD NAND是贴片式TF卡&#xff0c;可以用于存储数据&#xff0c;比如视频图片或者代码 乐鑫ESP32一颗具有双核处理器的嵌入式系统芯片&#xff0c;有丰富的外设接口&#xff0c;包括Wi-Fi、蓝牙、UART、SPI、I2C等&#xff0c;使其适用于各种物联网…

加工零件的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意&#xff1a; 主要思路&#xff1a; 但是我们怎么才能判断出x走到1时L是偶数还是奇数呢&#xff1f; 初始化&#xff1a;…

vim编辑器

1.vi编辑器介绍 vim是全屏幕纯屏幕纯文本编辑器, 是vi编辑器的增强版. 可以利用别名让输入vi命令时, 实际上执行vim编辑器, 例如: alias vi "vim" #定义别名 这样定义的别名是临时生效, 如果需要永久生效, 请放入环境变量配置文件(~/.bashrc) 2.vim基本的使用 …

如何压缩照片?分享4种全面的方法!

随着智能手机的普及&#xff0c;我们每个人都成为了摄影爱好者。然而&#xff0c;随着拍摄的照片越来越多&#xff0c;手机内存也逐渐变得捉襟见肘。那么&#xff0c;如何有效地压缩照片&#xff0c;释放手机内存呢&#xff1f;今天&#xff0c;我们就来为你揭秘那些可以轻松压…

前端浏览器滚动条炫酷美化

一、文章引导 #mermaid-svg-2qRndEP8CFzlUhap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2qRndEP8CFzlUhap .error-icon{fill:#552222;}#mermaid-svg-2qRndEP8CFzlUhap .error-text{fill:#552222;stroke:#55222…

多模态+SNN个人学习历程和心得

祖传开头 这次想写一个一直深藏心中的研究方向&#xff0c;那就是多模态方向。其实当初在实验室那会儿&#xff0c;最先接触的就是多模态的工作&#xff0c;因此这是我科研之路的起点。只不过&#xff0c;后来经历了一些波折&#xff0c;导致个人没有往这个方向深挖&#xff0…

PayPal账号被关联!跨境卖家如何自救?关于PayPal防关联你不得不知道的事!

很多跨境卖家的支付平台都会选择 PayPal&#xff0c;但是 PayPal 账号在使用过程中也经常会遇见关联&#xff0c;风控等问题&#xff0c;这时候为了保护我们的 PayPal 账号安全&#xff0c;防关联就很重要。今天龙哥就分享一些关于 PayPal 防关联的内容&#xff0c;希望能够帮助…