冯诺依曼,操作系统以及进程概念

文章目录

    • 一.冯诺依曼体系结构
    • 二.操作系统(operator system)
    • 三.系统调用和库函数
    • 四.进程
      • 1.进程控制块(PCB)
      • 2.查看进程
      • 3.系统相关的调用
      • 4.fork介绍(并发引入)
    • 五.总结

一.冯诺依曼体系结构

计算机大体可以说是由五个硬件组成:存储器,运算器,控制器,输入设备,输出设备

存储器又分为内存(掉电易失)和外存(永久性存储),所谓外存就是除内存以外具有永久性存储能力的存储设备(最常见的是磁盘)

运算器和控制器共同组成了中央处理器,也就是CPU

除此之外电脑中还存在一些输入输出设备,比如:网卡,磁盘等

在冯诺依曼中所说的存储器就是内存

冯诺依曼体系规定了这五个硬件之间是如何进行数据交流的:

在这里插入图片描述

通过观察发现,在数据层面上CPU只和内存打交道。

CPU是所有设备中最快的,而输入设备和输出设备作为外设来说是最慢的。如果每次CPU读取/写入数据都要和外设打交道,那么计算机的效率就是以外设作为基准了,因为CPU要等外设将数据拿出/载入,这也极大的浪费了CPU的性能。

越快的东西造价越高,为了不让计算机的价格太高,于是就在CPU和外设之间引入了内存(主存和高速缓存)。

在这里插入图片描述

让CPU只和内存打交道,那么整机的效率就由内存决定。内存比CPU要慢,但是比外设要快的多。

对所谓的打交道更详细点说就是:主存从磁盘读取数据并加载到L3高速缓存,L3到L1高速缓存逐级向上加载读取数据,最后将数据加载到寄存器中,CPU再到寄存器中读取数据。

以后聊天别发在吗,因为这个在吗要从你的键盘到你的内存如然后还要到你的CPU,最后到你的网卡和显示器,再到我的网卡我的内存我的CPU,最后到我的显示器。太麻烦了,这边建议先叫老公(斜眼笑)

到这里我们可以得到第一个结论:为了提高整机效率,CPU只和内存打交道


我在程序中写了一个printf("hello world\n");于是屏幕上就输出了hello world,是因为我将打印hello world的指令写好点击运行加载到程序以后CPU从内存中读取到这个指令去帮我执行屏幕上才会输出hello world。

也就是说CPU不是天然就有数据的,CPU其实很笨它只会被动的执行我的指令或者操作系统的指令。那么要执行指令,CPU就要认识指令。在CPU内部有它自己的指令集,我写好程序以后这个程序要经过汇编等步骤生成可执行文件本质是将我所写的指令翻译成CPU所认识指令。

二.操作系统(operator system)

操作系统是一个做软硬件资源管理(进程管理,文件管理,内存管理,驱动管理)的软件对下管理好软硬件(手段),对上提供良好的(稳定的,安全的,高效的)运行环境。


我们首先来理解一下什么是管理,当我们上了大学以后发现平常根本见不到校长,可是校长也能把学校管理好(没倒闭就是管理好了),对于你个人来说,校长怎么知道你给你评三好学生还是要勒令你退学呢?是因为大家的学校都有教务系统,你的一切信息都会在教务系统中实时更新。校长手握教务系统就可以知道你每个学期的成绩,你的综合表现。所以校长知道能知道是否要给你颁奖等。可以从上面的例子中知道,校长能管理好这个学校的根本原因是因为校长能一直拿到这个学校所有学生的数据。

这里可以得到第二个结论:管理的本质就是对数据的管理

那么我的数据在教务系统中肯定不是以Excel表格的形式呈现的,因为Excel在面临几万项数据时会变得十分的难处理。

虽然我们每个人都是独一无二的,但是我们有共同的属性比如我们都有自己的姓名,家庭住址,电话号码等。也就是说我们的个人数据可以抽象为一个结构体或者类,只要使用特定的数据结构将这些结构体或者类管理起来,就能大大的减少管理的成本。

通过抽象描述和数据结构的组织,最终对我们每个人数据的管理就变成了对结构体或者类的管理,这也就为什么说面向对象是进步的表现。

这里可以得到第三个结论:管理的方法是先描述再组织

