《深入理解LINUX内核(第三版)》章节试读

当前位置:首页 > 计算机网络 > 操作系统/系统开发 > 深入理解LINUX内核(第三版)章节试读

出版社:中国电力出版社
出版日期:2007-10-01
ISBN:9787508353944
作者:(美)博韦,西斯特
页数:896页

《深入理解LINUX内核(第三版)》的笔记-第十六章:访问文件 - 第十六章:访问文件


1、访问文件的模式有多种:规范模式、同步模式、内存映射模式、直接I/O模式、异步模式。
2、第一节 读写文件。大多数磁盘文件系统的read方法是由名为generic_file_read()的通用函数实现的。而大多数磁盘文件系统是通过通用函数generic_file_write()实现它们的write方法的。本节详细介绍了generic_file_read() 函数和generic_file_write()函数以及它们涉及到的一些其他的函数。另外,还讲解了基于当前窗和预读窗的预读技术。
3、第二节 内存映射。内核把对线性区中页内某个字节的访问转换成对文件中相应字节的操作,这种技术称为内存映射(memory mapping)。有两种类型的内存映射:共享型和私有型。内核可以发出一个mmap()系统调用来创建一个新的内存映射。而当进程准备撤销一个内存映射时,就调用munmap()。
4、第三节 直接I/O传送。有一些非常复杂的程序为了提高效率不使用内核提供的页高速缓存等机制,而是实现自己的高速缓存。此时,内核只能放手,让程序利用直接I/O传送,绕过页高速缓存。
5、第四节 异步I/O。异步I/O也是提高效率的另外一种技术,因为它可以在后台运行,使得程序可以做更多的事情。

《深入理解LINUX内核(第三版)》的笔记-第14页 - 第一章 绪论

一些操作系统允许所有的用户程序都直接与硬件部分进行交互(如MS-DOS)。与此相反,类Unix操作系统把与计算机物理组织相关的所有低层细节都对用户运行的程序隐藏起来。
即程序必须通过操作系统使用硬件资源
为了实施这种机制,。。。
特别是,CPU引入了用户态和核心态

《深入理解LINUX内核(第三版)》的笔记-第十五章:页高速缓存 - 第十五章:页高速缓存


1、磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问不用再访问磁盘而能尽快得到满足。
2、第一节 页高速缓存,主要讲解了3方面的内容:①address_space对象,②基树,③页高速缓存的处理函数。函数的操作包括查找页、添加页、删除页、更新页。而为了更好地执行以上操作,需要对基树进行标记。
3、第二节 把块存放在页高速缓存中,重要概念是缓冲区首部。Alloc_buffer_head()和free_buffer_head()函数分别用于获取和释放缓冲区首部。
4、第三节 把脏页写回磁盘。“只要进程修改了数据,相应的页就被标记为脏页,即把它的PG_dirty标志置位。”刷新脏页由内核线程pdflush 负责。
5、第四节介绍了3个系统调用。Sync()允许进程把所有的脏缓冲区刷新到磁盘。Fsync()允许进程把属于特定打开文件的所有块刷新到磁盘。Fdatasync()与fsync()非常相似,但不刷新文件的索引节点块。

《深入理解LINUX内核(第三版)》的笔记-第三章 - 进程 - 第三章 - 进程

这一章讲进程,但没有涉及任何的算法相关的东西,都是那些跟数据有关的系统调用、函数、数据结构,这跟前一章很像。
进程的静态特性:进程描述符,都是task_struct类型的结构,它的字段包含了与一个进程相关的所有信息。进程描述符是很基础很重要的东西,整个内核都构建在它的基础之上。
进程切换,这一章里“切换”是跟“调度”完全不同的概念。切换只是当进程调度时要做的数据的处理,特别是与进程描述符相关的操作以及硬件上下文、进程上下文相关的数据、字段。
创建进程,最重要的是do_fork()函数和copy_process()函数。
还有最后一节是撤销进程。重点是do_exit()函数和进程删除时的父子进程关系。

《深入理解LINUX内核(第三版)》的笔记-第二章 内存寻址 - 第二章 内存寻址

这一章有点难懂,有点没搞懂。于是查了点总结性资料,在这儿备个份。
http://senghoo.com/293.html
http://senghoo.com/308.html

