禅与计算机 禅与计算机
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sharkchili

计算机禅修者
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

    • 计算机硬件知识小结
    • 编程语言是如何完成运算的
    • CPU核心知识点小结
      • 来聊聊图灵机
        • 简介
        • 用1+2=3来了解图灵机的工作机制
      • 什么是冯诺伊曼模型
      • CPU详解
        • 32位和64位CPU有什么区别
      • CPU组成简介
      • 什么是内存
      • 什么是总线
      • 计算机存储器介绍
        • 寄存器
      • CPU CACHE
      • 什么是内存
      • 什么是硬盘
      • 小结
      • 运算器
      • 什么是控制器
      • 总线日常工作流程
      • 输入、输出设备
      • 线路位宽与cpu位宽的把控
      • 通过一个更细致的例子了解这些过程CPU工作过程
      • 参考文献
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU如何完成计算运算
    • CPU指令封装原理
    • CPU性能优化技术详解
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • GPU工作原理简析
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

  • 计算机网络

  • 运维

  • 编码最佳实践

  • 计算机基础
  • 计算机组成原理
sharkchili
2023-01-12
目录

CPU核心知识点小结

# 来聊聊图灵机

# 简介

就像下面这张图一样,这就是大名鼎鼎的图灵机,他的工作方式也和现代计算机工作的原理差不多,我们的冯诺依曼模型就是以图灵机作为前身而设计的。 可以看出他时由一条很长的纸袋以及一个读写不断工作的盒子组成,这个盒子就是所谓的读写头。

在这里插入图片描述

# 用1+2=3来了解图灵机的工作机制

要想理解图灵机,我们不妨用一个1+2=3的例子来介绍和了解图灵机。 可以想象我们的纸带上有1、2、+这三个字符。他们不断向前进,逐渐走向读写头。

  1. 当读写头读到了1,发现这个是一个数字。于是就把他放到一个存储设备中,我们可以称他为图灵机的状态。
  2. 2也是同理,也被存到了图灵机的状态中。
  3. 最后遇到了+号,图灵机首先会将其放到所谓的控制单元(ALU)中,因为它是一个运算符,就不能直接存放到状态中,这时图灵机就会通知运算单元出来干活。
  4. 于是1、2都会读出来,配合+号完成了一次加法计算,得到结果3,再将这个值写回纸袋中。

在这里插入图片描述

# 什么是冯诺伊曼模型

借着图灵机的思想,冯诺依曼模型也诞生了。他的工作原理也是图灵机的进阶版,相较于图灵机,他职责划分更加清晰明确。

可以看到他将进行工作的不妨划分为CPU、存储单元、输入输出设备通过控制单元调度工作,然后寄存器和运算器负责数据加载以及指令计算。而其余存储和输出输入都划分到外部。

在这里插入图片描述

# CPU详解

# 32位和64位CPU有什么区别

翻译成中文就是中央处理器,这东西常分为32位和64位。那么问题来了,它为什么要分32和64位呢?它的区别又是什么呢? 回答这个问题之前,笔者要说一句废话:

	1字节(byte)=8位(bit)

32位就是4个字节,若CPU是32位,则说明它一次只能计算4个字节的数据。64位就是8个字节的数据。

# CPU组成简介

  1. 控制单元:负责CPU工作的调度

  2. 逻辑运算单元:负责逻辑运算的。

  3. 寄存器:CPU中的寄存器就很多了,我们大概可以将他们分为三类

     	1. 通用寄存器:就是存那些要被计算的数据的,例如上面两个被加数1、2。
     	2. 程序计数器:存着下一个被运行的指令的地址。
     	3. 指令寄存器:存着下一条要被执行的指令,在当前指令都没结束运算前,他都会一直存在指令寄存器中。
    

# 什么是内存

存数据的地方,单元是byte,1byte=8bit。从0开始按顺序排列。

# 什么是总线

总线分为地址总线、数据总线和控制总线

  1. 地址总线:顺着这条线就知道找到数据或者指令的地址。
  2. 数据总线:用于读写内存中的数据。
  3. 控制总线:用于发送和接收信号,例如中断信号等。当然CPU收到信号后的响应也是通过控制总线来通知的。

# 计算机存储器介绍

计算机有着各种各样的存储设备,比如一断电数据就会丢失的内存,以及可以持久化数据的磁盘等等。 其实CPU内部也有可以存储数据的东西,他就是寄存器。说到寄存器,可以说他是CPU内部最核心的存储器,因为它最接近CPU,所以速度是最快的。根据CPU的位宽,32位的CPU寄存器可以存储4字节。64位则是8字节。