我是一个low炮,二十门考试挂了十八门,然后校长决定把我勒令退学。校长根据我的数据做了决策(将我退学),这时就需要有一个人执行校长所做的决策(帮我办理退学手续),这个人就是执行者,而我作为被管理者只能说好吧那我走。

也就是说:在管理者和被管理者之间还有一个执行者,管理者根据数据做决策,执行者更具决策做执行。

电脑是由各种遵循冯诺依曼体系结构的硬件组成的,操作系统是管理硬件的软件,也就是对于硬件来说操作系统就是管理者,那么还需要有一个执行者将管理者做的决策去执行这个决策,最后再收集被管理在这个决策下的数据交给管理者。对于硬件来说,这个执行者就是驱动。

那么到这里我们应该有一个这样的模型:

在这里插入图片描述

这就完了吗?肯定没有啊,回想一下我们在学习语言的时候,是不是第一步永远是敲hello world,咔一下这个hello world就打到显示器上了,是因为CPU帮我执行了打印的指令。CPU能执行我的指令不但是因为CPU认识我的指令,更是因为操作系统提供了系统调用的接口。

三.系统调用和库函数

操作系统作为计算机运行的根基,其中的数据是不能被随便更改的。也就是说操作系统并不能相信任何人(就怕群众里面有坏人),但是操作系统又必须要给用户服务。

所以操作系统为了保护自己和服务用户,就将自己封装起来通过给用户提供系统调用的接口来服务用户。为了给我们二次开发提供便利,大佬们就围绕系统调用创造了库函数。这些库函数帮我们去调用了系统调用,所以我们直接咔一个printf("hello world");显示器上就打印了一个hello world。

那么到现在这个结构就能完全展现出来了:

在这里插入图片描述

可以看到虽然我们好像在做开发,但其实也是在用户层面做开发。

四.进程

操作系统是管理软硬件资源的软件,经过前面的学习我们已经知道操作系统通过驱动收集的数据对硬件做管理。一个程序想要运行就必须要加载到内存中,而在内存中的程序就是进程,所以操作系统通过对进程的管理来达到管理软件的目的。

1.进程控制块(PCB)

电脑一开机就会有程序被加载到内存中,这些是维护电脑本身所需要的,此外我们还会打开很多程序,也就是说在绝大多数情况下,进程的数量总是超过CPU的。

这就会导致一个CPU往往想要处理多个进程,虽然我们所写的程序本身又不具备进程属性,但一旦加载到内存中成为了进程,操作系统为了管理好进程,就会采用先描述再组织的方法给进程建立进程控制块并用合适的数据结构将这些进程控制块给管理起来。

进程控制块就是进程属性的集合,在Linux下叫做struct task_struct,在Windows下叫PCB。操作系统通过对进程控制块做管理来达到对进程做管理的目的。

总结:struct task_struct内核结构体->内核task_struct对象->将该结构和代码关联

进程=内核数据结构+对应的磁盘代码

2.查看进程

查看进程的指令为ps ajx(查看所有进程)

写一个如下的简单程序:

在这里插入图片描述

当我在Linux下执行该程序以后,使用ps ajx|head -1 &&gerp 'proc'就可以查看到进程proc并且可以清楚的知道有关proc的每一项属性代表的是什么意思

在这里插入图片描述

那么如果我不想该进程在我的机器上继续运行了就可以使用kill -9+pid杀掉进程
在这里插入图片描述

如果在前面的学习过程中你有学过一些退出的骚操作,那么就可能会导致你的部分程序或者工具只是把它放在了后台并没有真正的结束掉这个进程或者工具,这就会导致你的服务器越来越卡。到今天你就可以使用ps ajx查看所有的进程并使用kill -9+ pid杀掉进程


当我的程序加载到内存中后,就成为了进程,这个进程从启动到终止可能中间有很长的一段时间,这就是为什么说进程具有动态属性。

也就是说进程在调度运行的时候,进程就具有动态属性。

3.系统相关的调用

地址是一块空间的唯一标识符,而进程的唯一标识就是id,使用getpid这个系统调用函数就可以拿到相关进程的id

在这里插入图片描述

接下来修改一下process.c在其中加入getpid函数

在这里插入图片描述

在这里插入图片描述

在Linux当中其实存在者一种特殊的目录,即内存级目录,这种目录都是以数字为名存放的都是进程的id

在这里插入图片描述

下面来证明一下这种数字文件是代表的是进程的id:

当我的程序在运行的时候我可以找到这个程序对应的id文件

在这里插入图片描述

