Linux操作系统:学习进程_对进程概念的深入了解

目录

前言

开篇

一、进程概念

二、进程的描述与管理

 1、如何描述与管理

2、Linux中的PCB-task_struct

3、对进程组织的理解

三、进程的属性

1、系统创建进程

2、查看进程

3、进程的标识符 

4、退出进程 

1>ctrl+c

2>kill命令杀死进程 

5、用户进程的创建方式 

6、进程的当前路径


前言

  在学校里学习到进程,听老师讲的似懂非懂,每天都有在接触着进程,但是对于课本上的知识理解起来又是格外的难,这篇博客,我用Linux操作系统举例,来带大家深入的理解一下进程,摆脱对这个问题的困扰。

开篇

  我们接触Windows系统的电脑较多,那在Windows系统的电脑里,我们也一直在跟进程打交道,举例说,当一个应用卡死的时候,我们一般会打开任务管理器,去结束该任务,此时罗列出来的一个个正在执行的任务,就叫进程。

  我们可以通过我们的操作接口---结束任务去结束进程。        

  我们可以看到,操作系统中可以同时存在很多个进程,那操作系统是如何管理这么多进程的呢?

仍然是先描述,再组织!(前篇谈操作系统时提到过,一个很重要的概念)

  那怎么谈“先描述,再组织”呢?我们接着往下看

一、进程概念

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

  我们在课本上学习的时候,我们看到这个什么执行实例,正在执行的程序,也许都是一头雾水,这到底是什么意思?

  注意,重点来了。

  当我们所写的代码,我们编译时会生成一个二进制的可执行程序,这是进程吗?不是,这只是文件。

  那当我们./去运行这个可执行程序,这时候操作系统需要进行哪些步骤呢?

  根据冯诺依曼体系结构我们可知,我们运行可执行程序时它是需要先进到内存里的。那么这个可执行程序进入内存之前它在哪里呢?在磁盘里。

    此时我们的可执行程序的代码和数据已经进入了内存,这里我有个疑问,可执行程序的代码和数据进入内存之后,它就是进程了吗?操作系统是怎么知道要执行它的呢?这个内存里面会有很多数据,操作系统又是怎么知道要去执行它的呢?又为什么要先执行它呢?

  显然,只进入内存是不可以被称为进程的,他只是进程对应的代码和数据,因为它不足以满足我们上面提出的要求。那么操作系统要怎么去管理这些内存中的数据呢?让他们有序的执行呢?

  要先描述,再管理!

二、进程的描述与管理

 1、如何描述与管理

  每一个进程都有一个PCB结构体,这个PCB结构体里面不仅包含了进程对应的属性,还有着一个,PCB类型的next指针,还存在着一个内存指针。这就是先描述

  其中,next指针作用是去指向下一个进程,内存指针去指向这个进程在内存中所在的位置,也就是指向了进程对应的代码和数据。组成了一个链表。这样,一个个进程都被连接起来,对这些进程的管理,就变成了对链表的增删查改。这就是再管理

  一个进程,一定要有一个PCB,此时我们就可以给进程一个概念

  进程=PCB+自己的代码和数据。

2、Linux中的PCB-task_struct

  进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block

  Linux操作系统下的PCB是: task_struct, task_struct是PCB的一种。 task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

  那在我们Linux操作系统中,我们操作系统对进程的管理如图所示:

  每一个进程都有一个tast_struct,当进程在排队等待的时候,本质上就是task_struct在排队等待罢了。

  所以在Linux操作系统中,我们可以知道进程的概念就等于

  进程=内核task_struct结构体+进程对应的代码和数据

3、对进程组织的理解

  所有运行在系统里的进程都以task_struct链表的形式存在内核里。我们把它称为,内核数据结构。在内核源代码里可以找到它。


  我们上述提到可执行程序会从磁盘到内存,我们电脑开机之前等待的那几十秒,就是在等待操作系统。

  操作系统也是软件,它在没被运行之前也是一个二进制文件存在磁盘里,开机后,它会先到内存里,然后加载操作系统,再由操作系统内部去生成task_struct数据结构去管理进程。

三、进程的属性

1、系统创建进程

  我们先在xshell里创建一个.c文件,写下如下代码

  我们./运行它的可执行程序时,我们可以发现屏幕上会每隔一秒打印出这句话,它已经被运行了,此时他就是一个进程。

  所以我们可以把我们的./运行换个说法,./可执行程序,本质上是让系统创建进程并运行

  不单单有我们自己的可执行程序是进程,我们在使用每一个指令时,系统会在一瞬间自动对该指令创建进程并运行

  那如何查看进程呢?

2、查看进程

指令:

ps axj

  a就是all,xj表示系统所有的进程信息。 

  使用该指令,我们可以看到系统当下所有正在运行的进程。

  但是我们查进程时一般只会查自己想查的进程,这时我们需要用管道过滤。

指令:

