摘要:指令和运算 编译、链接和装载之程序装载:640K内存真的不够用么 [toc] 计算机组成原理目录: 在前面几节中,我们已经知道高级语言通过编译、链表生成可执行文件,但这个可执行文件只有先被加载到内存中,才能被 CPU 执行。但问题是内存是有限的,如何加载越来越多的程序呢? 比尔·盖茨在上世纪 80
阅读全文
摘要:指令和运算 编译、链接和装载之静态链接:代码复用成为可能 [toc] 计算机组成原理目录: 在第一小节中,我们分析了高级语言通过编译和汇编后,最终翻译成计算机指令。之后的两个小节,我们又知道 CPU 是如何执行计算机指令,包括指令跳转和函数调用的实现原理。我们知道编译、链接和装载是程序执行的必不可少
阅读全文
摘要:指令和运算 指令执行之函数调用:函数调用和递归调用是怎么实现的 [toc] 计算机组成原理目录: 1. 为什么我们需要程序栈 1.1 示例 同样编译一下 function_example.c 文件后,使用 objdump 查看汇编指令: 我们把这个程序编译之后,objdump 出来。我们来看一看对应
阅读全文
摘要:指令和运算 指令执行之指令跳转:条件分支和循环语句是怎么实现的 [toc] 计算机组成原理目录: 在上一节中,我们分析了高级语言是如何翻译成计算机指令,本节内容则是分析 CPU 是如何执行这些计算机指令的。除了最简单的顺序执行外,指令跳转是如何实现的呢? 1. CPU 是如何执行计算机指令 现代 I
阅读全文
摘要:指令和运算 计算机指令:高级语言是如何翻译成计算机指令 [toc] 计算机组成原理目录: 本小节聚焦在高级语言是如何翻译成机器码,以及机器码的格式。之后的两小节则深入讲解 CPU 如何执行条件、循环、函数、递归这些完整的语句。 1. 机器码 vs 计算机指令 计算机只认知 "0" 和 "1",那我们
阅读全文
摘要:计算机组成 性能指标:通过 CPU主频谈谈性能究竟是什么 [toc] 计算机组成原理目录: 1. 性能 = 1 / 响应时间 响应时间(Response time)或者叫执行时间(Execution time) 吞吐率(Throughput)或者带宽(Bandwidth) 2. 计算机的计时单位:C
阅读全文
摘要:计算机组成 冯·诺依曼体系结构 [toc] 计算机组成原理目录: 计算机组成原理在整个计算机课程中的地位如下图所示: 图1:计算机体系结构 计算机组成原理这门课会围绕冯·诺依曼体系的五大组成部分展开,分别介绍运算器、控制器、存储器、输入设备和输出设备。 1. 冯·诺依曼体系结构 冯·诺依曼体系结构(
阅读全文
摘要:存储器 I/O 性能指标:如何理解 IOPS [toc] 计算机组成原理目录: 1. I/O 性能指标 IO 性能、顺序访问和随机访问如果去看硬盘厂商的性能报告,通常会看到以下指标。 1. 响应时间(Response Time):程序发起一个硬盘的写入请求,直到这个请求返回的时间。 2. 数据传输率
阅读全文
摘要:存储器 总线:计算机内部的高速公路 [toc] 计算机组成原理目录: 本文主要梳理计算机里不同的组件之间的通信问题,也就是总线机制。总线的设计思路,核心是为了减少多个模块之间交互的复杂性和耦合度。实际上,事件总线是一个常见的设计模式,通常事件总线也会和订阅者发布者模式结合起来,成为大型系统的各个松耦
阅读全文
摘要:存储器 内存:程序的虚拟内存是如何映射到物理内存 [toc] 计算机组成原理目录: 程序运行时,指令和数据都需要先加载到内存里面,才会被 CPU 拿去执行。那程序中的虚拟地址最终是如何映射到内存中的物理地址呢?从简单页表,到多级页表,再到 TLB,都解决了那些问题? 1. 简单页表:类似数组,时间复
阅读全文
摘要:存储器 缓存一致性 MESI 协议:如何让多核CPU的高速缓存保持一致 [toc] 计算机组成原理目录: 在上一篇 "存储器 高速缓存(CPU Cache):为什么要使用高速缓存" 中,我们分析了高速缓存(CPU Cache) 的数据结构,及如何进行读写操作。在写操作时,可以通过使用写回策略替换直接
阅读全文
摘要:存储器 高速缓存(CPU Cache):为什么要使用高速缓存? [toc] 计算机组成原理目录: 1. 为什么需要高速缓存 CPU 和内存访问性能的差距非常大。如今,一次内存的访问,大约需要 120 个 CPU Cycle。这也意味着,在今天,CPU 和内存的访问速度已经有了 120 倍的差距。 C
阅读全文
摘要:存储器 金字塔层次结构:越靠近CPU速度越快,容量越小,价格越贵 [toc] 计算机组成原理目录: 1. 金字塔层次结构 现代计算机的存储设备一般有 Cache、内存、HDD(SSD) 硬盘。这些存储设备越靠近 CPU 速度越快,容量越小,价格越贵。 寄存器(Register):寄存器与其说是存储器
阅读全文
摘要:计算机组成原理目录 本文是极客时间 "《深入浅出计算机组成原理》" 的学习笔记,感兴趣的可以订阅正版。 1. [基础概念] [1.0 计算机组成原理怎么学] "1.1 计算机组成 冯·诺依曼体系结构" "1.2 计算机组成 性能指标:通过 CPU主频谈谈性能究竟是什么" 2. [指令和运算] "2.
阅读全文
摘要:锁原理 AQS 源码分析:有了 synchronized 为什么还要重复造轮子 [toc] 并发编程之美系列目录: 在前两篇文章中,我们主要是分析在并发编程问题上,计算机硬件、操作系统和编程语言分别提供了那些支持: 1. 计算机硬件: CAS 原子操作是基于已有的状态更新成另一个状态,如 count
阅读全文
摘要:锁原理 信号量 vs 管程:JDK 为什么选择管程 [toc] 并发编程之美系列目录: 管程和信号量都能解决并发问题,它们是等价的。所谓等价指的是用管程能够实现信号量,也能用信号量实现管程。但是管程在信号量的基础上提供条件同步,使用更容易,所以 Java 采用的是管程技术。synchronized
阅读全文
摘要:并发编程 可见性、原子性和有序性问题:并发编程 Bug 的源头 [toc] 并发编程之美系列目录: 本文是并发编程的第一篇,主要介绍为什么需要并发编程,同时分析并发编程问题的根本原因 可见性、原子性和有序性三个方面。下一章我们会继续分析 JVM 是如何解决这三个问题。 1. 并发程序幕后的故事 为什
阅读全文
摘要:Java 算法 跳表:为什么 Redis 一定要用跳表来实现有序集合? [toc] __数据结构与算法之美目录()__ 推荐文章: √《 "Skip Lists: A Probabilistic Alternative to Balanced Trees" 》 "【Redis 源码分析 skipli
阅读全文
摘要:Java 数据结构 HashMap 源码解读:如何设计工业级的散列表 [toc] __数据结构与算法目录()__ 在 "Java 数据结构 散列表原理" 一文中,提到评价一个散列表的标准有三个:散列函数、散列冲突、加载因子(动态扩容)三个指标。那像 HashMap 这样工业级的散列表应该具有哪些特性
阅读全文
摘要:Java数据结构 散列表原理 [toc] __数据结构与算法目录()__ 散列表(Hash table) 也叫哈希表,借助散列函数对数组进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是散列函数和散列冲突。散列函数有 MD5、SHA、CRC 等哈希算法。散列冲突开放寻址法和链
阅读全文
摘要:Java 算法 二分法查找 [toc] __数据结构与算法之美目录()__ 二分法查找是一种非常高效的查找方式,时间复杂度为 O(logn)。 唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》的第 3 卷《排序和查找》中说到:"尽管第一个二分查找算法于 1946 年出现,然而第
阅读全文
摘要:Java 排序算法 线性排序:桶排序和基数排序 [toc] __数据结构与算法目录()__ 前面我们介绍了时间复杂度分为 O(n2) 和 O(nlogn) 的排序算法,本文介绍的则是复杂度分为 O(n) 的排序算法:桶排序和基数排序。线性排序时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很
阅读全文
摘要:Java 排序算法 为什么快速排序要比归并排序更受欢迎呢? [toc] __数据结构与算法目录()__ 上一节分析了冒泡排序、选择排序、插入排序这三种排序算法,它们的时间复杂度都是 O(n2),适合小规模数据排序。今天,本文继续分析两种时间复杂度为 O(nlogn) 的排序算法:归并排序和快速排序。
阅读全文
摘要:Java 排序算法 为什么插入排序要比冒泡排序更受欢迎呢 [toc] __数据结构与算法之美目录()__ 对于大多数程序员来说,我们学习的第一个算法,可能就是排序。大部分编程语言中,也都提供了排序函数。在平常的项目中,我们也经常会用到排序。排序算法太多了,有很多可能连名字都没听说过,比如猴子排序、睡
阅读全文
摘要:Java 算法 递归算法 [toc] __数据结构与算法之美目录()__ 递归本质是借助栈的数据结构,加上一个简单的逻辑算法实现。 递归是一种应用非常广泛的算法,很多数据结构和算法都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和
阅读全文
摘要:Java 数据结构 队列 [toc] __数据结构与算法目录()__ 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的。 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构。使用队列时,在一端插入元素,而在另一端删除元素。 1.1 队列的主要特性 队列中的数据元素遵守
阅读全文
摘要:Java 数据结构 栈 [toc] __数据结构与算法之美目录:__ 我们今天要讲的数据结构是栈,比如浏览器的前进后退功能就可以用栈来实现。 1. 什么是栈 栈是一种先进后出的线性存储结构,先进先出就是队列结构。 栈(stack)是限制插入和删除只能在一个位置上进行的线性表,该位置是表的末端,叫作栈
阅读全文