这一讲将深入到Linux内核中探讨其主要结构和算法,主要介绍进程和内存管理,包括进程的结构、对进程的操作、进程调度、Shell基本工作原理、进程通信、请求分页机制和存储交换等。进程是动态的实体,每个进程在其生存期间会处于不同的状态,对系统中的资源有不同的需求,彼此间会发生直接或间接的联系。因此,系统必须有一套机制记载和管理它们的状态。进程的结构1.task_struct结构Linux系统中每一个进程都包括一个名为task_struct的数据结构,它相当于“进程控制块”。每一个task_struct结构都有一个指针指向它,所有的这种指针组成系统中的一个进程向量数组task,该数组的默认值是512。在创建新进程时,Linux就从系统内存中分配一个task_struct结构,并把它加入task数组。当前正在运行的进程的task_struct结构用current指针指示。task_struct结构包含下列几方面的信息:◆进程状态。◆调度信息。调度算法利用这个信息来决定系统中的哪一个进程需要执行。◆标识符。系统中每个进程都有惟一的一个进程标识符(PID)。PID并不是指向进程向量的索引,仅仅是一个数字而已。每个进程同时还包括用户标志符(UID)和用户组标识符(GID),用来确定进程对系统中文件和设备的存取权限。◆内部进程通信。Linux系统支持信号、管道、信号量等内部进程通信机制。◆链接信息。在Linux系统中,每个进程都和其它进程存在联系。除初始化进程外,每个进程都有父进程。该链接信息包括指向父进程、兄弟进程和子进程的指针。◆时间和计时器。内核要记录进程的创建时间和进程运行所占用CPU的时间。Linux 系统支持进程的时间间隔计时器。◆文件系统。进程在运行时可以打开和关闭文件。task_struct结构中包括指向每个打开文件的文件描述字的指针,并且包括两个指向VFS(虚拟文件系统)索引节点的指针。第一个索引节点是进程的根目录,第二个节点是当前的工作目录。两个VFS索引节点都有一个计数字段用来指向节点的进程数。◆虚拟内存。大多数进程都使用虚拟内存空间。Linux系统必须了解如何将虚拟内存映射到系统的物理内存。◆处理器信息。每个进程运行时都要使用处理器的寄存器及堆栈等资源。当一个进程挂起时,所有有关处理器的内容都要保存到进程的task_struct中。当进程恢复运行时,所有保存的内容再装入到处理器中。