Linux进阶-进程

news2025/1/12 5:56:50

目录

终端查询进程参数

进程状态

进程状态转换

子进程被Linux内核调入CPU执行的过程

子进程进入睡眠状态

子进程结束

进程控制

pid_t fork(void):创建子进程

exec()函数族:运行一个可执行文件。

void exit(int status):结束进程

wait():同步父进程与子进程

sleep(秒数):进程睡眠

进程组PGID:对相同类型的进程进行管理,由首进程PID决定

会话SID:管理进程组,由会话首进程决定

前台进程组

后台进程组

终端

守护进程

僵死进程

托孤进程


pstree:查看进程间的关系

终端查询进程参数

ps参数描述
-e列出所有进程
-f显示进程的全部信息
-h不显示进程标题列出所有进程
-l长格式显示进程
-w宽格式显示进程
-a显示终端上的所有进程,包括其他用户的进程
-r只显示正在运行的进程
-x显示没有控制终端的进程
-u显示进程的归属用户及内存使用情况
-j显示进程归属的进程组id、会话id、父进程id

ps auf(关注进程本身):用户名 PID 占用CPU% 占用内存% 虚拟内存大小 物理内存大小 进程关联的终端 进程当前状态 进程启动时间 进程运行时间 进程执行的程序。

ps axjf(关注进程间的关系):PPID PID PGID SID  进程关联的终端 是否是守护进程(-1是)  进程当前状态 用户id 进程运行时间 进程执行的程序。

进程状态

进程状态描述
创建状态进程正在被Linux内核创建
就绪进程还没有开始执行,但相关数据已被创建,只要内核调度它就立即可以执行
内核状态进程在内核状态下被运行,被调度上CPU执行
用户状态进程在用户状态下被运行,等待被调度上CPU执行
睡眠进程正在睡眠,等待系统资源或相关信号唤醒
唤醒正在睡眠的进程收到Linux内核唤醒的信号
被抢先具有更高优先级的进程强制获得进程的CPU时钟周期
僵死状态进程通过系统调用结束,进程不再存在,但在进程表项中仍有记录,该记录可由父进程收集

进程状态转换

子进程被Linux内核调入CPU执行的过程

最初,父进程通过fork系统调用创建子进程,子进程被创建后,处于创建态。Linux内核为子进程配置数据结构。如果内存空间足够,子进程在内核中就绪,否则在Swap分区就绪。这时子进程处于就绪态,等待Linux内核调度。

Linux内核会为子进程分配CPU时钟周期,在合适的时间将子进程调度上CPU运行,这时子进程处于内核态,子进程开始运行。被分配的CPU时钟周期结束时,Linux内核再次调度子进程,将子进程调出CPU,子进程进入用户态。 

待子进程被分配到下一个CPU时钟周期到来时,Linux内核又将子进程调度到CPU运行,使子进程进入内核态。如果有其他进程获得更高的优先级,子进程的时钟周期可能会被抢占,这时又回到用户态。

子进程进入睡眠状态

子进程在运行时,如果请求的资源得不到满足将进入睡眠态,睡眠态的子进程被从内存调换到Swap分区。被请求的资源可能是一个文件,也可能是打印机等硬件设备。如果该资源被释放,子进程将被调入内存,继续以系统态执行。 

子进程结束

子进程可以通过exit系统调用结束,这时子进程将进入僵死态,声明周期结束。

子进程在内核中的数据结构又被称为上下文。 

上下文:
用户级上下文是子进程用户空间的内容;
寄存器上下文是子进程运行时装入CPU寄存器的内容;
系统级上下文是子进程在Linux内核中的数据结构。

子进程切换时,CPU收到一个软中断,这时上下文将被保存起来,称之为保存现场。子进程再次运行时,上下文将还原到相关设置,称之为还原现场。整个过程称为上下文切换,保存上下文的数据空间称为u区,是Linux内核为进程分配的存储空间。

内核在以下情况会进行上下文切换操作:
子进程进入睡眠态时;
子进程时钟周期结束,被转为用户态时;
子进程再次被调度上CPU运行,转为系统态时;
子进程僵死时。

进程控制

