读CSAPP之进程、用户和内核模式

Computer System: A Programmer’s Perspective

进程是一个执行中的程序的实例。系统中的每个程序都是运行在某个进程的上下文(context)中。上下文由内核维持,由程序正确运行所需要的状态组成,包括通用目的寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构。

进程提供给应用程序两个关键抽象,其一是一个独立的逻辑控制流,好像应用程序独占地使用处理器;其二是一个私有的地址空间,好像应用程序独占地使用存储器系统。

从程序员的角度,进程总是处于三种状态之一,其一,运行,要么在 CPU 上执行,要么在等待被执行并最终会被内核调度;其二,停止,当收到 SIGSTOP(非来自终端的停止信号)、SIGTSTP(来自终端的停止信号)、SIGTTIN(后台进程从终端读) 或 SIGTTOU(后台进程向终端写) 信号时,进程即停止,并且保持到停止,直到收到一个 SIGCONT(继续进程如果该进程停止) 的信号,这时,进程再次运行;其三,终止,进程永远停止。

[ Read More » ]

读CSAPP之异常表、异常类型

Computer System: A Programmer’s Perspective

异常控制流(Exceptional Control Flow, ECF)是操作系统用来实现I/O、进程和虚拟存储器的基本机制。例如,应用程序通过使用一个叫做陷阱(trap)或者系统调用(system call)的 ECF 形式,向操作系统请求服务。而异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现。

系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号(exception number)。在系统启动时,操作系统分配和初始化一张称为异常表的跳转表,使得条目 k 包含异常 k 的处理程序的地址。异常号是到异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器(exception table base register)的特殊 CPU 寄存器里。

在任何情况下,当处理器检测到有事件发生时,它就会通过这个叫做异常表(exception table)的跳转表,进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序。

[ Read More » ]

读CSAPP之符号解析、定位和库

Computer System: A Programmer’s Perspective

.symtab 符号表由汇编器构造,使用编译器输出到汇编语言 .s 文件中的符号,存放程序中定义和引用的函数和全局变量的信息,包括了三类不同的符号:

  1. 由模块 m 定义并能被其他模块引用的全局符号;
  2. 由其他模块定义并被模块 m 引用的全局符号;
  3. 只被模块 m 定义和引用的本地符号。

.symtab 中的符号表不包含对应于本地非静态程序变量的任何符号,这些符号既不在 .data 节,也不在 .bss 节,是在运行时在栈中被管理,链接器对此此类符号不处理。

但是用 static 限定的内部变量却是例外,尽管其只能在该函数中使用,但是它一直占据存储器空间,并不伴随函数调用而产生和函数退出而消失。 其并不在栈中管理,而是由编译器在 .data 或 .bss 为其分配空间,并在符号表中创建一个有惟一名字的本地链接器符号。

[ Read More » ]

读CSAPP之链接器、目标文件和ELF

Computer System: A Programmer’s Perspective

链接(linking)是将各种代码和数据部分收集起来合并为一个单一文件的过程,这个文件可以被加载(或拷贝)到存储器并执行。其可以执行于编译时(compile time),也可以是加载时(load time),或者运行时(run time),由链接器(linker)执行,其使得分离编译(separate compilation)成为可能。

静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件(relocatable object file)由各种不同的代码和数据节(section)组成,指令、初始化的全局变量、未初始化的变量分别在不同的节当中。

[ Read More » ]

读CSAPP之优化的基础知识

Computer System: A Programmer’s Perspective

编写高效代码就是善待你的用户,每节省一个时钟周期、一字节网络流量,就是善事一桩,善小亦为之,日久功德无量。

首先,动手之前,选择出合适的算法和数据结构;其次,编写出的源代码应该让编译器能够有效优化,以生成成高效可执行代码;最后,针对处理运算量特别大的计算,要能将一个任务分成多个部分,这些部分可以在多核或多处理器的某种组合上并行地计算。

[ Read More » ]
←Older