Linux内核设计与实现摘录
“如果有这样一本书,既能提纲挈领,为我理顺思绪、指引方向;同时又能照顾小节、阐述细微,帮助我更好更快地理解源码,那该有多好。”说这话的先生虽然针对的是C ,但道出的是研习源码的人们共同的心声。我们能不能做点儿什么,让学习Linux内核的过程更符合程序员的习惯呢?本书回答了这个问题。本书作者RobertLove是一个狂热的内核爱好者,所以他的想法自然贴近程序员。
本书内容涉及Linux2.6内核,包含许多新特性,如O(1)调度程序、块I/0层、I/0调度程序等。
本书提供Linux内核设计和实现的概述性信息,覆盖了从核心内核系统的应用到内核设计与实现等各方面内容,能够带领读者快速走进Linux内核世界。本书不但介绍了理论,而且也讨论了具体应用,可以满足不同读者的需要,适合于各类希望理解Linux内核软件开发的读者。
《Linux内核设计与实现》电子书FTP下载
FTP地址:ftp://www.6688.cc/
用户名:www.linuxidc.net
密码:www.6688.cc
【进程管理】
1.进程
在Linux系统中,进程创建通常是调用fork()系统调用的结果,该系统调用通过复制一个现有进程来创建一个全新的进程。
调用fork()的进程被称为父进程,新产生的进程被称为子进程。在该调用结束时,在返回点这个相同的位置上,父进程恢复执行,子进程开始执行。
通常创建新的进程都是为了执行新的、不同的程序,而接着调用exec()这族函数就可以创建新的地址空间,并把新的程序载入。
最终,程序通过exit()系统调用退出执行。这个函数会终结进程并将其占用的资源释放掉。
进程退出执行后被设置为僵死状态,直到它的父进程调用wait()或waitpid()为止。
进程的另一个名字是任务(task)。Linux内核通常把进程也叫做任务。
内核把进程存放在叫做任务队列(task list)的双向循环链表中。链表中每一项都是类型为task_struct,称为进程描述符(process descrpotr)的结构,包含了一个具体进程的所有信息。
Linux进程之间存在一个明显的继承关系。所有进程都是PID为1的init进程的后代。
系统中每个进程必有一个父进程。相应的,每个进程也可以拥有一个或多个子进程。拥有同一个父进程的所有进程被称为兄弟。
2.进程上下文
当一个程序调用了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。
除非在此期间有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在用户空间继续执行。
系统调用和异常处理程序是内核明确定义的接口,进程只有通过这些接口才能陷入内核执行。--对内核的所有访问都必须通过这些接口。
3.线程
Linux实现线程的机制非常特别。从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当作进程来实现。
内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个使用某些共享资源的进程。
每个线程都拥有唯一隶属自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)
上述线程机制的实现与Microsoft Windows或是Sun Solaris等操作系统的实现差异非常大。这些系统都是在内核中提供了专门支持线程的机制。在这些系统中,进程是重量级的,而线程被抽象成一种耗费较少资源,运行迅速的执行单元。而对于Linux来说,线程只是一种进程间共享资源的手段(Linux的进程本身足够轻量的了)。举例来说,假如我们有一个包含四个线程的进程,在windows中,通常会有一个包含指向四个不同线程的指针的进程描述符。该描述符负责描述像地址空间、打开的文件这样的共享资源。线程本身再去描述它独占的资源。相反,Linux仅仅创建四个进程并分配四个普通的task_struct结构,建立者四个进程时指定他们共享某些资源就行了。