# 寄存器

一个CPU中一般就会有几十到几百不等的寄存器。 寄存器的访问速度一般在半个时钟周期就能够完成了,以笔者的电脑为例,笔者电脑主频为2.8Ghz,换算成时钟周期就是1/2.8=0.36ns(纳秒),所以半个时钟周期就是0.18ns。可见寄存器的访问速度是有多快,也正是寄存器的速度足够快,CPU才能够快速读写寄存器的数据,再通过进行译码指令,再计算和执行。给人感觉电脑很"快"。 而它的结构也如下所示,具体部件工作内容大抵是:

  1. 存储体:是数据的存储单元。
  2. MAR(存储地址寄存器 Memory Address Register):由译码器进行地址译码后,它再拿着译码结果找到相应的存储单元,说白了就是个找存储单元的。
  3. MDR(存储数据寄存器Memory Data Register):暂存要从MAR找到的存储单元对应的数据

在这里插入图片描述

如果说我们把CPU比作我们的脑子的话,那么上文所描述的寄存器存储的数据就可以比作我们脑子刚刚获取到且正处于思考的事务,虽然数据量有限但是处理速度非常快。

# CPU CACHE

相比于寄存器相对慢一些的就是CPU cache,它是一种用SRAM(Static Random-Access Memory,静态随机存储器) 的芯片,通常1个bit的数据需要6个晶体管,明显密度不大。也正说明他电路简单,所以访问速度很快。缺点也很明显,一断电数据就没了。 它分为三级,L1 cache,L2 cache,L3 cache。其中L1 cache相较于其他两种缓存更加接近CPU,访问速度差不多2-4个时钟周期。所以它的速度也比后两者快一些。 我们可以是使用如下两条命令查看L1 cache的数据容量大小和指令容量大小,以笔者虚拟机的Linux为例,他们的容量都是32k

cat /sys/devices/system/cpu/cpu0/cache/index0/size
cat /sys/devices/system/cpu/cpu0/cache/index1/size

1
2
3

根据存储的类别它可以分成数据缓存和指令缓存两种类别。如果说我们思考的数据好比寄存器中的数据。那么人脑中短期记忆的数据就是L1 cache,长期记忆的数据就是L2、L3 cache。而L2 cache访问速度差不多10-20个时钟周期,在笔者的虚拟机的容量为256k(数据基本都在几百k到几MB那样),具体可以键入如下指令查看

cat /sys/devices/system/cpu/cpu0/cache/index2/size
1

L3最慢的,访问速度差不多20-60个时钟周期吧,容量相较于上面两种缓存更大一些,笔者键入如下命令时看到差不多有9000k那样

cat /sys/devices/system/cpu/cpu0/cache/index3/size
1

# 什么是内存

紧接的是内存,它的速度排在三级缓存之后,我们可以把它比作人们工作或者学习时使用的笔记本,当脑子记不起东西时,就会翻阅自己之前的笔记本。 内存的组成就比较特殊了,它是由DRAM (Dynamic Random Access Memory,动态随机存取存储器)的芯片制作的。 相较于cache,密度更高,功耗也会更低一些,所以访问速度很慢,要200-300个时钟周期,造价也便宜,而且断电了数据也不会丢失。

# 什么是硬盘

最后就是硬盘,它的速度是最慢的,接着上面的例子来说,它可以那些人脑记不起来,笔记本都找不到的数据,只有去书房的书柜查找对应书籍对应的数据。 硬盘分为SSD和HDD两种,前者结构和内存差不多,但是数据可以持久化,速度大概是内存的 1/10-1/1000。 HDD是读写性能最差的,同样可以持久化,通过物理读写的方式来访问数据,速度大概是内存的1、10w。 由于近几年,SSD价格和HDD差不多,老硬盘逐渐被淘汰了。 让我们来总结一下CPU的存储器的结构,可以看出每个CPU都有1、2级的缓存,3级是共享的。然后就是内存和硬盘。 访问数据也是同理寄存器没有找缓存,缓存一直往下找也没有,就找内存,在没有就去硬盘里面查询。

在这里插入图片描述

# 小结

再总结一下,速度越往下越慢,价格也是越往下越便宜。具体可以参照下图的对照表

在这里插入图片描述

# 运算器