ps axj | grep <可执行程序>

 拿我们刚刚创建的process可执行程序进行测试,在此之前,我们需要先运行我们的process可执行程序,运行后才是进程,才可以被查到。

  此时有两个与process相关的进程被过滤出来,为什么是两个呢?正如我们上面所说,我们使用指令时,系统也会为其创建进程并运行,我们的管道对process可执行程序进行了过滤,所以也被过滤出来了,第一个才是我们process可执行程序./运行时系统为其创建的进程,第二个则是管道过滤时系统为管道指令创建的进程。

  想要了解每列信息对应的含义,我们可以把该信息的头部罗列出来,我们可以使用指令:

ps axj | head -<查看行数>

  我们只需要查看头部一行信息即可:

  这就是进程的头部信息,我们再把process进程罗列在头部信息下面,方便我们去查看学习。

 指令:

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

3、进程的标识符 

  每一个进程对应的有自己的标识符,像我们的学号一样,是一种区分标志,操作系统来区分每一个进程就是根据每一个进程表示符的不同。

  进程的标识符就是PID,在每一个进程的tast_struct中都有着每个进程独有的PID,方便操作系统来区分。

  我们想要去访问进程的PID,是不可以直接去访问的,因为每个进程的task_struct属于操作系统内核数据结构,我们不可以直接去访问操作系统内部,所以我们就需要通过操作系统为我们提供的系统调用接口去访问进程PID。

  这个系统调用接口就是getpid()

  我们现在process.c文件中使用这个接口,再运行进程查看其PID

  

  我们运行进程后去再去查看进程对应得PID,可以看到,process进程PID是2773

  在左边PID的旁边,有一个PPID,这个是该进程对应的父进程的PID

  我们也可以通过系统调用接口getppid()进行查看PPID.

  

4、退出进程 

1>ctrl+c

  当我们这个一直循环打印的进程无法结束时,我们可以ctrl+c使其强制结束

2>kill命令杀死进程 

指令:

kill -9 <PID>

   我们输入kill命令,我们可以发现,右边不断循环打印的进程被杀死了

5、用户进程的创建方式 

  我们想要创建一个进程,本质上是操作系统的内核数据结构中增加了一个task_struct,当然我们用户也不可以直接去访问操作系统,更不可能对操作系统的内核数据结构进行增删查改,所以,操作系统也为我们提供了一个系统调用接口fork()

  我们写下如下程序,运行这个程序之前,我们思考,运行时会先打印出一行,创建子进程之后,我们的父进程和子进程又各自会运行下一行打印代码

  可以理解为,fork()之后,父子代码共享

  我们将查看进程信息窗口设置为每秒更新一次,这样每秒就会更新一下进程运行的状态

  运行该进程

6、进程的当前路径

  我们在学习c语言的时候,学过文件相关的操作,那大家有没有疑惑,就是为什么我们在进行创建文件时,系统会自动给我们创建到与当前C语言文件相同的路径下呢?

  我们已经知道,每一个C语言程序在执行的时候,就是一个进程,那意思就是,我们所创建的文件是与其当前所在进程的路径的是相同的,这是为什么?

  我们创建CMD目录,并在其中创建code.c文件并写入以下代码:

  运行并查看进程所在的路径:

   再查看我们文件所创建的当前位置:

  文件路径与进程所在路径相同。

  这里我们就明白,创建文件时文件所在的路径与当前进程所在的路径相同 

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

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

相关文章

Embedding 技术在推荐系统中的应用

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录。 介绍 Embedding&#xff0c;中文直译为“嵌入”&#xff0c;常被翻译为“向量化”或者“向量映射”。它的主要作用是将稀疏向量转换成稠密向量&#xff0c;便于上层深度神经网络处理。事实上&#xff0c;Emb…

Kafka面试题

1、kafka消息发送的流程&#xff1f; 在消息发送时涉及到了两个线程&#xff0c;main 线程 和 sender 线程 &#xff0c;在main线程里面创建了一个双端队列&#xff08;RecordAccumulator&#xff09; ,当双端队列里面的信息满足 一定的条件后&#xff0c; sender线程会拉取双端…

RabbitMQ延迟队列(重要)

RabbitMQ延迟队列 1、延迟队列1.1、延迟队列使用场景1.2、延迟队列实现原理 2、使用rabbitmq-delayed-message-exchange 延迟插件2.1、下载2.2、安装2.2.1、解压2.2.2、启用插件2.2.3、查询安装情况 2.4、示例2.4.1、RabbitConfig配置类&#xff08;关键代码&#xff09;2.4.2、…

机器学习—神经网络如何高效实现

深度学习研究人员能够扩展神经网络的原因之一&#xff0c;在过去的十年里建立了非常大的神经网络&#xff0c;是因为神经网络可以向量化&#xff0c;它们可以使用矩阵乘法非常有效的实现&#xff0c;事实证明&#xff0c;并行计算硬件&#xff0c;包括gpus&#xff0c;但也有一…

