【Linux进程篇】进程概念(1)

【Linux进程篇】进程概念(1)

目录

  • 【Linux进程篇】进程概念(1)
      • 进程
        • 基本概念
        • 描述进程-PCB
          • task_struct-PCB的一种
          • task_ struct内容分类
        • 组织进程
        • 查看进程
        • 通过系统调用获取进程标示符
        • 通过系统调用创建进程——fork初识

作者:爱写代码的刚子
时间:2023.7.30
前言:操作系统和软硬件的关系就相当于管理者和被管理者的关系,管理者并不需要见到被管理者,通过执行者拿到对应数据,通过对数据的管理来达到管理的目的。==对软硬件的管理最后一定会变成对某种数据结构的增删查改。==本篇博客将介绍操作系统如何对进程进行管理,如何创建进程。

进程

基本概念

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

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

    • 通俗一点:一个已经加载到内存中(运行)的程序叫做进程(任务),计算机在开机时也需要将操作系统从外设加载到内存中。
    • 一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程,所以操作系统必须将进程管理起来。
    • 进程需要先描述再进行管理
    • 任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程的结构体对象(进程属性的集合)——PCB,process ctrl block——进程控制块
    • 进程属性: 进程编号、进程状态、优先级…
    • 操作系统根据进程的PCB,为该进程创建对应的PCB对象
    • 进程 = 内核PCB数据结构对象(描述你这个进程的所有属性值)[系统维护] + 你自己的代码和数据
    • 操作系统管理进程只需要管理PCB结构体对象
    • PCB中包含对应的指针信息找到代码和数据
    • 操作系统中中含有多个进程,对进程的管理变成了对双向链表进行增删查改
    • 所有操作系统都是按照以上方案来对进程进行管理(思路是一致),但是具体管理方法有差别。
    • 不要以为将程序加载到内存就叫进程,而是操作系统为了管理这个进程所创建的PCB结构体。(只写一份可执行程序,把同样的进程跑了两次,但是在系统层面上是两进程)
  • ps ajx查看所有进程
    在这里插入图片描述
    用vim编写一段代码,并执行:
    在这里插入图片描述

  • ps ajx | grep myprocess查看myprocess的进程状态

在这里插入图片描述

  • ps ajx | head -1 && ps ajx | grep myprocess将进程的属性也显示出来

在这里插入图片描述

