当前位置: 首页 > news >正文

【Linux】操作系统进程概念

文章目录

  • 1. 冯诺依曼体系结构
  • 2. 操作系统
  • 3. 进程
    • 进程的基本概念
    • 查看进程和杀死进程
    • 父进程和子进程
    • 通过系统调用创建子进程


1. 冯诺依曼体系结构

冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构

在这里插入图片描述

这里我们来介绍一下组成冯诺依曼体系结构的五个部分:

输入设备:键盘、摄像头、网卡、磁盘等
输出设备:显示器、磁盘、网卡、声卡音响等
存储器:内存(掉电易失)
运算器和控制器:CPU

关于冯诺依曼,我们必须强调几点:

  • 这里的存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

我们知道,我们的数据需要先从磁盘加载到内存中,然后由CPU读取并进行计算,将计算的结果再次加载到内存中,最后再由内存写入磁盘,通过输出设备将数据交给我们。那么,为什么CPU为什么不能直接访问外设呢?

其实原因也很简单,输入输出设备称之为外围设备,外设一般是很慢的,比如说磁盘,相对于内存,他的速度是非常慢的,但CPU的计算速度确是非常快的。就好比从磁盘的读取速度很慢,但是CPU的计算速度却很快,但是整体的速度还是以磁盘的读取速度为主的,所以整体效率就以外设为主。

所以在这里得出了两个结论:

  • 在数据层面上,一般CPU不和外设直接沟通,而是直接和内存打交道。
  • 在数据层面上,外设指挥和内存打交道。

所以说,程序的运行必须加载到内存中,因为CPU想要执行我们的程序,访问我们的数据,就必须从内存中读取,这是冯诺依曼体系结构规定的。

💕 那么,在硬件层面,单机和跨主机之间的数据流是如何流向的呢?

对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,那么,当你从登录上qq开始和某位朋友聊天开始,整个信息是如何在体系结构中流动的?

在这里插入图片描述

当我和我的朋友同时打开QQ时,我们的QQ其实已经被加载到内存中了,然后当我们在对话框中输入消息时,我们的数据已经被输入到内存中了,下面我们的数据在内存中被加密计算,计算完之后将数据返回到内存,然后显示到输出设备,也就是我们的显示器和网卡上,这时我们就可以在显示器上看到我们所发送的消息了。

紧接着,我们的数据还会通过网卡输入到对方的电脑上,对方通过网卡接收到数据后,加载到内存中,然后通过CPU将数据进行解密操作并写回内存,最后通过输出设备显示到对方的显示器上。


2. 操作系统

操作系统是一款进行软硬件资源管理的软件,在这里我们先来解释一下,为什么操作系统要对软硬件进行管理呢?

其实是因为,操作系统对下要管理好软硬件资源,对上需要给用户提供良好(安全、稳定、高效、功能丰富等)的执行环境。

那么我们应该如何理解操作系统对硬件做管理呢?其实,管理的本质就是对数据进行管理,管理的方法是:先描述、后组织。

💖 管理的本质是对数据进行管理

对于这一点,我们应该如何理解呢?我们可以以学校为例:假设学校只有校长、辅导员和学生。那么在这里,校长就是我们的管理者,同时也是做决策的人,而辅导员呢就是执行者,最后辅导员把决策交给我们学生,学生才是真正的被管理者。
因为管理的本质就是数据进行管理,但在这里我们需要考虑的是,管理者是如何拿到被管理者的数据的呢?就好比说,校长是如何拿到我们学生的数据的呢?其实也很简单,通过辅导员拿到的了。而校长只要管理好我们学生的这些数据,就能将学生管理起来了,所以管理的本质就是对数据做管理。

在这里插入图片描述

💕 管理的方法是先描述、后组织

这里我们可以想一下,学校的学生那么多,校长是如何管理的呢?这里我们提出了一种方法,叫做 ‘先描述、后组织’,先描述,就好比先将将被管理者的数据抽象成一个结构体(类),后组织,就是使用各种数据结构将数据管理起来,这里我们可以先将学生的各种信息定义一个结构体,然后,将学生们通过链表链接起来,那么现在对学生数据做管理就变成了,对链表的管理。