《深入理解LINUX内核(第三版)》的笔记-开源力量网推出299元超值Linux内核修 - 开源力量网推出299元超值Linux内核修

开源力量网推出299元超值Linux内核修炼之路课程,http://www.osforce.cn/course/97,于3月3日正式开课,分享给有需要的童鞋们!

《深入理解LINUX内核(第三版)》的笔记-第六章 - 定时测量 - 第六章 - 定时测量

Linux内核必需完成两种主要的定时测量:保存当前的时间和日期;维持计时器,这种机制能够告诉内核某一时间间隔已经过去了。
第一节时钟和定时器电路。讲的都是硬件方面的器件。包括实时时钟RTC、时间戳计数器TSC、可编程间隔定时器PIT、CPU本地定时器、高精度事件定时器HPET以及ACPI电源管理定时器。
第二节Linux计时体系结构。其数据结构包括定时器对象、jiffies变量、xtime变量。另外这节还分别讲述了单处理器系统跟多处理器系统上计时体系结构的实现。重要的函数有time_init()、timer_interrupt()。
内核通过利用各种计时器可以收集一些数据用于:检查运行进程的CPU资源限制;更新与本地CPU工作负载有关的统计数;计算平均系统负载;监管内核代码。
为了提供更灵活方便的定时器,内核实现了软件级别的定时器,包括动态定时器和间隔定时器。每个定时器都包含一个字段,表示定时器将需要多长时间到期。每个字段的初值就是jiffies的当前值加上合适的节拍数。 第六节与定时测量相关的系统调用。简单讲解了以下几个系统调用:time()、gettimeofday()、adjtimex()、settimer()、alarm()。
这一章的难度不大,而且讲解都很有条理、清晰。

《深入理解LINUX内核(第三版)》的笔记-第16页 - 第一章 绪论

区分程序和进程是非常重要的:几个进程能并发地执行同一程序,而同一进程能顺序地执行几个程序。???
内核体系结构:单块结构(monolithic)、微内核(microkernel)
关于操作系统的学术研究都是面向微内核的,但它比单块内核的效率低

《深入理解LINUX内核(第三版)》的笔记-第十二章 - 虚拟文件系统 - 第十二章 - 虚拟文件系统

虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持Linux所支持的所有实际文件系统所提供的任何操作。对所调用的每个读、写或其他函数,内核都能把它们替换成支持本地Linux文件系统、NTFS文件系统,或者文件所在的任何其他文件系统的实际函数。 第一节虚拟文件系统(VFS)的作用。VFS支持的文件系统可以划分为三种主要类型:磁盘文件系统,网络文件系统和特殊文件系统。Linux通过把各种不同的文件系统组织成一个通用的文件系统来达到支持它们的目的。通用文件模型包括以下几种对象类型:超级块对象、索引节点对象、文件对象、目录项对象。
第二节VFS的数据结构。本节讲解了上节提到的4类对象类型的字段数据结构以及它们的操作函数。然后介绍了为提高性能而设计的“目录项高速缓存”,以及处理与进程相关的文件的数据结构。
第四节文件系统处理。这节主要讲文件系统的安装和卸载。最重要的是mount()系统调用。该系统调用的服务例程是sys_mount(),它执行时调用do_mount()、do_kern_mount()函数。卸载文件系统要用到umount()系统调用,对应的服务例程是sys_umount()。
第五节路径名查找。通过路径名查找目标文件需要解析路径名,这同时,有很多因素需要考虑,例如目录的访问权、路径名可能跨越不同的文件系统、是否对应进程的命名空间等等。
第六节VFS系统调用的实现。对应的系统调用有很多,但本节只透过一个例子讲解了open()、read()、write()和close系统调用。
第七节文件加锁。用于文件加锁的锁有几种:劝告锁、强制加锁、租借锁。

《深入理解LINUX内核(第三版)》的笔记-第34页

僵死进程(zombie process):  一个进程在调用exit命令结束自己的生命的时候,其实linux中的僵尸进程它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显是忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
来自:http://baike.baidu.com/view/758736.htm
算作补充吧。

《深入理解LINUX内核(第三版)》的笔记-第19页 - 第一章 绪论

文件或目录名由除“/”和空字符“\0”之外的任意ASCII字符序列组成
硬链接、软链接(符号链接)???