当我杀掉这个程序以后,这个id文件就不存在了

在这里插入图片描述

到这里我们可以得到这样一个结论:在Linux下进程可以被当作一个文件来看待

拓展

当一个程序被加载到内存以后,这个程序就成为了进程。那么这个进程是否还要依赖本地的磁盘文件呢?下面我做一个实验

1.运行proc并找到这个程序的进程文件
在这里插入图片描述

可以发现这里有一个exe文件,这个exe文件就是pro可执行程序

2.将proc文件删除

在这里插入图片描述

当我执行rm proc指令删除掉了本地磁盘种对应的proc文件以后,虽然这个可执行文件开始警告,但是这个进程仍然在运行

所以可以得到这样一个结论,当一个程序被加载到内存以后,理论上这个进程就和对应的文件没关系了

4.fork介绍(并发引入)

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

fork是一个创建子进程的函数,它有两个返回值,对于子进程来说它的返回值是零,对于父进程来说它的返回值是子进程的pid

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

根据运行结果可以看到确实有两个proc进程,其中一个的ppid正好是另外一个的pid

而且子进程和父进程共同执行了fork后面的所有语句,也就是说fork后面的所有代码是子进程与父进程共享的

既然fork有两个返回值,那我们就可以通过以fork返回值作为条件来让父子进程分别执行不同的代码,这就是所谓并发。

在这里插入图片描述

让子进程休眠一秒,父进程休眠两秒,也就是当子进程打印两句时子进程打印一句

在这里插入图片描述

根据结果发现,在同一个程序中同时运行了两个死循环。这在我们以前是想都不敢想的,这就是子进程被创建的作用之一。

此外,我们还可以发现在子进程的父进程也有自己的父进程,并且这个父进程叫做bash。

bash就是Linux系统的内核,在我们启动Linux操作系统时这个bash就被加载了,此后我们所有的指令都是由bash创建的子进程来运行的。我们与bash交互,bash帮我们和操作系统交互。

总结一句话,fork()之后,会有父进程+子进程两个进程在执行后续代码,fork()后续的代码,被父子进程共享,通过返回值不同,让父子进程执行共享代码的一部分,这就是并发式编程

五.总结

1.CPU不直接和外设打交道,只和内存直接打交道,这样可以提高整机效率。

2.操作系统是一个对软硬件资源进行管理的软件。

3.管理的本质是对数据的管理,管理的方法是先描述再组织

4.操作系统不相信任何人,它对外表现为一个整体,通过提供系统调用接口来服务用户。

5.进程=内核数据结构+对应的磁盘代码

6.fork之后的代码由父子进程共享,通过返回值的不同让父子进程各执行共享代码的一部分就叫做并发式编程。


最后,我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2ejhnfpfr8e8w

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

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

相关文章

MD5加密竟然不安全,应届生表示无法理解?

前言 近日公司的一个应届生问我,他做的一个毕业设计密码是MD5加密存储的,为什么密码我帮他调试的时候,我能猜出来明文是什么? 第六感,是后端研发的第六感! 正文 示例,有个系统,前…

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好,今天和各位分享一下深度强化学习中的近端策略优化算法(proximal policy optimization,PPO),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://gith…

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器,可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点:多种信号类型:泰克信号发生器可以产生多种类型的电子信号,包括正弦波、方波、三角波、脉冲等…

TitanIDE:云原生开发到底强在哪里?