调度时机:指进程何时被调度上CPU执行。例如,转变为睡眠态的进程将获得较高的优先级,一旦所需要的资源被释放,该进程可以立即被调度上CPU执行。被抢占的进程也将获得一个较高的优先级,抢占其CPU时钟周期的进程一旦转为用户态,被抢占的进程立即转为内核态。

调度算法:所关心的内容就是如何为进程分配优先级。

pid_t fork(void):创建子进程

在执行fork函数之前,操作系统只有一个进程,fork函数之前的代码只会被执行一次。

在执行fork函数之后,操作系统有两个几乎一样的进程,fork函数之后的代码会被执行两次。

执行完fork函数后,fork函数会返回两次。

//所需头文件
#include <sys/types.h>
#include <unistd.h>

//函数原型
pid_t fork(void);    //创建子进程时,复制父进程的上下文
pid_t vfork(void);   //创建子进程时,不复制父进程的上下文

//返回值
成功:0或其它正整数
失败:-1

首先,Linux内核在进程表中为子进程分配一个表项,然后分配PID。子进程表项的内容来自于父进程,fork系统调用会将父进程的进程表项复制为副本,并分配给子进程。然后,Linux内核使父进程的文件表和索引表的节点自增1,创建用户级上下文。最后,将父进程上下文复制到子进程的上下文空间中。fork系统调用结束后,子进程的PID被返回给父进程,而子进程获得的值为0。

exec()函数族:运行一个可执行文件。

//常见后缀
l:以列表形式传参
v:以矢量数组形式传参
p:使用环境变量Path来寻找指定执行文件
e:用户提供自定义的环境变量

//所需头文件
#include <unistd.h>

//函数原型
int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
int execv(const char *path,char *const argv[]);
int execve(const char *path,char *const argv[],char *const envp[]);

//返回值
成功:不返回
失败:-1

exec系统调用会结束原有进程,然后更新上下文的内容,并从头开始执行一个新的进程。两个进程之间并无父子关系。

void exit(int status):结束进程

//所需头文件
#include <unistd.h>
#include <stdlib.h>

//函数原型
void exit(int status);
void _exit(int status);

//返回值
不返回

进程执行exit系统调用后,Linux内核将删除进程的上下文,但保留进程表项,进程处于僵死态。待合适时,再删除进程表项的内容,释放进程PID。

wait():同步父进程与子进程

//所需头文件
#include <sys/wait.h>

//函数原型
pid_t wait(int *status);

//返回值
成功:退出的子进程PID
失败:-1

//处理子进程退出状态值的宏
WIFEXITED(status):如果子进程正常退出,则该宏为真
WEXITSTATUSA(status):如果子进程正常退出,则该宏获取子进程的退出值

系统调用wait()函数后,父进程的执行被阻断,直到子进程进入僵死态。这时,子进程的退出参数可通过wait()函数返回给父进程。wait系统调用常被用来判断子进程是否已结束。

sleep(秒数):进程睡眠

进程组PGID:对相同类型的进程进行管理,由首进程PID决定

在Shell里面直接执行一个应用程序,对于大部分进程来说,自己就是进程组的首进程,进程组只有一个进程。如果进程调用了fork函数,那么父子进程同属一个进程组,父进程为首进程。

在Shell中通过管道执行连接起来的应用程序,两个程序同属一个进程组,第一个程序为进程组的首进程。

会话SID:管理进程组,由会话首进程决定

调用setsid函数,新建一个会话,应用程序作为会话的第一个进程,称为会话首进程。

用户在终端正确登录后,启动Shell时linux系统会创建一个新的会话,Shell进程作为会话首进程。

前台进程组

Shell进程启动时,默认是前台进程组的首进程。前台进程组的首进程会占用会话所关联的终端来运行,Shell启动其他程序时,其他程序成为首进程。

在Shell进程里启动程序时,把后台进程组切换为前台进程组操作:fg jobid

后台进程组

后台进程中的程序徐不会占用终端。

jobs:查看有哪些后台进程组。

在Shell进程里启动程序时,指定程序运行在后台进程组操作:&、Ctrl+Z。

终端

当终端被关闭之后,会话中的除守护进程外的所有进程都会被关闭。

物理终端:串口终端、LCD终端

伪终端:SSH远程连接产生的终端、桌面系统启动的终端

虚拟终端:Linux内核自带,Ctrl+Alt+F0~F6可以打开7个虚拟终端

守护进程