《深入理解LINUX内核(第三版)》的笔记-第九章 - 进程地址空间 - 第九章 - 进程地址空间

当用户态进程请求动态内存时,并没有获得请求的页框,而仅仅获得对一个新的线性地址区域的使用权,而这一线性地址区间就成为进程地址空间的一部分。这一区间叫做“线性区” 第一节进程的地址空间只是简单介绍了线性地址的一些相关内容。例如进程获得新的线性地址的几种情况。
第二节内存描述符。每一个内存描述符包含了它所对应的进程的地址空间的全部信息,一共有50个左右的字段用于标识各种信息。由于内核的特殊性,内核进程不拥有内存描述符。
第三节线性区。这是本章的重点。因为进程的地址空间就是有一个一个的线性区组成的。线性区描述符由vm_area_struct结构体实现。进程所拥有的线性区从来不重叠,并且内核尽力把新分配的线性区与紧邻的现有线性区进行合并。对某一个进程所拥有的所有的线性区,有两种组织方式,一种是链表,另一种是红黑树。
第四节缺页异常处理程序。这一节讨论了各种导致缺页异常的情况及其处理方法。另外还介绍了请求调页技术和写时复制技术。
第五节创建和删除进程的地址空间。创建时调用copy_mm()函数,使用写时复制技术。当进程结束时调用exit_mm()函数,释放进程的地址空间。

《深入理解LINUX内核(第三版)》的笔记-第19页

pathname 拼错了?

《深入理解LINUX内核(第三版)》的笔记-第二章 内存寻址 - 第二章 内存寻址

这一章的内容都是很底层的,直接是一些硬件特性或者是内核中处理硬件的一些策略。
内存地址根据其组织特点的不同分为三个层次:逻辑地址(虚拟地址)、线性地址、物理地址。再细一层,有分段和分页两种。对这两种机制,书中分别详细描述了其80X86的硬件特性和Linux内核对应的处理。
其中分页是重点。常规分页机制中,页框是4KB;而扩张分页机制的页框是4MB。Linux采用了4级分页模型,能适应不同的体系结构。本章还讲述了硬件高速缓存和TLB(Translation Lookaside Buffer),TLB的翻译有很多种:转换后援缓冲器、转换检测缓冲区、旁路转换缓冲、页表缓冲,我觉得直接叫页表缓冲就很好理解了,没有必要纠结于单个单词的意思。

《深入理解LINUX内核(第三版)》的笔记-第十章 - 系统调用 - 第十章 - 系统调用

但是这章不是单单讲系统调用的,也不像《UNIX环境高级编程》,因为这是一本内核的书嘛,所以这章讲的还是内核,具体来说就是内核怎么处理用户进程发出的系统调用。
第一节POSIX API和系统调用。让我们先强调一下应用编程接口(API)与系统调用之不同。前者只是一个函数定义,说明了如何获得一个给定的服务;而后者是通过软中断向内核发出一个明确的请求。一个API可能不包含系统调用,也可能包含一个或者几个系统调用,另外,几个API可能调用封装了不同功能的同一系统调用。POSIX标准针对API而不针对系统调用。
第二节简单讲了系统调用处理程序及服务例程。
第三节进入和退出系统调用。调用系统调用可以通过执行int $0x80汇编指令或者执行sysenter指令。从系统调用退出可以执行iret指令或者执行sysexit指令。进入和退出的后一种方法都是在Pentium II 中引入。
第四节参数传递。系统调用中从用户态传递到内核态的参数通过CPU寄存器来传递。可用的寄存器有:eax, ebx, ecx, edx, esi, edi, ebp。参数传递时还需要进行参数验证,不过内核采用的是尽量推后检查和粗略检查的策略。本节还讲了修正代码技术,用以处理系统调用产生的某些异常。
第五节讲述内核封装例程。

《深入理解LINUX内核(第三版)》的笔记-第16页

进程:程序执行时的一个实例,或者一个运行程序的“执行上下文”。
“调度进程”决定哪个进程执行。

《深入理解LINUX内核(第三版)》的笔记-第十三章 - 第十三章

