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

进程(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.rhkb.cn/news/166767.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——三路划分(快排优化)

刷Leetcode时遇到的问题,用普通的快排去跑,发现有问题。 普通的Hoare或者其他的快排好像都没有直接解决掉这个问题,当一个数重复出现的时候,用普通的快排效率其实并没有那么高。所以,这也是普通快排的缺点之一。 所以&…

基于SSM的仓库管理系统

基于SSM的仓库管理系统的设计与实现【文末源码】 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 员工管理 货物管理 员工界面 摘要 当考虑构建基于…

Git使用入门

一、Git简介 Git 是一个开源的分布式版本控制系统。 Git版本控制的功能为保存不同版本的代码,保存代码的地方叫做仓库。 每个仓库中有多个分支,每个分支上又有很多节点,每个节点代表一个版本,不同的分支可以进行合并&#xff0…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息: rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

通过小程序实现会议Oa的会议展示以及个人中心

🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《微信小程序 》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,…

游戏盾如何有效防护DDoS

从进入计算机时代以来,DDoS攻击一直是网络世界中的一大威胁,让无数服务陷入瘫痪。这种攻击的原理非常简单:攻击者使用大量的僵尸主机或蠕虫病毒,向目标服务器发送海量请求,迅速耗尽服务器的资源,使其无法继…

蓝桥杯 (年号字串 C++)

思路&#xff1a; 1、看成10进制转化成26进制 。 2、A表示1、B表示2。以此类推&#xff0c;Z表示26. 代码&#xff1a; #include <iostream> using namespace std; int main() {char str[10]; int sum 2019, n, i 0; while (sum > 0) {str[i] sum % 26 64;sum / …

REDIS命令

常见文件名 Redis-cli使用命令 1、启动Redis2、连接Redis3、停止Redis4、发送命令 1、redis-cli带参数运行&#xff0c;如&#xff1a;2、redis-cli不带参数运行&#xff0c;如&#xff1a;5、测试连通性key操作命令 获取所有键查询键是否存在删除键查询键类型移动键查询key的生…

vue ref和$refs获取组件实例

vue ref和$refs获取组件实例 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\15-ref和$refs获取组件实例 vue --ve…

用Nginx搭建一个具备缓存功能的反向代理服务

在同一台服务器上&#xff0c;使用nginx提供服务&#xff0c;然后使用openresty提供反向代理服务。 参考《Ubuntu 20.04使用源码安装nginx 1.14.0》安装nginx。 参考《用Nginx搭建一个可用的静态资源Web服务器》搭建静态资源Web服务器&#xff0c;但是/nginx/conf/nginx.conf里…

安装与脏数据绕过_安全狗

1安全狗 1.1 环境准备 安全狗safedogwzApacheV3.5.exe&#xff0c;安装步骤省略&#xff0c; pikachu环境&#xff1a;https://zhuanlan.zhihu.com/p/568493971 安装注意事项&#xff1a;安装完后php和web服务都需要重启 注意事项&#xff1a;服务名php版本保持一致 安装过…

甄知科技张礼军:数智化转型助企业破茧成蝶!

数智化浪潮滚滚向前&#xff0c;正席卷各行各业&#xff0c;带领企业从数字化时代跨入数智化时代。可什么是数智化&#xff1f;如何实现数智化转型&#xff1f;已经成为横亘在无数企业面前的大难题&#xff01; 事实上&#xff0c;数智化是数字化、AI和业务三个要素的交集&…

2023天猫双十一活动时间表 天猫淘宝双11预售几号开始付定金

双十一购物节是生活不可或缺的一部分&#xff0c;不论是满足基本需求还是享受生活乐趣&#xff0c;都需要购物。因此&#xff0c;双十一绝对是一个不容错过的绝佳机会&#xff0c;希望大家能善用这个机会&#xff0c;因为错过了就得再等一整年。 每日领红包&#xff1a;红包有…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互&#xff1f; 在小程序中&#xff0c;与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互&#xff0c;小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

Parallels Client for Mac:改变您远程控制体验的革命性软件

在当今数字化的世界中&#xff0c;远程控制软件已经成为我们日常生活和工作中不可或缺的一部分。在众多远程控制软件中&#xff0c;Parallels Client for Mac以其独特的功能和出色的性能脱颖而出&#xff0c;让远程控制变得更加简单、高效和灵活。 Parallels Client for Mac是…

分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现SSA-CNN-LSTM-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实…

【JavaWeb】后端(MySQL+Mybatis)

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

删除所有出现次数最少的字符

题意: 假设字符串中出现次数最少的字母是x, 出现次数为y, 删除所有出现次数为y的字符 思路&#xff1a;用unordered_map统计出出现次数最少的x出现的次数y 再遍历字符串&#xff0c;删除所有出现次数为y的字符 代码&#xff1a; #include <iostream> #include <uno…

SSM - Springboot - MyBatis-Plus 全栈体系(三十四)

第八章 项目实战 四、后台功能开发 1. 用户模块开发 1.1 jwt 和 token 介绍 1.1.1 token 介绍 令牌&#xff08;Token&#xff09;&#xff1a;在计算机领域&#xff0c;令牌是一种代表某种访问权限或身份认证信息的令牌。它可以是一串随机生成的字符或数字&#xff0c;用…