【Linux进程的知识点】

news2025/1/16 1:49:30

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录

前言

操作系统的知识补充

我们来理解一个用户操作接口:

进程的理解

进程的基本概念

描述进程-PCB

task_struct-PCB的一种

task_ struct内容分类

进程的task_struct本身内部的属性有哪些?

1、启动

查找 pid 的方式:

方法一:

方法二:

2、进程创建的代码方式

我们为什么要创建子进程?

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

操作系统的知识补充

我们来理解一个用户操作接口:

举个例子:

年轻人去银行办理业务,因为是年轻人,能力比较强,知道怎么办理,就可以直接找工作人员去办理;而老年人属于弱势群体,对于这些不熟悉,此时银行的工作经理就来了,他会帮助老年人准备好各种各样的手续,所有资料都准备好了,然后再让柜台前的工作人员来办理。

系统调用接口是操作系统提供的,用户必须懂一点操作系统,才可以直接通过系统调用的接口来访问操作系统;而有的用户对操作系统不是很了解,操作系统提供的接口确实很难,这时可以通过用户操作接口,来访问系统调用接口 ----> 访问操作系统。用户操作接口(库,例如:c/c++标准库)是系统调用接口的封装。

代码不具有跨平台性根本原因:

你直接访问操作系统的系统调用接口,平台不同,操作系统不同,系统调用接口、返回值,函数名都不同,所以不具有跨平台性。

c/c++具有跨平台性:

在用户操作接口方面:linux下给c语言提供了linux版的库函数,在windows中给c语言提供了windows版的库函数,大家向上提供的都是printf函数;系统调用接口方面:linux用linux的系统调用接口帮助你向显示器打印,windows下用windows的系统调用接口帮助你完成向显示器打印。

进程的理解

struct PCB{}在操作系统中,我们一般给它叫做内核数据结构。

没开机的话,操作系统(OS)也是储存在磁盘当中的一个二进制文件。可执行程序没有运行起来的话,一般都在磁盘中。

开机的时候,操作系统是第一个加载到内存中的一个软件。内存数据块是在我们的操作系统内部的。

开机的时候,都要等上十几秒,是在磁盘中的操作系统加载到内存当中;然后当你创建进程时,一方面是把你的可执行程序和数据加载到内存当中,另一方面,需要在我们对应的操作系统内部malloc出来对应的结构体,你有几个进程,就malloc几个struct PCB{}

我们在整个操作系统内部里面对进程的管理,就变成了对struct PCB的操作。

我们可以转换成学校管理学生:

内存 ----->学校;操作系统 ------> 教务管理系统;学生 -----> 加载到内存中的代码和数据。

你怎么证明你是学校的学生呢?

你的属性信息(struct PCB)在学校的教务管理系统中。操作系统对于进程的管理,本质是对 struct PCB{}的管理,而并非是对你的可执行程序加载到内存之后,对可执行程序做管理。

为什么要有PCB呢?

OS操作系统要对进程做管理!!!任何管理:先描述,在组织

PCB是对操作系统学科里面所有进程控制块的统称。

Linux进程控制块的具体称呼:struct task_struct。

调度运行进程,本质就是让进程控制块 struct PCB{} 进行排队!!!

如何理解进程动态运行?

只要我们的进程task_struct,将来在不同的队列中,进程就可以访问不同的资源。

进程的基本概念

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

描述进程-PCB

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

task_struct-PCB的一种

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

task_ struct内容分类

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

进程的task_struct本身内部的属性有哪些?

1、启动

  • 1、./xxxx,本质就是让系统创建进程并运行 ----- 我们自己写的代码形成的可执行 == 系统命令 == 可执行文件。在Linux中运行的大部分执行操作,本质都是运行进程!!!
  • 2、每一个进程都要有自己的唯一的标识符,叫做进程 pid。

查找 pid 的方式:

方法一:

方法二:

一个进程,不通过ps指令,想知道自己的pid,该如何做呢?

用户不能对操作系统直接访问,要通过系统调用接口来进行访问,我们就学到了第一个系统调用接口 man getpid

  • 3、ctrl + c 就是在用户层面上终止进程,kill -9 pid 可以直接用来杀掉进程。

2、进程创建的代码方式

父进程创建一个子进程,本质是系统多了一个进程,多了一个进程,就是多了:

1、内核 task_struct;2、有自己的代码和数据。

