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

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

文章目录

    • 一.冯诺依曼体系结构
    • 二.操作系统(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

相关文章:

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

文章目录一.冯诺依曼体系结构二.操作系统(operator system)三.系统调用和库函数四.进程1.进程控制块(PCB)2.查看进程3.系统相关的调用4.fork介绍(并发引入)五.总结一.冯诺依曼体系结构 计算机大体可以说是…...

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

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

关于位运算的巧妙性:小乖,你真的明白吗?

一.位运算的概念什么是位运算?程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。位运算就是直接操作二进制数,那么有哪些种类的位运算呢?常见的运算符有与(&)、或(|)、异或(^)、…...

【Android车载系列】第5章 AOSP开发环境配置

1 硬件支持 建议空闲内存16G以上,同时硬盘400G以上 内存不够可以使用 Linux 的交换分区2 VMware Workstation安装 https://download3.vmware.com/software/wkst/file/VMware-workstation-full-16.1.1-17801498.exe2.1 Ubuntu镜像 http://mirrors.aliyun.com/ubun…...

个人时间管理网站—Git项目管理

🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...

2023最新ChatGPT整理的40道Java高级面试题

2023 年最火的就是 ChatGPT 了,很多同事使用他完成一些代码上的智能提示,也有人使用它发了财《「用ChatGPT年入百万!」各博主发布生财之道,网友:答辩搬运工》、《“躺着就能赚大钱”?ChatGPT火了,有人早就动起坏脑筋》等。 最近我也使用 ChatGPT 写技术文章了,比如:《…...

单机分布式一体化是什么?真的是数据库的未来吗,OceanBase或将开启新的里程碑

一. 数据 我们先说说数据这个东西,这段时间的ChatGPT在全世界的爆火说明了一件事,数据是有用的,并且大量的数据如果有一个合适的LLM大规模语言模型训练之后,可以很高程度的完成很多意想不到的事情。 我们大多数的时候的注意力只…...

100天精通Python丨基础知识篇 —— 03、Python基础知识扫盲(第一个Python程序,13个小知识点)

文章目录🐜 1、Python 初体验Pycharm 第一个程序交互式编程第一个程序🐞 2、Python 引号🐔 3、Python 注释🦅 4、Python 保留字符🐯 5、Python 行和缩进🐨 6、Python 空行🐹 7、Python 输出&…...

springboot逍遥大药房管理系统

084-springboot逍遥大药房管理系统演示录像开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&a…...

ZYNQ中的GPIO与AXI GPIO

GPIO GPIO—一种外设,对器件进行观测和控制MIO—将来自PS外设和静态存储器接口的访问多路复用到PS引脚上处理器控制外设的方法—通过一组寄存器包括状态寄存器和控制寄存器,这些寄存器都是有地址的,通过这些寄存器的读写进行外设的控制sessi…...

接口导入功能

1.接口api export function import(param) { return fetch({ url: XXX.import, method: POST, headers: { Content-Type: multipart/form-data; }, data: param }) } 2.页面vue 和 js逻辑 <el-button :loading"disable&qu…...

网络安全知识点总结 期末总结

1、信息安全从总体上可以分成5个层次&#xff0c;密码技术 是信息安全中研究的关键点。 2、握手协议 用于客户机与服务器建立起安全连接之前交换一系列信息的安全信道。 3、仅设立防火墙系统&#xff0c;而没有 安全策略 &#xff0c;防火墙就形同虚设。 4、应用代理防火墙 …...

linux挂载远程目录

服务端操作 # 1、安装NFS程序 yum -y install nfs* rpcbind,在centos6以前自带的yum源中为portmap。 使用yum安装nfs时会下载依赖&#xff0c;因此只要下载nfs即可&#xff0c;无需再下载rpcbind. # 2、查看是否安装了nfs与rpcbind rpm -qa | grep nfs rpm -qa | grep rpc…...

ChatGPT—初识

ChatGPT初识 由于ChatGPT 注册相关的文章被平台限制了&#xff0c;所以有注册相关的问题可以私聊&#xff0c;或者可以代注册 Chat GPT是一款基于GPT模型的对话型AI模型&#xff0c;能够模拟真实的对话风格和行为方式&#xff0c;让人与AI的交互变得更加自然顺畅。下面将从Chat…...

【ArcGIS Pro二次开发】(18):地理处理工具类【Geoprocessing】补遗

ArcGIS Pro SDK 3.0中的Geoprocessing类是用于执行地理处理工具的核心类。地理处理工具是用于执行空间分析、数据转换、数据管理等任务的工具集&#xff0c;包括常见的空间分析工具、栅格处理工具、矢量处理工具、地图制图工具等。 之前有简单记录了下Geoprocessing工具的用法…...

国产芯片方案——红外测温体温计方案

红外测温体温计采用了热电堆式&#xff0c;利用塞贝克效应&#xff0c;将收集到的红外线光信号转化为电信号&#xff0c;再经过放大等处理&#xff0c;按内部的算法校正后再显示屏幕上输出具体温度值&#xff0c;能快速准确地测量人体体温。红外测温体温计广泛应用于医疗卫生、…...

详解ChatGPT的免费总结插件Glarity

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

RK3588平台开发系列讲解(NPU篇)NPU调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、日志等级二、NPU 支持查询设置项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来看一下NPU的调试方法。 一、日志等级 NPU 的运行库会根据开发板上的系统环境变量输出一些日志信息或者生成…...

基于微信小程序+爬虫制作一个表情包小程序

跟朋友聊天斗图失败气急败坏的我选择直接制作一个爬虫表情包小程序&#xff0c;从源头解决问题&#xff0c;从此再也不用担心在斗图中落入下风 精彩专栏持续更新↓↓↓ 微信小程序实战开发专栏 一、API1.1 项目创建1.2 图片爬虫帮助类1.3 测试窗体1.4 接口封装二、小程序2.1 项…...

TS常用数据类型(TypeScript常用数据类型,ts常用数据类型和js常用数据类型的区别)

简述&#xff1a;TS全称TypeScript&#xff0c;是一门弱类型的语言&#xff0c;可以理解为是 JavaScript 的扩展语法&#xff0c;因此我们可以在 ts 中继续写js代码&#xff0c;且不会报错&#xff0c;而且TypeScript 又叫做静态的JavaScript&#xff0c;可称为静态类型语言&am…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...