当然了,对应到我们的计算机中,操作系统就相当于我们的管理者,而硬件驱动就相当于我们的执行者,而硬件(软件)就是我们被管理者

当然了,我们的操作系统也是不相信任何人的,为了保护操作系统不受到任何的侵害,但是又必须又必须给上层用户提供服务,在用户和操作系统之间有一层系统调用接口,但由于系统调用接口的使用成本很高,所以相关人员就在系统调用上面进行了二次软件开发,例如:图形化界面、shell和工具集等。

系统调用和库函数:

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

计算机的体系结构图

在这里插入图片描述


3. 进程

进程的基本概念

进程 在课本中的描述一般为:程序的一个执行实例,正在执行的程序或者是一个程序运行起来(程序被加载到内存)就是进程,进程的内核观点是担当分配系统资源(CPU时间,内存)的实体。但是这些概念都很肤浅,我们应该如何去描述一个进程呢?

💕 描述进程

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

当我们把多个程序加载到内存中时,操作系统会对这些程序进行先描述,后组织。那么操作系统是如何对我们的程序进行描述和组织的呢?

我们将写好的代码编译链接形成可执行程序存放在磁盘上,然后我们运行这个程序时,需要先将这个程序加载到内存中,然后通过CPU进行运算。当我们的程序加载到内存中时,操作系统会对我们的程序进行管理,对程序的管理方法我们在上面也提及到了:先描述,在组织

在这里插入图片描述

操作系统在对我们的进程进行先描述,后组织的时候,会先将我们的程序的共有属性创建一个结构体,然后对我们的每一个进程创建一个结构体对象,这就是先描述的过程。接下来我们的操作系统会使用特性的数据结构(比如链表)将我们的结构体对象组织起来,这就是后组织的过程。然后我们的操作系统对进程的管理就会转换成对特定数据结构的管理。当然了,这个描述和组织进程的东西就被称为进程控制块(PCB)。

所以,在这里我们也引出了进程真正的概念:进程=内核关于进程的相关数据结构+当前进程的代码和数据

进程控制块(PCB) 是我们操作系统用来描述进程的工具,他包含了进程属性的集合。在Linux中描述进程的结构体叫做task_struct。他是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

下面我们看一下task_ struct内容分类:

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

查看进程和杀死进程

💕 查看进程

再查看进程之前我们需要先创建写一段普通的C语言代码:

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

查看进程有两种方式,这里我们先来讲解第一种:

ps ajx | head -1 && ps ajx | grep '进程名' 

当然了我们需要先将我们的程序运行起来:

在这里插入图片描述

这里我们还可以看到在我们的myproc进程的下面还有一个grep进程,这是因为grep指令也是一个进程,进程在调度的时候是具有动态属性的。这里我们还需要解释一个概念那就是PIDPPID的概念,操作系统里指进程识别号,也就是进程标识符操作系统里每打开一个程序都会创建一个进程ID,即PID。 当然了,PPID就是父进程的进程ID号。

查看进程的第二种方式:通过查看进程目录 ls /proc 来查看进程

在这里插入图片描述

当然了我们还可以直接到==/proc/进程pid==目录下去查看进程对应的可执行程序。

在这里插入图片描述

💕 杀死进程

我们要结束我们的进程可以有两种方法:直接按ctrl+c结束进程或者杀死进程。杀死进程需要的命令是:kill -9 进程标识符

在这里插入图片描述


父进程和子进程

上面我们已经介绍了父进程和子进程有各自的进程ID,但是究竟什么是父进程呢?什么又是子进程呢?其实,我们平常所写的进程都是由bash这个父进程来创建的,bash其实就是shell外壳,shell为了防止自身奔溃,一帮会通过派生子进程的方式去执行我们的指令。

我们可以通过getpidgetppid函数来获取当前进程的ID和当前进程父进程的ID。下面我们来看一下这两个函数:

在这里插入图片描述

这里我们修改一下我们的程序,看一下父进程和子进程的ID:

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

如果我们把我们的程序终止掉,然后再次运行的时候,就会发现子进程的ID一直在变,而父进程的ID却不变。那么我们现在来看一下这个父进程究竟是什么

在这里插入图片描述