父进程的代码和数据是从磁盘加载来的,子进程的代码和数据呢?

默认情况继承父进程的代码和数据。

我们为什么要创建子进程?

我们想要子进程执行和父进程不一样的代码。

父进程创建一个子进程,创建一个进程是操作系统内多了一个进程,多了一个进程,其实就是多了一个struct PCB{}和该进程的代码和数据;创建一个进程就是创建一个struct PCB{}的内核数据结构,可是用户没有任何权利直接对内核数据结构(操作系统)进行任何的增删查改,所以为了创建进程,操作系统就得给我们提供一个系统调用接口(fork)。

fork()的返回值:

如果fork()函数成功了,会返回子进程的pid(pid > 0)给父进程,返回0给子进程;

如果fork()函数失败的话,-1就返回给父进程,没有子进程创建成功,错误码被设置。

fork()之后的代码,其实都被父、子进程共享的,只不过这里做了判断,子进程通过fork()进入子进程的执行流当中;父进程进入父进程的执行流当中。

父进程和子进程是并列的,退出谁,也不会影响另一个。

怎么理解fork()会有两个返回值,返回两次?

fork()是一个函数,是由操作系统(OS)提供的,fork()是一个系统调用接口。当我们执行到 return 的时候,函数是不是已经执行完了?执行到 return 的时候,子进程已经存在了,并且子进程可以被调度了,return 也是代码。我们之前说的 fork()之后,代码共享,这种说法不太准确,而是在fork()内部,前半部分代码由我们的父进程创建子进程,执行到 return 的时候,已经是两个执行流了,所以父进程被调度一次,子进程被调度一次,各自执行一次 return ,return 被执行两次。其实不是 fork()之后的代码,而是 fork()从后半部分代码和 return 之后的所有代码都是被大家共享的。

进程一定要做到:进程具有独立性。

进程 = 内核数据结构task_struct(父、子进程是独立的,有各自的 pid)+ 进程的代码(只读的!所以父子之间可以共享代码)+ 进程的数据(原则上:数据要分开,这个之后再细谈)

样例代码:一次创建多个进程

每个进程在启动的时候,会记录自己当前在那个路径下启动。

/根目录下有一个 proc 目录,proc 目录会不时地把内存当中的进程信息,给我们挂接到文件当中,让我们以文件的方式可以看到对应的进程的相关信息。

如果我们一个进程正在执行,我们把进程的可执行程序删除掉,但是进程依旧在运行,这是为什么呢?

因为这里的删除只是删除的是磁盘中的代码,而可执行程序已经加载到内存当中了,所以进程还是在运行,当然还要看程序的大小,当可执行程序非常大时,进程一开始还是好的,但是过一段时间后,进程会出错。

man chdir 更改一个调用进程的当前的工作路径。


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

【四】【算法分析与设计】贪心算法的初见

455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有…

Terrace联合创始人兼CEO Jesse Beller确认出席Hack.Summit() 2024区块链开发者大会

在科技创新的浪潮中,区块链技术以其独特的去中心化、透明性和安全性,正逐渐成为引领未来发展的重要力量。在这样的背景下,备受瞩目的Hack.Summit() 2024区块链开发者大会即将于4月9日至10日在香港数码港盛大举行。本次大会的亮点之一&#xf…

Linux系统安全②SNAT与DNAT

一.SNAT 1.定义 利用SNAT技术实现2台私网地址都可以访问公网 2.实验环境准备 (1)三台服务器:PC1客户端、PC2网关、PC3服务端。 (2)硬件要求:PC1和PC3均只需一块网卡、PC2需要2块网卡 (3&a…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) > boolean) 刷新或关闭场景下,在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点,才会触发此回调。 参数…

docker部署多功能网络工具箱

功能 查看自己的IP:从多个 IPv4 和 IPv6 来源检测显示本机的IP 查看IP信息:显示所有 IP 的相关信息 可用性检测:检测一些网站的可用性 WebRTC 检测:查看使用 WebRTC 连接时使用的 IP DNS 泄露检测:查看 DNS 出口信息 …

NVMFS5A160PLZT1G汽车级功率MOSFET P沟道60 V 15A 满足AEC-Q101标准

关于汽车电子AEC Q101车规认证? 是一种针对分立半导体的可靠性测试认证程序,由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性、温度循环和湿度变化等…

STM32平替GD32有多方便

