【Linux】进程周边001之进程概念

2023-12-16

???? 樊梓慕: 个人主页

???? 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》

???? 每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.基本概念

2.描述进程-PCB

2.1task_struct-Linux中的PCB

2.2task_struct内容分类(成员)

3.查看进程

3.1通过系统目录查看

3.2通过用户级工具ps查看

4.通过系统调用获取进程标识符(PID)

4.1PCB是属于操作系统的还是属于进程的?

4.2使用getpid和getppid

5.通过系统调用创建进程(fork初识)

5.1fork函数创建子进程

5.2fork的返回值

5.3使用if进行分流


前言

上篇文章我们说学习系统我们要翻越三座大山:进程周边、文件周边以及线程周边。

那今天我们就对第一座大山:进程周边开启攀登之旅????

本篇文章主要讲解有关进程的基本概念,以及Linux系统下是如何管理进程的,还记得学习管理的六字真言么?没错,对于进程的管理也是先描述,再组织。

之后我们再来学习下如何查看进程以及进程的标识符PID、父进程的标识符PPID。

最后我们初步的认识下fork函数,并利用fork函数实现创建子进程等。

话不多说,直接进入我们今天的学习✍


欢迎大家???? 收藏 ????以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码: ???? fanfei_c的仓库 ????

=========================================================================


1.基本概念

较为官方的说法:

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

辅助理解:

对代码进行编译链接产生的文件我们称之为可执行 程序 (.exe),执行该程序,该程序会被加载到内存中,此时便称之为 进程


2.描述进程-PCB

上节课我们学习了管理的概念,并总结为六字真言:先描述,再组织。

那对于操作系统来说,管理进程的方式仍然归结于这六字真言中。

我们也可以将进程 描述 起来,描述得到的就是进程控制块PCB(process control block)。

PCB就是进程属性的集合(数据结构),里面存储的是进程信息。

管理不是直接管理人,而是管理人的信息;

管理不是直接管理进程,而是管理进程的信息(PCB)。

此时操作系统对进程的管理就转化为对PCB对象的管理。

那对于某个数据结构的管理我们是很熟悉的,假如我们利用链表的方式进行组织,那对于进程的管理说白了就是对链表的增删查改。

换句话说:进程=PCB(内核数据结构)+可执行程序

未来,所有对进程的控制和操作,都只和进程的PCB有关,和进程的可执行程序没有关系。

如果愿意,你可以把PCB(Node节点)放到任意数据结构中去。


2.1task_struct-Linux中的PCB

task_struct就是在Linux中描述进程的结构体 (Linux是C语言编写)。

你可以理解为PCB是操作系统学科抽象的叫法,而在Linux中具体为task_struct。

即task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含进程的信息。


2.2task_struct内容分类(成员)

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

3.查看进程

3.1通过系统目录查看

根目录下的proc目录,/proc下存储着进程信息。

目录名为数字的即为进程信息的目录,每个目录内存储着他们对应的进程信息。

而这些数字对应着该进程的标识符PID。

比如查看标识符PID=1的进程信息:

当我们新建一个普通的进程,并进入该进程所在目录时:

我们可以利用chdir系统调用接口修改工作目录。


3.2通过用户级工具ps查看

实例:ps ajx/ps aux

该命令可以查看所有系统进程。


现在我们来写一段代码并生成可执行程序,执行后变成进程我们如何查看呢?

(1)代码:

#include<stdio.h>
#include<unistd.h>                                                                                                                  

int main()
{
	while(1)
	{
		printf("I am a process!\n");
		sleep(1);
	}
	return 0;
}

(2)编译后执行:


(3)打开多窗口方便我们观察


(4)如何查看单个进程?

首先我们已经知道如何查看系统中所有进程了,即ps ajx,那我们可以利用Linux之前学习的一些指令来显示我们想要查看的单个指令。

实例:ps ajx | head -1 && ps ajx | grep test

对以上指令的解释:


我们来观察一下是否是我们想要的结果:


我们发现:test进程利用刚才的指令我们得到了该进程的相关信息,但是黄色框内是什么?

其实是grep命令:


这里也侧面反映出几乎所有独立的指令,就是程序,运行起来也是进程。

这里grep实际也是进程,且该进程内包含有test的信息,所以也显示出来了。

如何去掉这多余信息呢?

实例:ps ajx | head -1 && ps ajx | grep test | grep -v grep

-v选项是反向搜索的意思,即过滤掉包含有grep内容的信息。


另外我们也可以通过指令对进程进行检测,检测他是否运行:

实例:while :; do ps ajx | head -1 && ps ajx | grep test | grep -v grep; sleep 1;done

观察进程创建和销毁的过程:


所以我们发现: 进程是有生命的!


4.通过系统调用获取进程标识符(PID)

4.1PCB是属于操作系统的还是属于进程的?

答案是属于操作系统的,虽然PCB记录的是进程的相关信息,但是PCB是由操作系统创建并维护的。

