【Linux从入门到精通】一文带你理解进程概念

news2025/2/28 17:46:37

 

  我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解PCB(进程控制块)。希望本篇文章内容会对你有所帮助。

文章目录

一、再次理解操作系统

1、1 操作系统的作用

1、2 操作系统的管理

二、进程基本的概念

2、1 什么是进程

2、2 进程控制块 PCB

2、3 查看Linux上的进程

2、4 再次理解进程 

2、5 task_struct内容分类

2、5、1 进程标识符 PID

2、5、2 退出码

三、总结 


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Linux从入门到精通 👀

💥 标题:进程的基本概念 💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、再次理解操作系统

  在学习进程之前,我们先来理解一下操作系统。我们学习完冯诺依曼体系结构后,知道计算机是由一个个硬件组成的。只有一堆硬件,计算机可以运行起来吗?答案是不可能的。还需要结合软件才能运行起来。例如最重要的软件:操作系统。

  前面的文章中我们提到,操作系统是一款管理软硬件的软件。我们这里就有很多问题:操作系统是管理哪些软硬件呢?操作系统为什么要管理呢?操作系统是怎么进行管理的呢?我们接着往下看。

1、1 操作系统的作用

  我们先来看一张图:

  我们用户是不会直接跟底层的硬件打交道的。首先,新手用户不懂底层硬件的使用。其次,底层硬件学习起来成本太高。我们所使用的都是可视化界面,一个个软件。而软件是怎么跟底层的硬件打交道的呢?原因是中间有一个操作系统。

  通过上图我们看到,我们作为用户都是在向计算机使用简单操作或发送许多指令,达到我们使用计算机的目的。而我们的每个操作是要贯穿操作系统操作系统经过一系列操作将我们的指令“翻译”成底层硬件认识的指令,进而送达硬件部分。从这里我们了解到,操作系统有连接上层用户软件和下层驱动和硬件的作用。

  一个个硬件放在那里是不能运行起来的,他们之间需要产生联系。操作系统就是对下要管理好各种驱动程序和各个硬件资源,为上层的软件提供一个良好的运行环境

1、2 操作系统的管理

  在上节图片中看到,操作系统的主要的四个功能:内存管理进程管理文件管理驱动管理。我们发现,操作系统主要就是进行管理的。那到底是怎么管理的呢

  在这里举一个例子:学校管理学生。当一个学校只有几个学生时,那这个学校管理起来就很容易,并且可以很容易的记住这几个学生的所有信息。当学校有几千名甚至上万名学生时,管理起来似乎就并没有那么容易。为了更好的管理学生呢,学校会将所有学生的各种信息、属性统计起来,放在一张表格中。当需要看某个学生的成绩时,直接通过该同学的信息属性直接筛查出来即可。我们发现这样管理似乎就简单起来了。

  操作系统的管理也正是如此。对比上述的例子,我们知道操作系统中软硬件资源多而复杂(学生很多),为了更好的管理这些软硬件资源,可以将这些软硬件资源进行描述(学生入学填写各种属性、信息),通过各种高效的数据结构将他们组织起来(放到一张表格中,需要时可通过筛查直接找到)。

  通过上面的描述,我们总结管理其实就是先描述,后组织。这里我们再引入进程。那操作系统是怎么对进程进行管理的呢?我们可以直接理解操作系统是对进程先进行描述,再把进程组织起来。我们接下来进入我们主题:进程。

二、进程基本的概念

2、1 什么是进程

  我们在自己电脑上任务管理器下就可以查看进程,如下图:

  那到底什么是进程呢?

  我们在很多地方可能看到:加载到内存中的程序,就是进程。这种概念是正确的吗?我们不妨先接着往下探索一下。

2、2 进程控制块 PCB

  在学习进程中,我们都知道每个进程都会有一个PCB。为什么呢?PCB又是什么呢?

  我们上述提到了,操作系统对进程的管理就是先描述,后组织。怎么对进程进行描述的呢?答案就是:进程控制块PCB是对进程描述的一个结构体。这里我们知道了PCB是用来描述进程的一个结构体。是为了我们后面对进程更好的组织和管理。

  在Linux下描述进程的PCB是task_struct。有很多同学会在这里有点搞不清楚了。PCB和task_struct到底是什么关系呢?这里给大家举一个例子:在现实生活中,我们都知道相亲都靠媒婆。你可能也认识几个媒婆,例如你的邻居王阿姨就是媒婆,我们也叫她为王婆。媒婆是一个统称,王婆就是媒婆中的一个具体的人。同样,PCB是进程控制块的统称task_struct就是PCB中的具体的一种进程控制块。我们知道PCB是描述进程的一个结构体,

