《Linux从练气到飞升》No.12 Linux进程概念

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 进程基本概念
    • 描述进程-PCB
      • task_struct-PCB的一种
      • task_ struct内容分类
    • 组织进程
    • 查看进程
    • 通过系统调用获取进程标示符
    • 通过系统调用创建进程-fork初识
      • 1. 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。
      • 2. 父进程先运行还是子进程先运行?
      • 3. 创建子进程时OS要做什么?
    • 后记

前言

本篇我们将正式进入Linux的世界,首先先要讲的就是进程,进程是什么?怎么描述?如何组织、查看?如何创建?本篇都将详细讲解~

进程基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等

实际上,我们启动一个软件的本质上就是启动了一个进程,在Linux系统中运行 ./a.out 时,其实就是在系统的层面上创建了一个进程,如下:

#include <stdio.h>    
#include <unistd.h>    
int main() {   while(1)   {   printf("hello world!\n");   sleep(1);   }   return 0;   
} 

在这里插入图片描述

  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

从内核观点看的话,就是如下图这样,后面再讲概念。
在这里插入图片描述

按照之前操作系统篇讲过的先描述再组织,所以可以预言系统中会存在一个管理对应进程的结构体,因为不同的进程的属性不同,不可能直接管理进程,只能通过一个结构体来管理它,这个结构体的内容应该包括该进程的各个属性,我们之后叫它PCB(process control block),当然不同的系统中的叫法可能不同,但是理念是一样的。

区分程序和进程

  1. 程序的本质是一个静态文件,存储在磁盘中

  2. 进程是对应的代码+数据+进程对应的PCB结构体

描述进程-PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block)Linux操作系统下的PCB是: task_struct
在这里插入图片描述

task_struct-PCB的一种

在Linux中描述进程的结构体叫做task_struct
task_struct是Linux内核的一种数据结构(双向链表),它会被装载到RAM(内存)里并且包含着进程的信息。

task_ struct内容分类

    1. 进程标示符: 描述本进程的唯一标示符,用来区别其他进程。

进程PID在当前操作系统中唯一标识一个进程的标识符。

ps aux命令可以查看当前操作系统中所有的进程信息
在这里插入图片描述

    1. 进程状态: 任务状态,退出代码,退出信号等。
      进程状态:
      三种状态:
      运行态:正在拿着CPU资源进行运算的进程所持有的状态
      就绪态:一切的准备资源都准备就绪了,等待操作系统分配CPU资源
      阻塞态:等待某种资源到来之后才能进行运算
      细分状态:
      R:运行状态
      S:可中断睡眠状态:意味着进程在等待事件完成
      在这里插入图片描述

      D:不可中断睡眠状态:有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程
      通常会等待IO的结束。

      T:暂停状态:可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发
      送 SIGCONT 信号让进程继续运行。

      t:跟踪状态,当进程被gdb调试时会产生t
      X:死亡状态:这个状态只是一个返回状态,你不会在任务列表里看到这个状态
      Z:僵尸状态:一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就
      会产生僵死(尸)进程

    1. 进程优先级: 相对于其他进程的优先级。
    1. 程序计数器: 程序中即将被执行的下一条指令的地址。
      在这里插入图片描述
    1. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
      在这里插入图片描述
    1. 上下文数据: 进程执行时处理器的寄存器中的数据。
      在这里插入图片描述
    1. I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
    1. 记账信息: 可能包括处理器时间总和,使用的时钟数总和、时间限制、记账号、cpu使用率、内存使用率、CPU使用时长。
    1. 其他信息

组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程

进程的信息可以通过 /proc 系统文件夹查看
在这里插入图片描述

如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。
在这里插入图片描述

大多数进程信息同样可以使用top和ps这些用户级工具来获取

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {while(1){  printf("hello world!\n");sleep(1);}  return 0; 
}
ps aux | grep mycode | grep -v grep

在这里插入图片描述

通过系统调用获取进程标示符

  • 进程id(PID)
  • 父进程id(PPID)
    返回0为子进程,返回大于0(子进程PID)为父进程,返回小于0,创建失败
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

在这里插入图片描述

通过系统调用创建进程-fork初识

