欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

程序员探险记—知识图谱—大纲

程序员文章站 2022-07-02 23:02:40
计算机世界太庞大了,漫无目的的学习容易导致轻而易举的遗忘。...

开始

计算机世界太庞大了,漫无目的的学习容易导致轻而易举的遗忘。整个计算机体系的知识量是巨大的,我们不能从细节出发,那样很快就迷失了。如果从整体到局部一一击破,则要容易的多。或者只抓住主干,等用的时候再抠细节也不晚。

从大型服务器到微型计算机,现在常用的计算机系统都采用的冯·诺依曼结构(也称为普林斯顿结构),这种架构第一次将存储器(内存)和运算器(CPU)分开,指令和数据均放置于存储器中,为计算机的通用性奠定了基础。这是一种以存储器为核心的现代计算机。不过天下没有免费的午餐,正所谓成也萧何败也萧何,CPU与内存分开却导致了冯·诺伊曼瓶颈,这对我们编程产生了深刻的影响。

我们先看看具体的计算机五大组成部分:运算器+控制器+ 存储器+ 输入+输出。运算器+控制器其实就是CPU。所以抽象来看,计算机=CPU + 存储 + IO。CPU代表了时间,存储代表着空间,io就是时间和空间之间的各种变换。然后我们开始从这三大脉络开始着手来学习计算机编程基础。

程序员探险记—知识图谱—大纲

CPU,存储和IO的每个领域也都包含了太多的内容,这里不可能一一拆分并逐个细说。但只要掌握了思想,抓住了本质,是很容易扩展开来的,上手也比较容易。所以这里只进行大体结构的拆解,抓住我认为核心的部分。

CPU

CPU里面重点要掌握的就是缓存模型,线程模型和CPU的调度。

缓存模型

CPU通过多级缓存策略来平衡CPU速度和内存速度不匹配的问题。缓存其实比较好理解,但是缓存背后的哲学思想才值得我们深思。 首先是中介代理这种生活中很常见的例子,这正好印证了计算机领域一句很经典的名言“计算机世界的问题都可以通过引入新的一层来解决”。其次是计算机世界非常重要的局部性原理。时间维度的局部性就是缓存的核心原理。它是基于最近使用过的数据,将来很可能还会使用的理念。就像我们将这几天在看的书放在书桌,将这个月看的书放在书架,很长时间不看的书放回藏书室一样。

而空间维度的局部性正好是一个与缓存容易混淆的概念——缓冲。它表示一块数据被使用的时候,他附近的数据很可能也会被使用。这在操作系统里,磁盘io,数据库等技术里面大量被使用。

线程模型

大家在各种语言和框架中常看见进程,线程,轻量级进程,轻量级线程,纤程,协程,用户态线程等各种概念。如果没有真正理解线程模型,很容易被这些概念所迷惑。总的来看,主要有这三者线程模型:(1)内核线程模型KLT,线程的调度全部交给操作系统,比如java语言;(2)用户线程模型,在用户态自己实现线程的调度,比如erlang的actor模型;(3)混合线程模型,如go语言的goroutine 。

CPU的调度

首先要弄明白并发和并行的区别。

其次要理解并发中各种概念如竞态条件,临界区,锁等。特别是各种锁的实现方式,当然锁引起的阻塞会带来性能上的开销,所以我们应该尽量将锁由重量级转为轻量级,粗粒度变为细粒度,乐观锁代替悲观锁,甚至是达到无锁的地步,比如CAS(Compare and Swap),Read Copy Update,ThreadLocal等。

 

存储

说到存储,我们应该首先明白都有哪些存储类型?为什么会有这些存储类型?

 

IO

 

未完待续...

 

 

 

 

本文地址:https://blog.csdn.net/kingtao_1985/article/details/107317004