原文作者:行云创新技术总监 邓冰寒 引言 是一种新的软件开发方法,旨在构建更可靠、高效、弹性、安全和可扩展的应用程序。与传统的应用程序开发方式不同,云原生是将开发环境完全搬到云端,构建一站式的云原生开发环境。云原生的开…

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波,且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码: bsp_advance_tim.c /********************************************************************************* fi…

【YOLO】YOLOv8训练自定义数据集(4种方式)

YOLOv8 出来一段时间了,继承了分类、检测、分割,本文主要实现自定义的数据集,使用 YOLOV8 进行检测模型的训练和使用 YOLOv8 此次将所有的配置参数全部解耦到配置文件 default.yaml,不再类似于 YOLOv5,一部分在配置文件…

Anaconda 的安装配置及依赖项的内外网配置

在分享anaconda 的安装配置及使用前,我们必须先明白anaconda是什么;Anaconda是一个开源的Python发行版本。两者区别在于前者是一门编程语言,后者相当于编程语言中的工具包。 由于python自身缺少numpy、matplotlib、scipy、scikit-learn等一系…

Java中的深拷贝和浅拷贝

目录 🍎引出拷贝 🍎浅拷贝 🍎深拷贝 🍎总结 引出拷贝 现在有一个学生类和书包类,在学生类中有引用类型的书包变量: class SchoolBag {private String brand; //书包的品牌private int size; //书…

7.网络爬虫—正则表达式详讲

7.网络爬虫—正则表达式详讲与实战Python 正则表达式re.match() 函数re.search方法re.match与re.search的区别re.compile 函数检索和替换检索:替换:findallre.finditerre.split正则表达式模式常见的字符类正则模式正则表达式模式量词正则表达式举例前言&…

2022财报逆转,有赞穿透迷雾实现突破

2022年,商家经营面临困难。但在一些第三方服务商的帮助下,也有商家取得了逆势增长。 2023年3月23日,有赞发布2022年业绩报告,它帮助许多商家稳住了一整年的经营。2022年,有赞门店SaaS业务的GMV达到425亿元&#xff0c…

24万字智慧城市顶层设计及智慧应用解决方案

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。部分资料内容: 4.8 机房消防系统 4.8.1消防系统概况 根据本工程机房消防系统的特殊要求,整个消防系统由火灾报警系统、消防联动系统和气体灭火系统三部…

常见的嵌入式微处理器(Micro Processor Unit,MPU)

嵌入式微处理器是由通用计算机中的CPU演变而来的。它的特征是具有32位以上的处理器,具有较高的性能,当然其价格也相应较高。但与计算机处理器不同的是,在实际嵌入式应用中,只保留和嵌入式应用紧密相关的功能硬件,去除了…

医院陪诊系统源码,可以提供新的就医方式

随着人们生活水平的提高和医疗服务的进步,越来越多的人们开始注重家庭健康和医疗保健。在这个背景下,陪护系统和医院陪诊系统应运而生,成为了现代医疗服务领域中的重要组成部分。 陪护系统是一种为患者提供家庭养护服务的机构,它…

“蓝桥杯”递推和递归(一)——取数位

1. 算法简介 递推和递归虽然叫法不同,但它们的基本思想是一致的,在很多程序中,这两种算法可以通用,不同的是递推法效率更高,递归法更方便阅读。 (1)递推法 递推法是一种重要的数学方法&#…

【PC自动化测试-4】inspect.exe 详解

1,inspect.exe图解" 检查 "窗口有几个主要部分:● 标题栏。 显示" 检查 HWND (窗口句柄) 。● 菜单栏。 提供对 检查功能 的访问权限。● 工具 栏。 提供对 检查功能 的访问权限。● 树视图。 将 UI 元素的层次结构呈现为树视图控件&…

【超好懂的比赛题解】暨南大学2023东软教育杯ACM校赛个人题解

title : 暨南大学2023东软教育杯ACM校赛 题解 tags : ACM,练习记录 date : 2023-3-26 author : Linno 文章目录暨南大学2023东软教育杯ACM校赛 题解A-小王的魔法B-苏神的遗憾C-神父的碟D-基站建设E-小王的数字F-Uziの真身G-电子围棋H-二分大法I-丁真的小马朋友们J-单车运营K-超…

JavaScript实现列表分页(小白版)

组件用惯了,突然叫你用纯cssJavaScript写一个分页,顿时就慌了。久久没有接触js了,不知道咋写了。本文章也是借与参考做的一个demo案例,小白看了都会的那种。咱们就以ul列表为例进行分页: 首先模拟的数据列表是这样的&a…

变量的理论分布模型

二项分布 定义 对立事件的总体分布,称为二项分布。 例如,一个群体只有男和女,现在进行n次随机抽样调查,随机抽样男出现的次数可能是0,1,2,3,4,…,n, 这种类…

网络安全实战从 0 到 1 彻底掌握 XXE

0x01 什么是 XXE个人认为,XXE 可以归结为一句话:构造恶意 DTD介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞。既然能插入 XML 代码,那我们肯定不能善罢甘休…

ROS Cartographer--Algorithm

ROS Cartographer–Algorithm 原文:Algorithm walkthrough for tuning 论文地址(Google Search):Real-Time Loop Closure in 2D LIDAR SLAM ROS Cartographer的完整参考文件:Cartographer ROS Integration 概述 本地SLAM通常由前端和后端…