【Linux】从硬件到软件了解进程

在这里插入图片描述
个人主页~


从硬件到软件了解进程

  • 一、冯诺依曼体系结构
  • 二、操作系统
  • 三、操作系统进程管理
    • 1、概念
    • 2、PCB和task_struct
    • 3、查看进程
    • 4、通过系统调用fork创建进程
      • (1)简述
      • (2)系统调用生成子进程的过程
        • 〇提出问题
        • ①fork函数
        • ②父子进程关系
        • ③解答问题

一、冯诺依曼体系结构

我们常见的嵌入式结构,包括哈佛结构冯诺依曼体系结构,我们所使用的计算机电脑就是冯诺依曼体系结构,下图就是该体系的直观图
在这里插入图片描述
在这里的存储器指的是内存,如果不考虑缓存的情况,这里的CPU能且只能对内存进行读写,不能访问输入输出设备,输入输出设备要输入输出数据也只能写入内存或者从内存中读取,就是说,虽然CPU是中央处理器,但对于冯诺依曼结构来说,内存才是中心的部件,所有数据必须先经过内存然后再流向别处

冯诺依曼体系结构是计算机设备得以普及的重大突破,我们知道计算机的存储速度如下图,寄存器是最快的存储也是最贵的,机械硬盘HDD是最慢的存储也是最便宜的,如果没有冯诺依曼结构,我们的计算机要不然就是便宜速度慢,要不就是昂贵速度快,冯诺依曼结构的原理是,在CPU进行计算的时候,内存已经接收外部输入设备输入的数据并存储,然后在CPU进行完计算后将结果取出,然后将结果放到输出设备,再把输入的数据交给CPU进行计算,这样,低速的输入输出设备、中速的内存以及高速的CPU有机整合,形成了现代计算机雏形

在这里插入图片描述

二、操作系统

任何计算机系统都包含一个基本的程序集合,它就被称为操作系统,我们前面说过,操作系统就是操作系统内核+命令行解释器(shell),设计操作系统的目的就是更好地与硬件交互管理软件资源,为应用程序提供一个良好的执行环境
在这里插入图片描述
如上图所示,我们可以清楚看到对于用户和系统软件部分的交互,我们是不能直接调用操作系统的,操作系统像一只小蜗牛,它缩在壳里伸出触角与你交流,除了触角以外,你是碰不到蜗牛的身体的,你只能碰到壳,这里的触角就是系统调用接口,而操作系统也有壳,除了调用系统调用接口,其他的方式都没法间接使用操作系统,因为系统调用在使用上操作比较基础,对用户的要求比较高,所以开发者就对部分系统调用进行适度封装,从而形成了库,有了库我们程序员就可以更好的进行开发软件,然后开发出来的软件再被普通人所使用

对于硬件部分和系统软件部分的交互,我们前面提到了,操作系统是做管理的,何为管理呢?对于程序员而言,管理通过计算机语言的表示方法就是数据结构,大家不妨想一想,我们平常生活所遇到的有关于管理的问题,是不是都可以转化为数据结构的方式来解决呢?我是一个学生,我来举一个有关于学生管理例子:一个学校有十个学院,每个学院有一位院长一百位学生,假设我们的学校就这么单调,没有其他类似辅导员这样的职位,校长是不直接管理我们的,校长吩咐院长来管理学生,院长就要亲力亲为,亲自来管理这些学生,学生的属性都是不同的,但是学生属性的类型都是相同的,他们都有名字、性别、年龄、家庭住址,把学生这个群体定义成一个struct结构体,然后不同的学生填不同的数值,然后按照学号前后以单链表的方式连接起来,这样就把每个学院学生连接起来了,对学生的管理就是对链表的增删查改,校长想要对某个学生进行管理就可以通过院长执行,这里的校长就是操作系统,院长就是驱动程序,而学生就是硬件资源,一个事件可以拆分为决策+执行,操作系统负责决策,驱动程序负责执行,我们刚才的例子对于学生也就是硬件资源就是一个先描述再组织的过程,先将个体描述出来,再将个体组织起来

三、操作系统进程管理

1、概念

进程是正在执行的程序的实例,是操作系统进行资源分配和调度的基本单位,它包含了程序计数器、寄存器、内存空间、打开的文件描述符等运行上下文信息,这些信息共同构成了进程执行的环境

