研二一年要看的书

书单

Windows游戏编程大师技巧

TP316.7/L122

计算机程序的构造和解释

TP311.1/A152

计算机体系结构 量化研究方法

TP303/H3683

计算机科学概论

TP3/B555a5

计算机组成与体系结构 性能设计

TP303/S6633

讲得不细致,但是有广度,不怪我看不懂。这本书一共5部分。第2部分计算机系统由于不是重点,估计也没有其它的书讲的清楚,第4部分是关于早期CISC处理器的微程序控制的,本科只接触过一点点,基本看不懂书上在说什么。重点在第3部分和第5部分,这两部分将处理器的发展历史讲清楚了。

最早出现的是复杂指令集计算机(Complex Instruction Set Computer,CISC)处理器,但是那时候还不叫这个名字。受制于内存大小,还有为了方便编译器,CISC提供了很多功能,还有各种各样的寻址模式,以图更加接近高级语言。但是随着计算机的发展,研究发现更加接近高级语言并不是一个有效的策略,编译器很少使用复杂的指令,而且不利于流水线技术(pipeline),所以就诞生了精简指令计算机(Reduced Instruction Set Computer,RISC)。RISC的最大特点是大量使用寄存器,还有指令定长,更重要的是便于进行流水线技术。

流水线满流的情况下可以保证一个时钟周期完成一条指令,这虽然很快,但不是真正的并行。所以在流水线的基础上又提出了超标量(superscalar)和超长指令字(Very Long Instruction Word)。一条流水线只能进行一个标量运算,如果有多条流水线和多个算术逻辑单元(Arithmetic and Logic Unit),那就能同时进行多个标量运算了,这就是指令级并行(Instruction-level parallelism)。在消除了相邻指令之间寄存器的伪相关性后,就可以乱序执行,实现超标量计算。

在超标量处理器中,还只是一个线程中指令之间的并行。为了更高的并行度,又提出了处理器的并行多线程技术(simultaneous multi-threading),使得一个处理器可以同时执行两个线程,而每个线程又可以按照超标量的方式执行,这就是单核双线程的处理器。

Intel最初的8086处理器属于CISC。80386奠定了x86的基础,之后在80486中实现了流水线。Pentium 4是超标量处理器,同时也是超线程(hyper-threading)处理器(单核双线程),它将外层的CISC转换成内部的RISC,通过寄存器重命名的方式实现了20段流水线的超标量执行,此后就是朝着多核处理器发展了,所以叫做Core系列,例如i5的双核四线程和i7的四核八线程。

计算机网络与因特网

TP393/K2493

0day安全 软件漏洞分析技术

TP311.5/W216a2

Windows核心编程

TP316.7/L3422

编程语言实现模式

TP312/P118

操作系统设计

现代体系结构上的UNIX系统

TP316.81/X1572

本以为能很快看完的书,但是看了半年。这书读起来太困难了,可能是翻译的问题,也可能是自己水平太低。

这本书分3部分:

  • 第1部分是讲高速缓存的,尤其对虚拟高速缓存做了很多介绍,包括带有进程键的虚拟高速缓存和物理地址标记的虚拟高速缓存,最后才是物理高速缓存。常见的英特尔x86 CPU上都是物理高速缓存,所以之前对虚拟高速缓存也没有太多了解,这应该属于这本书最大的特色了吧!
  • 第2部分是讲对称多处理(SMP)的,从内容安排来看可以很好的把握SMP的历史脉络。UP机器上的于原子操作和互斥有着天然的优势,但是放到MP机器上就不成立了,所以最早的方法是主从内核,一个处理器运行内核,其余处理器不能运行内核。进而又提出了内核自旋锁,这样所有处理器都可以运行内核了,但是自旋锁这种互斥方法局限性太多,因此又提出了信号量,它改进了互斥的方法,使用信号量队列可以一次只唤醒一个进程,而不是像自旋锁一样唤醒所有进程。信号量可以说是同步方法的最早设计,后续又有了管程、事件等等方式。这一部分的最后还介绍了Dekker算法非定序存储模型。
  • 第3部分是将MP系统的高速缓存的,最主要的问题也就是高速缓存一致性的问题,介绍了软件和硬件的解决方法。软件的方法主要就是共享数据不缓存,或者适当的时候冲洗高速缓存,这种对于既有软件很不友好。硬件的方法是使用硬件高速缓存一致性协议,主要包括写—使无效协议和写—使更新协议,还有交叉互联开关总线中使用的基于目录的高速缓存一致性方法,这些方法对软件都是透明的。

需求分析与系统设计

TP311.52/M137

C++语言的设计与演化

TP312C++/S6632

Linux网络体系结构

TP316.89/W251a

3D数学基础:图形与游戏开发

TP391.41/D217

这本书关于数学部分的讲解浅显易懂,不过最大的反常点是使用左手坐标系以及使用行向量来表示矩阵。按照代码出现的章节,可以将这本书的内容分成4部分:

  • 第1部分是三维向量,属于高中数学的内容。
  • 第2部分是矩阵,很多也都是基础知识。印象最深一点是讲清楚了为什么使用方阵描述线性变换。给出笛卡尔坐标系中的向量v和方阵M = [P Q R]T,则v' = v * M = xP + yQ + zR。如果PQR线性无关,则可以看作一组基向量,那么在新坐标系中v的表示依然是(x, y, z),而在原笛卡尔坐标系的表示为v'。进一步如果v表示的是笛卡尔坐标系的基向量,那么v'就是转换后的基向量(PQ或者R),因此基向量经过变换后仍然是基向量,根据这个原理,计算旋转、平移、缩放、切变和镜像时,通过对原基向量进行变换,就可以得到变换后的基向量,经过组合就可以得到变换矩阵了。另一点是如何将图形学中的透视投影也用矩阵进行表示,因为透视投影需要除法,而矩阵变换无法实现,所以引入的四维齐次坐标。最后一点是使用四元数描述描述物体自身的旋转。
  • 第3部分是基本几何图元的表示方法,包括射线、圆、球、矩形边界框AABB,三角形及其重心坐标、多边形,以及常见的相交性检测,基本都是高中的数学和物理。
  • 第4部分描述了一个图形管线。
setTheCamera();
clearZBuffer();
setLightAndFog();
ObjList = highLevelVisibleDetection();//这可能是说绘制了哪些物体的意思???
for(each obj in ObjList)
{
	if(!obj.BoundingVisibleDetection()) continue;//去掉视锥外的物体,通过包围盒的8个顶点进行检测
	for(each triangle in obj.surface) //假设图形表面由三角形网格组成
	{
		clipSpaceTriangle = transformAndLighting(triangle);//物体坐标系->世界坐标系->摄像机坐标系(视锥),并进行顶点光照计算
		if(clipSpaceTriangle.back()) continue;//背向剔除
		clippedTriangle = clip(clipSpaceTriangle);//边界裁剪
		projectionTriangle = project(clippedTriangle);//投影变换
		for(each pixel in projectionTriangle)//对于每一个保留的像素
		{
			if(!ZBufferTest()) continue;//深度测试
			if(!AlphaTest()) continue;//alpha测试
			color = shadePixel();//根据光照、纹理进行渲染
			writePixel(color, FrameBuffer, ZBuffer);//写入帧缓存,更新z缓存
		}
	}
}
发布了194 篇原创文章 · 获赞 2 · 访问量 7700

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/100552490