感觉自己对计算机系统的整体把握不够,所以找来这本书学习一下,读书要做笔记,第一章,开始。
书名:Commputer Systems (A Programmer's Perspective Second Edition) 深入理解计算机系统
站在程序员的视角讲计算机系统的本质概念小知识:
1.x86-64是IA32的一种扩展,允许程序操作更多的数据,引用更广范围的内存地址,x86-64系统可以运行IA32的代码
2.类Unix的操作系统:Solaris, Mac OS, Linux1. 计算机系统漫游
1.1 信息就是位 + 上下文
只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件C语言是Dennis Ritchie与1969~1973年在贝尔实验室创建的,1989年ANSI颁布ANSI C,后来C语言标准化由ISO负责,它 们定义了C标准库
Kernighan和Ritchie在K&R里描述了ANSI C
C语言的特点:
C语言与Unix操作系统关系密切C语言小而简单
C语言是为实践目的设计的
1.2 程序被其他程序翻译成不同的格式
GCC编译器驱动程序将.c编译到.exe预处理阶段:修改#开头的命令,得到.i
编译阶段:由.i到.s,得到汇编语言程序
汇编阶段:由.s到.o,得到机器语言指令,可重定位目标程序的格式,是一个二进制文件
链接阶段:将printf函数的printf.o合并到所编译的.o文件中,得到可执行目标文件
GNU项目
开发出一个完整的类Unix的系统,其源代码能够不受限制地被修改和传播,该项目已经开发出很多有用的工具
1.3 了解编译系统如何工作是大有益处的
要知道的原因:优化程序性能
理解链接时出现的错误
避免安全漏洞
1.4 处理器读并解释存储在存储器中的指令
1.4.1 系统的硬件组成
1. 总线:贯穿整个系统的一组电子管道,携带信息字节并负责在各个不见间传递,通常总线被设计成传送定长的字节块, 也就是字。2. I/O设备:输入/输出设备是系统与外部世界的联系通道,是通过一个控制器或适配器与I/O总线相连。
3. 主存:是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。由一组DRAM芯片组成,逻辑上是从零开始的 字节数组
4. 处理器:中央处理单元CPU,是解释存储在主存中指令的引擎。核心是一个字长的程序计数器。 可能会执行加载、存储、操作,跳转的操作。
1.4.2 运行hello程序
键盘回车结束,加载可执行的hello文件,把代码和数据从磁盘复制到主存,将字符串从主存复制到寄存器文件,从从寄存器文件复制到显示设备,最终显示在屏幕上。1.5 高速缓存至关重要
系统花费了大量的时间把信息从一个地方挪到另一个地方。根据机械原理,较大的存储设别要比较小的存储设备运行得慢,而快速设别的造价远高于同类的低速设备。
高速缓存是更小、更快的存储设备,用来存放当处理器近期可能会需要的信息。
是一种SRAM的硬件技术实现的。
1.6 存储设备形成层次结构
存储器层次结构的主要思想是一层上的存储器作为第一层存储器的高速缓存。1.7 操作系统管理硬件
可以把操作系统堪称是应用程序和硬件之间插入的一层软件。操作系统的基本功能:
1. 防止硬件被失控的应用程序滥用
2. 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
文件: 对I/O设备的抽象表示
虚拟存储器: 对主存和磁盘I/O设备的抽象表示
进程: 对处理器、主存和I/O设备的抽象表示
Unix是贝尔实验室开发的,由于后来的盛行导致版本过多,进而出现不兼容情况,为了解决这一情况,出现了Posix标准。
1.7.1 进程
是操作系统对一个正在运行的程序的一种抽象。就好像系统上只有这个程序在运行。在一个系统上可以同时运行多个进程,而每个进程都好像在独立地使用硬件。并发运行,是指一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作。
1.7.2 线程
一个进程可以由多个线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程之间比多进程之间更容易共享数据,线程一般来说都比进程更高效。1.7.3 虚拟存储器
一个抽象概念,为每个进程提供了一个假象,即每个进程都独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。地址空间最上面的区域为操作系统中的代码和数据保留的。地址空间的底部区域存放用户进程定义的代码和数据,地址是从下往上增大的。每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。
程序代码和数据:代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据位置。
堆:代码和数据区后紧随着的运行时堆。代码和数据区在进程一开始运行时就被规定了大小。malloc和free可以动态扩展和收缩堆
共享库:大约在地址空间的中间部分是一块用来存放像C标准库和数据库这样数学库的代码和数据的区域。
栈:位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。
内核虚拟存储器:内核总是驻留在内容中,是操作系统的一部分。地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区 域的内容或者直接调用内核代码定义的函数。
虚拟存储区的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。其基本思想 是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
1.7.4 文件
文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以视为文件。系统中的所有输入输出都是用过使用一小组系统函数调用读写文件来实现的。Linux项目
芬兰研究生Linux Torvalds,使用范围很宽广
1.8 系统之间利用网络通信
可以把网络通信看作是不同计算机之间通信的I/O设备1.9 重要主题
1.9.1 并发和并行
并发:具有多个活动的系统并行:用并发使一个系统运行得更快
1. 线程级并发
工业界的专家语言他们能够将几十个、最终会是上百个核做到一个芯片上。超线程:同时多线程,一项允许一个CPU执行多个控制流的技术。
多处理器的使用可以从两个方面提高系统性能。首先,它减少了在执行多个任务时模拟并发的需要。其次,它可以使应用程序运行得更快。