【Linux】进程的标识符、状态(超详解)
目录
进程的概念
进程标识符PID
系统调用创建进程-fork初识
进程状态
R状态(运行状态)
S,D状态(休眠状态)
T,t状态
Z状态(僵尸进程)
孤儿进程
X状态(死亡状态)
进程的概念
课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。
其实:进程=内核数据(task_struct)+程序的代码和数据

task_struct:Linux中描述进程的结构体;是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_struct内容分类:
1、标示符: 描述本进程的唯一标示符,用来区别其他进程。
2、状态: 任务状态,退出代码,退出信号等。
3、优先级: 相对于其他进程的优先级。
4、程序计数器: 程序中即将被执行的下一条指令的地址。
5、内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
6、上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
7、I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
8、记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
9、其他信息
进程标识符PID
(1)把程序运行起来,./xxx.exe----->本质就是在系统中启动一个进程!!
进程分为两种:1、执行完就退出。
2、一直不退,直到用户退出-------常驻进程。
把程序运行起来查看进程属性:每个进程都有其PID,这是进程的标识符

如何查看进程属性?
可以用ps ajx,也可以ls /proc(proc是一个存放进程属性的文件!)
如:
ps ajx | head -1 && ps ajx |grep myproc
ls /proc

注意,如果进程关闭,是查不到PID为5175的进程;
因为proc是实时更新的;

如何运行程序打印pid,ppid?(ppid是该父进程的pid)
获取PID:getpid() ----->依赖头文件:<sys/types.h>
获取PPID:getppid()
(Linux系统启动后,新创建任何进程的时候,都是由自己的父进程创建的!!)


如何杀掉进程?
kill -9 pid

系统调用创建进程-fork初识
运行 man fork 认识fork
fork有两个返回值:如果返回值为0,则为子进程;
返回值大于0,则为父进程;
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
1、子进程的创建(分支,fork)

运行结果:

更好的理解分支:

2、fork()特点,(返回值上)
父:子=1:n
fork()---->多个进程----->父子关系------>一般代码会共享,但是数据是各自私有一份的。
可以参考下面的例子来理解:

运行结果:

由此可知:
进程有很强的独立性!!
多个进程之前不影响;
补充知识点:
c++:.cc、.cpp、.cxx
进程状态
Linux进程状态本质就是用一个变量,取不同的值来表示;

| R | 运行状态 |
| S | 休眠状态 |
| D | 磁盘休眠状态 |
| T | 停止状态 |
| t | 跟踪状态 |
| Z | 僵尸进程 |
| X | 死亡状态 |
R状态(运行状态)
- 一个进程已经准备就绪,可以随时被系统调度此时就是运行状态;
- 如果只要一个进程,cpu可以直接分配足够资源执行进程,但是,当有很多的进程被调度后,cpu的资源就不够分配 ,这时每个进程需要去竞争cpu资源,而cpu不可能同时给这么多进程分配资源;这时就要有一个运行队列(runqueue)把PCB组织起来;
- 进程在这个runqueue中,就是R状态

一个进程一旦持有cpu,会一直运行吗?
不会
一个进程被拿到cpu执行时,并不是等这个进程执行完毕才切换下一个进程。而是这多个进程在一个时间段内所有的进程都会执行(并发执行),每个进程执行一个时间片的时间后,就会从cpu上拿下来,切换成下一个进程.(进程切换)
一个时间片通常是10ms左右
在查看进程状态时,我们会发现有R状态,也要R+状态,这是区分进程在前台执行还是在后台执行;
./test:进程在前台执行
./test &:进程在后台执行
S,D状态(休眠状态)
S状态:本质就是等待”资源“就绪,S状态可以中断;
D状态:也是一种休眠状态,不过D状态不可中断;
看下面的图:

一个进程将1GB的数据放置到磁盘中,等待磁盘读取,我们知道外设尤其是像磁盘这样的设备读取速度是比较慢的,这时进程就会一直等待;但是在等待期间,OS内存严重不足(OS是由权限来杀掉进程来释放空间的),这时如果OS看到这个等待的进程,把他杀掉,那么就会造成一个严重的问题:磁盘在读取数据时出来问题,这时它回去找调度它的进程,但是这时候发现进程没有了???就会造成这1GB数据的丢失。
如何避免这个问题?
给这个进程设置深度休眠状态,D状态,那么这个进程就不会被OS杀掉,就要等到进程自己醒来。注意D状态用kill也杀不掉,除非重启,有时甚至要断电。
T,t状态
T状态:停止进程
kill -19 pid:暂停进程
kill -18 pid:继续进程
t状态:遇到断点的暂停
Z状态(僵尸进程)
Z状态:一个进程执行完毕,且进程也退出了,但是进程占用的资源并没有被完全释放。
看下面代码:

运行我们发现:子进程执行完后,父进程还在在执行;
查看进程信息:

已经运行完毕,但是需要维持自己的退出信息,在自己进程的task_struct中会记录自己的退出信息,让父进程来读取,如果父进程没有读取,则该进程会一直存在。
孤儿进程
孤儿进程:父进程完成,而子进程还在执行;
孤儿进程一般由1号进程(OS本身)进行领养;
孤儿进程为什么要被OS领养?
要保证子进程被正常回收
X状态(死亡状态)
进程执行完毕,且所占用的资源全部释放;
kill -9 PID
killall 进程名
相关文章:
【Linux】进程的标识符、状态(超详解)
目录 进程的概念 进程标识符PID 系统调用创建进程-fork初识 进程状态 R状态(运行状态) S,D状态(休眠状态) T,t状态 Z状态(僵尸进程) 孤儿进程 X状态(死亡状态&a…...
Elasticsearch 启动后在浏览器输入http://localhost:9200 访问失败
windows Elasticsearch 启动后在浏览器输入http://localhost:9200 访问失败 文章目录 前言本地下载安装了个elasticsearch,启动成功了,在本地访问http://localhost:9200 无法访问!!!难受了一下。 一、windows Elastics…...
javascript中new操作符的工作原理
在 JavaScript 中,new 操作符用于创建对象的实例。它可以让我们通过构造函数创建一个新的对象,并初始化该对象的属性和方法。尽管 new 操作符的使用很常见,但它在背后实际进行了几个步骤。下面详细解释 new 操作符具体做了哪些事情。 new 操…...
基于springboot+vue 旅游网站的设计与实现
基于springbootvue 旅游网站的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,…...
Ansible集群服务部署案例
案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统,分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…...
探索AI编程新境界:aider库揭秘
文章目录 **探索AI编程新境界:aider库揭秘**背景:为何选择aider?简介:aider是什么?安装指南:如何安装aider?功能演示:aider的简单用法实战应用:aider在不同场景下的使用常…...
SQL Server 2012 ldf日志文接太大的截断和收缩日志处理
SQL Server 2012 ldf日志文接太大的截断和收缩日志处理操作 --- SQL Server 2012 ldf日志文接太大的截断和收缩日志处理 ----- 查看所有 database 列表及详情 select * from sys.databases;-- 切换到指定的操作数据库 use testdb;-- 查询当前数据库的日志文件ID和逻辑文件名 S…...
java日志门面之JCL和SLF4J
文章目录 前言一、JCL1、JCL简介2、快速入门3、 JCL原理 二、SLF4J1、SLF4J简介2、快速入门2.1、输出动态信息2.2、异常信息的处理 3、绑定日志的实现3.1、slf4j实现slf4j-simple和logback3.2、slf4j绑定适配器实现log4j 4、桥接旧的日志框架4.1、log4j日志重构为slf4jlogback的…...
Oracle DB运维常用的视图及数据字典
List item 本文介绍一些Oracle DB日常运维最常用到(使用频率很高)的视图及数据字典 用户有关的常用视图: 1、 查看当前用户的缺省表空间* SQL>select username,default_tablespace from user_users; 2、 查看当前用户的角色 SQL>sele…...
vue.config.js devServer中changeOrigin的作用
问题 vue开发时,为了解决前端跨域问题,通常在vue.config.js配置 devServer proxy devServer: {proxy:{/api: {target: http://b.com,changeOrigin: false},}, }官方文档http-proxy options对changeOrigin的解释 option.changeOrigin: true/false, Defa…...
基于Ubuntu 20.04 LTS上部署MicroK8s(最小生产的 Kubernetes)
目录 文章目录 目录简介Kubernetes简介MicroK8s简介Ubuntu系统MicroK8s的优势安装环境基本要求执行安装命令加入群组(使用非 root 用户访问)开启 dashboard 仪表盘查看服务名称查看仪表盘开放的端口打开浏览器检查状态打开你想要的服务(使用附加组件)开始使用 microk8s访问 Kub…...
Spring:项目中的统一异常处理和自定义异常
介绍异常的处理方式。在项目中,都会进行自定义异常,并且都是需要配合统一结果返回进行使用。 1.背景引入 (1)背景介绍 为什么要处理异常?如果不处理项目中的异常信息,前端访问我们后端就是显示访问失败的…...
有点快要跟不上时代的感觉
团队的群里面有一个同事突然问了下,下面的这个 JavaScript 如何进行优化 var startIndex (start undefined || start null) ? null : start[0].Value;看上面的代码就是典型的判断和返回的问题。 如果是要调试的话也不是做不出来,但可能要花点时间&a…...
【pytorch】pytorch入门4:神经网络的卷积层
文章目录 前言一、定义概念 缩写二、性质三、代码总结参考文献 前言 使用 B站小土堆课程的笔记 一、定义概念 缩写 卷积层是神经网络中用于突出特征来进行分类任务的层。 二、性质 卷积核例子:vgg16 model 三、代码 添加库 python代码块import os import …...
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
目录 🍔 LSTM介绍 🍔 LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 🍔 小结 学习目标 🍀 了解LSTM内部结构及计算公式. 🍀 掌握Pytorch中LSTM工具的使用. &…...
QT学习笔记之文件操作
你千万不要跟任何人谈起任何事。你只要一谈起,就会想念起每一个人来。 在ui界面添加一个LineEdit(lEt)、QPushButton(btn)、QWidget widget.cpp #include "widget.h" #include "ui_widget.h" #include <QFile> #include <QFileDialo…...
Mybatis XML配置文件操作数据库
Mybaits在操作数据库时,可以有两种方式;第一种是使用注解的方式操作,另一种是使用XML配置文件的方式:一般而言,若没有特别的要求,则编写一些简单的SQL语句,可以直接使用注解的方式;编…...
Ansible-template模块动态生成特定文件
文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…...
【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑
1. 进入 vim 编辑器 在终端中输入以下命令: vim ~/.bashrc 2. 进入插入模式 打开文件后,你将处于普通模式。在普通模式下,你不能直接编辑文本。 要进入插入模式,请按下 i 键。这时,你应该会看到屏幕底部出现 -- 插…...
vs code自动报错
让vs code自动报错, 点击插件 → 搜索error lens → 点击install, 下载完后,编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置(settings) → 点击常用设置 → 修改字符缩进。...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
