【Linux从入门到精通】进程的基本概念

news2025/1/18 9:08:27

 

  我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解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/532682.html

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

相关文章

【Linux】12. 模拟实现shell

回顾 在之前的学习过程中&#xff0c;我们掌握了进程的相关概念&#xff0c;冯诺依曼体系结构&#xff0c;进程地址空间概念&#xff0c;进程状态&#xff0c;进程控制&#xff0c;进程退出&#xff0c;进程替换…等等一系列的基础知识&#xff0c;这些基础知识让我们清楚的知…

Qt6之字符串类内存分配新变化——16的次方增加

qt提供了比标准c string更强大&#xff0c;更丰富&#xff0c;更实用的字符串类QString&#xff0c;它的主要功能22个已经在之前逐一分析过&#xff0c;感兴趣的可前往以下链接查看&#xff0c;本文主要重点分析下qt在字符串类上面做的优化&#xff0c;主要是两个方面&#xff…

当产品进化遇见亿元福利,华帝携手人民日报为消费复苏添了一把火

这个五一黄金周&#xff0c;消费复苏的热火彻底被点燃。统计数据显示&#xff0c;2023年“五一”假期累计超过2.74亿人次出游&#xff0c;消费市场恢复到2019年同期水平。久违的“人间烟火气”再度回归。 除了旅游市场的火爆&#xff0c;同样助燃消费市场的还有全民“厨房焕新…

使用Vue+Python基于卷积神经网络前后端分离实现蔬菜种类预测系统

使用VuePython基于卷积神经网络前后端分离实现蔬菜种类预测系统 一、实现效果 1、种类预测界面 2、数据处理分析界面 3、网络模型界面 4、结果分析界面 二、需求分析 用户通过上传待预测图片到系统&#xff0c;系统预测出该图片对应的蔬菜种类&#xff0c;并且提示用户预测信…

基于Web的智慧储能电站3D可视化管理平台

电能作为现代社会的运转和发展的基础&#xff0c;是民生最基本的保障&#xff0c;其稳定性对国家经济发展至关重要。 建设背景 电力系统是一个稳态平衡系统&#xff0c;发电站的总发电功率需要等于用户端的总发电功率。如果两者不一致&#xff0c;就会导致整个电力系统的不稳…

[PyTorch][chapter 34][池化层与采样]

前言&#xff1a; 这里主要讲解一下卷积神经网络中的池化层与采样 目录 DownSampleMax poolingavg poolingupsampleReLu 1&#xff1a; DownSample 下采样,间隔一定行或者列进行采样&#xff0c;达到降维效果 早期LeNet-5 就采样该采样方式。 LeNet-5 2 Max pooling 最大值采样…

【28岁了,没有职业规划,没有目标,朋友推荐学云计算技术,能成吗?】

一般来说&#xff0c;当然可以的。云计算是一个不断发展的行业&#xff0c;不考虑年龄的因素&#xff0c;任何人都可以学习和掌握云计算的技能。28岁的年龄入行云计算是可行的&#xff0c;年龄方面还是符合企业的要求&#xff0c;而且云计算领域的发展趋势也显示出越来越多的企…

RIDGID里奇金属管线检测仪故障定位仪维修SR-20KIT

里奇RIDGID管线定位仪/检测仪/探测仪维修SR-20 SR-24 SR-60 美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户&#xff0c;都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数&#xff0c;使得大多数复杂的定位工作变得很容易。此外&#xff0c…

国内ChatGPT使用教程

猿说AI助手系统基于中国开源项目进行开发&#xff0c;由神诺网络科技工作室提供技术支持&#xff0c;后面我们会跟随官方持续更新。对话默认运行的是3.5-turbo模型&#xff0c;绘画采用Midjourney接口&#xff0c;待更新百度文心、通义千问、微信WeLM等。本系统仅用于技术研究&…

【k8s】【ELK】基于节点DaemonSet运行日志Agent实践【待写】

1.日志收集场景分析与说明 部署架构说明 对于那些将日志输出到&#xff0c;stdout与stderr的Pod&#xff0c; 可以直接使用DaemonSet控制器在每个Node节点上运行一个 <font colorred>filebeat、logstash、fluentd </font>容器进行统一的收集&#xff0c;而后写入…

论文阅读-DGM4-Detecting and Grounding Multi-Modal Media Manipulation

一、论文信息 论文名称&#xff1a;Detecting and Grounding Multi-Modal Media Manipulation 作者团队&#xff1a;南洋理工哈工大 Github:https://github.com/rshaojimmy/MultiModal-DeepFake 项目主页&#xff1a;https://rshaojimmy.github.io/Projects/MultiModal-DeepF…

在EasyCVR平台中添加设备提示成功但不显示是什么原因?

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理&#xff0c;可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvi…

JECloud 运行前端模块所遇到的问题 汇总

1.依赖安装问题 官网 JECLoud 前端打包部署 1.1 部署前 注意 可以先下载 jecloud-libs 项目 尝试 部署安装 node版本不能过高&#xff01;选择node v14.17.5 版本 在部署前 如果当前node版本过高可以使用 nvm工具 切换到低版本&#xff0c; 但是需要注意的是 切换版本时 …

内网渗透(七十五)之域权限维持之DCShadow

DCShadow 2018年1月24日,在BlueHat安全会议上,安全研究员Benjamin Delpy 和 Vincent Le Toux 公布了针对微软活动目录域的一种新型攻击技术------DCShaow。利用该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能…

接口自动化测试-Requests之Session鉴权关联接口实战

目录 前言&#xff1a; 一、 简介 二、 实战操作 1. 登录接口 2. 查询订单接口 3. 新增订单接口 4. 修改订单接口 5. 删除订单接口 三、 结束语 前言&#xff1a; 接口自动化测试是软件测试过程中的重要一环&#xff0c;现在越来越多的公司开始使用自动化测试来提高测…

某社交平台 x-s所有可用

本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 最新版 x-s 没露任何版权请审核员认真对待谢谢。 【2023.05.16】 更新全站接口通用 …

webpack食用指北

目录 何为webpackwebpack前置知识webpack项目初始化webpack配置文件运行webpack loadercss引入对loader的配置的几种写法 图片引入url的options自动清除上次打包遗留的资源 资源模块类型图片的webpack5引入方式字体的webpack5引入方式 webpack插件html-webpack-plugincopy-webp…

CSS 常用属性

padding (内边距):钻戒到盒子内边框的距离 margin (外边距):钻戒盒子距离桌子边缘的距离 border:钻戒盒子边框宽度 1) 内边距和外边距 内边距 外边距 使用方式: .a {padding: 10px 5px 15px 20px; /*上右下左*/padding: 10px 5px 15px; /*上右下*/padding: 10px 5px; /*上右…

EMC常见术语-dB、dBm、dBw以及如何计算

1. 手把手教&#xff1a;如何计算dB、dBm、dBw…… dB应该是无线通信中最基本、最习以为常的一个概念了。我们常说“传播损耗是xx dB”、“发射功率是xx dBm”、“天线增益是xx dBi”…… 有时&#xff0c;这些长得很像的dBx们可能被弄混&#xff0c;甚至造成计算失误。它们究…

docker Connection refused

环境介绍、服务版本、测试服务是否正常&#xff0c;可参考&#xff1a; docker could not find driver_龙枫995的博客-CSDN博客docker容器中&#xff0c;php和mysql互动时&#xff0c;解决出现could not find driverhttps://blog.csdn.net/longfeng995/article/details/130704…