【Linux】进程的概念|查看进程的方法|子进程

news2024/11/17 3:07:23

文章目录

  • 基本概念
    • “先描述”进程(PCB)
      • task_ struct内容分类
    • “再组织”进程
    • 最终结论:
  • 如何查看进程
    • 方法一:
    • 方法二:
  • 通过系统调用获取进程标识符
  • 通过系统调用创建进程子进程(fork)
    • 实验一:
    • 实验二:
    • 实验三:

基本概念

在了解进程之前需要知道什么是程序?
对于计算机而言,程序就是系统可以识别的一组有序的指令。程序能指挥计算机执行我们想要它做的动作。程序储存在磁盘上,在执行时从磁盘到内存再到寄存器,最后被CPU执行。
进程的课本概念:程序的一个执行实例,正在执行的程序等,但这只是课本的概念。

“先描述”进程(PCB)

不可能在内存上只有一个进程,一般有很多程序在运行,那么操作系统怎么对这些进程进行管理呢?

一谈到操作系统的管理那么就一定是先描述。再组织,就像这样的先描述再组织的方式是操作系统一贯的作风。不了解先描述再组织的老铁可以看这篇文章文章链接

把程序加载到内存可不仅仅是把代码拷贝到内存,操作系统为了维护和管理这个进程也要创建对应的管理数据结构,就是这里的PCB(process control block),在Linux操作系统中描述进程的结构体叫做task_struct。
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
本质上是一个装有进程属性的结构体。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。一个程序对应一个task_struct结构体对象。

task_ struct内容分类

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

“再组织”进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里,
将程序对应一个task_struct结构体对象与它自己的代码和数据关联起来,根据程序对应PCB(task_struct)优先级和各种属性的不同,CPU对他们进行着不同的操作。

在这里插入图片描述

最终结论:

现在返回来看什么是进程,现在对于进程的概念就应该是:内核数据结构(task_struct)+进程对应的磁盘代码

如何查看进程

在window下我们可以直接通过任务管理器查看进程。
在这里插入图片描述
在Linux下如何查看进程呢?

方法一:

我这里先创建一个死循环程序
在这里插入图片描述
然后运行程序,在命令行输入

ps ajx |head -1 && ps ajx |grep 'myproc'
或者
ps ajx |head -1 && ps ajx |grep "myproc"

在这里插入图片描述

在这里插入图片描述
PPID是父进程IDPID是这个进程自己的ID,PGID是这个进程的组ID,STAT代表这个进程的状态
UID是用户ID,COMMAND就代表我是哪一个进程

想杀掉这个进程用kill -9 这个进程的PID
在这里插入图片描述

方法二:

进程的信息可以通过 /proc 系统文件夹查看。
在这里插入图片描述
其实一个一个的进程也就相当于/proc下的一个个目录

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

  • 如:要获取PID为1的进程信息,你需要利用cd /proc/1查看/proc/1这个文件夹。 那么怎么在程序里就直接获取PID呢?

其实Linux提供了一个系统调用接口,叫做getpid()
运行man getpid认识一下getpid()

在这里插入图片描述
在我们的程序里添加这个系统调用,就会自动把当前程序的PID显示出来。
在这里插入图片描述
在这里插入图片描述
当我们利用kill -9 命令将这个11167的进程杀掉之后,那么在/proc下就看不到11167这个目录了。

然后我们再使用一下getppid来获取一下当前进程的父进程,

在这里插入图片描述
通过编译之后,多次运行,我们可以发现,PID也就是下面的id号是运行一次就变一次,而父进程pid号7139是一直都不变的,那么为什么呢?
在这里插入图片描述
我们在命令行输入ps ajx | head -1 && ps ajx | grep 7139
在这里插入图片描述
就可以看到7139是一个bash,我们把这个bash用kill命令杀掉的话,那我们的各种ls、cd等等一些个命令都运行不了了,我们退出shell下次再进行这样的操作,发现他们的父进程还是bash,所以其实在Linux命令行上启动的进程, 一般它的父进程没有特殊情况的话,都是bash!

