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

网站建设的目的定位盈利模式和功能福鼎建设局网站

网站建设的目的定位盈利模式和功能,福鼎建设局网站,wordpress后车头,青岛市城乡和住房建设局CPU是如何执行程序的#xff1f; 程序执行的基本过程 第一步#xff0c;CPU 读取「程序计数器」的值#xff0c;这个值是指令的内存地址#xff0c;然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址#xff0c;接着通知内存设备准备数据#xff0c;数据准…CPU是如何执行程序的 程序执行的基本过程 第一步CPU 读取「程序计数器」的值这个值是指令的内存地址然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址接着通知内存设备准备数据数据准备好后通过「数据总线」将指令数据传给 CPUCPU 收到内存传来的数据后将这个指令数据存入到「指令寄存器」。第二步「程序计数器」的值自增表示指向下一条指令。这个自增的大小由 CPU 的位宽决定比如 32 位的 CPU指令是 4 个字节需要 4 个内存地址存放因此「程序计数器」的值会自增 4第三步CPU 分析「指令寄存器」中的指令确定指令的类型和参数如果是计算类型的指令就把指令交给「逻辑运算单元」运算如果是存储类型的指令则交由「控制单元」执行 简单总结一个程序执行的时候CPU 会根据程序计数器里的内存地址从内存里面把需要执行的指令读取到指令寄存器里面执行然后程序计数器根据指令长度自增开始顺序读取下一条指令。 在指令寄存器中CPU会分析指令寄存器中的指令确定指令的类型和参数如果是计算类型的指令就把指令交给「逻辑运算单元」运算如果是存储类型的指令则交由「控制单元」执行程序计数器自增的长度与CPU位宽决定比如 32 位的 CPU指令是 4 个字节需要 4 个内存地址存放因此「程序计数器」的值会自增 4 CPU 从程序计数器读取指令、到执行、再到下一条指令这个过程会不断循环直到程序执行结束这个不断循环的过程被称为 CPU 的指令周期。 冯诺依曼模型定义了计算机基本结构运算器、控制器、存储器、输入输出设备。 内存 我们的程序和数据都是存储在内存存储的区域是线性的。 在计算机数据存储中存储数据的基本单位是字节byte1 字节等于 8 位8 bit。每一个字节都对应一个内存地址。 中央处理器CPU 中央处理器也就是我们常说的 CPU32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据。这里的32位和64位通常表示CPU的位宽。 32 位 CPU 一次可以计算 4 个字节4个字节就是32位 4 * 864 位 CPU 一次可以计算 8 个字节 CPU内部还有一些组件常见的有寄存器控制单元和逻辑运算单元 控制单元负责控制CPU的工作。 逻辑运算单元负责运算。 寄存器存储计算时的数据由于内存离CPU太远了而寄存器就在CPU内部计算速度更快。寄存器有以下几种 通用寄存器存放需要运算的数据。程序计数器存储CPU要执行的下一条指令的地址。指令寄存器存放当前正在执行的指令。 总线 负责各种设备之间的通信。比如CPU读取内存数据时要通过三个总线 先通过地址总线来指定内存的地址。再通过控制总线来指定读或写的命令。最后通过数据总线来传递数据。 线路位宽与CPU位宽 线路位宽数据在线路中传输其实是通过操作电压低电压表示0高电压表示1。这样一位一位进行传输的方式称为串行想要一次性多传输数据可以增加线路的位宽。比如CPU 想要操作内存地址就需要地址总线可以通过增加线路位宽的方式增加CPU能操作的最大内存地址数量。注意不是说同时操作的最大内存地址数量 如果地址总线有 2 条那么能表示 00、01、10、11 这四种地址所以 CPU 能操作的内存地址最大数量为 42^2个。那么想要 CPU 操作 4G 大的内存那么就需要 32 条地址总线因为 2 ^ 32 4G。32位对应有232个地址对应的内存数是232 * 8bit4Gbyte即4GB CPU位宽CPU 的位宽最好不要小于线路位宽否则工作起来会非常复杂且麻烦。如果计算的数额不超过 32 位数字的情况下32 位和 64 位 CPU 之间没什么区别的只有当计算超过 32 位数字的情况下64 位的优势才能体现出来。 另外32 位 CPU 最大只能操作 4GB 内存就算你装了 8 GB 内存条也没用。而 64 位 CPU 寻址范围则很大理论最大的寻址空间为 2^64。 a 1 2的执行具体过程 程序—汇编语言—计算机指令 CPU 是不认识 a 1 2 这个字符串这些字符串只是方便我们程序员认识要想这段程序能跑起来还需要把整个程序翻译成汇编语言的程序这个过程称为编译成汇编代码。针对汇编代码我们还需要用汇编器翻译成机器码这些机器码由 0 和 1 组成的机器语言这一条条机器码就是一条条的计算机指令这个才是 CPU 能够真正认识的东西。 程序编译过程中编译器分析代码发现1和2是数据所以放在内存中的「数据段」编译器会把a 1 2翻译成4条指令存放到正文段中。 编译完成后具体执行程序的时候程序计数器会被设置为 0x100 地址然后依次执行这 4 条指令。 上面的例子中由于是在 32 位 CPU 执行的因此一条指令是占 32 位大小所以你会发现每条指令间隔 4 个字节。而数据的大小是根据你在程序中指定的变量类型比如 int 类型的数据则占 4 个字节char 类型的数据则占 1 个字节。 你知道软件的 32 位和 64 位之间的区别吗再来 32 位的操作系统可以运行在 64 位的电脑上吗64 位的操作系统可以运行在 32 位的电脑上吗如果不行原因是什么 64 位和 32 位软件实际上代表指令是 64 位还是 32 位的 如果 32 位指令在 64 位机器上执行需要一套兼容机制就可以做到兼容运行了。但是如果 64 位指令在 32 位机器上执行就比较困难了因为 32 位的寄存器存不下 64 位的指令操作系统其实也是一种程序我们也会看到操作系统会分成 32 位操作系统、64 位操作系统其代表意义就是操作系统中程序的指令是多少位比如 64 位操作系统指令也就是 64 位因此不能装在 32 位机器上。 总之硬件的 64 位和 32 位指的是 CPU 的位宽软件的 64 位和 32 位指的是指令的位宽。 CPU时钟频率1GHz表示该CPU的时钟频率是1G表示1秒会发出1G次数的脉冲信号每一次脉冲信号的高低电平就是一个时钟周期。时钟周期时间越短CPU运算的越快。 磁盘比内存慢几万倍 机械硬盘、固态硬盘、内存这三个存储器到底和 CPU L1 Cache 相比速度差多少倍呢 CPU L1 Cache 随机访问延时是 1 纳秒内存则是 100 纳秒所以 CPU L1 Cache 比内存快 100 倍左右。 SSD 随机访问延时是 150 微秒所以 CPU L1 Cache 比 SSD 快 150000 倍左右。 最慢的机械硬盘随机访问延时已经高达 10 毫秒CPU L1 Cache 比机械硬盘快 10000000 倍左右 寄存器 寄存器用来存储计算的数据是最靠近 CPU 的控制单元和逻辑计算单元的存储器。 寄存器的价格很贵数量通常在几十到几百之间每个寄存器可以用来存储一定的字节byte的数据。比如 32 位 CPU 中大多数寄存器可以存储 4 个字节64 位 CPU 中大多数寄存器可以存储 8 个字节。 寄存器的访问速度非常快一般要求在半个 CPU 时钟周期内完成读写CPU 时钟周期跟 CPU 主频息息相关比如 2 GHz 主频的 CPU那么它的时钟周期就是 1/2G也就是 0.5ns纳秒。 CPU Cache CPU Cache 用的是一种叫 SRAMStatic Random-Access Memory静态随机存储器 的芯片。静态说明有电时数据一直存在但掉电数据丢失。 在 SRAM 里面一个 bit 的数据通常需要 6 个晶体管所以 SRAM 的存储密度不高同样的物理空间下能存储的数据是有限的不过也因为 SRAM 的电路简单所以访问速度非常快。 CPU 的高速缓存通常可以分为 L1、L2、L3 三层高速缓存也称为一级缓存、二级缓存、三级缓存。 L1 高速缓存是每个CPU Core独有的访问速度快只需要 2~4 个时钟周期。大小在几十 KB 到几百 KB 不等。 L1 高速缓存的指令和数据是分开存放的所以 L1 高速缓存通常分成指令缓存和数据缓存。 L2 高速缓存同样每个 CPU 核心都有但是 L2 比L1 距离 CPU 核心更远访问速度则更慢速度在 10~20 个时钟周期。但大小比 L1 更大通常大小在几百 KB 到几 MB不等 L3 高速缓存通常是多个 CPU 核心共用的位置比 L2 高速缓存距离 CPU 核心 更远访问速度相对也比较慢一些访问速度在 20~60 个时钟周期。大小也会更大些通常大小在几 MB 到几十 MB 不等。 内存 内存用的芯片和 CPU Cache 有所不同它使用的是一种叫作 DRAM Dynamic Random Access Memory动态随机存取存储器 的芯片。动态因为数据会被存储在电容里电容会不断漏电所以需要定时刷新电容才能保证数据不会被丢失。 相比 SRAMDRAM 的密度更高功耗更低有更大的容量而且造价比 SRAM 芯片便宜很多。存储一个 bit 数据只需要一个晶体管和一个电容就能存储。 DRAM 的数据访问电路和刷新电路都比 SRAM 更复杂所以访问的速度会更慢内存速度大概在 200~300 个 时钟周期之间。 SSD/HDD硬盘 固态硬盘Solid-state diskSSD 结构和内存类似。相比寄存器/Cache/内存的优点是断电后数据还存在缺点是读写速度很慢。 机械硬盘Hard Disk Drive, HDD通过物理读写的方式来访问数据的因此它访问速度是非常慢的它的速度比内存慢 10W 倍左右。由于 SSD 的价格快接近机械硬盘了因此机械硬盘已经逐渐被 SSD 替代了。 存储器的层次关系 CPU 并不会直接和每一种存储器设备直接打交道而是每一种存储器设备只和它相邻的存储器设备打交道。比如CPU Cache 的数据是从内存加载过来的写回数据的时候也只写回到内存再从内存写回到硬盘中。 另外当 CPU 需要访问内存中某个数据的时候如果寄存器有这个数据CPU 就直接从寄存器取数据即可如果寄存器没有这个数据CPU 就会查询 L1 高速缓存如果 L1 没有则查询 L2 高速缓存L2 还是没有的话就查询 L3 高速缓存L3 依然没有的话才去内存中取数据并把内存中的数据读入到 Cache 中CPU 再从 CPU Cache 读取数据。 不同的存储器之间性能差距很大构造存储器分级很有意义分级的目的是要构造缓存体系。这样的访问机制跟我们使用「内存作为硬盘的缓存」的逻辑是一样的。 如何写出让CPU跑的更快的代码 CPU Cache有多快 根据摩尔定律CPU 的访问速度每 18 个月就会翻倍相当于每年增长 60% 左右内存的速度当然也会不断增长但是增长的速度远小于 CPU平均每年只增长 7% 左右。于是CPU 与内存的访问性能的差距不断拉大。到现在一次内存访问所需时间是 200~300 多个时钟周期这意味着 CPU 和内存的访问速度已经相差 200~300 多倍了。 为了弥补 CPU 与内存两者之间的性能差异就在 CPU 内部引入了 CPU Cache也称高速缓存。 CPU Cache 数据结构 CPU Cache 是由很多个 Cache Line 组成的Cache Line 缓存块是 CPU 从内存读取数据的基本单位。 Cache Line 结构 有效位Valid bit标记对应Cache Line 中数据是否有效的有效位。组标记Tag为了区分不同的内存块在对应的CPU Cache LIne中会存储一个组标记用来记录当前CPU Cache Line 中存储的数据对应的内存块区分不同的内存块。数据Data从内存加载过来的数据。 内存地址与Cache Line的直接映射 CPU 访问内存数据时是一小块一小块数据读取的具体这一小块数据的大小取决于 coherency_line_size 的值一般 64 字节。在内存中这一块的数据我们称为内存块Block读取的时候我们要拿到数据所在内存块的地址。 一个内存的访问地址包括组标记、CPU Cache Line 索引、偏移量这三种信息于是 CPU 就能通过这些信息在 CPU Cache 中找到缓存的数据。 对于直接映射 Cache 采用的策略就是把内存块的地址始终映射在一个 CPU Cache Line 的地址至于映射关系实现方式则是使用取模运算取模运算的结果就是内存块地址对应的 CPU Cache Line缓存块 的地址。使用偏移量可以在CPU Cache Line 中的数据块找到对应的字。 CPU Cache 读写过程 根据内存地址中索引信息计算在 CPU Cache 中的索引也就是找出对应的 CPU Cache Line 的地址 找到对应 CPU Cache Line 后判断 CPU Cache Line 中的有效位确认 CPU Cache Line 中数据是否是有效的如果是无效的CPU 就会直接访问内存并重新加载数据如果数据有效则往下执行 对比内存地址中组标记和 CPU Cache Line 中的组标记确认 CPU Cache Line 中的数据是我们要访问的内存数据如果不是的话CPU 就会直接访问内存并重新加载数据如果是的话则往下执行 根据内存地址中偏移量信息从 CPU Cache Line 的数据块中读取对应的字。 CPU 在从 CPU Cache 读取数据的时候并不是读取 CPU Cache Line 中的整个数据块而是读取 CPU 所需要的一个数据片段这样的数据统称为一个字Word。 写出让CPU跑得更快的程序 CPU操作L1 Cache的速度是很快的提升CPU运行速度可以提升访问L1 Cache的速度。 那么L1 Cache 通常分为「数据缓存」和「指令缓存」因此要分别提高「数据缓存」和「指令缓存」的缓存命中率。 提升数据缓存的命中率 CPU会一次从内存中加载多少元素到 CPU Cache 可以在Linux 里通过 coherency_line_size 配置查看 它的大小通常是 64 个字节。 如果遇到遍历数组之类的情况时按照内存布局顺序访问将可以有效的利用 CPU Cache 带来的好处这样我们代码的性能就会得到很大的提升。 提升指令缓存的命中率 使用显式分支预测工具如果分支预测可以预测到接下来要执行 if 里的指令还是 else 指令的话就可以「提前」把这些指令放在指令缓存中这样 CPU 可以直接从 Cache 读取到指令于是执行速度就会很快。 比如如果你肯定代码中的 if 中的表达式判断为 true 的概率比较高我们可以使用显示分支预测工具比如在 C/C 语言中如果 if 条件为 ture 的概率大则可以用 likely 宏把 if 里的表达式包裹起来。 还可以提升多核CPU的缓存命中率 L2 Cache和L1 Cache 是每个核心独有的如果一个线程在不同核心来回切换各个核心的缓存命中率就会受到影响可以把线程绑定到某一个CPU核心上。 在 Linux 上提供了 sched_setaffinity 方法来实现将线程绑定到某个 CPU 核心这一功能。 整理自小林coding
http://www.dnsts.com.cn/news/93126.html