描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct(PCB具体的一种)
task_struct-PCB的一种
  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类
  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。(CPU中有一个寄存器(程序计数器),当运行一个进程时,永远要把当时运行指令的下一条指令的地址记录下来,因为进程可能因为某些原因不被运行,唤醒时才运行
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针(找到代码数据)
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

组织进程

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

Linux内核中,最基本的组织进程task_struct的方式是采用双向链表组织的,PCB还有其他的链式属性(队列、二叉树等,数据结构之间的关系非常错综复杂)

查看进程

进程的信息可以通过/proc系统文件夹查看

  • 如:要获取PID为1的进程信息,你需要查看/proc/1这个文件夹。

  • ls /proc查看当前系统的所有进程(关机之后目录里的数据没了,上面的所有信息是Linux操作系统用文件系统的方式把内存当中的文件包括进程信息给我们可视化出来,上面的数据都是内存级的)
    在这里插入图片描述
    运行指令时,所有的指令都变成了进程,这些指令都要加载到内存,以进程的方式去运行(很快)

在这里插入图片描述

  • ls /proc -l显示进程(蓝色数字是当前进程的PID)
    在这里插入图片描述
    在这里插入图片描述

当进程重新运行时PID很可能会变化
在这里插入图片描述
cwd:current work directory当前进程的工作目录(目录的重新理解

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

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

在这里插入图片描述

    • 进程id(PID)
    • 父进程id(PPID)
  • kill -9 +PID杀死对应进程

在这里插入图片描述

  • while :;do ps ajx | head -1 ; ps ajx | grep proc | grep -v grep;echo “--------------------------------------------”; sleep 1;done 打印进程相关的信息

在这里插入图片描述

  • getppid() 利用这个函数可以查看父进程id(头文件:#include <sys/types.h>)

  • 多次运行时父进程不会变,但是子进程会变
    在这里插入图片描述

  • 查看该程序的父进程(bash进程)
    在这里插入图片描述
    运行一个进程时,命令行解释器会将这个指令变成bash的子进程,由子进程执行对应的命令。

  • 每次登入iTerm时,系统会为我们单独创建一个bash进程(命令行解释的进程)(所有指令的父进程)

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

  • 运行man fork认识fork
  • fork有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

在这里插入图片描述

在这里插入图片描述

进程创建成功,给父进程返回子进程的PID,给子进程返回0;创建失败返回-1

  • 那是不是表示fork函数会返回两次?
    在这里插入图片描述

在这里插入图片描述
说明这个id具有两个值,说明fork()在程序运行期间创建了一个子进程。

【问题】:

    • 为什么能跑两份的代码?
      因为存在了两个进程。
    • 为什么fork要给子进程返回0,给父进程返回子进程PID?
      返回不同的返回值,是为了区分让不同的执行流,执行不同的代码块,一般而言fork之后的代码父子共享。给父进程返回子进程PID是为了标识子进程的唯一性,父进程来控制子进程,子进程只需调用getpid()就可以知道子进程的PID。
    • 一个函数是如何做到返回两次的?如何解释?
      fork()之后父子进程的代码是共享的,代码是不可以被修改的。虽然代码是共享的,但是我们是希望他们执行不同的代码块,这样才可能让父子进程协同起来。
      fork()也是一个函数,一个函数return了说明该函数的核心工作已经完成。
      fork()函数的功能可以总结为以下:
      1. 创建子进程PCB
      2. 填充PCB对应的内容
      3. 让子进程和父进程指向同样的代码
      4. 父子进程都是有独立的task_struct,可以被CPU调度运行
      5. … …
      6. return ret;

既然return ret;也是一份代码,说明父子进程共享这份代码,父进程在函数调度时返回一次,子进程在函数调度时返回一次。所以fork()函数返回了两次fork()return之前,子进程早就创建了

    • 一个变量怎么会有不同的内容?
      在任何平台,进程在运行的时候,是具有独立性的,直接决定了父子进程不能访问同一份数据,因为数据可能会被修改。(共享代码并不影响独立性),理论上子进程需要将父进程数据拷贝一份(操作系统实现)。但是子进程并不一定使用父进程的全部数据,如果全部拷贝父进程的数据可能造成资源的浪费,造成不必要的内存负担,所以子进程拷贝数据时会进行写时拷贝所以在进程刚创建的时候父子进程的代码和数据全都是共享的,但是一旦当子进程尝试去修改父进程的数据时,操作系统会重新开辟一块空间,去新开辟的这块空间进行写入。(用多少开多少空间)
      (深浅拷贝也用到了写实拷贝)
      由于fork()的返回值写入了id,子进程写入时发生了写实拷贝,操作系统对同一个id变量拷贝了两份,所以父子进程在使用id时,父子进程看到的id的内容就会不一样。(访问了不同的内存区)

【存疑】:同一个变量是如何让父子进程看到不同的内容?(地址空间章节里会介绍)

  • 如果父子进程被创建好,fork()往后谁先运行呢?
    谁先运行是不确定的,由调度器决定,调度的本质是对CPU资源的竞争,调度器的存在保证了竞争的公平

【问题】但是作者发现了一个问题:
在这里插入图片描述

按照上面的理解该程序的输出结果应该为:111111122222221111111
实际运行时:
在这里插入图片描述
【解释现象】:因为代码中的第一个printf打印的字符串后面没有加上\n,导致父进程打印完1111111,该字符串还存在缓冲区中,导致创建子进程时也将父进程的缓冲区也拷贝了,所以也将"1111111"打印了出来。


进程概念篇(1)结束

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

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

相关文章

【Docker】Docker应用部署之Docker容器安装Redis

目录 一、搜索Redis镜像 二、拉取Redis镜像 三、创建容器 四、测试使用 一、搜索Redis镜像 docker search redis 二、拉取Redis镜像 docker pull redis:版本号 # 拉取对应版本的redis镜像 eg: docker pull redis:5.0 三、创建容器 docker run -id --nameredis -p 6379:637…

Games101学习笔记 - 变换矩阵基础

二维空间下的变换 缩放矩阵 缩放变换: 假如一个点&#xff08;X,Y&#xff09;。x经过n倍缩放&#xff0c;y经过m倍缩放&#xff0c;得到的新点&#xff08;X1&#xff0c;Y1&#xff09;&#xff1b;那么新点和远点有如下关系&#xff0c;X1 n*X, Y1 m*Y写成矩阵就是如下…

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat&#xff0c;我们一般会想到什么&#xff1f;没错&#xff0c;就是他&#xff0c;童年的回忆…

安全基础 --- html标签 + 编码

html标签 &#xff08;1&#xff09;detail标签 <details>标签用来折叠内容&#xff0c;浏览器会折叠显示该标签的内容。 <1> 含义&#xff1a; <details> 这是一段解释文本。 </details> 用户点击这段文本&#xff0c;折叠的文本就会展开&#x…

【云原生】Docker容器资源限制(CPU/内存/磁盘)

目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容…

平面设计软件都有哪些?推荐这7款

优秀的平面广告设计可以给产品带来良好的效益&#xff0c;正确传播品牌的价值和色调&#xff0c;而功能强大、使用方便的平面广告设计软件是创造优秀平面广告设计的关键。本文推荐7款备受好评的平面广告设计软件&#xff0c;易于使用&#xff01; 1.即时设计 即时设计是国内一…

Bug记录: CUDA error_ device-side assert triggered

Bug记录&#xff1a; CUDA error: device-side assert triggered 在接触AIGC算法的过程中偶尔会遇到这样的bug&#xff1a;RuntimeError: CUDA error: device-side assert triggered return torch._C._cuda_synchronize() RuntimeError: CUDA error: device-side assert trig…

python在不同坐标系中绘制曲线

文章目录 平面直角坐标系空间直角坐标系极坐标地理坐标 平面直角坐标系 回顾我们的数据可视化的学习历程&#xff0c;其实始于笛卡尔坐标系的创建&#xff0c;并由此建立了数与形的对应关系。在笛卡尔坐标系中随便点上一点&#xff0c;这个点天生具备坐标&#xff0c;从而与数…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够&#xff0c;所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中&#xff0c;成为本地硬盘的工具&#xff0c;支持 Window…

短视频平台视频怎么去掉水印?

短视频怎么去水印&#xff0c;困扰很多人&#xff0c;例如&#xff0c;有些logo水印&#xff0c;动态水印等等&#xff0c;分享操作经验&#xff1a; 抖音作为中国最受欢迎的社交娱乐应用程序之一&#xff0c;已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

数据结构--基础知识

数据结构是什么&#xff1f; 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式&#xff0c;以便能够高效地使用和访问数据。 相关内容 基本组成 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;…

K8S暴露pod内多个端口

K8S暴露pod内多个端口 一、背景 公司统一用的某个底包跑jar服务&#xff0c;只暴露了8080端口 二、需求 由于有些服务在启动jar服务后&#xff0c;会启动多个端口&#xff0c;除了8080端口&#xff0c;还有别的端口需要暴露&#xff0c;我这里就还需要暴露9999端口。 注&a…

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

Vue 基础语法(二)

一、背景&#xff1a; 我们对于基础语法&#xff0c;说白了就是实现元素赋值&#xff0c;循环&#xff0c;判断&#xff0c;以及事件响应即可&#xff01; 二、v-bind 我们已经成功创建了第一个 Vue 应用&#xff01;看起来这跟渲染一个字符串模板非常类似&#xff0c;但是 V…

vue中在使用keep-alive时,会出现在页面跳转后el-tooltip或el-dropdown不消失的问题以及解决方法

一、 问题复现 跳转前&#xff1a; 跳转后&#xff1a; 二、分析 由于在vue中使用了keep-alive&#xff0c;页面在切换时&#xff0c;上一个页面的实例被缓存了&#xff0c;跳转后并没有销毁&#xff0c;所以才会残留 tooltip或dropdown&#xff0c;所以有以下解决思路&am…

这就是ChatGPT,走进我们的生活!

这就是ChatGPT&#xff0c;走进我们的生活&#xff01; 早在年初&#xff0c;合作导师将我叫过去&#xff0c;让我了解学习一下ChatGPT&#xff0c;看能不能对我们的生活有所帮助。一直使用着国内镜像&#xff0c;五月份我才注册了OpenAI的账户。如今&#xff0c;打开购物商城购…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

无人机调试笔记——常见参数

无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID&#xff0c;也就是无人机的速度闭环控制&#xff0c;确认没有问题后再进行外环位置控制&#xff0c;也就是定点模式控制。 2、调试的时…

【分享帖】LCD的MCU接口和SPI接口详解

LCD&#xff08;Liquid Crystal Display&#xff09;液晶屏&#xff0c;作为电子产品的重要组成部分&#xff0c;是终端用户与电子产品交互的重要载体。现在市场上的LCD&#xff0c;按照尺寸、功能、接口、用途等分为很多种&#xff0c;本文主要介绍如下两种LCD物理接口&#x…