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

   

目录

前言

开篇

一、进程概念

二、进程的描述与管理

 1、如何描述与管理

2、Linux中的PCB-task_struct

3、对进程组织的理解

三、进程的属性

1、系统创建进程

2、查看进程

3、进程的标识符 

4、退出进程 

1>ctrl+c

2>kill命令杀死进程 

5、用户进程的创建方式 


前言

  在学校里学习到进程,听老师讲的似懂非懂,每天都有在接触着进程,但是对于课本上的知识理解起来又是格外的难,这篇博客,我用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()之后,父子代码共享

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

  运行该进程

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

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

相关文章

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

lora训练模型 打造个人IP

准备工作 下载秋叶炼丹器整理自己的照片下载底膜 https://rentry.org/lycoris-experiments 实操步骤 解压整合包 lora-scripts,先点击“更新” 训练图片收集 比如要训练一个自己头像的模型&#xff0c;就可以拍一些自己的照片&#xff08;20-50张&#xff0c;最少15张&…

IO 多路复用技术:原理、类型及 Go 实现

文章目录 1. 引言IO 多路复用的应用场景与重要性高并发下的 IO 处理挑战 2. IO 多路复用概述什么是 IO 多路复用IO 多路复用的优点与适用场景 3. IO 多路复用的三种主要实现3.1 select3.2 poll3.3 epoll三者对比 4. 深入理解 epoll4.1 epoll 的三大操作4.2 epoll 的核心数据结构…

大数据新视界 -- 大数据大厂之 Impala 性能优化:从数据压缩到分析加速(下)(8/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

信息学奥赛一本通 1395:烦人的幻灯片(slides)

【题目链接】 ybt 1395&#xff1a;烦人的幻灯片(slides) 【题目考点】 1. 图论&#xff1a;拓扑排序 【解题思路】 先理解题意&#xff1a; 如图&#xff0c;每张幻灯片是一个矩形&#xff0c;在该矩形范围内有一个位置写了这张幻灯片的编号。但实际情况是幻灯片是透明…

DB-GPT系列(三):底层大模型设置(开源模型、在线模型)

前面两篇文章分别对 DB-GPT 的总体情况进行了介绍&#xff0c;同时涵盖了镜像一键部署与源码部署这两种部署方式。 DB-GPT系列&#xff08;一&#xff09;&#xff1a;DB-GPT能帮你做什么&#xff1f; DB-GPT系列&#xff08;二&#xff09;&#xff1a;DB-GPT部署&#xff0…

LabVIEW配电产品精度测试系统

开发了一种基于LabVIEW平台的配电产品精度测试系统&#xff0c;通过自动化测试流程实现更高的测试准确性与效率。系统采用串口和TCP通信技术&#xff0c;与多功能交流采样变送器和配电设备无缝数据交互&#xff0c;提升了测试工作的可靠性和一致性。 一、项目背景 在配电产品…

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议&#xff0c;但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的…

【大数据学习 | kafka】kafka的偏移量管理

1. 偏移量的概念 消费者在消费数据的时候需要将消费的记录存储到一个位置&#xff0c;防止因为消费者程序宕机而引起断点消费数据丢失问题&#xff0c;下一次可以按照相应的位置从kafka中找寻数据&#xff0c;这个消费位置记录称之为偏移量offset。 kafka0.9以前版本将偏移量信…

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…

推荐一款强大的图像处理软件:Adobe Photoshop2025

AdobePhotoShop赛博日落版是一款强大的图像处理软件&#xff0c;专为用户提供多种先进的图像编辑功能。该版本包含了最新的AI移除工具、AI查找干扰功能以及Neural Filters神经滤镜插件&#xff0c;旨在提升用户的创作效率和成品效果。 主要功能 - AI创意填充&#xff1a;该功能…

PC模块静电放电测试中的宕机黑屏

静电放电(ESD)是电子设备中常见且难以避免的干扰源之一,尤其是在复杂的电子系统中,它对系统的稳定性和可靠性影响极大。近期,在进行静电放电(6KV接触放电、15KV空气放电)测试时,某P C模块在多个端子(如USB、RJ45、HDMI及耳机端子)遭遇了显示黑屏、图像异常及系统宕机…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.7-4.8

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.7 深度卷积网络学习什么&#xff1f;&am…

适用于个人或团队的文档管理和知识库系统,NAS快速部署『BookStack』

适用于个人或团队的文档管理和知识库系统&#xff0c;NAS快速部署『BookStack』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 知识库对于很多需要和文字打交道的个人或者团队都不陌生对吧&#xff1f;对于我们个人来说&#xff0c;它可以将常用的学习资料、工作笔记、项目计划和…

并发编程的基础:深入理解内存屏障(Memory Barriers)

内存屏障是一种基础语言&#xff0c;在不同的计算机架构下有不同的实现细节。本文主要在x86_64处理器下&#xff0c;通过Linux及其内核代码来分析和使用内存屏障 对大多数应用层开发者来说&#xff0c;“内存屏障”&#xff08;memory Barrier&#xff09;是一种陌生&#xff…

Windows转Mac过渡指南

最近由于工作原因开始使用mac电脑&#xff0c;说实话刚拿到手的时候&#xff0c;window党表示真的用不惯。坚持用一下午之后&#xff0c;发现真的yyds&#xff0c;这篇文章说说mac电脑的基本入门指南。 1. 不会使用mac的触摸板&#xff0c;接上鼠标发现滚轮和windows是反的。 …

poi excel数据统计导出

##poi excel导出案例 1.ajxa导出请求没有任何反应&#xff0c;打断点看了workBook中也有数据&#xff0c;网上查阅说ajax请求导出无法接收流&#xff0c;换成location.href,果然可以了 2.控制器代码 response.setCharacterEncoding("UTF-8");response.setContentTyp…

昆仑通态触摸屏-如何完成几个窗口的切换

一、启动窗口 想要哪一个窗口是启动时第一个显示的&#xff0c;就把谁设置为启动窗口就可以。 二、公共窗口 给一个窗口命名为公共窗口 然后选择一个窗口&#xff0c;将他的公共窗口设置为我们刚才命名的那个窗口 三、页面切换 页面切换&#xff0c;是通过在公共窗口内设置按…

dns服务器配置

主服务器 1.挂载点 mount /dev/sr0 /mnt 2.防火墙关闭 systemctl stop firewalld setenforce 0 3.下载bind软件 dnf install bind -y 4.进行正向解析配置 vim /etc/named.conf options { listen-on port 53 { 192.168.92.128; }; directo…

GraphRAG本地部署使用及兼容千帆通义

文章目录 前言一、GraphRAG本地安装1.创建环境并安装2.准备demo数据3.初始化demo目录 二、GraphRAG兼容千帆通义等大模型1.安装 graphrag-more2.准备Demo数据3.初始化demo目录4.移动和修改 settings.yaml 文件 三、知识库构建与使用1.知识库构建2.执行查询 前言 GraphRAG是一种…