第十三章-I/O体系结构和设备驱动程序
第一节I/O体系结构。重要概念有I/O端口、I/O接口和设备控制器。
第二节设备驱动模型。Linux 2.6 提供了一些数据结构和辅助函数,它们为系统中所有的总线、设备以及设备驱动程序提供了一个统一的视图;这个框架被称为设备驱动模型。每个设备由一个device对象来描述。驱动程序由device_driver对象描述。总线类型由bus_type对象描述。
第三节设备文件。内核通过访问设备文件来访问I/O设备。
第四节设备驱动程序。设备驱动程序是内核例程的集合。驱动程序加载到内核之前需要被注册,在设备使用之前又需要初始化。
第五节字符设备驱动程序。字符设备驱动程序是由一个cdev结构描述的。

《深入理解LINUX内核(第三版)》的笔记-第十七章:回收页框 - 第十七章:回收页框


1、回收页框是虚拟内存子系统很重要的一部分。
2、第一节 页框回收算法。页框回收算法(PFRA)采取从用户态进程和内核高速缓存“窃取”页框的办法补充伙伴系统的空闲块列表。总的来说其目标就是获得页框并使之空闲。PFRA采用的几个总原则:首先释放“无害”页;将用户态进程的所有页定义为可回收页;同时取消引用一个共享页框的所有页表项的映射,就可以回收该共享页框;只回收“未用”页。
3、第二节 反向映射。Linux 2.6内核能够快速定位指向同一页框的所有页表项,这个过程就叫做反向映射(reverse mapping)。
4、第三节 PFRA实现。页框回收算法的执行有三种基本情形:内存紧缺回收;睡眠回收;周期回收。PFRA的核心数据结构是活动链表和非活动链表。
5、第四节 交换。交换用来为非映射页在磁盘上提供备份,从内存中换出的页存放在交换区中。每个交换区都由一组页槽组成,也就是说,由一组4096字节大小的块组成,每块中包含一个换出的页。

《深入理解LINUX内核(第三版)》的笔记-第五章 - 内核同步 - 第五章 - 内核同步

内核各部分交错执行,产生了竞争条件,所以需要同步技术来解决。临界区是一段代码,在其他的内核控制路径能够进入临界区前,进入临界区的的内核控制路径必须全部执行完这段代码。 第二节“同步原语”是重点。一共讲述了几种同步技术。①每CPU变量,是指专属于某一个CPU使用的变量,其他CPU不能访问。②原子操作,确保某些操作在芯片上是原子级的,由单个指令执行,中间不能中断。③优化和内存屏障。优化屏障原语保证编译程序不会混淆放在原语操作之前的汇编语言指令和放在原语操作之后的汇编语言指令。而内存屏障原语确保,在原语之后的操作开始执行之前,原语之前的操作已经完成。④自旋锁,内核控制路径通过执行一条紧凑的循环指令来等待锁被释放。⑤顺序锁,写者可以打断读者获得锁。⑥信号量,能够让等待着睡眠,直到等待的资源可用。

《深入理解LINUX内核(第三版)》的笔记-第14页

内核是操作系统在启动之初就被装入到RAM中的,系统运行必不可少的很多核心程序的集合。它订有两个目标:
1。与硬件部分交互,为包含在硬件平台上所有低层可编程部件提供服务。
2。为系统中的用户程序提供执行环境。

《深入理解LINUX内核(第三版)》的笔记-第40页 - 第二章 内存寻址

80x86微处理器区分以下三种不同的地址:
逻辑地址(logical address)
线性地址(linear address)(也称虚拟地址 virtual address)
物理地址(physical address)
内存仲裁器
实模式与保护模式

《深入理解LINUX内核(第三版)》的笔记-第27页

内核控制路径:内核处理系统调用、异常或中断所执行的指令序列。
所有unix的内核都是可重入的。这意味着若干个进程可以同时在内核状态下被 执行。

《深入理解LINUX内核(第三版)》的笔记-第七章 - 进程调度 - 第七章 - 进程调度