创建子进程,父进程直接退出(父进程放弃终端使用权)。fork()函数。

创建新会话,不关联任何终端。setsid()函数。

改变守护进程的当前工作目录,改为“/”。chdir()函数。

重设文件权限掩码,新建文件的权限受文件权限掩码影响。umask()函数

关闭默认的文件描述符。close()函数。

实现守护进程的功能。

普通程序伪装成守护进程:nohup

僵死进程

进程正常退出:
子进程调用exit()函数退出
父进程调用wait()函数为子进程处理其他事情

子进程调用exit()函数退出,父进没有调用wait()函数为子进程处理其他事情,子进程就变成僵死进程。

托孤进程

父进程比子进程先退出(_exit()可立即退出进程),子进程变为孤儿进程,Linux系统会把子进程托孤给1号进程(init进程)。

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

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

相关文章

Illuminate/22圆桌回顾:Web3互操作性的未来现已到来

Illuminate/22 由Moonbeam主办的Illuminate/22于2022年11月10-11日成功举办。为期2天的线上会议聚集了60演讲嘉宾超过40个话题讨论。通过本次会议&#xff0c;来自行业领先的项目及负责人分享了通过互操作性和跨互连合约实现的最新进展。 本次以“Web3互操作性的未来现已到来”…

AI是如何影响全球的安防监控产业

全球AI安防市场现状 人工智能安防监控技术正在以更快的速度传播到更广泛的国家。全球176个国家中&#xff0c;至少有75个国家正在积极将AI技术用于监视目的。其中包括&#xff1a;智慧城市/安全城市平台&#xff08;56个国家&#xff09;&#xff0c;面部识别系统&#xff08;6…

【torch】如何把给定mask按比例选取再次划分mask?

背景 在以torch为基础的很多框架下有一些集成的数据集&#xff0c;数据集往往自带已经划分好的mask。但是如何能够把框架给出的mask再次划分&#xff1f;比如按比例划分出来80%的train mask。 解决 新生成一个每个元素都是0-1分布的与mask2的true位置相同的矩阵&#xff0c;…

xss-labs/level4

首先还是输入我们最熟悉的payload <script>alert(xss)</script> 查看界面回显 发现表单中的尖括号都消失了 说明后台服务器将尖括号删除了 再去查看源代码 通过源代码我们可以知道存在两个有意义的输出点 第一个输出点被转义了 没办法利用了script标签去执行js代…

亲戚小孩月薪17k,而我只有4k+,好慌......

我们总是在悲观与乐观中反复折磨自己&#xff0c;感觉自己一事无成。总是眼高手低&#xff0c;总以为大运会砸到自己&#xff0c;遇到挫折就会感到很沮丧。 大学四年没考到英语六级证书&#xff0c;小学教资考了两次。现在想要考研&#xff0c;但总是觉得来不及&#xff0c;或…

SpringBoot概念、创建和运行

文章目录什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f;Spring Boot 优点Spring Boot 项目创建项目目录介绍和运行约定大于配置什么是Spring Boot &#xff1f;为什么要学Spring Boot &#xff1f; Spring 的诞生是为了简化 Java 程序的开发的&#xff0c…

外汇天眼:外汇市场为何在周末休市?为什么周末行情有波动?

虽然从理论上而言&#xff0c;货币市场从不休市&#xff0c;但您很难见到有人在周日交易。新手甚至会认为&#xff0c;交易活动的停止是因为外汇经纪商周末休息。但如下文所述&#xff0c;实际情况并非如此。 外汇市场中的主要参与者 货币交易主要是为了促进贸易和旅游业。而且…

助推专精特新企业数字化的低代码

近两年&#xff0c;“专精特新”成为行业的热门词。根据工信部的定义&#xff0c;“专精特新”中小企业&#xff0c;是指具有专业化、精细化、特色化、新颖化等特点的企业。它们多专注于产业链上某个环节&#xff0c;主营业务聚焦&#xff0c;同时具有较强大的创新能力、创新活…

PG::Potato

nmap -Pn -p- -T4 --min-rate1000 192.168.171.101 nmap -Pn -p 22,80,2112 -sCV 192.168.171.101 打开80端口未发现可利用的服务 尝试对路径爆破&#xff0c;同时FTP可匿名访问&#xff0c;查看FTP内是否有可用信息 dirb http://192.168.171.101 在FTP中得到了网站源码的…

