CSAPP[0]计算机系统漫游

gcc -o helloworld helloworld.c

经过了一下步骤:

  • 预处理器处理以#开头的宏命令,生成helloworld.i
  • 编译器编译出一个汇编语言程序 ,生成helloworld.s
  • 汇编器将helloworld.s翻译成机器语言生成helloworld.o,此时文本文件变成了二进制文件
  • 连接器负责将printf.o与helloworld.o链接起来,最终生成helloworld程序,它是一个可执行文件,可以被加载到内存中,由系统执行

系统的硬件组成

总线

贯穿整个系统,总线通常传输定长的字节块,成为,一个字中的字节数是一个基本的系统参数,64位系统一般为8个字节

I/O设备

每个IO设备都通过一个控制器与适配器与I/O总线相连

主存

由一组动态随机存储器(DRAM)芯片组成的

处理器

核心为一个大小为一个字的存储设备(寄存器),成为程序计数器(PC),在任何时刻,PC都指向主存中某条机器语言的指令的地址

处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令,处理器按照指令集进行一些简单操作来运行,这样的简单操作通常围绕着主存、寄存器文件(由一些单个字长的寄存器组成)和算数/逻辑单元(ALU)来运行。

处理器中重要的技术包括 指令集架构和微体系结构,指令集架构描述了每条机器代码的效果,微体系结构描述了处理器实际上是如何实现的

处理器中由高速缓存,加快访问数据的速度

操作系统

进程

一个系统上可以运行很多进程,每个进程都好像在独立地占用硬件,这是通过处理器在进程间切换实现的,被称作上下文切换

任何时候,单处理器系统只能执行一个进程的代码,如果操作系统要决定把控制权从当前进程转移到某个新进程之上,就会进行上下文切换,即保存当前程序的上下文、恢复新进程的上下文,然后把控制权交给新进程,这种转换是通过操作系统内核(kernel)管理的

线程

线程是程序执行时的最小单位 ,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。

虚拟内存

每个进程都好像在独占主存,每个进程看到的内存是一致的,被称为虚拟地址空间

运行helloworld程序时内存地址0逐步向上:

  • 程序代码和数据,从某一固定地址开始,紧接的是和C全局变量相应的数据位置。
  • 堆,可以动态地扩展和收缩
  • 共享库,C标准库这样的共享代码区域
  • 栈,用户栈位于虚拟空间顶部,编译器用它实现函数调用,栈也可以动态扩展或收缩
  • 内核虚拟内存,在地址空间的顶部,不允许应用程序读写这个区域的内容或者调用内核代码定义的函数

并发

  • 线程级并发:一个进程中可以执行多个控制流
  • 指令级并发:流水线的使用
  • 单指令多数据并发:e.g.并行对多个数做加法

发表评论

电子邮件地址不会被公开。 必填项已用*标注