那既然PCB是属于操作系统的,那我们如何查看PCB的信息呢?

在操作系统的那篇文章中我们提到过用户想要获取操作系统的信息,需要调用系统接口。

所以获取进程标识符(PID)等PCB的信息我们需要通过系统调用来获得,所以我们来认识下getpid()。

首先我们利用man getpid查看下命令手册:


我们发现getpid是在2号手册中,利用man man我们知道2号手册中记录的就是系统调用接口。


4.2使用getpid和getppid

(1)编写代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
	pid_t id = getpid();
	while (1)
	{
		printf("I am a process!pid:%d\n", id);
		sleep(1);
	}
	return 0;
}

(2)执行可执行程序并观察


那我们再来学习一下getppid(获取父进程的进程标识符)。

一般在Linux中,普通进程,都有他的父进程。

每一个子进程都是由父进程创建出来的。

子进程只能有一个父进程,父进程可以有多个子进程。

每次执行可执行程序,进程标识符会改变(因为每次都是新的进程)。

那我们来观察一下他的父进程:

(3)编写代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
	pid_t id = getpid();
    pid_t fid = getppid();
	while (1)
	{
		printf("I am a process!pid:%d ppid:%d\n", id, fid);
		sleep(1);
	}
	return 0;
}

(4)执行可执行程序并观察


我们来查询一下该进程的父进程究竟是什么?

我们发现该进程的父进程是bash(命令行解释器)。

在命令行启动的进程都是bash的子进程。


5.通过系统调用创建进程(fork初识)

./+可执行程序的方式是一种手动创建进程的方式。fork则是通过系统调用创建进程。

5.1fork函数创建子进程

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
	printf("before fork : I am a process,pid:%d,ppid:%d\n", getpid(), getppid());

	fork();

	printf("after fork : I am a process,pid:%d,ppid:%d\n", getpid(), getppid());
	sleep(2);
	return 0;
}

现象:

确实如我们所料,fork执行后,创建出了一个子进程。

并且我们发现fork后面的语句执行了两次。

也就是说fork之后,代码共享,从一个进程分为两个分支,一为父,一为子。

那我们如何知道谁是父谁是子呢?

这就要研究一下fork函数的返回值问题了。

5.2fork的返回值

意思是返回给父进程的是子进程的PID,返回给子进程的是0.

为什么?

  • 因为父:子= 1:n,子找父是很容易的,而父找子必须有子的pid。

两个返回值么?

我们来验证一下:

执行结果:

也就是说父进程使用该变量就返回子进程的pid,子进程使用就返回0。


提问:fork函数为什么会返回两次?

当一个函数运行到了最后执行return的时候,这个函数的核心逻辑已经执行完成了!

而fork函数中必然会有创建子进程这一操作,所以在fork函数返回值之前,子进程已经存在了。

所以fork函数会返回两次值写入到变量中。


提问:id怎么可能同一个变量既等于0又等于pid?

一个进程崩溃会不会影响其他进程呢?答案是不会。

注:任意进程之间是具有独立性的,互相不能影响,即便是父子进程。

子进程被创建时,会继承大部分父进程的属性,即子进程的创建是以父进程为模板的。

模拟场景:父进程或子进程对一共享数据进行修改会发生什么?

前面我们刚说到任意进程之间具有独立性,互相不能影响,所以操作系统必须保证这一点。

假如为子进程修改该数据:子进程会从父进程那拷贝一份到自己这里进行修改,这一行为称之为 写时拷贝

父进程修改该数据也如此。

id就是这一共享数据,返回的本质就是写入。

  • linux中可以使用同一变量名,表示不同的内存。

提问:我们创建子进程的目的是什么?

一般而言:我们想让父子做不同的工作。

所以我们就可以 利用返回值的不同使用if进行分流


5.3使用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的工作代码段
	}
	else { 
		//father的工作代码段
	}
	sleep(1);
	return 0;
}

本篇内容就到这里,其中有些知识需要学习到进程地址空间才能深入研究,博主会持续更新Linux系列文章,欢迎大家关注哈!

=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

????博主很需要大家的支持,你的支持是我创作的不竭动力????

???? ~ 点赞收藏+关注 ~ ????

=========================================================================

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程周边001之进程概念 的相关文章