跑通Intellij Platform Plugin项目

目录需求描述尝试方向1. 用2022.1版本运行2. 用2019.2版本运行结论需求描述 在研究DDD逆向建模支持工具的过程中&#xff0c;需要复现期刊作者的cargo项目&#xff0c;实现C2MD&#xff0c;即代码转UML的功能。虽然按照文章的要求安装DddTool插件&#xff0c;但是不能成功使用…

第三次上机作业 大连理工大学

8.7 某种电子元件的寿命x(单位:小时)服从正态分布。现测得16只元件的寿命如下 是否有理由认为元件的平均寿命显著地大于225小时(a=0.05)? data = read.csv("习题8.7.csv") t.test(data$寿命,mu = 225,alternative = "greater")p值小于0.05,不能认为认…

Python CNN卷积神经网络实例讲解,CNN实战,CNN代码实例,超实用

一、CNN简介 1. 神经网络基础 输入层&#xff08;Input layer&#xff09;&#xff0c;众多神经元&#xff08;Neuron&#xff09;接受大量非线形输入讯息。输入的讯息称为输入向量。 输出层&#xff08;Output layer&#xff09;&#xff0c;讯息在神经元链接中传输、分析、权…

3.Linux传统性能检测工具——vmstat

命令&#xff1a;vmstat <duration> 参数duration&#xff1a;统计间隔如果不加参数则输出自启动以来的统计结果&#xff08;注意&#xff1a;输出的第一行总是为该结果&#xff08;除memory counter相关数据以外&#xff09;&#xff09; 输出示例&#xff1a; 虽然vmst…

nVisual部署之nginx配置说明

Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;因此nvisual在部署前端包时便采用了它作为服务器&#xff0c;版本使用1.14.1以上。在默认的配置下&#xff0c;还需要向nginx各模块添加配置才能达到生产需要。 接下来&#xff0c;从http模块开始&#xff0c;再到ser…

英文Paper写作需要了解哪些信息?

写Paper最重要的一点就是要仔细理解&#xff0c;Paper的题目告诉了哪些信息。 The most important thing about writing paper is to carefully understand what information the paper title tells you. 你应当精度每一个单词&#xff0c;从中找到尽可能多的指导。然后需要考虑…

历届图灵奖得主盘点

图灵奖&#xff0c;全称A.M.图灵奖&#xff08;ACM A.M Turing Award&#xff09;&#xff0c;是由美国计算机协会于1966年设立的计算机奖项&#xff0c;名称取自艾伦麦席森图灵&#xff0c;旨在奖励对计算机事业作出重要贡献的个人 。图灵奖对获奖条件要求极高&#xff0c;评奖…

STC 51单片机43——看门狗

看门狗测试&#xff0c;通过修改delay函数的延时长度&#xff0c;可以看到看门狗是否复位系统。 #include <reg52.h> sfr WDT_CONTR 0xE1; //声明WDT_CONTR void delay(void){ unsigned char i,j,k; for(i0;i<255;i) for(j0;j<2…

测试大老都是怎么理解cookiesession的?

为什么要学习cookie和session呢&#xff1f;若是没有掌握cookie和session的会话机制&#xff0c;就不了解客户端与服务器之间的交互通信原理&#xff0c;也就定位不了产生bug的原因。 cookie与session他们是如何理解的呢&#xff1f; 1、cookie与session区别&#xff1f; co…

笔试强训48天——day21

文章目录一. 单选1. 设一个有序的单链表中有n个结点&#xff0c;现要求插入一个新结点后使得单链表仍然保持有序&#xff0c;则该操作的时间复杂度&#xff08;&#xff09;2. 在一个单链表中&#xff0c;若删除 P 所指结点的后续结点&#xff0c;则执行?3. 设一个链表最常用的…

Thread的使用、线程的几个重要操作和状态【JavaEE初阶】

一、Thread类的常见构造方法 Thread()&#xff1a; 默认无参构造方法&#xff0c;如 &#xff1a;Thread t1 new Thread()&#xff1b; Thread(Runnable target)&#xff1a; 使用 Runnable 创建一个任务&#xff0c;再把 任务 放到线程里面&#xff0c; 如 Thread t2 new Th…