进程是正在执行的程序的实例,程序本身只是存储在磁盘等介质上的一组指令和数据的集合,是静态的,只有当程序被加载到内存中,并由操作系统为其分配资源、创建相应的数据结构来管理其执行时,它才成为一个进程,即变成了一个动态的执行实体

进程是操作系统进行资源分配的基本单位,操作系统需要为每个进程分配独立的资源,包括但不限于内存空间、CPU 时间、文件描述符、网络端口等,每个进程都有自己独立的地址空间,进程在自己的地址空间内可以自由地访问和操作数据,而不会干扰其他进程的地址空间

进程包含了程序执行时的运行上下文信息,运行上下文是指进程在执行过程中所涉及的各种状态和数据,主要包括程序计数器、寄存器状态、堆栈信息、内存管理信息等,程序计数器指示了进程下一条要执行的指令地址,寄存器用于临时存储数据和指令操作数等,堆栈用于保存函数调用的相关信息和局部变量等,这些运行上下文信息完整地描述了进程当前的执行状态,当进程被调度暂停或恢复执行时,操作系统需要保存和恢复这些上下文信息,以确保进程能够正确地继续执行

进程是构成操作系统中并发执行环境的基本单元,操作系统通过管理和调度多个进程,实现了多个任务的并发执行,从而提高了系统资源的利用率和系统的整体性能,多个进程之间可以通过各种进程间通信机制进行数据交换和协作,共同完成复杂的系统任务

下图是我们Windows中的进程
在这里插入图片描述
进程粗略来讲就是内核PCB数据结构对象+你自己的代码和数据
记住上面所说的先描述后组织,通过结构体描述进程的属性,然后通过链表组织多个进程

2、PCB和task_struct

进程的所有信息被存放在一个叫做进程控制块的数据结构中,它是进程属性的集合,被称为PCB

Linux操作系统下的PCB就是task_struct,它是一个结构体,被装载到RAM里

以下是task_struct的内容分类,除了这些,还有一些其他信息

内容意义
标示符每个进程的标识符不同
状态任务状态
优先级相对于其他进程的优先级
程序计数器程序中即将被执行的下一条指令的地址
内存指针包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据进程执行时处理器的寄存器中的数据
IO状态显示的IO请求,分配给进程的IO设备和被进程使用的文件列表
记账信息处理器时间总和或使用的时钟数总和或时间限制、记账号等

所有运行在系统里的进程都以task_struct(双向)链表的形式存在内核里

3、查看进程

写一个死循环的程序,方便我们查看进程

在这里插入图片描述
在这里插入图片描述

ps aux | grep process | grep -v grep 查看进程指令

ps aux 会列出系统中所有用户的所有进程的详细信息,grep process 会在 ps aux 输出的所有行中查找包含 process 的行,并将这些行输出,grep 是要排除的模式,由于在执行 grep process 时,这个 grep 命令本身也会作为一个进程被 ps aux 列出,并且会匹配 process,为了避免将 grep process 这个进程本身显示出来,我们使用 grep -v grep 来过滤掉包含 grep 的行

在程序执行过程中会生成一个进程,我们通过查看进程指令,其中第二列就是进程唯一标识PID
在这里插入图片描述

进程重启对应的PID会发生变化,是由于内存重新给它分配的原因
在这里插入图片描述

这里解答一下为什么我们在进行./process的时候会启动可执行文件process:在进程中有一个目录叫做cwd,意味着当前的工作目录,你可以把它想象为一个指针(其实它是一个软链接),指向这个文件所在的目录,所以一个进程在属性中就有一个是当前的工作目录
亦可以看到exe这里指向的是这里的我们正在执行的可执行程序process
在这里插入图片描述

4、通过系统调用fork创建进程

(1)简述

上面的进程是在执行可执行程序的时候程序自动构建的进程,这节我们要通过系统调用fork创建进程

写一个fork创建进程的程序如下test.c,在我们现有的知识体系里,在fork函数自身不出现问题的情况下给到的id值是大于等于0的值,属于双分支结构,即id值要不然就等于0要不然就大于0,不会出现即等于0又大于0的情况,本身两种情况同时出现就是错误的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到结果,两个分支的程序都会执行,就是因为fork这里的原因,生成了子进程,改变了我们对该程序固有的看法,现在我们来研究fork是如何做到的

