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

今年是离开校园的第六年,这六年来我一直在从事应用软件的设计、开发工作,大部分时间是在与高级编程语言、设计模式、业务逻辑打交道。它们大多流于表面,久而久之,与技术底层疏远了,诸如计算机组成原理、汇编语言、编译原理、数据结构以及算法慢慢得生疏,时至今日,向上碰到天花板,向下触到花岗岩。五年是一个契机,趁着下一个五年开始之际,我计划用三个月至半年时想间,重新学习这些知识,以期达到巩固基础,厚积薄发的目的。

本篇是我阅读《Computer System: A Programmer’s Perspective》一书的笔记,该书和与之搭配的《Professional Assembly Language》是我当下阅读计划的一部分。

Process

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

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

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

操作系统内核使用一种称为上下文切换(context switch)的较高层形式的异常控制流来实现多任务。上下文切换,1、保存当前进程的上下文;2、恢复某个先前被抢占的进程被保存的上下文;3、将控制传递给这个新恢复的进程。

当内核代表用户执行系统调用时,可能会发生上下文切换。如果系统调用因为等待某个事件发生而阻塞,那么内核可以让当前进程休眠,切换到另一个进程。中断也可能引发上下文切换,每次发生定时器中断时,内核就能判定当前进程已经运行了足够长的时间,并切换到一个新的进程。

Concurrent & Parallel

逻辑控制流是指一系列由 PC 值构成的序列,若一个逻辑控制流的执行在时间上与另一个流重叠,则称为并发流(concurrent flow),一个进程与其他进程轮流运行的概念称为多任务(multitasking)。如果两个流并发地运行在不同的处理器核或者计算机上,那么它们称为并行流(parallel flow)。并行流是并发流的真子集。

User Mode & Kernel Mode

处理器通过某个控制寄存器中的一个模式位提供了机制,限制一个应用可以执行的指令以及它可以访问的地址空间范围。

一个运行于内核模式的进程,可以执行指令集中的任何指令,可以访问系统中任何的存储器位置。如果是用户模式,则不允许执行特权指令,也不允许直接引用地址空间中内核区内的代码和数据。一个用户模式的进程只有通过中断、故障或者陷入系统调用才能进入内核模式。

Linux 提供了 /proc 文件系统,允许用户模式进程访问内核数据结构的内容。/proc 文件系统将许多内核数据结构的内容输出为一个用户程序可以读的文本文件的层次结构。Linux 2.6 引入了 /sys 文件系统,它输出关于系统总线和设备的额外的低层信息。

Leave a comment

Your comment