进程(1)——什么是进程?【linux】

news2024/12/25 9:54:16

进程(1)——什么是进程?【linux】

  • 一. 什么是进程?
  • 二. 管理进程:
    • 2.1 怎么管理:
    • 2.2 PCB
      • 2.3.1 task_struct
      • 2.3.2 组织task_struct:
  • 三.查看进程
    • 3.1 ps ajx
    • 3.2 ls /proc
  • 四. 父子进程
    • 4.1 什么是父子进程
    • 4.2 创建子进程——fork()
      • 4.2.1 用法
      • 4.2.2 刨析fork三个疑问
        • i. 为什么要给子进程返回零,给父进程返回pid
        • ii. fork怎么返回两次
        • iii. 一个变量怎么会有不同的值:

一. 什么是进程?

概念:正在运行的程序
还记得前面讲的冯诺依曼结构吗。

系统的软件和硬件
那里面我们讲了,输出设备和输入设备的数据交互基本都是和内存的
之后cpu从内存中读取数据,在内存中被读取到的程序就可以看作在运行
所以通俗的讲:一个已经加载到内存中的程序,就叫做进程

同时一个操作系统能运行多个进程,这个想必大家也知道
因为在现实中,我们能一边听歌一边玩游戏就是多个进程并行

二. 管理进程:

我们了解了什么是进程后,就要来了解了解
在系统中是如何管理内存中的一个个程序的

2.1 怎么管理:

这里我们要明确一个点:

我们是要对运行的程序进行管理,因为内存中有多个运行程序
我们的管理想法:是对各个运行程序能进行查看和改变他们的状态

但是光靠程序本身的代码和数据不能进行管理

就比如写了一个test.c其中有hello world的程序

当被读取到内存中的时候,还有很多个相同的程序
那如何进行区分,如何找到运行程序在内存中的地址?

这些问题程序本身的数据和代码不能解决的。