(2)系统调用生成子进程的过程

〇提出问题

该过程我们可以简化为一个问题:为什么id在等于0的同时又大于0?
id值是从fork函数来的,那么进一步提出问题:fork为什么能产生两个返回值? id为什么能承载两个返回值?

最终我们将目光移动到fork函数身上

①fork函数

fork系统调用用于从一个现有的进程创建一个新的进程,新创建的进程被称为子进程,而原来的进程被称为父进程,子进程是父进程的一个副本,它几乎继承了父进程的所有资源,包括代码段、数据段、堆、栈等,但拥有自己独立的进程控制块(PCB)和进程 ID(PID)

在父进程中,fork返回子进程的 PID,因为父进程可能需要对多个子进程进行管理和控制,所以通过返回的 PID 来标识每个子进程
在子进程中,fork返回 0,这是因为子进程不需要知道父进程的 PID 来进行后续操作,它可以通过getppid函数来获取父进程的 PID
如果fork调用失败,将返回 - 1,并设置errno变量来表示错误原因

②父子进程关系

进程可以粗略表示为代码+数据
当父进程调用fork时,内核会为子进程分配新的 PCB,并复制父进程的大部分资源到子进程中,这包括进程的代码部分
虽然子进程最初复制了父进程的地址空间,但在实际运行中,父子进程的地址空间是相互独立的,如果其中一个进程修改了某些数据,不会影响到另一个进程中的相应区域,这是通过写时复制技术来实现的,即只有当进程试图修改某个数据时,才会真正复制该数据,以节省内存资源,就是说在不修改某些数据的情况下它们指向的是同一块位置,如果子进程或者父进程某些数据要修改,它们会重新开辟一块空间存放该进程的特有数据
fork调用完成后,父进程和子进程就开始并发执行,它们可以各自独立地执行不同的代码路径,也可以通过各种进程间通信机制进行通信和同步,这里就是从fork函数出现之后的代码我们可以把它当做两份,两份代码同时跑,但是id不同,后面执行的效果可能就不同

并且我们可以发现上面的截图父子进程谁先运行是不确定的,这个是由调度器决定的

③解答问题

问:id为什么能承载两个返回值?
答:id变量并不是同时承载两个返回值,而是在不同的执行流(父进程和子进程)中被赋予不同的值,fork函数通过这种方式让父进程和子进程能够区分彼此,并根据返回值执行不同的操作

问:fork为什么能产生两个返回值?
答:父子进程并发执行,每个执行流从fork函数的返回处继续执行,并且根据自身的角色(父进程或子进程)返回不同的值,这样就实现了一个函数调用在两个进程中产生不同返回结果的效果


今日分享就到这里了~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网(IoT)‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术,实时采集并连接任何需要监控、连接、互动的物体或过程,实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…

【背包问题】二维费用的背包问题

目录 二维费用的背包问题详解 总结: 空间优化: 1. 状态定义 2. 状态转移方程 3. 初始化 4. 遍历顺序 5. 时间复杂度 例题 1,一和零 2,盈利计划 二维费用的背包问题详解 前面讲到的01背包中,对物品的限定条件…

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它

据悉折叠手机开创者三星披露了一份专利,通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力,希望通过这种方式进一步增强折叠手机的可靠性和耐用性,来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…

首发!ZStack 智塔支持 DeepSeek V3/R1/ Janus Pro,多种国产 CPU/GPU 可私有化部署

2025年2月2日,针对日益强劲的AI推理需求和企业级AI应用私有化部署场景(Private AI),云轴科技 ZStack 宣布 AI Infra 平台 ZStack 智塔全面支持企业私有化部署 DeepSeek V3/R1/ Janus Pro三种模型,并可基于海光、昇腾、…

25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表

目录 240. 搜索二维矩阵 II题目描述题解 148. 排序链表题目描述题解 240. 搜索二维矩阵 II 点此跳转题目链接 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到…

it基础使用--5---git远程仓库

文章目录 it基础使用--5---git远程仓库1. 按顺序看2. 什么是远程仓库3. Gitee操作3.1 新建远程仓库3.2 远程操作基础命令3.3 查看当前所有远程地址别名 git remote -v3.4 创建远程仓库别名 git remote add 别名 远程地址3.4 推送本地分支到远程仓库 git push 别名 分支3.5 拉取…

