csapp阅读笔记(1)、计算机系统漫游

257 阅读7分钟

程序员视角下的计算机系统

计算机系统是由硬件和软件组成的,它们共同工作运行应用程序。操作系统屏蔽了硬件的不同,提供了相似的接口使得程序员在编程时不用过多在乎硬件本身的细节。 我们先写一个hello, world程序并保存。我们这节就以这个程序开始

#include <stdio.h>

int main()
{
    printf("Hello world\n");
    return 0;
}

image.png

信息就是位 和 上下文

每个程序本身都是以文件的方式存在的,一般以.后面作为扩展名,指定文件的格式。例如.c(c源文件),.cc(c++源文件) 其实每一个文件在计算机本身看来都是由0和1组成的,8个位被表示为一个字节。大部分现代的操作系统都是以ASCII标准表示文本字符,就是用不同的整数表示不同的字符。 比如我们的hello.c 使用od命令打开

od -x -a hello.c   ## -x表示以16进制打开,-a表示以ascii码打开

可以看到 image.png 在书里是这样的

image.png 我们看到数字不等,是因为书中是以10进制表示,我们这里用的16进制表示

可以知道hello.c文件是由0和1构成的,我们看到不同的文件其实是由不同的解释方式,对计算机来说文件就是位和上下文组成的。

  • 像hello.c这样的只由ascii码字符组成的文件称为文本文件,其他文件都被称为二进制文件

c程序的整个执行过程

我们知道gcc可以直接进行c语言的编译、链接,最后生成一个可执行的.out文件。 其实中间的过程有很多步骤

image.png

image.png

中间的过程分为很多步,需要不同的参数指定

image.png

image.png

  • -E表示预处理,生成一个.i文件,是修改过的源程序(宏展开,内联替换...)
  • -S表示编译阶段,生成一个汇编语言程序
  • -c表示汇编阶段,由汇编文本文件生成一个可重定位目标程序 .o
  • -l表示链接,比如我们的hello.c使用了printf函数,存在于系统的printf.o文件中。就需要链接这个文件

系统的硬件组成

总线:贯穿整个系统的一组电子通道,被称为总线,它携带信息字节并负责在各个部件之间传递。通常总线被设计成传送定长的字节快,也就是字。字中的字节数(即字长)是一个基本的系统参数,在各个系统中不同。现在的大多数机器的字长要么是4个字节(32位机),要么是8个字节(64位机)

I/O设备:I/O设备即输入/输出设备,是系统与外界的联系通道。常见的设备有键盘,鼠标,显示器,网卡,磁盘...,每个I/O设备都通过一个适配器控制器I/O总线相连。控制器与适配器之间的区别,控制器是I/O设备本身或者电脑的主板上的芯片组。而适配器是插在主板插槽上的卡,他们的功能都是在I/O总线和I/O设备之间传递信息。

主存:主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。物理上来说,主存是由一组动态随机访问存储器芯片组成的。从逻辑上说,是一个线性的字节数组,每个字节有唯一的地址(数组索引)

处理器:中央处理单元(cpu),简称处理器。是解释存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(pc, progmming counter, 不是个人电脑(private computer))。在任何时候, pc都指向主存中的某条机器语言指令(即含有该条指令的地址)

指令集架构描述的是每条机器代码指令的效果;而微体系结构描述的是处理器实际上是如何实现的。

image.png

运行一个程序

从键盘读取命令

image.png

image.png

存储器层次结构

因为不同设备的读取和写入速度差异巨大。所以缓存用来提升速度就很重要,就形成了存储器层次结构

image.png

image.png

操作系统的基本功能

管理硬件。屏蔽硬件的细节,就是在硬件上面的一层抽象。我们后面还会学到很多主题,例如文件系统就是对I/O设备的抽象,虚拟内存就是对主存的抽象,进程就是对运行的程序的抽象

image.png

进程

进程是操作系统对一个正在运行的程序的一种抽象。在一个机器上可以同时运行多个进程,每个进程都好像在独占地使用硬件。而并发运行则是说一个进程的指令个另外一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。 操作系统保持跟踪进程运行所需的所有状态信息,称为上下文。当操作系统决定吧控制权从当前进程转移到某一个进程,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次它停止的地方开始。

image.png

线程

在现代的操作系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并且共享同样的代码和全局数据。因为多线程比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效,所以线程称为越来越重要的编程模型。

虚拟内存

虚拟内存是一个抽象,让每个进程都以为在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。

image.png 从下往上分别是(从低地址向高地址)

  • 程序代码和数据(对应c语言里的静态变量)。
  • 堆。运行时堆。堆可以在运行时动态的扩展和收缩
  • 共享库。用来链接
  • 栈。位于用户虚拟空间顶部的是用户栈
  • 内核虚拟内存。地址空间顶部的区域就是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。

文件

文件就是字节序列,仅此而且。每个I/O设备,包括磁盘,键盘,显示器,甚至网络,都可以看成是文件。系统中所有的输入输出都是通过一小组称为Unix I/O的系统调用函数读写文件实现的。向应用程序提供了一个统一的视图,来看待系统中可能含有的所有各种各样I/O设备。

系统通过网络通信

从一个单独的系统看,网络可以视为一个I/O设备

image.png

image.png

其他

并发与并行

并发是一个通用的概念,指一个同时具有多个活动的系统,而并行指的是用并发来使一个系统运行的更快。并行可以在计算机系统的多个抽象层次上使用。

image.png

计算机系统中的抽象

操作系统中主要的三个抽象是:文件是I/O设备的抽象,虚拟内存是对程序存储器的抽象,进程是对一个正在运行的程序的抽象。 虚拟机是对操作系统的一个抽象