随机推荐

  • 基于Java的土地档案管理系统设计与实现开题报告

    计算机开题报告 一 选题背景与意义 土地档案管理是土地资源管理的重要组成部分 对于政府部门来说 一个高效 准确的土地档案管理系统能够提高土地资源管理的效率和质量 本项目旨在设计和实现一个基于Java的土地档案管理系统 方便政府部门对土地档案
  • 选择正确的自动化测试工具:打造高效测试流程的必备利器!

    摘要 自动化测试正在逐步取代部分手动测试 因为它可以节省时间并提高测试质量 特别是在进行回归测试的情况下 自动化可以通过多种方式提高效率 手动进行重复测试是浪费时间和资源 此外 由于重复测试可能会遗漏 因此存在一定的错误范围 但是自动化中发
  • 大模型下开源文档解析工具总结及技术思考

    1 基于文档解析工具的方法 pdf解析工具 导图一览 PyPDF2提取txt import PyPDF2 def extract text from pdf pdf path with open pdf path rb as file pd
  • 概念解读稳定性保障

    什么是稳定 百度百科关于稳定的定义 稳恒固定 没有变动 很明显这里的 稳定 是相对的 通常会有参照物 例如 A 车和 B 车保持相同速度同方向行驶 达到相对平衡相对稳定的状态 那么软件质量的稳定是指什么呢 假设软件系统是辆车 质量预期是满足
  • 华为od求捞

    字节 虾皮 算法面试 虾皮 算法工程师 一面面经 虾皮北京提前批 算法工程师 回暖分析 战绩结算 on 赛文X 爱奇艺 华为od求捞 情况 12月机考289 没有约到面试 普通本科 自考了河北大学计算机本科 有四年的软件开发工作经验 这种情
  • 快速搭建知识付费平台?我有才,为你提供一站式解决方案

    在当今数字化时代 知识付费已经成为一种趋势 越来越多的人愿意为有价值的知识付费 然而 公共知识付费平台虽然内容丰富 但难以满足个人或企业个性化的需求和品牌打造 同时 开发和维护一个属于自己的知识付费平台需要较高的成本和专业技术支持 对于许多
  • Java + Selenium + Appium自动化测试

    一 启动测试机或者Android 模拟器 Genymotion俗称世界上最快的模拟器 可自行百度安装 二 启动 Appium Appium环境安装可自行百度 三 安装应用到Genymotion上 如下图我安装一个计算机的小应用 包名为Cal
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 自动化测试框架 —— pytest框架入门篇

    今天就给大家说一说pytest框架 今天这篇文章呢 会从以下几个方面来介绍 0 1 pytest框架介绍 pytest 是 python 的第三方 单元测试 框架 比自带 unittest 更简洁和高效 支持非常丰富的插件 同时兼容 uni
  • 企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

    鸿鹄招投标系统的功能描述 1 门户管理 用户可通过门户页面查看所有公告信息及相关通知信息 包括招标公告 非招标公告 系统通知和政策法规等板块 2 立项管理 企业用户可以对需要采购的项目进行立项申请 并提交审批 同时可以查看所有的立项信息 主
  • 全面解析“由于找不到hid.dll,无法继续执行代码”的4个解决方法

    在计算机使用过程中 我们经常会遇到一些错误提示 其中之一就是 找不到hid dll 这个问题通常出现在尝试运行某个程序或访问某个设备时 那么 当我们遇到这个问题时 应该如何解决呢 本文将详细介绍找不到hid dll的解决方法 首先 我们需要
  • 小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c

    java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案 使用技术 Spring Cloud Spring Boot Mybatis 微服务 服务监控 可视化运营 B2B2C平台 平台管理端 包含自营 商家平台端 多商户入驻
  • 通用大模型训练过程必须经历的四个阶段!

    上图来自 Andrej Karpathy 深度学习的大拿 目前在Tesla 这张图的信息量相当大 通过该图能让我们对大模型的整个训练过程有一个总体的了解 从该图可知大模型训练主要有4步 Pretraining 预训练阶段 Supervise
  • LoRA 微调大模型的实践经验总结

    前两天 SEBASTIAN RASCHKA 博士发了一篇博客介绍了使用LoRA微调大模型的一些实践经验 个人觉得有一定参考价值 总结一下分享给大家 喜欢记得收藏 点赞 关注 文末附上原文 欢迎品读 简单介绍下什么是LoRA 在深度学习领域
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 行业大模型训练经验分享&落地思考

    大家好 行业大模型一直是大家关注的内容 恰逢我司也做了行业知识大模型 借此机会聊一聊行业大模型训练Trick以及行业大模型落地想法 但有些并没有什么理论依据 全是自己的实验经验 结论 可能跟大家有所不同 喜欢欢迎点赞 收藏 关注 文末提供技
  • 题解 | #反转链表#很简单,新建节点插在末尾就行

    华为车bu最新情况汇总 华为车bu最新情况汇总 某小厂实习面经 已oc 华子开了 比亚迪vs华为 麻烦大家帮忙比较一下offer 帮选offer 秋招决赛圈 offer选择 太难了呜呜呜帮忙选一下Offer 晒一晒我的offer 38210
  • java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 评论送书:以企业架构为中心的SABOE数字化转型五环法

    0 1 传统企业数字化转型面临诸多挑战 即将过去的2023年 chatGPT大模型 数据资产入表等事件的发生 标志着数字经济正在加速发展 数字经济是人类社会继农业经济 工业经济之后的第三种经济形态 将推动生产方式 生活方式和治理方式深刻变革
  • 【Linux】进程周边001之进程概念

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 基本概念 2 描述进程 PCB 2 1task struct Linux中