所以我们就需要自己给程序添加一些属性
1.程序在内存中运行的编号(进程编号
2.程序在内存中的地址
………………
等等

所以说进程不光是被读取到内存中的程序,同时还有为了方便管理而添加的属性
在这里插入图片描述
这里我们了解了进程的具体组成后,我们就可以聊聊该如何进行管理了。

这里有一个口诀:先描述再组织

描述:
我们之前做数据结构时,都是先想好管理的类是如何构成的
比如说为了写个学生管理系统,需要在类中塞进学生的各个信息的属性。
组织
管理的类什么样子想好后,就可以进行组织,挑选用什么结构去进行组织管理,链表,顺序表等
系统中的硬件都是这样进行管理的,所以操作系统中有大量的数据结构

所以说进程也是一样,但是进程是在系统中的,系统使用C语言写的,所以不是类,而是结构体

所以进程也是塞进数据结构中的,进程可以说是一个数据结构结构体对象

2.2 PCB

进程进行描述后,就是pcb

PCB是描述进程属性的一个数据结构结构体对象。
PCB结构体中包含了:
1.进程编号
2.进程状态
3.优先级
…………
所以对进程进行管理,就是对PCB进行管理
虽然PCB组织方式有很多,但基本上都是链表,所以管理PCB的本质就是对链表的增删查改

2.3.1 task_struct

在linux中PCB是:task_struct
task_struct 是pcb的一种
属于linux内核中的一种数据结构体对象
创建一个进程就是对task_stuct的实例化

2.3.2 组织task_struct:

linux如何组织进程:
linux内核中,最基本的组织进程task_struct的方式,采用双线链表组织
task_struct本身在双链表中
同时双链表可能处于别的数据结构组织中,所以关系错综复杂

三.查看进程

接下来就该查看系统中的进程了。

这里带来查看进程两种方法:

3.1 ps ajx

ps ajx

在这里插入图片描述
这里我们看到了多个进程
同时能看到:ppid pid等进程属性

这里小提一下,上面说了pcb本质在链表中,所以ps本质也是遍历链表

ps ajx | grep 文件名 查找进程:

在这里插入图片描述
这里我们发现第二个进程是grep test
正好是我们执行的代码,这是因为执行grep操作时,grep本身也变成了一个进程。

3.2 ls /proc

ls /proc

在这里插入图片描述
这里我们能看到大量的数字
这是因为:在proc目录中会给每一个正在运行的进程创建一个以他们的(进程编号)pid进行命名目录
同时:目录中有进程的属性,当进程结束了以后proc中的文件会进行对应进程的文件夹删除。

查看进程属性名

ls /proc/进程pid -l

在这里插入图片描述

这里注意一下这个cwd
(current work dir)cwd:当前进程的工作目录(进程启动时,记录下来的文件所在目录)
这就是有时候用部分文件操作指令时,不需要输入目录,而是默认在当前文件的目录下执行,这是因为进程记录了当前的运行目录

四. 父子进程

4.1 什么是父子进程

pid:进程编号,每个进程都有属于自己的编号,便于管理

获得自己的pid:

getpid

在这里插入图片描述

在这里插入图片描述

ppid 父进程:可以认为时父进程中衍生出来的子进程

getppid

用法与子进程一样

这里我们让他们进行父子同台一下。
在这里插入图片描述
用这个文件进行测试一下。
在这里插入图片描述

这里能发现每一次重新执行程序,父进程编号不变,子进程编号会变

这里我们来查看一下父进程是谁

ps axj | head -1 && ps -axj | grep 16668

这里&&代表两边指令都要执行

搜索出来:
16668是bash进程
在这里插入图片描述

bash是命令解释器,相当于充当用户和系统的中介,这个在之前的博客提到过。

我们所有在命令行打出的指令的父进程可以说都是bash的子进程

4.2 创建子进程——fork()

fork()创建一个子进程——代码级别创建子进程
这里的fork不同于我们平常在指令出用的 ./
fork是在代码处使用的。

4.2.1 用法

在这里插入图片描述

在这里插入图片描述
这里我们能发现这后面的lala,多打印了一遍。
说明创造出来的子进程,是从创造出来的位置执行代码的

fork具有返回值:
在父进程中,fork返回新创建子进程的进程ID;
在子进程中,fork返回0;
如果出现错误,fork返回一个负值

这里我们就用这个文件进行测试一下
在这里插入图片描述
在这里插入图片描述
这里我们可以提出三个疑问了

1.为什么要给子进程返回零,给父进程返回pid
直接返回一样值不行吗?

2.fork怎么返回两次
fork明明就是一个函数是怎么做到返回两次的。
让父进程和子进程都接收到值

3.一个变量怎么会有不同的值
这个返回值为什么有不同的情况

4.2.2 刨析fork三个疑问

i. 为什么要给子进程返回零,给父进程返回pid

从前面我们知道fork之后的代码子进程和父进程共享
但是我们创建父子进程就是为了让他们干不同的事

因为fork之后代码共享,所以为了区分子进程和父进程,来让两个进程进入执行不同的代码,
所以返回不同的返回值,区分不同的进程流,执行不同的代码块(加了筛选条件,if while等)

ii. fork怎么返回两次

要回答这个问题的话需要了解fork这个函数到底是如何执行的。、

当在fork中将pcb创建完了后,
子进程就已经成为一个单独的进程,能被系统进行调用。
所以执行return的语句之前,子进程和父进程就已经代码块共享了
所以能执行return语句,就返回了两次。

iii. 一个变量怎么会有不同的值:

这里也可以理解为:
子进程和父进程的数据(变量)到底共享还是独有

因为进程的组成有:
数据和代码+pcb
两个进程的pcb已经复制,代码共享

接下来就是数据:

对于进程来说每个进程都具有独立性,都能单独进行运行
数据可能被进行修改,所以为了不影响两个进程的数据导致代码运行(保证进程独立性),所以两个进程的数据不能进行共享

所以子进程和父进程的数据是独立的,但是如果父进程有大量的数据,可能子进程压根就用不上,就会导致大量的内存流失

所以在最开始的时候父进程和子进程数据代码都是共享的
但是当子进程尝试去修改父进程的变量时候,编译器会创建一个对应变量的空间,同时给子进程专门拷贝父进程对应的变量

可以称为写时拷贝

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

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

相关文章

02-2、PyCharm中文乱码的三处解决方法

PyCharm中文乱码 修改处1: 修改处2:这个也没用 在Pycharm中可以创建一个模版,每次新建python文件时Pycharm会默认在前两行生成utf-8 #!/user/bin/env python3 # -- coding: utf-8 -- 还是乱码 再在这里设置以下 添加 : -Dfi…

【LeetCode 算法专题突破】滑动窗口(⭐)

文章目录 前言1. 长度最小的子数组题目描述代码 2. 无重复字符的最长子串题目描述代码 3. 最大连续1的个数 III题目描述代码 4. 将 x 减到 0 的最小操作数题目描述代码 5. 水果成篮题目描述代码 6. 找到字符串中所有字母异位词题目描述代码 7. 串联所有单词的子串题目描述代码 …

rust学习——引用与借用(references-and-borrowing)

引用与借用(references-and-borrowing) 先看一个返回参数的所有权的代码 fn main() {let s1 String::from("hello");let (s2, len) calculate_length(s1);println!("The length of {} is {}.", s2, len); }fn calculate_length(…

day01_matplotlib_demo

文章目录 折线图plot多个绘图区绘制数学函数图像散点图scatter柱状图bar直方图histogram饼图pie总结 折线图plot import matplotlib.pyplot as pltplt.figure(figsize(15, 6), dpi80) plt.plot([1, 0, 9], [4, 5, 6]) plt.show()### 展现一周天气温度情况 # 创建画布 plt.figu…

mysql高级查询

score student courses inner join 内连接:查询的结果为两个表匹配到的数据 1.条件:查询学生信息及课程对应的分数 解析:此时信息存储在三张表通过外键标识,可以先将学生和分数表根据条件连接在一起,然后在连接课…

升级你的照片编辑体验:Nik Collection by DxO,让你的照片更出色

如果你是一个摄影爱好者或者专业摄影师,你一定需要一款功能强大、易于使用的照片编辑插件套件来提升你的作品质量。今天,我们要向大家介绍一款备受赞誉的产品——Nik Collection by DxO。 Nik Collection by DxO是一款集合了多种照片编辑功能的插件套件…

Leetcode刷题笔记--Hot71--80

1--会议室II(253) 2--完全平方数(279) 主要思路: 完全背包问题,每一个平方数可以选取多次。 本题的物品组合与顺序无关,对应于组合问题,因此先遍历物品,再遍历背包。 定…

51单片机中断操作详解(03)

eg1:数码管如何显示出字符 51单片机40个引脚的功能需要记住** RXD:表示的是串行输入口INT0:外部中断0INT1:外部中断1TO : 外部中断0T1 :外部中断1WR: 外部输入存储器写RD: 外部输出存储器读XTK2/XTL1 单片机晶振的输…

分享5个解决msvcp140.dll丢失的方法,全面解析msvcp140.dll丢失的原因

一、MSVCP140.dll是什么? 首先,我们需要了解什么是MSVCP140.dll。MSVCP140.dll是一个动态链接库文件,它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了运行使用C编写的应用程序所需的一些函数和类。因此,当…

从零开始,学好 Python 从大一新生自我介绍开始

从零开始,学好 Python 从大一新生自我介绍开始 大家好,我叫xxx,今年18岁,刚刚入学不久。我决定从零开始系统学习Python编程语言。 Python是一种解释型、交互式和脚本编程语言。它由荷兰人Guido van Rossum在1991年左右创立,语法简…

深入理解 C++ 右值引用和移动语义:全面解析

C11引入了右值引用,它也是C11最重要的新特性之一。原因在于它解决了C的一大历史遗留问题,即消除了很多场景下的不必要的额外开销。即使你的代码中并不直接使用右值引用,也可以通过标准库,间接地从这一特性中收益。为了更好地理解该…

023-第三代软件开发-自定义Button

第三代软件开发-自定义Button 文章目录 第三代软件开发-自定义Button项目介绍自定义Button第一类型-加声音第二类型-加样式 第三类型-减声音总结一下存在一点小问题 关键字: Qt、 Qml、 Button、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&…

无需公网IP,如何远程访问内网SVN服务?

小王以往为客户服务器做维护时,需要先在本地服务器上调试后再copy到客户服务器上进行发布。现在在本地搭建SVN服务器并通过花生壳发布SVN到外网,在客户服务器现场时也能load公司内网服务器的SVN代码。无需再次copy又发布,省时省力。下面来看详…

【JavaWeb】后端(MySQL+Mybatis)

目录 一、MySQL1.什么是数据库?2.MySQL安装3.MySQL连接 二、DDL1.DDL(数据库操作)2.MySQL客户端工具3.表操作4.数据类型5.表操作 三、DML1.INSERT2.UODATE3.DELETE 四、DQL1.基本查询2.条件查询(where)3.分组查询(group by&#…

Python---练习:while循环嵌套(用两次while三步走--里外各一次)

1、循环嵌套的引入 案例: 有天女朋友又生气了,惩罚:说3遍“老婆大人, 我错了”,这个程序是不是循环即可?但如果女朋友说:还要刷今天晚饭的碗,这个程序怎么书写? 思考&…

《红蓝攻防对抗实战》一. 隧道穿透技术详解

一.隧道穿透技术详解 从技术层面来讲,隧道是一种通过互联网的基础设施在网络之间传递数据的方式,其中包括数据封装、传输和解包在内的全过程,使用隧道传递的数据(或负载)可以使用不同协议的数据帧或包。 假设我们获取到一台内网主机的权限,…

概念解析 | 毫米波雷达与计算机视觉的融合

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:毫米波雷达与计算机视觉的融合。 毫米波雷达与计算机视觉的融合 Sensors | Free Full-Text | MmWave Radar and Vision Fusion for Object Detection in Autonomous Driving: A …

分享一个MSSA插值的GRACE level数据集

1. 背景介绍 我们通常使用的GRACE数据包含球谐数据和mascon数据。而不管是球谐产品还是mascon产品,都存在月份数据的缺失,如下图所示(Yi and Sneeuw, 2021)。本专栏分享了一个利用多通道奇异谱分析(MSSA&#…

一篇前段时间使用评分卡的总结_20231022

有帮助要帮我点赞哦 可以依据现在的流程,结合实际数据情况进行调整。 流程框架: eda查看字段相似性,提炼相似字段初步分箱必要时展开二次分箱(或者多轮分箱调优)可以进一步查看分箱后字段的相似性(woe值转化之后)查看…

【微信小程序】授权登录流程解析

目录 微信授权登录流程 1. 官方图示流程详解 2. 代码登录流程拆解 2.1 前端代码示例讲解 2.2 后端代码示例讲解 2.3 代码登录流程拆解 🌟 3. 表情包存储展示(扩展) 附议 微信授权登录流程 1. 官方图示流程详解 ① 微信服务器验证&a…