重点理解部分:
不过在第一章内容中,不需要立即掌握上述内容,在后续继续学习过程中,会有更深入的了解。我相信哈…
系统硬件:计算机系统主要由处理器(CPU)、存储器(RAM)、和输入输出设备(I/O设备)组成。CPU负责执行程序指令,进行运算和控制操作;RAM存储正在运行的程序和数据;I/O设备负责与外部世界进行信息交互,例如键盘、鼠标、显示器等。
总线(Bus):贯穿整个系统的一组电子管道,它将处理器、内存和I/O设备链接起来,并携带信息字节在这节部件间传递。
I/O设备(Input/Output Devices):是系统与外界的联系通道。包括各种输入设备(如键盘、鼠标)、输出设备(如显示器、打印机)以及存储设备(如硬盘、光盘驱动器)。这些设备可以通过总线与处理器和内存进行通信,也可以通过DMA(Direct Memory Access,直接内存访问)方式访问主存,这可以在不占用CPU的情况下,直接在I/O设备和主存之间传输数据。
主存(Main Memory):也称作内存,是一个临时存储设备,主要用于存储正在运行的程序以及其所需要处理的数据。
处理器(Processor):也称为中央处理器(CPU),它是计算机的运算核心和控制核心。它是一个字长大小的存储设备或寄存器,始终指向主存中的某条机器语言指令。
处理器的工作过程:
处理器可以执行的操作类型包括:
Hello, World程序运行的过程:
预处理:预处理器(cpp)按照你在源代码中的指示修改代码。例如解析#include
,#define
等预处理指令。即将hello.c处理成hello.i。
编译:编译器(cc1)将预处理过的C源代码(hello.i)翻译成汇编语言(hello.s)。
汇编:汇编器(as)将汇编语言翻译成机器语言指令,生成可重定位目标文件(hello.o)。
链接:链接器(ld)将目标文件与库文件链接在一起,生成一个可执行文件。
计算机系统中的存储设备按照它们的存取速度和容量组织成了一个层次结构,这就存储器层次结构。
存储器层次结构的主要思想是一个层次的存储器作为下一层次上的存储器的告诉缓存。这个结构从顶到底分别是:寄存器、高速缓存(Cache)、主存(Main Memory)、磁盘存储(Disk Storage)以及备份存储(Backup Storage)。
存储器层次结构存在的主要原因是处理器和存储器之间的“速度差距”。处理器的速度远远超过了存储器的速度,如果没有Cache,那么处理器就会花大量的时间在等待数据存取上,这就是所谓的存储器壁垒(Memory Wall)问题。通过引入Cache,我们可以将常用的数据保存在接近CPU速度的存储器中,从而大大提高程序的运行效率。
操作系统可以看成应用程序和硬件之前插入的一层软件,所有应用程序对硬件的操作都必须通过操作系统。
操作系统有两个基本功能:
操作系统通过下图显示的抽象概念(进程、虚拟存储器、文件)实现这两个功能。
进程:是操作系统对运行程序的一种抽象。当你运行一个程序时,操作系统会创建一个新的进程来执行它。这个进程看起来好像它是独占的,即它有自己的处理器、内存和I/O设备。实际上,操作系统允许多个进程并发运行,交错执行每个进程的指令,创建出它们各自独占硬件的假象。
这种并发运行的实现是通过操作系统的一种机制:上下文切换。操作系统保存每个进程运行所需的所有状态信息,即上下文,这包括程序计数器(PC)和寄存器文件的当前值,以及主存的内容。当操作系统决定从当前进程切换到另一个进程时,它会保存当前进程的上下文,恢复新进程的上下文,然后将控制权交给新进程。新进程就会从上次停止的地方开始运行。
例如,当你在shell中运行hello程序时,最初只有shell进程在运行,等待你的输入。当你让它运行hello程序时,shell通过调用一个系统调用来执行你的请求,系统调用会将控制权交给操作系统。操作系统保存shell进程的上下文,创建一个新的hello进程及其上下文,然后将控制权交给hello进程。hello程序运行完毕后,操作系统恢复shell进程的上下文,并将控制权返回给shell,它会继续等待你的输入。
进程这个概念需要硬件和操作系统软件的紧密合作来实现。虽然它为我们提供了一个看似简单的运行环境,但实际上,操作系统和硬件背后的复杂性被隐藏了起来。另外,由于进程的并发执行,时间的概念被打乱了,导致很难获取准确和可重复的运行时间测量。
线程是一个进程内的执行单元,每个线程都在进程的上下文中运行,并共享同一套代码和全局数据。相比于多进程,多线程更易于数据共享,也更为高效。特别是在需要并行处理的场景,如网络服务器,线程就显得尤为重要。
虚拟存储器是另一个操作系统的重要抽象。它为每个进程提供了一种假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储空间,称之为虚拟地址空间。例如,在Linux系统中,虚拟地址空间被分为两部分:底部的四分之三存放用户进程的代码和数据,顶部的四分之一则预留给操作系统的代码和数据。这样的设计使得每个进程都有一致的视角,似乎拥有了整个主存。
虚拟地址空间由多个区组成,每个区都有特定的功能:
虚拟存储器的运作需要硬件和操作系统软件间的精密复杂的互相合作。基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
网络是现代计算机系统的核心组成部分,它使得不同的计算机系统可以彼此进行通信和数据交换。从单个系统的视角来看,网络可以被看作是另一种I/O设备,系统可以从主存中复制数据到网络适配器,然后数据通过网络到达另一台机器。相反,系统也可以从网络中读取数据,将数据复制到主存中。
我们可以通过telnet应用在远程主机上运行程序。假设我们在本地主机上的telnet客户端连接到远程主机的telnet服务器,登录并运行shell,然后在shell中输入命令来运行程序。接下来,远程shell将运行程序并将输出返回给telnet服务器,最后,telnet服务器通过网络将输出传输到telnet客户端,客户端将输出显示在我们的本地终端上。
这种在客户端和服务器之间进行交互的方式在所有网络应用中都是非常典型的。我们可以利用这种机制来创建各种网络应用程序,如Web服务器等。
总体来说,网络为计算机系统提供了与其他系统通信的能力,使得数据可以在不同的系统之间传输。这为许多网络应用提供了基础,也极大地提高了计算机系统的功能性和灵活性。
互联网是一个全球性的计算机网络,它使用TCP/IP协议族来连接全球各地的计算机。在网络通信中,数据被分解为小的数据包,然后通过网络发送到目的地。每个数据包都包含源地址和目标地址,这样它就可以被正确地路由到目的地。
计算机通过网络交换信息的基本过程是这样的:首先,源计算机的操作系统将要发送的信息分解为一个个数据包,并添加TCP/IP头信息,然后通过NIC发送到网络。这些数据包通过网络到达目的地后,目标计算机的操作系统将它们重新组合成原始信息。
在互联网中,还有一些特定的服务和应用程序,如HTTP(用于网页传输)、FTP(用于文件传输)、SMTP(用于电子邮件传输)等,它们都是建立在TCP/IP协议之上的,用来执行特定的网络通信任务。
并发是指一个系统能够处理多个任务的能力。这并不意味着它们会同时运行;而是意味着在同一时间段内,这些任务都在进展,但可能会被分解为更小的子任务,并交替执行。并发常常出现在单核处理器的系统中,通过任务切换(task switching)和时间分片(time slicing)技术,使得单个处理器看起来像是在同时处理多个任务。
并行则是指在同一时刻执行多个任务的能力。这通常需要多个处理器或者多核处理器的支持。在并行计算中,任务会被分解为一些可以独立并行执行的小任务,然后在多个处理器或核心上同时运行。