【数据集】【YOLO】【目标检测】水面船只识别数据集 9798 张,YOLO船只识别算法实战训练教程!

一、数据集介绍 【数据集】水面船只识别数据集 9798 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: ship}&#xff0c;代表水面船只。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机船只检测、监控灯塔船…

斜坡函数功能块(支持正常停机和紧急停机切换)

1、CODESYS斜坡函数功能块 CODESYS斜坡函数功能块(ST源代码)_用plc难能写一个斜坡加减速度吗-CSDN博客文章浏览阅读1k次。本文介绍了如何在CODESYS平台上创建斜坡函数功能块(FC),用于PID闭环控制中的给定值平滑处理。通过ST源代码实现,详细步骤包括仿真测试、变量修改、FC…

渗透测试--web基础之windows(二):常用命令详解及病毒编写

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、常见端口对应的服务 二、 常见的cmd命…

【含文档】基于ssm+jsp的客户管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 管理员登录进入…

腾讯混元宣布大语言模型和3D模型正式开源

腾讯混元大模型正在加快开源步伐。 11月5日&#xff0c;腾讯混元宣布最新的MoE模型“混元Large“以及混元3D生成大模型“ Hunyuan3D-1.0”正式开源&#xff0c;支持企业及开发者精调、部署等不同场景的使用需求&#xff0c;可在HuggingFace、Github等技术社区直接下载&#xff…

《常用深度学习神经网络及其原理与应用场景》

一、总体介绍 一、引言 随着科技的不断发展&#xff0c;深度学习已经成为人工智能领域中最具影响力的技术之一。深度学习神经网络通过模拟人类大脑的神经元结构和工作方式&#xff0c;能够自动学习数据中的特征和模式&#xff0c;从而实现各种复杂的任务&#xff0c;如图像识…

操作系统三级调度相关习题

填空题 微机是以(总线)为组带构成的计算机系统在批处理兼分时系统中&#xff0c;往往把由分时系统控制的作业称为(前台)作业&#xff0c;把由批处理系统处理的作业称为(后台)作业在分时系统中&#xff0c;若时间片长度一定&#xff0c;则(用户数越多)&#xff0c;系统响应时间…

STL 迭代器iteratior 详解

C的标准模板库&#xff08;STL&#xff09;中&#xff0c;迭代器是一种重要的工具&#xff0c;用于访问容器中的元素。 迭代器是一个变量&#xff0c;相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素&#xff0c;通过迭代器就可以读写它指向的元素。从…

移门缓冲支架有什么作用?

移门缓冲支架是一种安装在滑动门上的装置&#xff0c;主要用于吸收门关闭时的冲击力&#xff0c;防止门突然停止时的震动&#xff0c;从而保护门体、轨道和墙体。移门缓冲支架不仅提升了门的使用体验&#xff0c;还增加了安全&#xff0c;延长了门的使用寿命。关于移门缓冲支架…

MATLAB大数计算工具箱及其用法

1. MATLAB大数工具箱Variable Precision Integer Arithmetic介绍 Variable Precision Integer Arithmetic是John DErrico 开发的大数运算工具箱&#xff0c;可以用完全任意大小的整数进行算术运算。支持vpi定义的数组和向量。 2.MATLAB代码 完整代码见: https://download.cs…

AI大模型如何重塑软件开发流程?

《AI大模型对软件开发流程的重塑&#xff1a;变革、优势、挑战与展望》 一、传统软件开发流程与模式&#xff08;一&#xff09;传统软件开发流程&#xff08;二&#xff09;传统软件开发模式面临的问题&#xff08;一&#xff09;AI在软件开发中的应用场景&#xff08;二&…

基于Python通过DOI下载文献(至简仅需2行代码)

文章目录 一、安装库二、导入库三、准备doi3.1 excel法3.1.1 检索数据3.1.2 导出excel 3.2 txt法3.3 列表or字符串法3.3.1 字符串3.3.2 列表 四、下载4.1 脚本4.2 下载成功4.3 已存在4.4 至于失败的 五、结果5.1 目标文件夹5.2 失败记录 一、安装库 pip install OAFuncs 二、导…

Git仓库

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 2.函数 2.1 统计函数-count a.count(区域&#xff0c;区域&#xff0c;......) 统计数量&#xff0c;只针…

沙龙活动精彩回顾:攸信携手博格咨询,探索数智管理的奥秘

10月30日&#xff0c;一场聚焦数智管理的沙龙活动在热烈的氛围中圆满落幕。本次活动由攸信携手博格咨询共同举办&#xff0c;有幸邀请到了资深讲师书麟老师、攸信项目经理黄小容以及市场部经理高建成&#xff0c;他们共同为参会者带来了一场关于数智管理的知识盛宴。 01深入剖析…

17个工作必备的Python自动化代码

Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化的世界&#xff0c;探索17个可以简化工作并节省时间精力的Python脚本。 1.自动化文件管理 1.1 对目录中的文件…