相关文章:

  • 全国学校网站建设163网易企业邮箱格式
  • 分类信息网站平台的推广企业做网站的注意事项
  • 淘宝做代销在哪个网站上进货比较好网站做百度推广需要什么材料
  • 我要下载中国建设网站聊城正规网站建设设计公司
  • 定制网站建设济南网站开发后端作用
  • 北京个人网站设计wordpress分享插件积分
  • 鉴定手表网站2008服务器做网站
  • 做网站代刷能赚多少钱关键词网站建设公司
  • 1000套网站源码嘉兴网站建设wmcn
  • 青岛网站建设培训学校网站服务器租用怎么购买
  • 搭建网站手机软件网站关键词快照优化
  • 巴中微网站建设高校校园网站建设项目的要求
  • 烟台网站建设地址文化企业网站模板
  • 腾讯风铃怎么建设网站深圳高端设计公司有哪些
  • 凡科网站建设之后怎么删除重庆平台网站建设工作
  • 长春做网站seo的下载中国建设银行app
  • 网站建设的活怎么接东莞建设工程交易中心门户网站
  • 网站开发需要掌握哪些技术做地产的设计网站
  • 做游戏网站的背景图片做论坛网站时应该注意什么
  • 侨联网站建设方案宁波定制网站建设
  • 坪山网站建设行情外贸服装接单网站
  • 台州手机网站建设隐私空间
  • 优易官方网站wordpress 5.1.1简体中文版
  • 餐饮网站建设设计价格网络营销师培训课程
  • 云浮网站设计wordpress语言切换
  • 个人网站制作图片图片上传网站制作
  • 文稿写作网站joomla网站模板
  • 国外手机网站设计wordpress 禁止保存
  • 网站建设网络科技公司加盟百度关键词推广价格查询
  • 深圳公司网站建设哪家好手机网站设计框架