这是我们就可以恍然大悟了,原来该父进程就是bash,bash通过创建子进程的方式来运行我们的程序,那么shell是如何创建子进程的呢?下面就让我们来认识一下如何创建子进程。


通过系统调用创建子进程

我们先通过 man fork 来认识一下fork函数:

在这里插入图片描述

fork函数的返回值是fork函数的重点,如果子进程创建成功,fork函数给父进程返回子进程的id,给子进程返回0,如果子进程创建失败将会给父进程返回-1。

这里我们先修改一下我们的代码:

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

但是这个代码为什么可以既执行if里面的语句,又可以执行if else里面的代码呢?

结论:

  • fork之后,执行流会变成2个执行流。
  • fork之后,谁先运行由调度器决定。
  • fork之后的代码共享,通常通过ifelseif来进行执行流分流。

下面我们再来看一个更离谱的事情,我们将代码中的内容做出如下修改:

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

以上问题我们都可以归结为三点:

  • fork做了什么?
  • fork是如何看待代码和数据的?
  • fork如何理解两个返回值问题?

💕 fork做了什么?

子进程会创建一份独立的pcb结构,但子进程的pcb的大部分属性都是以父进程为模板进行拷贝的,当然了对于PID和PPID这些值是不能拷贝的。

在这里插入图片描述

💕 fork是如何看待代码和数据的?

进程在运行的时候,是具有独立性的,当然父子进程再运行的时候也是具有独立性的,如果我们父子进程同时运行但我们把其中任意一个进程杀死后,并不会影响另一个进程。当然如果父子进程中有相同的变量,但我们修改父进程或子进程中的任意一个数据时,操作系统会在当前进程中触发写时拷贝

💕 fork是如何理解两个返回值问题的?

在这里插入图片描述

当我们的函数执行return功能之前其实函数中的主体部分就已经完成了,但是return也是一条语句,在这之前子进程已经被创建,甚至可能已经被调度,我们在执行return时,父进程可以被调度执行一次,而子进程也有它的执行流,所以return也会被调度执行一次。所以一条return就被执行了两次,好像让我们看到了两个返回值。


相关文章:

【Linux】操作系统进程概念

文章目录1. 冯诺依曼体系结构2. 操作系统3. 进程进程的基本概念查看进程和杀死进程父进程和子进程通过系统调用创建子进程1. 冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯诺依曼提出了计算…...

C语言const的用法详解

有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定:constin…...

Day886.MySQL的“饮鸩止渴”提高性能的方法 -MySQL实战

MySQL的“饮鸩止渴”提高性能的方法 HI,我是阿昌,今天学习记录的是关于MySQL的“饮鸩止渴”提高性能的方法的内容。 不知道在实际运维过程中有没有碰到这样的情景: 业务高峰期,生产环境的 MySQL 压力太大,没法正常响…...

08- 数据升维 (PolynomialFeatures) (机器学习)

在做数据升维的时候,最常见的手段就是将已知维度进行相乘(或者自乘)来构建新的维度 使用 np.concatenate()进行简单的,幂次合并,注意数据合并的方向axis 1 数据可视化时,注意切片,因为数据升维…...

2023备战金三银四,Python自动化软件测试面试宝典合集(二)

马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.24应聘岗位:数字芯片设计工程师笔试时长:90min笔试平台:nowcoder牛客网题目类型:单选题(18道)、不定项选择题(22道)题目评…...

WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了

背景 WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了;开启了腾讯云验证码防火墙但APPID,APPSecret没配置,结果在退出登录后,由于验证码验证失败管理端进不去了 提示如下:...

自动驾驶感知——毫米波雷达

文章目录1. 雷达的基本概念1.1 毫米波雷达分类1.2 信息的传输1.3 毫米波雷达的信号频段1.4 毫米波雷达工作原理1.4.1 毫米波雷达测速测距的数学原理1.4.2 毫米波雷达测角度的数学原理1.4.3 硬件接口1.4.4 关键零部件1.4.5 数据的协议与格式1.5 车载毫米波雷达的重要参数1.6 车载…...

取电芯片全协议都可兼容