进程调度(scheduling)主要关心什么时候进行进程切换及选择哪一个进程来运行。
第一节调度策略。Linux的调度基于分时(time sharing)技术:多个进程以“时间多路复用”方式运行,因为CPU的时间被分成“片(slice)”,给每个可运行进程分配一片。 第二节调度算法。分为普通进程的调度和实时进程的调度。每个普通进程都有它自己的静态优先级,根据该优先级可以算出它的基本时间片。当然,还有根据进程的平均睡眠时间来调整的动态优先级。
第三节调度程序所使用的数据结构。数据结构runqueue是Linux2.6调度程序最重要的数据结构。系统中的每个CPU都有它自己的运行队列,所有的runqueue结构存放在runqueue每CPU变量中。此外,进程描述符也是很重要的数据结构。
第四节调度程序所使用的函数。这一节讲解的函数有以下几个:scheduler_tick()、try_to_wake_prio()、recalc_task_prio()、schedule()。
第五节多处理器系统中运行队列的平衡。调度域的概念:实际上是一个CPU集合,它们的工作量应当由内核保持平衡。还有三个重要函数:rebalance_tick()、load_balance()、move_tasks()。
第六节与调度相关的系统调用。讲解了好几个系统调用:nice()系统调用,不过已经被setpriority()取代、getpriority()、setpriority()、sched_getaffinity()、sched_setaffinity()、sched_getscheduler()、sched_setscheduler()、sched_getparam()、sched_setparam()、sched_yield()、sched_get_priority_min()、sched_get_priority_max()、sched_rr_get_interval()。

《深入理解LINUX内核(第三版)》的笔记-第12页 - 第一章 绪论

Linux试图在硬件无关的源代码与硬件相关的源代码之间保持清晰的界限。为了做到这一点,在arch和include目录下包含了23个子目录,以对应Linux所支持的不同硬件平台。
alpha
arm,arm26
cris
frv
h8300
i386
ia64
m32r
m68k,m68knommu
mips
parisc
ppc,ppc64
s390
sh,sh64
sparc,sparc64
um
v850
x86_64

《深入理解LINUX内核(第三版)》的笔记-第13页 - 第一章 绪论

Linux版本
2.5之前
从2.6开始,第二个数字不再用于表示稳定版还是开发中的内核

《深入理解LINUX内核(第三版)》的笔记-第11页

只读过小部分,很想读通

《深入理解LINUX内核(第三版)》的笔记-第十八章:Ext2和Ext3文件系统 - 第十八章:Ext2和Ext3文件系统


1、第一节 Ext2的一般特性。使得Ext2高效、健壮的一些特性:①当创建Ext2文件系统时,系统管理员可以根据预期的文件平均长度来选择最佳块大小;②当创建Ext2文件系统时,系统管理员可以根据在给定大小的分区上预计存放的文件数来选择给该分区分配多少个索引节点;③文件系统把磁盘块分为组;④在磁盘数据块被实际使用之前,文件系统就把这些块预分配给普通文件;⑤支持快速符号链接。
2、第二节 Ext2磁盘数据结构。任何Ext2分区中的第一个块从不受Ext2文件系统的管理,因为这一块是为分区的引导扇区所保留的。Ext2分区的其余部分分成块组(block group)。由于内核尽可能地把属于一个文件的数据块存放在同一块组中,所以块组减少了文件的碎片。Ext2在磁盘上的超级块存放在一个ext2_super_block结构中。
3、第三节 Ext2的内存数据结构。为了提高效率,当安装Ext2文件系统时,存放在Ext2分区的磁盘数据结构中的大部分信息被拷贝到RAM中,从而使内核避免了后来的很多读操作。
4、第四节 创建Ext2文件系统。Ext2文件系统是由实用程序mke2fs创建的。
5、第五节 Ext2的方法。本节简单介绍了超级块和索引节点的一些操作。
6、第六节 管理Ext2磁盘空间。本节介绍了创建索引节点、删除索引节点、数据块寻址、文件的洞、分配数据块和释放数据块这几点内容。
7、第七节 Ext3文件系统。相比Ext2,新的文件系统在设计时曾秉持两个简单的概念:成为一个日志文件系统;尽可能与原来的Ext2文件系统兼容。而新的文件系统确实是做到了。日志文件系统的目标就是避免对整个文件系统进行耗时的一致性检查,这是通过查看一个特殊的磁盘区达到的,因为这种磁盘区包含所谓的日志(journal)的最新磁盘操作。Ext3文件系统提供三种不同的日志模式:日志(最详细全面,但是慢);预定(缺省模式);写回(最快的模式)。

