【操作系统】从操作系统底层出发,成为更好的程序员

news2024/12/29 13:20:32

冯老爷子的模型

首先,我们从一个问题开始( ̄∇ ̄)/

为什么需要程序员?

早期的计算机程序是硬件化的,即使用各种门电路组装出一个固定的电路板,这个电路板只能用于执行某个特定的程序,如果需要修改程序功能,就要新组装一个电路板。而一位叫做冯诺依曼的老爷子的出现,提出了一种指令数据化的思想,使得程序和数据一样,可以存储起来,组合调用,至此,程序脱离了电路板的桎梏,成为了可以人为组合的指令集,程序员应运而生。

当然,我们需要郑重地介绍下这位冯老爷子

约翰·冯·诺伊曼(德语:John von Neumann,德语发音:[joːn.fɔn.ˈnɔɪ̯man],英语发音:/dʒɒn.vɒn.ˈnɔɪmən/,1903年12月28日—1957年2月8日),原名诺依曼·亚诺什·拉约什(匈牙利语:Neumann János Lajos,匈牙利语发音:[ˈnɒjmɒn ˈjaːnoʃ ˈlɒjoʃ]),出生于匈牙利的美国籍犹太人数学家,理论计算机科学与博弈论的奠基者,在泛函分析、遍历理论、几何学、拓扑学和数值分析等众多数学领域及电脑科学、量子力学和经济学中都有重大贡献。 —— 维基百科

冯诺伊曼计算机模型

冯·诺伊曼结构/计算机模型(英语:Von Neumann architecture),也称冯·纽曼模型(Von Neumann model)或普林斯顿结构(Princeton architecture),是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。本词描述的是一种实作通用图灵机的计算装置,以及一种相对于平行计算的序列式架构参考模型(referential model)。 —— 维基百科

冯诺依曼计算机模型(von Neumann architecture)是一种计算机硬件结构,在这种结构中,程序指令和数据共用同一块存储器,并通过控制单元来管理这些数据和程序指令的执行。这个模型是20世纪40年代由物理学家冯诺依曼(John von Neumann)提出的,至今仍然是计算机设计的主流模型。冯诺依曼结构的灵魂在于其思想减少了硬件的连接,导致硬件与软件的分离,即我们可以分别设计硬件与软件,

冯诺依曼计算机模型由五个部分组成:

  1. 运算器(Arithmetic and Logic Unit,ALU):负责执行各种算术和逻辑运算,例如加减乘除、与或非等运算。

  2. 控制器(Control Unit,CU):负责控制程序执行的流程和计算机硬件的操作,管理指令和数据的读写操作,指挥各种器件进行计算。

  3. 存储器(Memory):用于存储数据和程序指令。在冯诺依曼计算机模型中,存储器以线性地址方式编址,在同一块存储器内含有数据和指令两部分,程序指令和数据共享同样的物理存储器。

  4. 输入设备(Input Devices):用于向内部设备输入数据,例如键盘、鼠标等。

  5. 输出设备(Output Devices):用于向外部设备输出数据,例如显示器、打印机等。

 冯诺依曼计算机模型的优点在于它的简单性灵活性,由于指令和数据共用同一块存储器,并且程序可以通过更改存储器中的指令来修改计算机的行为,使得程序可以随意修改,更加灵活。这个模型随着计算机技术的不断发展得到不断完善,并且被广泛应用在现代计算机的设计中。

在冯诺依曼计算机模型中, 运算器(Arithmetic and Logic Unit,ALU)和控制器(Control Unit,CU)组成了CPU,负责执行各种算术和逻辑运算,并管理指令和数据的读写操作,指挥各种器件进行计算;存储器即内存,则是计算机中用于存储指令和数据的设备,接下来我们就介绍下CPU和内存这两大核心

CPU

CPU指令结构

CPU的内部结构

  • 控制单元

  • 运算单元

  • 数据单元

CPU缓存结构