乐得瑞PD协议芯片/PD取电芯片/PD受电端协议芯片 支持5/9/12/15/20v定制 1、概述 LDR6328S 是乐得瑞科技有限公司开发的一款兼容 USB PD、QC 和 AFC 协议的 Sink 控制器。 LDR6328S 从支持 USB PD、QC 和 AFC 协议的适配器取电,然后供电给设备。比如可以配置适配器输…...

自己总结优化代码写法

jdk1.7新特性详解 开发期间略知jdk1.7的一些特性,没有真正的一个一个得展开研究,而是需要说明再去查,导致最整个新特性不是特别的清楚,这种情况以后得需要改变了,否则就会变成代码的奴隶。现在正好有时间可以细细的研…...

Java体系最强干货分享—挑战40天准备Java面试,最快拿到offer!

如何准备java面试,顺利上岸大厂java岗位? 主攻Java的人越来越多,导致行业越来越卷,最开始敲个“hello world”都能进大厂,现在,八股、全家桶、算法等等面试题横行,卷到极致!就拿今年…...

云计算|OpenStack|错误记录和解决方案(不定时更新)

前言: openstack的部署和使用是难度比较大的,难免会出现各种各样的问题,因此,本文将把一些在部署和使用openstack社区版时出现的错误做一个记录,并就每一个错误分析和解决问题。(尽量记录比较经典的错误&a…...

项目实战-NewFixedThreadPool线程池

目录 什么是线程池 线程池的类型 1.CachedThreadPool 2.FixedThreadPool 3.ScheduledThreadPool 4.SingleThreadPool 5.newWorkStealingPool 线程池的好处 1、线程池的重用 2、控制线程池的并发数 3、线程池可以对线程进行管理 线程池的示例 1.Client启动类 2.具体…...

导数与微分总复习——“高等数学”

各位CSDN的uu们你们好呀,今天,小雅兰来复习一下之前学过的知识点,也就是导数与微分的总复习,依旧是高等数学的内容,主要是明天就要考高等数学了,哈哈哈,下面,让我们一起进入高等数学…...

Linux软件安装

1.Linux安装JDK 1.安装位置 /opt 2.安装包 jdk-8u171-linux-x64.rpm 3.安装步骤 1.将安装包上传到虚拟机中 [rootlocalhost opt]# ls jdk-8u171-linux-x64.rpm2.执行安装命令 [rootlocalhost opt]# rpm -ivh jdk-8u171-linux-x64.rpm 准备中... #####…...

【表面缺陷检测】基于YOLOX的PCB表面缺陷检测(全网最详细的YOLOX保姆级教程)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 Hello,大家好,我是augustqi。 今天给大家分享一个表面缺陷检测项目:基于YOLOX的PCB表面缺陷检测(保姆级教程)。多的…...

【C#基础】C# 程序基础语法解析

序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结 文章目录前言基础语法1. using 关键字2. namespace 关键字3. class 关键字4. 成员字段5. 成员方法6. Main 方法7. new 关键字8. 标识符9. 关键字结语前言 😄 大家好,我是writer桑&…...

【webpack】webpack 中的插件安装与使用

一、webpack 插件的作用 通过安装和配置第三方的插件,可以拓展 webpack 的能力,从而让 webpack 用起来更方便。最常用的 的webpack 插件有如下两个: 1.webpack-dev-server(实时打包构建) 类似于 node.js 阶段用到的 no…...

生物素-磺基-活性酯,Sulfo-NHS Biotin科研用试剂简介;CAS:119616-38-5

生物素-磺基-活性酯,Sulfo-NHS Biotin 结构式: ​ 编辑 添加图片注释,不超过 140 字(可选) 英文名称:Sulfo-NHS-Biotin Sulfosuccinimidyl biotin 中文名称:磺酸基-Biotin-N-琥珀酰亚胺基酯 CAS&…...

Debain安装命令

目录 一、安装sudo命令 二、安装jdk8 三、更换软件源 四、Debian 安装 yum 五、安装zip、unzip、curl、lrzsz、NUMA 六、安装Maven 五、问题 一、安装sudo命令 1)执行sudo命令,提示 -bash: sudo: command not found的解决方法 apt-get install s…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: ‌问题原因‌: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...