SpringBoot 整合 Mybatis:注解版

第一章&#xff1a;注解版 导入配置&#xff1a; <groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version> </dependency> 步骤&#xff1a; 配置数据源见 Druid…

海思ISP开发说明

1、概述 ISP&#xff08;Image Signal Processor&#xff09;图像信号处理器是专门用于处理图像信号的硬件或处理单元&#xff0c;广泛应用于图像传感器&#xff08;如 CMOS 或 CCD 传感器&#xff09;与显示设备之间的信号转换过程中。ISP通过一系列数字图像处理算法完成对数字…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…

SpringBoot 整合 SpringMVC:配置嵌入式服务器

修改和 server 相关的配置(ServerProperties)&#xff1a; server.port8081 server.context‐path/tx server.tomcat.uri‐encodingUTF‐8 注册 Servlet 三大组件&#xff1a;Servlet、Fileter、Listener SpringBoot 默认是以 jar 包的方式启动嵌入式的 Servlet 容器来启动 Spr…

如何实现滑动网格的功能

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverList组件相关的内容&#xff0c;本章回中将介绍SliverGrid组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件&#xff0c;主要用来…

17.[前端开发]Day17-形变-动画-vertical-align

1 transform CSS属性 - transform transform的用法 表示一个或者多个 不用记住全部的函数&#xff0c;只用掌握这四个常用的函数即可 位移 - translate <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta ht…

高清种子资源获取指南 | ✈️@seedlinkbot

在如今的数字时代&#xff0c;高清影视、音乐、游戏等资源的获取方式不断丰富。对于追求高质量资源的用户而言&#xff0c;一个高效的资源分享平台至关重要。而 ✈️seedlinkbot 正是这样一个便捷的资源获取工具&#xff0c;为用户提供高质量的种子资源索引和下载信息。 1. ✈️…

DeepSeek R1安装与使用

DeepSeek R1安装与使用 1、安装 Ollama 如果之前没有安装过 Ollama&#xff0c;先在 Ollama官网 下载对应系统的 Ollama 进行安装。 2、部署 DeepSeek R1 模型 选择需要下载的模型。这里我们选择 deepseek-r1 根据自己机器配置&#xff0c;选择不同参数的模型。这里我们选择…

Van-Nav:新年,将自己学习的项目地址统一整理搭建自己的私人导航站,供自己后续查阅使用,做技术的同学应该都有一个自己网站的梦想

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Van-Nav是一个基于Vue.js开发的导航组件库&#xff0c;它提供了多种预设的样式和灵活的配置选项&#xff0c;使得开发者可以轻松地定制出符合项目需求…

C++ Primer 命名空间的using声明

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Python 中最大堆和最小堆的构建与应用:以寻找第 k 大元素为例

引言 在数据处理和算法设计中&#xff0c;堆&#xff08;Heap&#xff09;是一种非常重要的数据结构。它是一种特殊的完全二叉树&#xff0c;具有高效的插入和删除操作特性&#xff0c;时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)。堆主要分为最大堆和最小堆&#xff0c;…

如果把Linux主机作为路由器转发流量,性能可靠吗?

正文共&#xff1a;666 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 strongSwan是一个开源的基于IPsec的VPN解决方案&#xff0c;我计划是将strongSwan部署在CentOS系统中&#xff0c;但是这中间涉及到一个小问题&#xff0c;那就是strongSwan网关的子网怎么处理&…

Qt Creator 中使用 vcpkg

Qt Creator 中使用 vcpkg Qt Creator 是一个跨平台的轻量级 IDE&#xff0c;做 Qt 程序开发的同学们肯定对这个 IDE 都比较属于。这个 IDE 虽然没有 Visual Stdio 功能那么强&#xff0c;但是由于和 Qt 集成的比较深&#xff0c;用来开发 Qt 程序还是很顺手的。 早期&#xf…

Linux防火墙基础

一、Linux防火墙的状态机制 1.iptables是可以配置有状态的防火墙&#xff0c;其有状态的特点是能够指定并记住发送或者接收信息包所建立的连接状态&#xff0c;其一共有四种状态&#xff0c;分别为established invalid new related。 established:该信息包已建立连接&#x…