1. 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。

  • 代码是逻辑,一般不可被修改,数据,即可读又可写。

  • 进程是有独立性的,父子进程fork完毕后,谁先运行是不确定的,这个有调度器决定。

测试代码:

#include <stdio.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {printf("begin fork...\n");fork();printf("end fork...\n");return 0; 
}

结果:出现两个end fork…
在这里插入图片描述
测试代码

#include <stdio.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {printf("create process failed\n");pid_t pid=fork();if(pid<0){printf("create process failed\n");}else if(pid == 0){ printf("create child success\n");}else{ printf("create parent success\n");}printf("end fork...\n");return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述
pid进入两个分支说明了有两个pid值,也就说明fork有两个返回值,

为什么会有两个返回值?

  1. 因为fork内部,父子各自会执行自己的return语句
  2. 返回两次,并不意味着缓存两次。(以后讲)

return后核心代码都执行完了吗?

完成了

fork函数是怎么新建进程的?

操作系统和CPU运行某个进程,本质就是从task_struct链表中挑一个task_struct来执行它的代码,只要想到进程就要优先想到对应的task_struct,而进程调度就变成了在task_struct链表中选择一个进程的过程,fork函数就是再创建一个进程和task_struct,并将这个task_struct添加到task_struct队列中。
在这里插入图片描述

为什么给子进程返回0,父进程返回子进程的pid?(感性分析一下,并不完全正确)

子进程只有一个父进程,而父进程可以有多个子进程,fork之后,给父进程返回子进程的pid可以方便父进程对子进程进行管理,而父进程对子进程是唯一的,子进程只需要知道自己是否创建成功,成功创建后的父进程是谁即可。

既然子进程有父进程,那最终的父进程是谁?

是bash,bash是所有进程的父进程,验证如下: 子进程的ppid是父进程的pid,而父进程的ppid是bash,所以bash是所有进程的父进程。
代码:

#include<stdio.h>#include<unistd.h>int main(){  int ret=fork();if(ret<0){  printf("fork error!\n");}  else if(ret==0){  printf("i am child:%d ret=%d\n",getpid(),ret);}  else{  printf("i am parent:%d ret=%d\n",getppid(),ret);}  return 0; }  

运行结果:
在这里插入图片描述
查看:

ps aux | grep 32158

在这里插入图片描述

2. 父进程先运行还是子进程先运行?

  • 子进程在被创建后,在内核中会生成一个PCB对它进行管理,这个PCB会被挂在PCB构成的双向链表当中组织起来
  • 而父进程与子进程谁先运行是不确定的,取决于操作系统的调度
  • 它是抢占式执行的,也就是OS会给进程运行一段时间然后中止,把CPU资源让给其他进程。
  • 子进程在创建出来以后,子进程的运行与父进程无关了

3. 创建子进程时OS要做什么?

本质上就是新建了一个task_struct加入到系统中

在这里插入图片描述

后记

本篇主要讲述了进程的基本概念以及如何描述进程——PCB,并且讲述了如何通过系统调用获取进程标识符,如何创建子进程——初识fork,更为深入的讲解将在后面的文章进行讲述~

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

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

相关文章

maven 删除下载失败的包

本文介绍了当Maven包报红时&#xff0c;使用删除相关文件的方法来解决该问题。文章详细说明了_remote.repositories、.lastUpdated和_maven.repositories文件的作用&#xff0c;以及如何使用命令行删除这些文件。这些方法可以帮助开发者解决Maven包报红的问题&#xff0c;确保项…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中&#xff0c;经常遇到这个问题&#xff0c;即让某个元素的内容在水平和垂直方向上都居中&#xff0c;内容不仅限于文字&#xff0c;可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景&#xff0c;实现居中的方法存在很多&#xff0c;可以将这…

go语言从0基础到安全项目开发实战

一.环境搭建并helloworld 搭建环境比较简单 1.1安装SDK 到以下链接下 Go下载 - Go语言中文网 - Golang中文社区 下载windows版本64位zip包 https://studygolang.com/dl/golang/go1.20.7.windows-amd64.zip 1.2配置环境变量 不配置的话就只能在bin目录下才能运行go命令 …

[保研/考研机试] 猫狗收容所 C++实现