那么这个结构体中都有进程的哪些属性呢?我们接着往下看。

2、3 查看Linux上的进程

  我们在上面了解到进程后,我们不妨在Linux下查看一下进程。我们先在Linxu下写一个C语言代码,代码如下:

  #include<stdio.h>                                                                                                                                            
      
  int main()    
  {    
      
    while(1)    
    {    
      sleep(1);    
      
      printf("hello OS,pid";    
    }                                                                                    
    return 0;                                                                            
  }

  我们写的是一段无限循环的代码。是为了我们后面可以更好的观察进程。我们编译生成 myporc可执行程序查看进程的指令是:ps axj | head -1 && ps axj | grep "proc"。我们可看下图一起理解:

 当我们结束程序后,我们就会发现进程中就不再有该程序,如下图:

   我们曾经所有运行创建的程序,本质上都是在内村上创建进程

2、4 再次理解进程 

  问题回溯:加载到内存中的程序,就是进程吗?

  这里举个例子:在清华大学里面的学生就算是清华大学的学生吗?你可能会说是的。那么问题来了。我现在确实是一个河北省的大学生,我现在坐个火车来到清华了,我就是清华的学生了吗?想得美ovo!是清华的学生就应该有清华的学生证。

  加载到内存中的程序也是一样,程序确实是程序,但不能称它为进程。我们上面学到了为更好的控制进程,我们还有PCB来描述进程。加载到内存中的程序,就是进程这个说法并不准确。我们目前可理解进程=程序文件内容+维护进程相关的数据结构。我们可结合下图理解:

  PCB就是操作系统给每个进程提供的。在Linux上就会自动创建出struct task_struct{} 结构体。task_struct就会包含了进程的所有属性和信息

  有同学就会有所疑惑:操作系统到底在哪里呢?注意:操作系统也是一款软件。当我们开机时,我们相当于就是启动了操作系统这款软件,相关内容数据就会加载到了内存中。当然,操作系统也会有其对应的PCB。只不过操作系统这款软件的功能较为强大。

  当有多个进程时,操作系统就会用搞笑的数据结构将它们组织起来,以便后续的更好的管理。

  当我们知道进程中还包含了task_struct后,CPU拿数据时,是直接找程序的内容数据,还是找task_struct呢? 答案是找task_struct。我们看下图:

 

  如上,假如内存中有6个进程。其中每个进程的PCB都有特殊的联系,也就是操作系统见他们组织起来了。CPU拿数据时,会直接找对应进程task_struct,这样会更加高效。为什么呢?因为task_struct中包含了指向内容数据的指针找到了进程对应的task_struct就可以找到对应的内容数据!到这里我们知道了PCB中包含了对应的内容数据指针。还有呢?

2、5 task_struct内容分类

  task_struct中包含的内容很多,在这里给大家列出主要的内容:

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
  • 上下文数据: 进程执行时处理器的寄存器中的数据。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息。
  这里标识符下面会对齐详解。状态有运行状态,阻塞状态等等。退出码也会在下发进行详解。程序计数器也就是PC指针,该指针存储的是下条指令的地址。内存指针我们上面提到了。上下文数据记账信息会另写一篇文章对其进行详解,因为上下文数据相对复杂,也比较重要。I/O状态信息我们可简单理解为输入输出信息状态及请求。注意:并不是你在控制I/O,也不是你所写的代码在控制I/O,而是进程在控制I/O

2、5、1 进程标识符 PID

  进程标识符PID就是唯一标示一个进程。我们这里有一个函数getpid()可以直接返回进程的PID,如下图:

  我们可结合下面例子一起理解一下。代码如下:

#include<stdio.h>    
#include<sys/types.h>    
#include<unistd.h>    
    
int main()    
{    
    
  while(1)    
  {    
    sleep(1);    
    
    printf("hello OS,pid:%d\n",getpid());                                                                                                                    
  }                                                                                                                        
  return 0;                                                                                                                
}     

  运行结果如下图:

  当然,我们也可通过此PID找到该进程,指令为:ps ajx | grep 16940。结果如下:

  我们也可通过 kill 指令来终止该进程,指令:kill -9 16940。结果如下图:

  一个进程也是有父进程的,可通过getppid()函数获得父进程的PPID。一般在命令行上运行的命令,其父进程基本上都为bash

2、5、2 退出码

  你有没有想过,在我们所写的代码中,为什么最后都会有一句 return 0呢?return 100 可以吗?这里的 return 的数据就是我们程序结束的结束码,查看结束吗的指令为:echo $?。具体如下图:

   注意,echo $? 是指的最近一次的退出码。又如下图:

三、总结 

  本篇文章的内容就讲解到这里。我们来稍微总结一下:我们在讲述进程之前,是学习了冯诺依曼体系结构和操作系统管理,是我们理解起来进程更加容易。而不是突然蹦出来一个概念,显得枯燥难理解。当然,进程中还有很多细节,包括我们还没有讲解上下文数据,后面都会给大家解释。进程是一个十分重要的概念,对我们后面的学习也很重要,我们需要反复阅读,查阅资料去理解进程概念。也希望本篇文章会对你有所帮助,让你有所收获。 

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

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

相关文章

基于Kubernetes集群构建大中型企业CICD应用平台(5)--Integrate工具

5.1、jenkins介绍 持续集成、持续部署的工具很多&#xff0c;其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务&#xff0c;并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作&#xff0c;安装成本较高&am…

Java Web开发:Spring Boot和Spring Cloud的应用和实践

一、介绍 Java Web开发是当今互联网时代中的一项重要技术&#xff0c;随着互联网的发展和应用场景的不断扩大&#xff0c;Java Web开发技术也得到了广泛的应用。而Spring Boot和Spring Cloud作为Java Web开发中最常用的技术之一&#xff0c;已经成为了很多开发者必备的技能。本…

使用Vue3和Typescript实现可复用的路由标签页和面包屑导航组件

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、为什么需要可复用的路由标签页和面包屑导航组件1.1 前端应用导航的问题1.2 解决问题的方法二、Vue3和Typescript基础知识回…

shell脚本中数组的运用以及排序算法

shell脚本中数组的运用 一、数组的介绍1、概念2、定义方法3、数组包括的数据类型 二、关于数组的操作1、获取数组长度2、获取数组各个元素的下标3、获取数组列表或单个元素4、对数组切片输出5、对数组里的元素替换6、删除单个元素或数组7、数组追加元素8、向函数传入数组的值 三…

Learning C++ No.20 【红黑树实战】

引言&#xff1a; 北京时间&#xff1a;2023/5/12/20:30&#xff0c;今天周五&#xff0c;周五不摆烂从我做起&#xff0c;虽然刚睡醒&#xff0c;但是今天如果论学习时长&#xff0c;那可能是许久以来最长的一天&#xff0c;从早上6:40晨跑回来坐在凳子上&#xff0c;一坐久坐…

在 I/O 看未来 | 开发者集合!官方学习资源已更新,即 课 解锁新技能!

看完 Google I/O 2023 的精彩内容 你是否已跃跃欲试&#xff0c;准备充电学习&#xff1f; 马上跟随 Google 开发者在线课程 刷新知识储备和开发技能 将技术热爱落地为实践应用&#xff01; "解码 Google I/O 洞见科技未来" 征文活动 也向身为技术爱好者的你发出召唤…

【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be

WiFi发展历史 IEEE 802.11 Protocol Release Date Frequency Band Bandwidth Max Throughput 802.11-1997 1997 2.4GHz 22MHz 2Mbps 802.11b 1999 2.4GHz 22MHz 11Mbps 802.11a 1999 5GHz 20MHz 54Mbps 802.11g 2003 2.4GHz 20MHz 54Mbps 802.11n (W…

Kubernetes❀实战入门

Kubernetes❀实战入门 4. 实战入门4.1 Namespace4.1.1 **查看**4.1.2 **创建**4.1.3 **删除**4.1.4 **配置方式** 4.2 Pod4.2.1 创建并运行4.2.2 查看pod信息4.2.3 访问Pod4.2.4 删除指定Pod4.2.5 配置操作 4.3 Label4.3.1 命令方式4.3.2 配置方式 4.4 Deployment4.4.1待操作。…

第二章 介绍Productions - 互操作性制作简介

文章目录 第二章 介绍Productions - 互操作性制作简介介绍Productions设置Production的消息流 第二章 介绍Productions - 互操作性制作简介 互操作性产品的目的是使能够连接系统&#xff0c;以便可以在它们之间转换和路由消息。要连接系统&#xff0c;需要开发、配置、部署和管…

( 位运算 ) 693. 交替位二进制数 ——【Leetcode每日一题】

❓693. 交替位二进制数 难度&#xff1a;简单 给定一个正整数&#xff0c;检查它的二进制表示是否总是 0、1 交替出现&#xff1a;换句话说&#xff0c;就是二进制表示中相邻两位的数字永不相同。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;true 解释&#…

【FreeRTOS】——API函数任务创建与删除挂起与恢复

目录 前言&#xff1a; 一、任务创建与删除的API函数 二、任务挂起与恢复的API函数 总结&#xff1a; 前言&#xff1a; 博客笔记根据正点原子视频教程编辑&#xff0c;仅供学习交流使用&#xff01; 一、任务创建与删除的API函数 任务的创建和删除的本质就是调用FreeRT…

小宁ChatGPT智能机器人上线,无需魔法注册即可使用!

​大家好&#xff0c;今天我要向大家介绍一款基于人工智能技术的聊天机器人——ChatGPT。ChatGPT可以与用户进行自然语言交互&#xff0c;回答用户的问题、提供服务、进行闲聊等&#xff0c;让聊天变得更有趣。 小宁ChatGPT是对接ChatGPT官方api&#xff0c;实现无需魔法无误差…

使用Visual Studio 2019 创建JNI式的动态库及在Java代码中的使用

文章目录 JNI简介JNI 数据类型与 Java 、C 类型对比JNI式动态库函数编码规则Visual Studio下的编码JNI式动态库在Java代码中的使用改进版通过javah命令自动生成.h文件 JNI简介 JNI (Java Native Interface) 是 Java 沟通 Native 语言&#xff08;主要是C、C&#xff09;的桥梁…

《花雕学AI》34:用13种Prompt玩转AI聊天机器人—揭秘ChatGPT模型

引言&#xff1a; 聊天机器人是一种能够通过自然语言进行交流的智能系统&#xff0c;它可以模仿人类的对话方式&#xff0c;提供各种信息、服务或娱乐。随着人工智能技术的发展&#xff0c;聊天机器人的应用越来越广泛&#xff0c;从电商、教育、医疗、旅游等领域&#xff0c;到…

Spring ( 四 ) 注解注入

3.2.注解方式 目前 主流的方式 是使用注解方式来实现IoC效果. 3.2.1.配置类 在 config包下增加 SpringConfig 配置类 Configuration 声明当前类为配置类, SpringIoC容器会根据配置类信息进行配置 ComponentScan() bean扫描路径 , SpringIoC容器只维护 声明的路径下的增加&q…

华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】

一、题目描述 给定由[a-z] 26 个英文小写字母组成的字符串 A和 B&#xff0c;其中A中可能存在重复字母&#xff0c;B 中不会存在重复字母&#xff0c;现从字符串 A 中按规则挑选一些字母&#xff0c;可以组成字符串 B。 挑选规则如下: 同一个位置的字母只能被挑选一次&#…

Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

文章目录 前言一、引入SQL模块二、数据库的基本操作三、示例完整代码四、下载链接总结 前言 什么是 SQLite&#xff1f; SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其…

软件 工程

目录 第十章、软件工程1、瀑布模型&#xff08;SDLC&#xff09;2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型&#xff08;CBSD&#xff09;8、统一过程&#xff08;RUP&#xff09;9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

Codeforces Round 872 (Div. 2) 题解

总结&#xff1a;5.9有同学问B题&#xff0c;所以就连同ABC题一起做了&#xff0c;都算是思维题吧&#xff0c;难度不算高 A. LuoTianyi and the Palindrome String 思路&#xff1a;输入的都为回文字符串&#xff0c;如果输入的回文字符串每个字符都相同&#xff0c;如"…

QT+VS推箱子小游戏

1、创建一个GUI程序&#xff0c;将界面设计成如下样式&#xff1a; 创建一个已QDialog为基类的子类&#xff0c;在窗体里添加一个pushbutton的按钮&#xff0c;一个QLabel用来显示文字。窗体的背景图片和按钮的背景颜色&#xff0c;都可以在样式中进行设计。 2、右键项目名称&…