《深入理解LINUX内核(第三版)》的笔记-第四章 - 中断和异常 - 第四章 - 中断和异常

中断(interrupt)通常被定义为一个事件,该事件改变处理器执行的指令顺序。 中断分为同步和异步中断,或者称为异常和中断。
第二节中断和异常。中断包括可屏蔽中断和非屏蔽中断,而异常则包括处理器探测异常和编程异常。还讲述了一些关于IRQ线的知识,然后是异常处理程序发送的19种信号。当然,少不了中断描述符表。
第四节“初始化中断描述符表”,在Linux中分为以下几种描述符:中断门、系统门、系统中断门、陷阱门、任务门。
第六节中断处理。这是本章的重点,也是难点。物理IRQ可以分配给32~238范围内的任何向量。 每个中断向量都有它自己的irq_desc_t描述符。 这一节还探讨了IRQ在多处理器系统上的分发,使得处理器间达到平衡。最重要的两个函数:do_IRQ()、__do_IRQ()。
第七节软中断及tasklet。这是实现下半部机制的两种最重要的技术。但是很奇怪书上没提到半点下半部。软中断类型很少,只有6种,而tasklet可以很方便地在软中断的基础上实现。软中断的两个主要函数do_softirq()、__do_softirq()。
第八节讲了工作队列的数据结构、实现,却没有讲它到底有什么用、怎么用。

《深入理解LINUX内核(第三版)》的笔记-第一章 - 第一章

第一章是绪论。前三节内容很少,讲的都是一些内核边缘相关的东西,不是真正内核的内容,简单了解就好,不必深究。后三节,“操作系统基本概念”简单描述了几个“使用操作系统”要知道的概念;“Unix文件系统概述”也是从用户的角度讲了几个概念,并没有深入到内核;“Unix内核概述”这一节内容很多,最重要的是它在讲述一些内核的重要概念时引出了很多必须处理的问题,让读者带着疑问到本书的后续章节里去自己探寻答案。

《深入理解LINUX内核(第三版)》的笔记-第十一章 - 信号 - 第十一章 - 信号

信号用于进程间通信。
第一节信号的作用。对内核来说,使用信号有两个主要目的:让进程知道已经发生了一件特定的事件;强迫进程执行它自己代码中的信号处理程序。除了86平台中的31个信号外,Linux还另外定义了33个实时信号(32~64)。与信号有关的数据结构包括进程描述符中的某些字段、信号描述符以及信号处理程序描述符。
第二节产生信号。当发送给进程一个信号时,这个信号可能来自内核,也可能来自另一个进程。specific_send_info()函数向指定进程发送信号,而group_send_sig_info()函数向整个线程组发送信号。
第三节传递信号。do_signal()函数处理已经产生的信号。若某一个系统调用被信号打断,则要重新执行。
第四节与信号处理相关的系统调用。kill()系统调用可以向普通进程或多线程应用发送信号;tkill()和tgkill()系统调用向线程组中的指定进程发送信号;sigaction()系统调用允许用户为信号指定一个操作;sigsuspend()系统调用把进程置为TASK_INTERRUPTIBLE状态。

《深入理解LINUX内核(第三版)》的笔记-第十九章:进程通信 - 第十九章:进程通信


本章介绍“用户态”的进程之间如何进行“同步”和“交换数据”。
Unix系统提供的进程间通信的基本机制:①管道和FIFO(命名管道);②信号量;③消息;④共享内存区;⑤套接字。
第一节 管道。管道是进程之间的一个单向数据流:一个进程写入管道的所有数据都由内核定向到另一个进程,另一个进程由此就可以从管道中读取数据。管道被看作是打开的文件,但在已安装的文件系统中没有相应的映像。可以使用pipe()系统调用来创建一个新的管道。管道一旦被创建,进程就可以使用read()和write()这两个VFS系统调用来访问管道。
第二节 FIFO。为了突破进程无法打开已经存在的管道的缺陷,Unix引入了一种称为命名管道或者FIFO的特殊文件类型。有了磁盘索引节点,就使得任何进程都可以访问FIFO,因为FIFO文件名包含在系统的目录树中。FIFO和管道几乎是一样的,并使用相同的pipe_inode_info结构。只有两点主要差别:①FIFO索引节点出现在系统目录树上而不是pipefs特殊文件系统中;②FIFO是一种双向通信管道。FIFO一旦被创建,就可以使用普通的open(), read(), write(), close()系统调用访问FIFO。
第三节 System V IPC。IPC是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行下列操作的一组机制:①通过信号量与其他进程进行同步;②向其他进程发送消息或者从其他进程接收消息;③和其它进程共享一段内存区。根据新资源是信号量、消息队列还是共享内存区,分别调用semget()、msgget()或者shmget()函数创建IPC资源。
第四节 POSIX消息队列。POSIX标准基于消息队列定义了一个IPC机制,它很像System V IPC 消息队列,但有以下几个优点:①更简单的基于文件的应用接口;②完全支持消息优先级;③完全支持消息到达的异步通知;④用于阻塞发送与接收操作的超时机制。

