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

news2024/11/25 10:27:46

目录

前言

开篇

一、进程概念

二、进程的描述与管理

 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.coloradmin.cn/o/2236685.html

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

相关文章

PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)

此内容是论文总结&#xff0c;重点看思路&#xff01;&#xff01; 文章概述 这篇文章提出了PointMamba&#xff0c;一种基于状态空间模型&#xff08;SSM&#xff09;的点云分析方法&#xff0c;通过引入线性复杂度算法来实现高效的全局建模。与传统基于Transformer的点云方…

【LLM】【LLaMA-Factory】:Qwen2.5-Coder-7B能力测评

1 前期准备工作 1.1 环境概述 大模型框架&#xff1a;LLaMA-Factory CG客户端镜像&#xff1a;hiyouga/LLaMA-Factory/LLaMA-Factory / v4 cpu 架构 核心数 线程数 频率 内存使用情况 操作系统 GPU&#xff1a;四张4090显卡 CUDA python 以及相关依赖包 pytorch 1.2 数据准…

OpenAI CEO阿尔特曼预测AGI可能在五年内出现 对社会的影响远小于预期

OpenAI 不断探索人工智能及其所蕴含的技术可能性的工作已经引起了相当大的反响&#xff0c;用户和科技界都对其新发布的模型及其所蕴含的先进性着迷。 在公司大力发展 AGI&#xff08;人工通用智能&#xff09;的同时&#xff0c;许多知名公司的关键员工也加入了 OpenAI&#x…

AI周报(11.3-11.9)

AI应用--商务会议旅游必备 AI同传翻译耳机 作为一个经常出差和旅游的人&#xff0c;我深知语言不通带来的困扰。每次在国外旅行&#xff0c;面对不同语言的环境&#xff0c;总是让人头疼不已。幸好&#xff0c;现在有了AI同传翻译耳机&#xff0c;出门在外也能轻松交流。 时空…

qt QCompleter详解

1、概述 QCompleter是Qt框架中的一个类&#xff0c;用于为文本输入提供自动完成功能。它可以与Qt的输入控件&#xff08;如QLineEdit、QTextEdit等&#xff09;结合使用&#xff0c;根据用户的输入实时过滤数据源&#xff0c;并在输入控件下方或内部显示补全建议列表。用户可以…

为什么分布式光伏规模是6MW为界点

安科瑞 华楠 近日&#xff0c;能源局发布定义分布式光伏6MW及以上的光伏电站必须自发自用&#xff0c;自行消纳。多省能源局规定大于6MW的电站必须按集中式管理&#xff0c;另外大于6MW&#xff08;包含&#xff09;要省级审批&#xff0c;小于则由市级审批&#xff0c;10kV线…

【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子产品中&#xff0c;控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择&#xff0c;但随着国内半导体技术的进步&…

分析报告、调研报告、工作方案等的提示词

什么是提示词&#xff1f; 提示词的英文是Prompt&#xff0c;是你与人工智能&#xff08;AI&#xff09;进行交流的方式。简单来说&#xff0c;提示词就是你给AI的一段文字或问题&#xff0c;AI根据这段文字或问题来生成回应或完成任务。 举个例子&#xff1a;假设你在使用一…

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

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

解决Postman一直在转圈加载无法打开问题的方法

在使用Postman这款强大的API测试工具时&#xff0c;有时可能会遇到程序长时间加载而无法正常使用的情况。面对这样的问题&#xff0c;可以尝试以下几种解决办法&#xff1a; 方法一&#xff1a;直接运行Postman可执行文件 定位到Postman的安装目录 如果您不确定Postman的具体安…

机器学习—训练细节

首先回忆如何训练一个逻辑回归模型&#xff0c;建立一个Logistic回归模型是&#xff1a;你将指定如何计算输出给定输入特征x和参数w和b&#xff0c;在逻辑回归函数预测f(x)g&#xff0c;它是应用于w*xb的Z状结肠函数&#xff0c;所以如果znp.dot(w,x)b&#xff0c;f_x1/(1np.ex…

bert-base-uncased处理文档

1.安装必要的库 确保安装 transformers 和 torch 库&#xff1a; pip install transformers torch 2.加载本地 BERT 模型和分词器 由于已将模型和分词器下载到本地&#xff0c;可以指定文件路径加载。确保路径与本地文件结构一致。 from transformers import BertTokenizer…

Python http打印(http打印body)flask demo(http调试demo、http demo、http printer)

文章目录 代码解释 代码 # flask_http_printer.pyfrom flask import Flask, request, jsonify import jsonapp Flask(__name__)app.route(/printinfo, methods[POST]) def print_info():# 分隔符separator "-" * 60# 获取请求头headers request.headers# 获取 JS…

HTB:Perfection[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What version of OpenSSH is running? 使用nmap对靶机TCP端口进行开放扫描 2.What programming language is the web application written in? 使用浏览器访问靶机80端口页面&#xff0c;并通过Wappalyzer查看页面脚本语言 3.Which e…

cursor+QT5.12.12

一、QT相关 1、环境设置相关 2、安装插件&#xff1a; 在CURSOR中安装以下插件&#xff1a; C/C插件&#xff1a;这是必需的&#xff0c;用于支持C/C语言开发。 Qt Configure&#xff1a;用于配置Qt环境。 Qt Tools&#xff1a;提供Qt相关的工具支持。 CMake&#xff1a;如果…

【Python】pandas 和numpy版本不兼容怎么办?遇到numpy.dtype size change的解决方法(解决方法篇)

前情简要&#xff1a; 之前我在写程序的时候&#xff0c;因为运行了别人写的程序文件&#xff0c;不知道为啥&#xff0c;直接报出了这个问题&#xff1a; ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 f…

HTB:Devel[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the name of the service is running on TCP port 21 on the target machine? 使用nmap对靶机TCP端口进行开放扫描 2.Which basic FTP command can be used to upload a single file onto the server? 尝试匿名连接至靶机FTP服…

【大数据学习 | kafka高级部分】kafka的kraft集群

首先我们分析一下zookeeper在kafka中的作用 zookeeper可以实现controller的选举&#xff0c;并且记录topic和partition的元数据信息&#xff0c;帮助多个broker同步数据信息。 在新版本中的kraft模式中可以这个管理和选举可以用kafka自己完成&#xff0c;而不再依赖zookeeper。…

漫谈MCU优化:从硬件设计优化到可靠性挑战

1.关于MCU 微控制器&#xff08;Microcontroller Unit, MCU&#xff09;&#xff0c;是以微处理器为基础&#xff0c;加上存储器以及计数器、I2C、UART等外设模块与接口电路整合的单芯片微型计算机。 ▲MCU实物图 MCU拥有性能好、可编程、灵活度高、功耗低等优点&#xff0c;…

Notepad++ 更改字体大小和颜色

前言 在长时间编程或文本编辑过程中&#xff0c;合适的字体大小和颜色可以显著提高工作效率和减少眼睛疲劳。Notepad 提供了丰富的自定义选项&#xff0c;让你可以根据个人喜好调整编辑器的外观。 步骤详解 1. 更改字体大小 打开 Notepad 启动 Notepad 编辑器。 进入设置菜…