这一章主要通过介绍一个程序的运行周期,延伸介绍程序的编译过程,程序的运行过程:计算机系统的软硬件组成,操作系统的概念以及相关的进程、文件和虚拟内存的抽象概念。
1.计算机系统由硬件和软件组成,由它们共同工作来运行应用程序
2.程序生命周期
3.为何要了解编译系统如何运作?
- 可以优化程序性能:了解一些机器底层代码和编译器将高级程序语言转化成机器语言的过程,可以帮助我们在程序编码过程中选择更好的编码选择,提高程序性能。
- 理解链接时发生的错误:一些令人困扰的程序错误一般出现在链接操作时。
- 避免安全漏洞:理解从不信任的源接受数据的数量与格式,避免缓冲区溢出错误
4.处理器读并解释储存在内存中的指令
代码文件被编译成可执行文件后,在Linux系统下,无IDE支持下,通过shell程序输入./hello命令,并执行
- 系统硬件组成:总线、I/O设备、主存、处理器
- 运行程序过程:shell程序执行指令,将其读入寄存器,然后读入主存,处理器执行主存中的程序中的main部分的机器语言指令,比如这些指令将要输出的“hello world”字节从主存复制到寄存器,寄存器文件复制到显示设备,最终显示到屏幕上。
5.高速缓存
为了解决处理器与主存之间的处理速度的差异,利用高速缓存的局部性原理,可以将处理器近期可能需要的信息存放在缓存区,使得大部分内存操作可以在高速缓存中完成。
同时,存储结构形成层次结构,上层结构作为下一层结构的高速缓存
6.操作系统管理系统硬件
程序不直接访问系统硬件,而是通过操作系统进行操作,有两个功能:防止硬件被失控的程序滥用;提供简单一致的机制来控制复杂而大不相同的低级硬件设备给应用程序。
这两个功能通过文件、虚拟内存、进程抽象概念实现。
文件是I/O设备的抽象表示;虚拟内存是主存和磁盘I/O设备的抽象表示;进程是主存、I/O设备和处理器的抽象表示。
7.进程
是资源分配的基本单位,是操作系统对一个正在运行的程序的抽象
8.线程
是指令执行的基本单位,共享进程的代码和全局数据,一个进程可以有多个线程。
9.虚拟内存
为进程提供每个进程都独占内存的假象
- 程序代码和数据:存放代码和数据
- 堆:程序执行时的动态内存
- 共享库:存放共享库代码、数据
- 栈:用户栈,编译器用栈实现函数调用
- 内核虚拟内存:应用程序调用内核来执行读写该区域的内容或调用内核代码定义的函数。
把进程虚拟内存的内容储存在磁盘上,然后将主存作为磁盘的高速缓存。
可以为每个进程提供一致的地址空间,简化内存管理,保护每个进程的地址空间不被其他进程破坏。
10.文件
就是字节序列,所有I/O设备:磁盘、键盘、显示器和网络等都可以被看做是文件。
11.系统之间通过网络通信
比如说电子邮件、FTP等通信方式都是通过网络在不同系统之间进行通信。
下面是一个利用Telnet通过网络远程运行程序的步骤
12.Amdahl定律
用于计算加速比的公式
13.并发和并行
并发是指可以做多个任务,比如做完这个任务的一部分然后做另一个任务一部分,接着又回去做那个任务
并行是指同时做多个任务。
- 线程级并发
- 指令级并行
- 单指令、多数据并行