运算器也是CPU的主要组成部分,如下图所示,运算器是由以下几个部分组成的。

  1. ACC:程序累加器,用于存放操作数,或者运算符。
  2. MQ:乘商寄存器,在乘、除运算时,用于存放操作数或者运行结果。
  3. X:这个是操作数寄存器,用于存放操作数。
  4. ALU:算数逻辑单元,是运算器的核心部分,他就是通过内部复杂的电路实现算术运算、逻辑运算。

在这里插入图片描述

# 什么是控制器

控制器则是调度指令执行的核心组成部分,它有以下几个部分:

  1. CU控制单元:分析指令,给出控制信号。
  2. IR:存放当前执行的指令。
  3. PR:存放指令地址。

在这里插入图片描述

# 总线日常工作流程

一般情况下,CPU的工作只需通过地址总线找到数据的内存地址,再通过数据总线完成传输即可。

# 输入、输出设备

我们的键盘、显示器、鼠标等就是典型的输入、输出设备了。他们的和cpu的交互也是通过控制总线来进行的。

# 线路位宽与cpu位宽的把控

数据是通过线路来传输的,假如线路位宽只有1位,且我们的内存有4G,也就是2 ^ 32,那么访问某个内存地址就需要cpu来来回回的和地址总线交互32次才知道,这种效率肯定是非常低下的。 对此,解决办法就是加大cpu的位宽,尽可能的做到cpu位宽大于或者等于线路位宽。 当然,这种说法也不是说小于线路位宽不行,只是运算效率不高而已。假如我们有两个8字节(64位)的数据要相加,而我们的cpu是32位。那么我们只能先将高32位相加,再将低32位相加,最后在进行进位等操作后才能得到结果。

# 通过一个更细致的例子了解这些过程CPU工作过程

这就是我们日常开发所写的代码,一段很简单的乘法加法综合运算再赋值给y

在这里插入图片描述 它会被翻译成机器码后存到主存中,就会变成下图所示的一条条指令 在这里插入图片描述

  1. 如下图所示,首先PC(程序计数器)会指向第一条指令,MAR通过程序记录器中得到这条指令的地址
  2. 然后MAR会顺着这个地址从存储体中找到这个地址的实际指令将其存到MDR中。
  3. MDR之后会通过数据总线将这条数据存放到IR中,IR会将指令操作码即指令前半部分送到CU中。
  4. CU(控制单元)通过分析得知这是一个取数的操作
  5. 然后拿到指令后半段部分,得知地址是5
  6. 然后IR再将这个指令的地址码送到MAR中,MAR再从存储器中得到这个值,并放到MDR中
  7. 最后MDR再将数据放到ACC中
  8. 由此结束一次取值的操作,最后pc在自增一下指向下一条指令

在这里插入图片描述 pc拿到第2条指令时,会进行如下操作

  1. PC会将地址告诉MAR,MAR通过存储体中找到这个指令,将其放到MDR中
  2. MDR将指令通过总线送到IR中
  3. IR将前半部分给CU,CU分析出这是一个乘法
  4. 然后IR(存放当前执行的部分)在通过MAR询问指令后半部分地址对应的内容,MAR通过存储体捞到数据送到MDR中
  5. MDR将数据送到MQ中(因为这是乘法)
  6. ACC将之前存储的值送到X中
  7. 然后CU告诉ALU这是一个乘法操作
  8. 然后ALU进行计算得出结果,再将其存放到ACC(累加器)中
  9. 由此完成第二条指令,程序计数器自增,增多少看cpu位宽。 在这里插入图片描述

同样的第3条指令也是如此,由于存取指令过程差不多,我们就从第9步开始分析:

  1. 首先顺着指令拿到被加数,将其放至X中
  2. CPU告诉ALU接下来要进行一个加法操作
  3. ALU将累加器的值与其进行一次运算,最终得到结果再存入ACC中 在这里插入图片描述

# 参考文献

CPU 是如何执行程序的? (opens new window)

磁盘比内存慢几万倍 (opens new window)

编辑 (opens new window)
上次更新: 2026/03/26, 01:05:31
编程语言是如何完成运算的
浅谈CPU流水线的艺术

← 编程语言是如何完成运算的 浅谈CPU流水线的艺术→

最近更新
01
基于EasyExcel实现高效导出
03-25
02
从开源框架中学习那些实用的位运算技巧
03-25
03
浅谈分布式架构设计思想和常见优化手段
03-25
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Evan Xu | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
×