通过系统调用创建进程子进程(fork)

  • 运行 man fork 认识fork
    在这里插入图片描述
  • 下面是fork的返回值,惊奇的发现fork竟然有两个返回值
RETURN VALUE
       On success, the PID of the child process is returned in the parent, 
       and 0 is returned in the child.  
       On failure, -1 is returned in the parent, no child process is created, and
       errno is set appropriately.
  • 父子进程代码共享,数据各自开辟空间,私有一份。fork执行之前只有一个父进程,函数执行之后是父进程+子进程

实验一:

下面用vim工具写一段代码:

在这里插入图片描述
运行起来可以看到printf被执行了两次,其中上面是父进程打印的,下面的是子进程打印的

在这里插入图片描述
通过ps ajx| head -1 && ps ajx | grep 29346查看这个29346是谁,从下面结果就可以清晰的看到它是bash
在这里插入图片描述
从上面的结果来用一句形象的话来描述上面的现象就是:29945是爸爸,29346(bash)是爷爷,29946是孩子。

实验二:

代码:
在这里插入图片描述
执行结果:
在这里插入图片描述

RETURN VALUE
       On success, the PID of the child process is returned in the parent, 
       and 0 is returned in the child.  
       On failure, -1 is returned in the parent, no child process is created, and
       errno is set appropriately.

通过前面的介绍已经知道fork是有两个返回值的,可以看到其实它一个返回值返回给了父进程,这个返回值从上面可以看出它是子进程的id,另一个返回值是0,被返回给了子进程。

  • fork 之后通常要用 if 进行分流

实验三:

代码:
在这里插入图片描述
执行结果:
在这里插入图片描述
可以看到在fork之后,会有父进程+子进程连个进程在执行后续代码。fork之后的代码,被父子进程共享,通过返回值的不同,让父子进程执行后续共享的代码的一部分。这就叫所谓的并发式编程。

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

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

相关文章

Java基于PHP+MySQL客户信息管理系统的设计与实现

随着我国经济的发展,越来越多的企业出现,但是相对企业来说客户才是企业的根本,如何能够更好的当下的客户信息进行管理,是很多企业一直以来所关心的问题,如果对客户的信息不够重视最终将会使企业在激烈的竞争中失去活力,为此我们开发了本客户信息管理系统。 本客户信息管理系统采…

IB究竟在考什么?IB真的有传闻中的那么难吗?

提起学习“国际课程之王”IB的感受,学生们估计都能开一个“吐槽大会”了,IB很难,不少人学IB,GET到的第一个技能,就是“熬夜”。▲IB学生做的搞笑图:凌晨三点,唯一一扇亮着灯的窗户一定是属于IB学…

安装与调试Dragonfly实现自动化测试项目

通过ASP.NET Core Selenium 实现 Web 自动化平台 1、获取项目 从Gitee上拉取代码到本地。地址: 点击这里 有多种方式拉取,我使用的zip下载方式。 2、解压运行 这里我是在F盘新建了一个文件夹,只放这一个项目。 点击解压文件,找到“.sln”…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统9p5w4

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了,确实,从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做,创…

逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列