众所周知, GD32一直模仿STM32,从未被超越。 我最近公司使用的GD32E230C6T6 这款芯片有48个引脚。 属于小容量的芯片。 我有一个用STM32写的代码,之前是用的 STM32F103CB 这款芯片是中容量的。 不过在keil中,只需要这两步,就能使用原来的逻辑,几乎不用修改代码。 1. …

武汉儿童医院变电所电力运维平台系统的设计及应用

彭姝麟 Acrelpsl 1 引言 2015年国务院发布《中共中央、国务院关于进一步深化电力体制改革的若干意见》(中发[2015]9号),简称“电改9号文”。而本次新电改的重点是“三放开一独立三强化”:输配以外的经营性电价放开、售电业务放开…

APP测试基本流程以及APP测试要点

一、 APP测试基本流程 1、流程图 2、测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。 3、测试资源 测试任务开始前,…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的车牌检测系统(Python+PySide6界面+训练代码)

摘要:本篇博客详细介绍了如何利用深度学习技术开发一个先进的车牌检测系统,并附上了完整的实现代码。系统核心采用了强大的YOLOv8算法,并对前代版本如YOLOv7、YOLOv6、YOLOv5进行了详尽的性能评估,包括mAP和F1 Score等关键指标的对…

three.js 鼠标左右拖动改变玩家视角

这里主要用到了 一个方法 obj.getWorldDirection(); obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。 按下 W键前进运动&#xff1b; <template><div><el-container><el-main><div class"box-card-left…

Qt(C++) | QPropertyAnimation动画(移动、缩放、透明)篇

动画类继承关系图 # QPropertyAnimation QPropertyAnimation是一个可以在Qt应用程序中使用的动画框架。它可以用于创建各种动画效果,包括但不限于以下几种: 1. 移动动画:可以将一个对象从一个位置平滑地移动到另一个位置。比如,你可以创建一个按钮,当用户点击它时,按钮…

Python语法基础

Python 运行方式 交互解释器&#xff1a;进入交互解释器 Pycharm 里面有个 Terminal 终端&#xff0c;点击即可进入Python的交互环境 语句快缩进 同行多个语句 输出语句:print 输入语句: 变量定义: 变量赋值: 运算符: 基本数字类型: 数字表示方法: 定义字符串: 定义列表:

【Vue3】深入理解Vue3路由器的工作原理to的两种写法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

整块代码自动生成、智能括号匹配……CodeGeeX编程提效,功能再升级!

CodeGeeX插件功能持续打磨&#xff0c;希望成为开发者更高效的智能编程工具&#xff0c;提高开发速度和代码质量。今天介绍VSCode中最新的v2.4.0版本插件新功能&#xff0c;让你在编写代码时更加得心应手。 一、新增block代码块生成的设置 CodeGeeX插件中&#xff0c;以往针对…

读西游记第一回:西游记世界格局

天地之数&#xff1a; 元&#xff1a;十二万九千六百岁&#xff08;129600年&#xff09; 1元12会&#xff1a;子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期&#xff1a;前5400年混沌期&#xff0c;后5400年&#xff0c;盘古开天辟地&am…

【阿里云系列】-ACK的Java应用POD无法访问云数据库Redis

问题介绍 如下图所示&#xff0c;是ACK集群的POD访问阿里云的云数据库Redis&#xff0c;如何实现访问呢 配置步骤 要实现ACK集群内的所有POD都可以访问云数据库Redis&#xff0c;则需要在Redsi的白名单里增加源IP或网段&#xff0c;如下图所示 注意&#xff1a; 以上添加…

小型校园网配置笔记

1&#xff0c;搭建网络拓扑图 LSW1:三层交换机命令&#xff1a; <Huawei>sys [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]vlan batch 10 20 30 40 100 101 [Huawei]int vlan 10 [Huawei-Vlanif10]ip add 192.168.10.254 24 …

PyTorch之完整的神经网络模型训练

简单的示例&#xff1a; 在PyTorch中&#xff0c;可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码&#xff1a; import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…

sqllab第九关通关笔记

知识点&#xff1a; 时间盲注&#xff1a;利用休眠时间进行判断是否注入成功利用bp时注意把timeout时间修改一下 首先判断注入类型 构造id1/0 返回正常信息&#xff0c;应该是字符型注入 构造id1 返回正常信息&#xff0c;欸&#xff0c;这就怪了 构造id1 正常显示内容&am…