说到CPU不得不提的就是著名的摩尔定律(Moore's Law)

摩尔定律是英特尔创始人之一戈登·摩尔的经验之谈,其核心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。换言之,处理器的性能大约每两年翻一倍,同时价格下降为之前的一半

CPU以每18个月翻一倍的速度在发展,然而内存和硬盘的发展远远赶不上CPU,缓存的出现就是为了填补CPU运算速度和I/O速度之间的鸿沟。

为了减少 CPU与内存的交互,提高执行效率,一般在CPU上集成了多层缓存架构,常见的为三级缓存结构,即CPU 中的缓存按照其距离 CPU 核心的远近、大小和速度等因素,通常分为 L1 缓存、L2 缓存、L3 缓存(有时也会有高速缓存(common cache))

  1. L1 :是 CPU 中距离核心最近的缓存,大小通常在几 KB 到几百 KB 之间

    1. 逻辑核独占

    2. 访问速度非常快,可以在一个 CPU 时钟周期内完成

    3. L1 缓存通常将指令和数据分别缓存,且一般来说,指令缓存比数据缓存更大

  2. L2 :是 CPU 中的第二级缓存,通常比 L1 缓存要大,大小在几百 KB 到几 MB 之间

    1. 物理核独占,逻辑核共享

    2. 补充 L1 缓存,将更多的热数据缓存在内部,并且降低 L1 缓存未命中时的延迟

    3. 访问速度较 L1 缓存要慢一些,一般需要几个 CPU 时钟周期

  3. L3 :是 CPU 中的第三级缓存,通常比 L2 缓存要大,大小在几 MB 到几十 MB 之间

    1. 物理核共享,CPU独占

    2. 补充 L2 缓存,一般用于高端 CPU,尤其是多核 CPU 的设计中

    3. 访问速度比 L2 要慢一些,但比主存要快得多

  4. 高速缓存(common cache):是一个统一的缓存,用于将 L2 和 L3 缓存中的数据共享

    1. 在一些多核 CPU 中,由于不同的核心时刻都在访问内存,因此 L2 和 L3 缓存中的数据可能会部分重叠,通过将这些缓存共享,可以缩小 CPU 在一个时钟周期内访问内存的延迟,并提高 CPU 的性能

 寄存器(Register)是 CPU 内部的一种存储设备,CPU内核分为物理核逻辑核,每个CPU都有自己独有的寄存器,用于暂时存储数据、地址和指令等相关的信息,是计算机体系结构中最快的存储器,它们与 CPU 相关的芯片集成在一起,位于 CPU 内部。寄存器的大小和数量通常是 CPU 架构的一个重要参数,寄存器的增加可以提高计算机系统的吞吐率和响应速度,但同时也增加了物理设备的复杂性和成本。

在实际计算机系统中,CPU 和内存之间的数据传输通常需要通过系统总线(Bus)进行。系统总线是计算机中各种硬件设备互联的物理通道,能够以高速率传输指令和数据。CPU 可以通过总线将指令和数据从内存读取到 CPU 中进行处理,也可以将处理结果存储回内存中。总线的带宽和传输速率对计算机的整体性能有很大的影响,因此在计算机硬件设计中,总线的带宽和性能通常是优化的重点。

总的来说,在速度上:寄存器 > L1 > L2 > L3 > 内存

缓存行(cacheline)

缓存行(cacheline)是缓存最小的存储块(通常大小为64byte)

  • 如果L1 大小是512kb,那么L1里就会有 512 * 1025 /64 个cacheline

  • 如果一个数据很大,一行装不下就两行,以此类推(特别大的数据还是比较少的)

两项原则

  • 时间局部性原则(Temporal Locality):如果一个信息正在被访问,那么他近期很可能再被访问

    • 比如循环、递归、方法的调用等

  • 空间局部性原则(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用(于是会进行预读)

    • 比如顺序执行的代码、连续创建的两个对象、数组

    • 我们可以做个小实验佐证下这项原则

      • 初始化一个二维数组,分别按照先行后列、先列后行的顺序求和,输出执行时间

      • 从上图的执行结果我们可以看出,先行后列比先列后行速度快很多,这就是空间局限性原则的体现,由于预读是以缓存行为单位的,我们分别分析下先行后列、先列后行这两种方式和主内存的交互次数

        • 先行后列

          • 由于 64/4=16 ,我们一行的数据有8个,因此可以通过一次与主内存的交互获得一行的数据,于是对行求和,然后再对列求,因此和主内存的交互次数为:10 * 1024 * 1024

        • 先列后行

          • 每次读取每行的第1个元素,相加求完一列的和再求下一列,因此和主内存的交互次数为:10 * 1024 * 1024 * 8

内存

操作系统内存管理

执行空间的保护

操作系统拥有用户空间和内核空间两个概念,目的是为了做到程序运行安全隔离与稳定

有四个(按照Intel的标准)

  • ring0(最高,内核态)

  • ring1

  • ring2

  • ring3(用户态,比如JVM)

Linux和WIndows只用到了ring0和ring3这连哥哥安全🔐级别,操作系统内部的指令通常运行在ring0级别上,操作系统以外的运行在ring3级别,当第三方程序需要调用系统内部的函数功能,由于安全级别不够,就需要切换CPU的运行状态(即从ring3切换到ring0),因此Java中创建线程、线程阻塞唤醒是重型操作(Java中的线程和操作系统的线程是一一对应的),因为CPU要切换运行状态

举个🌰,JVM创建线程时,CPU的大致工作流程

  1. CPU从ring3切换到ring0,创建线程

  2. CPU从ring0切换到ring3,线程执行JVM程序

  3. 执行完毕,ring3切换到ring0销毁线程

线程的分类

CPU调度的基本单位是线程

  • 内核线程模型(KLT)

  • 用户线程模型(ULT)

Java的线程是映射到操作系统的原生线程之上的,在 Linux 和 windows 使用的是内核级线程模型KLT

JVM 没有限定Java线程需要使用哪种线程模型来实现,JVM 只是封装了底层操作系统的差异,而不同的操作系统可能使用不同的线程模型,例如 Linux 和 windows 使用了一对一模型,solaris 和unix 某些版本可能使用多对多模型。所以一谈到 Java 语言的多线程模型,需要针对具体 JVM 实现。

比如 Sun JDK 1.2 开始,线程模型都是基于操作系统原生线程模型来实现,它的 Window 版和 Linux 版都是使用系统的1:1的线程模型实现的。

Java线程在JDK1.2之前,是基于称为“绿色线程”(Green Threads)的用户线程实现的,而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致,虚拟机规范中也并未限定Java线程需要使用哪种线程模型来实现。线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编码和运行过程来说,这些差异都是透明的。

对于Sun JDK来说,它的Windows版与Linux版都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程之中,因为Windows和Linux系统提供的线程模型就是一对一的。而在Solari平台中,由于操作系统的线程特性可以同时支持一对一(通过Bound Threads或Alternate Libthread实现)及一对多(通过LWP/Thread Based Synchronization实现)的线程模型,因此在Solaris版的JDK中也对应提供了两个平台专有的虚拟机参数:-XX:+UseLWPSynchronization(默认值)和-XX:+UseBoundThreads来明确指定虚拟机使用哪种线程模型。

—— 《深入理解Java虚拟机》

感谢博文:https://www.cnblogs.com/itxdm/p/What_kind_of_implementation_is_the_thread_created_Why_is_process_switching.html

虚拟机指令集架构

分类

  • 栈指令集架构

  • 寄存器指令集架构

栈指令集架构

HotSpot 虚拟机使用的就是栈指令集架构

优点:

  • 设计与实现更简单,适用于资源受限的系统

  • 避开了寄存器的分配难题,使用零地址指令方式分配

  • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈,指令集更小,编译器更容易实现

  • 不需要硬件支持,可移植性好,更好实现跨平台

缺点:

  • 在内存中执行,效率较低

  • 实现同一项操作花费的指令数量更多

寄存器指令集架构

典型的应用是X86的二进制指令集:比如传统的PC以及Androud的Davlik虚拟机

优点:

  • 在CPU中执行,效率更高

  • 实现同一项操作花费的指令数量更少

缺点:

  • 完全依赖于硬件,可移植性差

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

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

相关文章

学生电费管理系统

随着现代化的发展和科技的进步,各种智能化的系统应运而生。其中,学生电费管理系统是一个非常实用的系统,它可以帮助学校管理电费,提高学生的电费管理意识,减少学校的电费支出。本文将着重介绍该系统的作用、特点以及优…

【hive】基于Qt5和libuv udp 的lan chat

作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可

【Java】面试常问知识点(数据库相关知识)

Redis Redis数据结构,跳表如何实现?跳表添加层级的时机? 布隆过滤器的底层原理 Redis数据结构 有5中数据结构,string(字符串类型)、list(列表类型)、hash(哈希表类型…

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题,因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录,通常在 /opt/intel 文件夹下, cd /opt/intel/openvino_2021/openvino_…

SOA协议DDS和Some/IP对比

SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术,所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为:Scalable service-Oriented MiddlewarE over IP,是一种面向服务…

Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

文章目录 A. Love Story(模拟)B. Blank Space(模拟)C. Mr. Perfectly Fine(模拟)D. Gold Rush(小思维)E. The Lakes(DFS)F. Forever Winter(简单的图)G. Hits Different(二维前缀和)H. Dont Blame Me(状态压缩dp) 传送门 A. Love …

视频文本检索之CLIP4Clip

论文:CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub:https://github.com/ArrowLuo/CLIP4Clip 论文基于图片-文本检索模型CLIP (Contrastive Language-Image Pretraining)提出了视频-文本检索模型CLIP4Clip (CLIP …

【开源硬件篇】STM32F103C8T6主控板

STM32F103C8T6主控板 文章目录 STM32F103C8T6主控板设计目标一、STM32F103C8T6核心板外围引脚电路1.1 原理图设计1.2 PCB设计用例 二、ISP一键下载电路设计2.1 原理图设计2.2 原理分析2.2.1 CH340电路选择2.2.2 ISP一键下载原理 2.3 PCB设计示例 三、串口通信电路3.1 原理图设计…

Jackson2JsonRedisSerializer使用及问题

1、使用 public static RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {lettuceConnectionFactory.setShareNativeConnection(false);RedisTemplate<String, Object> rt new RedisTemplate<>();// 设置…

嵌入式软考备考_6 嵌入式程序设计

嵌入式程序设计 开发流程 要想某个功能要用硬件还是软件实现&#xff08;硬件快&#xff0c;但是耗资源&#xff09;&#xff1f;BSP&#xff1f;裸机还是OS&#xff1f; 硬件的设计与实现-》设备驱动软件的设计与实现-》os的选择&#xff0c;移植&#xff0c;api接口函数的…

openGL 环境搭建

刚入坑&#xff0c;每个包、每个项目都得重新配一遍&#xff0c;实在烦人&#xff0c;由于网上已有很多教程&#xff0c;故在此只简要介绍。 比较通用的安装方法如下&#xff1a; 优先下载&#xff0c;对应vs版本&#xff0c;32位&#xff0c;已经编译好的库。如果下载的是源代…

2023 年Java经典面试题,基础篇02(持续更新)

本篇文章主要讲的是 2023 年Java最新面试题&#xff0c;持续更新中 原文地址&#xff1a;https://github.com/Snailclimb/JavaGuide 面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程把解决问题的过程拆成一个个方法&…

Git 配置多个SSH-Key

Git 全局配置 查看全局配置 git config --global --list git config --global user.name 删除全局配置 git config --global --unset user.name 1.生成ssh public key and private key open git base, 执行以下command&#xff0c;其中是keyname自己填&#xff1b;codeup…

java程序员容易被人误解?我来聊聊常见的三种情况

先说一下个人情况吧。21年来到深圳&#xff0c;现在马上工作满两年。我说程序员是一个容易被人误解的职业呢&#xff0c;可能在大部分人的印象里&#xff0c;程序员就是一个呆板、穿着格子衫、戴着厚厚的眼镜片、比较呆滞的一群人。其实这个印象可能是符合上个年代吧——程序员…

第二部分——长难句——第二章——复合句——第二节——定语从句

内容比较多&#xff0c;且比较重要 一&#xff0c;定语从句的概述 定语&#xff08;紧挨着名词&#xff09;礼让弱小&#xff0c;所以放在所修饰的名词后面。 法律是一种学科&#xff08;鼓励责任判定&#xff09;定语修饰 在翻译成中文的习惯&#xff0c;我们会把定语从句放…

倒计时|数字标准读书会—打破“信息孤岛”、拆除“数据烟囱”

业务与其他业务域间存在信息鸿沟&#xff0c;协作效率低下&#xff1b; 系统边界划分复杂混乱&#xff0c;技术标准不兼容&#xff1b; 新业务无法基于已有解决方案快速组装上线&#xff0c;迭代创新&#xff1b; …… 以上这些数字化转型痛点&#xff0c;你是否也遇到过&a…

家里网速越来越慢?路由器附近千万别放这几样东西

我们在日常生活中常常会使用到WiFi&#xff0c;当遇到网络卡顿、网速缓慢时往往感到疑惑&#xff0c;是不是自己的WiFi速度不够&#xff1f;其实除了无线路由器、终端等自身产品质量问题&#xff0c;还有许多外在因素。 在网络本身没有问题的情况下WiFi卡顿或不稳定&#xff0…

美国限制Unity和UE渲染引擎风险增加,数字孪生行业急需国产渲染引擎软件

数字孪生作为智能制造的关键技术之一&#xff0c;其应用已经从工业制造领域扩展到了城市规划、交通运输、农业等多个领域。然而&#xff0c;随着中美脱钩的持续进行&#xff0c;有关3D渲染引擎的“卡脖子”问题已经引起了行业的高度关注。 美国限制3D渲染引擎风险对数字孪生产…

linux中查看某个文件夹下文件的个数和大小

一、统计某个目录的文件和子目录的大小 1、stat指令 stat命令 主要用于显示文件或文件系统的详细信息&#xff0c;该命令的语法格式如下&#xff1a; -f  不显示文件本身的信息&#xff0c;显示文件所在文件系统的信息-L  显示符号链接-t  简洁模式&#xff0c;只显示…

强化学习p3-策略学习

Policy Network (策略网络) 我们无法知道策略函数 π \pi π所以要做函数近似&#xff0c;求一个近似的策略函数 使用策略网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ) 去近似策略函数 π ( a ∣ s ) \pi(a|s) π(a∣s) ∑ a ∈ A π ( a ∣ s ; θ ) 1 \sum_{a\in …