《深入理解LINUX内核(第三版)》的笔记-第15页

多用户系统:就是一台能并发和独立地执行分别属于两个或多个用户的若干应用程序的计算机。“并发”意味着几个应用程序能同时处于活动状态并竞争各种资源。独立意味着每个应用程序能独立执行自己的任务,而无需考虑其它用户程序在干些什么。

《深入理解LINUX内核(第三版)》的笔记-第二十章:程序的执行 - 第二十章:程序的执行


当装入并运行一个程序时,用户可以提供影响程序执行的两种信息:命令行参数和环境变量。
第一节 可执行文件。可执行文件是一个普通文件,它描述了如何初始化一个新的执行上下文,也就是如何开始一个新的计算。程序执行需要的函数库包括两种:静态库和共享库。静态库的一大缺点是占用太大的磁盘空间。而共享库导致动态链接的程序启动时需要较多的时间,而且其移植性也没有静态链接的程序好。从逻辑上说,Unix程序的线性地址空间传统上被划分为几个叫做段的空间:正文段、已初始化数据段、未初始化数据段、堆栈段。
第二节 可执行格式。Linux标准的可执行格式是ELF(Executable and Linking Format)。
第三节 执行域。Linux执行其他操作系统所编译的程序时可以是模拟执行或者原样执行。Microsoft MS-DOS 和Windows程序是被模拟执行的,因为它们包含的API不能被Linux所认识,因此不能原样执行。
第四节 exec函数。Unix系统提供了一系列的函数,这些函数能用可执行文件所描述的新上下文代替进程的上下文。这样的函数名以前缀exec开始,后跟一个或两个字母,因此,这些函数被统称为exec函数。

《深入理解LINUX内核(第三版)》的笔记-第十四章:块设备驱动程序 - 第十四章:块设备驱动程序


1、块设备的主要特点是,CPU和总线读写数据所花时间与磁盘硬件的速度不匹配。
2、第一节块设备的处理讲解了Linux块设备I/O子系统的一般体系结构。这一节还介绍了磁盘设备的“扇区”,“块”,“段”,这几个概念以及一些相关的设定。
3、第二节通用块层。通用块层是一个内核组件,它处理来自系统中的所有块设备发出的请求。其核心数据结构是一个称为bio的描述符,它描述了块设备的I/O操作。
4、第三节 I/O调度程序,决定在请求队列中的哪一个I/O请求先得到处理。请求队列是由一个大的数据结构request_queue表示的,称为请求队列描述符。在请求队列里的每一个请求又由一个请求描述符来描述,也就是request数据结构。Linux 2.6中提供了四种不同种类的的I/O调度算法(或说是电梯算法),分别为“预期算法”,“最后期限算法“,”完全公平算法(CFQ)“以及Noop算法”。
5、第四节 块设备驱动程序,每个块设备驱动程序对应一个device_driver类型的描述符。而每个块设备都是由一个block_device结构的描述符来表示的。所有块设备描述符被插入一个全局链表中。
6、第五节 打开设备文件,本节详细介绍了open方法的具体操作。

《深入理解LINUX内核(第三版)》的笔记-第八章 - 内存管理 - 第八章 - 内存管理

这章有三大块内容,“页框管理”和“内存区管理”两节分别介绍对连续物理内存区处理的两种不同技术,而“非连续内存区管理”一节介绍的是处理非连续内存区的技术。


 深入理解LINUX内核(第三版)下载 更多精彩书评


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024