题目描述&#xff1a; 输入&#xff1a; 第一个是n&#xff0c;它代表操作序列的次数。接下来是n行&#xff0c;每行有两个值m和t&#xff0c;分别代表题目中操作的两个元素。 输出&#xff1a; 按顺序输出收养动物的序列&#xff0c;编号之间以空格间隔。 源代码&#xff…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置&#xff1a;CentOs 7.6以上版本&#xff0c;我的版本是7.9&#xff0c;不要对yum换源&#xff0c;否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令&#xff0c;是…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口&#xff0c;还有就是加上关联的那一套逻辑&#xff0c;…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展&#xff0c;虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中&#xff0c;VR3D课程在线教育平台作为一种新兴的教育方式&#xff0c;正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具&#xff0c;流行了很多年&#xff0c;知道现在依然是大部分Java项目的构建工具的首选&#xff1b;但随着项目复杂度提高&#xff0c;代码量及依赖库的增多使得ma…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

AIGC技术揭秘:探索火热背后的原因与案例

文章目录 什么是AIGC技术&#xff1f;为何AIGC技术如此火热&#xff1f;1. 提高效率与创造力的完美结合2. 拓展应用领域&#xff0c;创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作&#xff1a;生成独特的艺术作品2. 内容创作&#xff1a;实时生成各类内容3. …

Ajax 笔记(四)—— Ajax 进阶

笔记目录 4. Ajax 进阶4.1 同步代码和异步代码4.2 回调函数地狱4.2.1 解决方法一&#xff1a;Promise 链式调用4.2.2 解决方法二&#xff1a;async 函数和 await 4.3 Promise.all 静态方法4.4 事件循环4.4.1 事件循环4.4.2 宏任务与微任务 4.5 案例4.5.1 案例一-商品分类4.5.2 …

Python ImportError报错:No module named ‘numpy.core_multiarray_umath‘

文章目录 背景Import 报错是版本问题吗&#xff1f;删除pandas在Visual Studio中设置Python 环境为什么要在Visual Studio IDE下继续安装Python package在Visual Studio安装numpy和pandasPYTHONPATHDebug模式下继续报错配置Release 工程优化不便之处 1不便之处 2后续 参考 背景…

YOLO v8目标跟踪详细解读(一)

在此之前&#xff0c;我们已经对yolo系列做出了详细的探析&#xff0c;有兴趣的朋友可以参考yolov8等文章。YOLOV8对生态进行了优化&#xff0c;目前已经支持了分割&#xff0c;分类&#xff0c;跟踪等功能&#xff0c;这对于我们开发者来说&#xff0c;是十分便利。今天我们对…

Java基础入门篇——数组初识

一、数组 1.假设某公司有100个员工&#xff0c;需要统计某公司员工的工资情况&#xff0c;首先需要声明100个变量来分别记每个员工的工资&#xff0c;那么如果按照之前的做法&#xff0c;可能定义的结构如下所示&#xff1a; int a1,a2,a3,......a100; 要求你输出这100个员工…

Android系统组件——AMS,App启动中的AMS流程

AMS&#xff08;Activity Manager Service&#xff09;是Android系统中非常重要的一个组件&#xff0c;负责管理应用程序的生命周期、进程调度以及任务栈的管理等任务。本文将从AMS的原理、数据结构、SystemServer加载AMS以及App启动中的AMS流程等方面进行详细介绍&#xff0c;…

【LeetCode】105. 从前序与中序遍历序列构造二叉树

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 105. 从前序与中序遍历序列构造二叉树 力扣 题目描述&#xff1a; 给定两个整数数组 preord…

小结:基于 JavaWeb 的宠物店管理系统

宠物店管理系统 系统介绍系统展示登录界面用户注册页面 店主主界面宠物信息管理页面修改宠物信息 宠物出入库管理页面宠物订单查询页面宠物账单查看页面用户信息管理页面修改用户信息 用户主界面宠物订购页面用户订购支付页面 个人资料编辑页面个人订单查看页面 系统说明开发环…

【力扣每日一题】2023.8.11 矩阵对角线元素的和

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个矩阵&#xff0c;让我们把矩阵对角线上的元素都加起来返回。 那么矩阵的对角线是有两条的&#xff0c;一条是从左上到右下…