np.random.seed(24)features,labels arrayGenReg(w[1,-1,1])将第一个特征取值调大100倍 features[:,:1] features[:,:1] * 100 features --- array([[ 132.92121726, -0.77003345, 1. ],[ -31.62803596, -0.99081039, 1. ],[-107.08162556, -1.43…

python爬取网页内的指定内容-不需要技术一样爬取网页详细教程

爬虫文章采集,我们怎么利用爬虫采集自己想要的文章内容,我们需要学习python爬虫吗?如果完全靠自己自学,又是从零基础开始学习Python的情况下,按照每个人的学习和理解能力的不同,我认为大致上需要半年到一年…

【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

麻了,之前写的博客全是收藏,没人点赞,来点赞行不行! GitHub同步更新(已分类):Data_Structure_And_Algorithm-Review 公众号:URLeisure 的复习仓库 公众号二维码见文末 以下是本篇…

我国火箭回收历程介绍

引言 火箭回收技术对于节约火箭发射成本具有重要意义,中国的火箭回收技术研发步履不停,本文将总结中国的可重复使用发动机和垂直回收火箭发展现状,数据更新时间为2022年11月11日。如需了解火箭回收相关概念. 提示:本文图片和表格…

Loss模块

导入包 from utils import cos_sim, euclidean_dist 方法 EucSoftmax 变量 “”"Calculate cos distance loss. Args:protos: protos vector in now episode (**class_size, hidden_size**)querys: queres vector to classify **(querys_len, hidden_size)**querys_y…

深浅拷贝的区别?如何实现一个深拷贝?

一.数据类型存储 js中存在两大数据类型: 基本数据类型:保存在栈内存中; 引用数据类型:保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中。 二.浅拷贝 浅拷贝:…

CRM系统的功能有哪些?

**CRM系统**的功能有:1、联系人管理;2、沟通跟踪;3、潜客管理;4、电子邮件集成;5、文档管理;6、报价/提案管理;7、商机管理;8、工作流自动化;9、报表/分析;10…

利用Seagate service获得system shell

这是挖掘 CVE-2022-40286 漏洞的记录。 闲来无事,我上网随便找了一个驱动来进行测试。我想找一个知名公司的产品,但是又不能是太偏太难懂的东西。 我最先发现了一个叫"Seagate Media Sync"的软件,这是一个将文件复制到希捷无线硬…

SR-MPLS技术基础讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

pyinstaller瘦身指南

目录说明无优化直接打包优化:创建专用虚拟环境原因分析和总结说明 之前写了一个自动化办公的python脚本,按需求打包exe。经过不断优化打包过程,把26.1MB的文件变成了9.5MB的文件。 打包工具pyinstaller。 安装: pip install pyi…

Ubuntu1804里进行KITTI数据集可视化操作

需要做的准备工作 1、需要提前安装kitti2bag(终端输入即可安装) pip install kitti2bag 如果没有pip,按照Ubuntu给的提示先安装pip 2、下载kitti数据集(下载圈出的两部分) kitti数据集的百度网盘链接 kitti数据集链接_FYY2LHH的博客-CSDN博客 文件存放位置如图 上图…

Android Material Design之Chip, ChipGroup(十二)

效果图 资源引入 implementation com.google.android.material:material:1.4.0属性 Chip 属性描述android:id控件idstyle样式属性系统默认4种 1.style/Widget.MaterialComponents.Chip.Entry 2.style/Widget.MaterialComponents.Chip.Choice3.style/Widget.MaterialCompon…

集团资金管理BI分析的三个关键节点

集团资金管理方面的商业智能BI分析怎么做?从财务角度来说,企业的管理是以财务管理为中心,财务管理以资金管理为中心,资金管理以现金流量为中心。围绕资金管理至少需要考虑三个方面的内容:安全、收益和效率。 在商业智…

【JavaEE】JavaScript(WebAPI)

努力经营当下,直至未来明朗! 文章目录前言一、前置知识二、【DOM】【获取元素】【事件】【操作元素】1.【获取/修改元素的内容】2.【获取/修改元素属性】3.【获取/修改 表单元素属性】4.【获取/修改样式属性】【操作节点】1.【新增节点】2.【删除节点】&…

【2-3个月左右录用】物联网、无线通信类、人工智能、传感器、人机交互等领域必投快刊,进展顺利,12月截稿

【期刊简介】3.0-4.0,JCR2/3区,中科院4区 【检索情况】SCI在检,正刊 【征稿领域】安全和隐私雾云辅助物联网网络 【参考周期】2-3个月左右 【截稿日期】2022年12月31日 【期刊简介】2.0-3.0,JCR3区,中科院4区 【检索情…

【白嫖】如何低价续费服务器

背景 现在各大云服务商的学生价服务器都已经关闭了,华为云、阿里云、百度云,以前都有学生价服务器,一年只要99。现在我找半天都没找到入口,而原价的一年得500起步。。。 但是!!!腾讯虽然也取消了…