已阅读5页,还剩59页未读, 继续免费阅读
(模式识别与智能系统专业论文)支持集群系统的linux内核技术研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
南京理工大学硕士学位论文 支持集群系统的li n u x 内核技术研究 摘要 集群技术一直是计算机界研究的一个热点问题。集群系统不但能够充分利用 现有的计算机资源,而且具有良好的可扩展性和较高的性能价格比。为了使普通 的l i n t = 内核能够支持集群技术,可以对l i n u x 进行修改,目前已有很多种不同 的修改方案。本文深入分析了其中的一种实现方案,它就是o p e n m o s i x 集群系统。 这个系统通过修改1 i n u x 源代码,在内核层次上实现了进程的迁移。 本文首先分析了li n u x 内核源代码,并在此基础上研读集群系统的源代码, 深入理解它的进程迁移机制。集群系统在迁移进程时只迁移用户空间的应用程序, 内核空间并不进行迁移。但经过本文的分析发现内核空间中的有些结构是可以进 行迁移的,并且迁移之后能够提高系统的性能,为此,本文提出基于进程迁移的 套接字迁移方案。这一迁移方案是针对在o p e n m o s i x 集群系统上运行服务器程序 时存在的不足而提出的。为了实现套接字迁移,本文还着重研究了l i n u x 内核中 i p v 4 协议栈。 关键词:虚拟地址空间,进程迁移,服务器进程,套接字迁移 硕士论文 a b s t r a c t c l u s t e rt e c h n i q u eh a sb e i n gah o ts p o ti nc o m p u t e rw o r l d c l u s t e rn o to n l 了m a k e s ag o o du s eo ft h ee x i s t i n gr e s o u r c e s ,b u ta l s oh a sg o o de x p a n s i b i l i t ya n dh i g h e rr a t eo f p o w e ra n dp r i c e m o d i f y i n gl i n u xk e r n e lc o d ec a l lm a k el i n u xs u p p o r tc l u s t e r t e c h n i q u e t h e r ea r ea l r e a d ya l o to fd i f f e r e n tm o d i f i c a t i o np r o j e c t s t h i sp a p e rg i v e sa p r o f o u n da n a l y s i s o fo n eo ft h e s e p r o j e c t s ,t h a t 斌o p e n m o s i xc l u s t e rs y s t e m o p e n m o s i xm o d i f i e sl i n u xk e r n e lc o d ea n di m p l e m e n t st h em i g r a t i o no ft h ep r o g r e s si n l i n u xk e r n e ls p a c e t h i sp a p e ra n a l y z e sl i n u xk e r n e ls o u r c ec o d e ,a n dt h e ns t u d i e st h ec o d eo f o p e n m o s i xa n d t h e p r i n c i p l eo fp r o c e s sm i g r a t i o n w h e no p e n m o s i xm i g r a t e s p r o c e s s e s ,i tj u s tm i g r a t e su s e rs p a c e sb u tn o tm o v e sk e r n e ls p a c e t h r o t l g ha n a l y s i s ,i t i sf o u n dt h a ts o m ek e r n e ls t r u c t u r e sc a l lb em i g r a t e da n dt h em i g r a t i o n sc a ni m p r o v e t h ep e r f o r m a n c eo fc l u s t e r s oa p r o j e c ti sp r o p o s e dt om i g r a t es o c k e t t h i sp r o j e c ti s m a i n l yd i r e c t e da tt h es h o r t a g eo fc l u s t e rw h e ni tr u n ss e r v e rp r o g r a m f o re x a m p l e ,a s e r v e rp r o c e s si sm i g r a t e dt oar e m o t en o d e a c c o r d i n gt ot h ep r i n c i p l eo fo p e n m o s i x , w h e nas e r v e rp r o c e s si sb e i n gm i g r a t e d ,t h es o c k e to fs e r v e rp r o c e s sw i l ln o tb e m i g r a t e d s oi fs e r v e rp r o c e s si n t e n d st or e a do rw r i t es o c k e t ,i tm u s ts e n dr e q u e s tt o d e p u t yn o d e t h i sm e t h o dw a s t e sn o to n l yc p ur e s o u r c e ,b u ta l s om e m o r yr e s o u r c e s ot h i sp a p e rm i g r a t e ss o c k e tt or e m o t en o d e ,w h e nk e r n e lm i g r a t e ss e r v e rp r o c e s s o n c em i g r a t i o no fs o c k e th a sb e i n gi m p l e m e n t e d ,s e r v e rp r o c e s sw i l lr e a do rw r i t e s o c k e to nr e m o t en o d ed i r e c t l y i no r d e rt om i g r a t es o c k e t ,t h i sp a p e ra l s oa n a l y z e s 4p r o t o c o ls t a c k k e y w o r d , v i r t u a la d d r e s ss p a c e ,p r o c e s sm i g r a t i o n ,s e r v e rp r o c e s s , m i g r a t i o no fs o c k e t y 7 6 3 5 5 2 声明 本学位论文是我在导师的指导下取得的研究成果,尽我所知,在 本学位论文中,除了加以标注和致谢的部分外,不包含其他人已经发 表或公布过的研究成果,也不包含我为获得任何教育机构的学位或学 历而使用过的材料。与我一同工作的同事对本学位论文做出的贡献均 己在论文中作了明确的说明。 研究生签名: 蹙科至苫c 7 口诲1 月牛日 学位论文使用授权声明 南京理工大学有权保存本学位论文的电子和纸质文档,可以借阅 或上网公布本学位论文的全部或部分内容,可以向有关部门或机构送 交并授权其保存、借阅或上网公布本学位论文的全部或部分内容。对 于保密论文,按保密的有关规定和程序处理。 研究生签名:鲨。型望j 年月斗曰 南京理工大学硕士学位论文支持集群系统的1 i n u x 内核技术研究 l 绪论 1 1 引言 l i n u x 是由芬兰的一个程序员l i n u st o r v a l d s 在1 9 9 1 年开发,发布于因特网 并由大量遍布全球的程序人员管理维护,由此引起全球的开放自由源代码运动。 l i n u x 被大量的公司和因特网服务提供商作为一可以信赖的操作系统。大量的高 性能计算中心、大学实验室、国家政府实验室也都在关注l i n u x 的发展,并为l i n u x 的低成本、共享软件代码的开发模式、与u n i x 的相近性等种种优势所鼓舞。在 1 i n u x 世界中,每一个人都是一个小的团体,开放软件源代码的开发模式是非常 吸引人的。虽然l i n u x 不能应用在任何超高速的计算机上,但它正被作为集群或 超级集群的方式应用于一些超级计算中心。虽然没有价值数百万美元的超级计算 机那么快,那么强壮,但是可扩充升级的集群系统与普通的桌面系统相比较有着 更强大的功能和运算能力。可扩充性意味着它能加入更多的节点来增强它的性能 或能接受更多用户的访问。 集群的基本单位是单独的计算机,称为节点( n o d e ) 。其可增长的特性,称为 延展性。集群没有严格的定义,可以说集群就是具有高速运算能力的,具有单一 用户界面的计算机组合。 和集群技术相对应的是对称多处理器( s m p ) 技术。对称多处理器系统的扩展 是比较有限的,为了能够使s m p 技术支持更多的中央处理器,需要投入大量的资 金和时间对处理器、处理器的总线和主板进行设计。与s m p 相比,集群技术更易 于实现,它开发周期短,而且造价低。虽然节点之间数据传输的速度比s m p 总线 低,但是它的可扩展性远远超过了s m p 。同时由于各节点之间使用了松散耦合的 方式连接,可以在系统正在运行的情况下方便地更换或添加节点,因此它的可靠 性与可扩展性也优于目前的s m p 技术。 1 。2 论文背景 o p e n m o s i x 是由j e r u s a l e m 的h e b r e w 大学开发的,它为l i n u x 内核扩充了高 性能的集群计算能力。它采用单一系统映像模式s s i ( s i n g l es y s t e mi m a g e ) ,支 持所有的u n i x 接口和机制,具有如下特性:易使用性和透明性,动态负载平衡, 分布式控制和高度的可伸缩性【“。这个系统的核心技术是进程迁移,集群能够根 据系统的负载情况,将进程从负载较重的节点转移到另一负载较轻的节点上运行, 从而实现负载的动态平衡。此外,集群负载均衡算法中所使用的数学模型来自于 绪论硕士论文 经济学领域f 】。 1 3 论文工作 本文首先分析了l i n u x 内核的实现,研读了o p e n m o s i x 集群系统的源代码。 然后深入理解了集群系统中的进程迁移机制,并在o p e n m o s i x 系统进程迁移机制 的基础之上,提出和实现了套接字的迁移方案。为了实现套接字的迁移,本文分 析了并发的面向连接的服务器运行模式,分析了1 i n u x 内核中与网络相关的系统 调用的实现,分析了服务器程序在集群系统上是如何运行的。在本文的迁移方案 中,在套接字迁移之后需要对到达套接字的i p 分组进行拦截和转发,为此本文分 析了l i n u x 内核中i p 协议、a m p 协议的实现,分析了内核中隧道技术和n e t f i l t e r 技术的实现。 基于a p e n m o s i x 进程迁移的套接字迁移,可有多种实现方案。第一种,子服 务进程在执行过程中被迁移,迁移时同时迁移子套接字,这时就必须要迁移套接字 中的读写队列,还需要迁移的有定时器。这种方案的迁移代价较大。第二种,如果 系统决定迁移套接字,就将子服务进程一经生成就迁移,同时迁移套接字。这种 迁移方案迁移开销比较小,因为在定条件下,套接字的几个队列中都不会有报 文段,并且定时器还没启动。本文将研究第二种迁移方案。 1 4 论文结构 全文共分七章,各章的内容如下: 第一章:绪论,介绍论文的背景及本论文的主要研究内容。 第二章:l i n u x 内核分析,结合具体问题分析了l i n u x 主要内核模块。分析 的具体内容有l i n u x 中进程的实现,虚拟空间的实现与作用,系统调用的原理和 实现,子进程和父进程的关系,l i n u x 中的虚拟文件系统,套接字以及套接字缓冲 区。 第三章:o p e n m o s i x 中进程迁移的原理,在这一章中本文描述了集群的工作 原理,重点分析了集群中进程是如何迁移的,以及迁移之后进程是如何运行的。 第四章:套接字迁移分析,在这一章中本文分析了并发的面向连接的服务器 运行模式,分析了l i n u x 内核中是如何支持这种运行模式的,分析了集群系统在 这一模式下是如何运行的。为了提高集群在这种模式下运行的效率,本文提出了 基于o p e n m o s i x 系统的套接字迁移。 第五章:i p 分组的截获与转发,套接字迁移之后,需将发往套接字的i p 分 组截获并转发。在截获i p 分组时本文使用了l i n u x 中的n e t f i i t e r 技术,在转发 i p 分组时本文使用了1 i n u x 中的隧道技术。 2 南京理工大学硕士学位论文支持集群系统的l i n u x 内核技术研究 第六章:套接字迁移的实现,基于前面几章的分析,在这一章将会详细的介 绍套接字迁移的实现。 第七章:结束语,总结全文工作,进行进一步工作的描述。 l i f l u x 内核分析硕士论文 2 l i n u x 内核分析 要研究o p e n m o s i x 集群系统,首先要做的就是理解l i n u x 内核,因为这个集群 系统是基于l i n u x 内核的,它在内核中实现了进程的迁移。在这一章中,本文主 要分析了和进程迁移相关的内容,如进程、虚拟地址空间、系统调用、子进程和 父进程。另外,本文除了分析集群系统,还实现了基于进程迁移的套接字迁移, 所以本章还会研究关于套接字和套接字缓冲区的一些概念。 2 1 进程 操作系统中最核心的概念是进程。所谓进程是由正文段,用户数据段,以及 系统数据段共同组成一个执行环境。程序是一个普通的文件,是机器代码指令和 数据的集合。这些指令和数据储存在磁盘上的一个可执行映像中,所以程序是一 个静态的实体,程序装入内存之后就可以运行了,在指令指针寄存器的控制下, 不断地将指令取到中c p u 运行。这些指令的控制对象不外乎各种存储器,这些存 储器中保存有待运行的指令和待处理的数据。可见,在计算机内部,程序的执行 过程实际就是一个执行环境的总和,这个执行环境包括程序中的各种指令和数据, 还有一些额外数据,如寄存器的值,传递给某个函数的参数,函数的返回地址, 保存的变量,程序堆栈,系统堆栈,打开文件的数量,输入输出设备的状态等,这 个执行环境的动态变化表征了程序的运行,这个环境被称为进程。它代表程序的 执行过程,是一个动态的实体,它随着程序中指令的执行而不断地变化。 l i n u x 是个多任务的操作系统,可以有多个程序同时装入内存并运行,操 作系统为每个程序建立一个运行环境即进程,每个进程拥有自己的虚拟地址空间, 它们之间互不干扰,如果进程之间要相互作用,也要通过内核提供的进程问通信 机制。内核支持多个进程虚拟的并发执行,这是通过不断的保存和切换程序的运 行环境而实现的,选择哪个进程运行由调度程序s h e d u l e 决定。 在内核中,一个t a s k s t r u c t 结构就代表了一个进程。这个结构就是我们所 说的进程控制块即p c b 。这个结构容纳了进程的所有信息,是系统对进程进行控 制的唯一手段。在这个p c b 块中具有的信息有( 1 ) 进程状态,说明进程是在可运 行还是在等待状态。( 2 ) 进程调度信息,主要是一些调度策略和优先级信息。( 3 ) 各种标志符,其中有一个p i d 域用来在主机上唯一的标志一个进程。( 4 ) 与进程 通信有关的信息。( 5 ) 时闻和定时器信息。( 6 ) 进程链接信息。( 7 ) 文件系统信 息,其中有个f i l e s s t r u c t 类型的域f i l e s ,这个域是用来管理进程所打开的 文件( 8 ) 虚拟内存管理信息,有一个m m s t r u c t 类型的域m m ,这个域描述了进 4 南京理工大学硕士学位论文支持集群系统的1 l r l l l x 内核技术研究 程的虚拟地址空间,包括内核空间和用户空间。( 9 ) 页面管理信息( 1 0 ) 对称多 处理机信息。( 1 1 ) 和处理器相关的环境信息。 进程内核栈,每个进程都有自己的内核栈。进程控制块和系统空间堆栈在物 理储存空间中是连在一起的。内核在为每个进程分配一个t a s k s t r u c t 结构时, 实际是分配两个连续的物理页面。两个页面的底部用作t a s k _ s t r u c t 结构,而在 结构的上面就用作进程的系统空间堆栈。在用户从用户态进入内核态时,c p u 就 会进行堆栈的切换,从用户空间堆栈切换到内核空间堆栈口】。 2 2l i n t t x 的虚报空间 何谓虚拟空间呢,虚拟空间也叫虚拟内存。虚拟储存系统中的所有地址都是 虚拟地址而不是物理地址。通过操作系统所维护的一系列表,由处理器( 更加确 切的说是m m u ) 实现从虚拟地址到物理地址的转换。为了使转换更加简单,虚 拟内存和物理内存都以页面来组织,不同系统中页面大小可以相同,也可以不同。 在页面模式下虚拟地址由两部分构成:页号和页面内偏移值。l i n u x 总是假定处 理器支持三级页表结构。这三级页表依次为:页目录p g d ,中间页目录p m d , 页表p t e 。每一个页表通过虚拟地址的一个域来访问。虚拟地址被分割成四个域。 其中三个域分别提供了在三级页表内的偏移,最后一个域提供了页内偏移。为了 将虚拟地址转化为物理地址,处理器必须依次得到这几个域中包含的偏移值,还 需要有页目录在物理内存中的起始地址,这个地址保存在寄存器中,处理器首先 根据页目录在物理内存中的起始地址和第一个偏移值,访问页目录,得到中间页 目录的起始地址,然后根据中间页目录的起始地址和第二个偏移值,访问中间页 耳录,得至页表的起始地址,然后根据页表的起始地址和第三个偏移值,访问页 表,得出页帧号,最后根据页帧号和页内偏移得到物理地址。在i n t e lx 8 6 系统上 p m d 和p g d 是合二为一的。 l i n u x 的虚拟空间地址为0 - 4 g 字节,内核又把这4 g 的空间分为两部分。将 最高的i g 空间,从0 x c 0 0 0 0 0 0 0 到o 雠,供内核使用,成为内核空间。将较 低的3 g 字节供进程使用,称为用户空间。每个进程可以通过系统调用进入内核, l i n u x 内核空间是由系统内的所有进程共享的。所以从进程的角度来看,每个进程 可以拥有4 g 字节的虚拟空间。k i n l l x 使用两级保护机制,0 级供内核使用,3 级 供用户程序使用。每个进程的私有用户空间( o 一3 g ) ,这个空间对系统中其它进 程是不可见的。内核空间中存放的是内核代码和数据,而进程的用户空间中存放 的是用户程序的代码和数据。不管是内核空闻还是用户空间都是处于虚拟空间中。 虚拟空间的管理是以进程为基础的,每个进程都有各自的虚拟空间,此外每 个进程的内核空间为所有进程所共享。一个进程的虚拟空间主要由两个数据结构 l i n u x 内核分析硕士论文 来描述。一个是最高层次的m m _ s t m c t 结构描述了一个进程的整个虚拟地址空间。 较高层次的结构v ma r e as t r c t 描述了虚拟地址空间的一个区间。每个进程只有一 个m m _ s t r u c t 结构,它描述了代码段,数据段,堆栈段,参数段,环境段的起始 地址和结束地址,以及指向虚拟区间的链表指针。一个进程可能有多个 v ma r e , as t r u c t 结构即多个虚拟区间。每个这样的结构描述了( 1 ) 一段虚拟内存 的起始地址和结束位置,( 2 ) 进程对此内存区域的存取权限,( 3 ) 一组内存操作 方法,这些方法都是内核操纵虚拟地址空间时必须用到的,例如当进程试图访问 的虚拟地址不在物理内存时( 发生缺页中断) ,就需要用到内存操作方法( n o p a g e ) 。 内存映射,当程序的映像开始执行时,可执行映像必须装入到进程的虚拟地 址空间。l i n u x 并不将映像一下子全部装入到物理内存,相反,可执行文件映像 只是被映射到进程的虚拟地址空间中。更具体的讲是映射到进程的用户空间。随着 程序豹运行,程序映像会由操作系统逐步的装入至物理内存,这秘将程序映像链 接到进程虚拟地址空间的方法被称为内存映射。可执行映像映射到进程的虚拟空 间时将会产生一组v m _ a r e as t r u c t 结构,每个结构表示可执行映像的一部分。如 可执行代码段,初始化数据段等。当用户程序通过系统调用e x e c v e ,装入可执行 程序映像时,会调用d om m a p 函数实现内存映射。这个函数除了生成一组 v m _ a r e a _ s t r u c t 结构之外,还做了一件重要的事情,就是设置这个结构的内存操作 方法n o _ p a g e ,当发生缺页中断时,就会调用这个方法,这个方法告诉内核如果 所需要的页面不在内存中时,如何从磁盘取出这个页面。这个方法负责将磁盘中 的程序调入内存。使用内存映射这种机制的好处是,节省内存,因为整个程序不 是一开始执行就全部调入内存,而是在运行过程中,按需调八内存。 2 3 系统调用 系统调用是内核提供的功能十分强大的一系列函数。它们在内核中实现。然 后通过一定方式呈现给用户。它是用户程序和内核交互的一个接口。可以这么说, 没有系统调用,我们就不能编出功能强大的用户程序。内核主体可以归结为( 1 ) 系 统调用的集合( 2 ) 实现系统调用的算法。 通过系统调用,进程可由用户模式转入内核模式,在内核模式下完成相应服 务之后,再返回用户模式。用户程序在用户模式下通过门机制进入内核模式,这 时程序的运行级别就会发生改变,同时改变的还有空间堆栈,从用户空间堆栈切 换到内核堆栈。在进入内核空间时首先会将用户空间的堆栈指针、用户进程的返 回地址压到内核堆栈中,同时压入内核堆栈的还有其它寄存器中的内容。在内核 空间执行系统调用时,就一直使用这个内核空间堆栈,直到系统调用结束返回到 用户空间。 南京理工大学硕士学位论文支持集群系统的l i n u x 内核技术研究 内核和用户空间堆棱的切换只发生在下面几种情况下( 1 ) 用户空间程序使用 系统调用来取得系统服务。( 2 ) 系统调用结束,程序返回到用户空间。( 3 ) 在用 户空间执行程序时,发生中断,这也会发生堆栈的切换,因为中断程序属于内核 程序。( 4 ) 中断处理结束,返回到用户空间。有种情况下是不发生堆栈切换的, 那就是当执行系统调用时发生中断。这时就会直接利用当前的内核堆栈,在中断 处理结束后,程序会直接返回到系统调用继续执行。 在内核中维护了一张系统调用表,系统调用表依次保存着所有系统调用的函 数指针,以方便系统调用处理程序( s y s t e m _ c a u ) 进行索引调用。系统调用号被 保存在e a x 寄存器中,系统根据e a x 砖递进来的参数决定调用在系统调用表 ( s y s _ c a l lt a b l e ) 中的哪个系统调用函数【6 】。 2 4 虚揿文件系统 虚拟文件系统的主要作用有口l ( 1 ) 对具体文件系统的数据结构进行抽象。( 2 ) 接受用户层的系统调用,如r e a d 、w r i t e 。( 3 ) 支持多种具体文件系统之间的互 访。( 3 ) 接受内核其它子系统的操作请求。如果只有虚拟文件系统,系统是无法 工作的,因为它的这些数据结构并不能凭空而来,只有与实际的文件系统,如 e x t 2 、e x t 3 、m i n i x 、m s d o s 、v f 盯、套件字文件、管道等相结合,才能开始工作。 与v f s 相对应,e x t 2 、m i n i x 、m s d o s 为具体文件系统,套接字文件、管道则是具体 文件系统中的特殊文件系统。 虚拟文件系统所用的主要思想是引入一个通用的文件模型,这个模型能够表 示所有支持的文件系统。在这个文件模型中主要有以下数据结构组成( 1 ) 超级块, 存放系统中已安装文件系统的一般信息。( 2 ) 目录项,存放目录项与对应文件进 行链接的信息。( 3 ) 索引节点( i n o d e ) ,存放关于具体文件的一般信息,在这个 结构中有个用u n i o n 定义的数据结构u ,这个联合体结构u 就是用来存放具体的 文件系统的信息。套接字就是利用了这个联合体结构来存放套接字中的s o c k e t 结构。( 4 ) 文件对象( f i l e ) 存放打开文件和进程之间进行交互的信息,当一个 进程调用o p e n 系统调用时,就会生成一个文件对象,而对于套接字而言这个结 构生成是在s o c k e t 系统调用之时。 此外,l i n u x 内核是用c 来实现的,本文所提到的对象在内核中都是用结构 体来表示的,而对象中的方法,则是一个函数指针。这个函数指针所指向的函数 与一般的函数并没有太大的区别。只是在定义这些函数时会将这些函数定义为静 态函数。 下面重点研究文件对象,文件对象描述进程怎样与一个打开的文件进行交互, 文件对象是在文件被打开时被创建的,由一个f i l e 结构组成。每个文件系统都有 7 l i n u x 内核分析硕士论文 自己的文件操作集合,执行诸如读写文件这样的操作。每个进程用一个 f i l e s t r u c t 结构来记录文件的使用情况,这个结构就称为用户打开文件表,它 是进程的私有数据,即一般情况下,每个进程都有一个这样的结构。当然某些情 况下子进程可以共享父进程的文件打开表。在这个结构中有一个f d 域,它是指向 文件对象指针数组的指针。通常f d 域指向f i l e s s t r u c t 结构的f d _ a r r a y 域, f a _ a r r a y 域是一个数组,其中存放文件对象指针。这个数组中可包含3 2 个文件 指针。如果进程打开的文件数目大于3 2 ,内核就分配一个新的更大的文件指针数 组,并将其地址存放在f d 域中,数组的长度存放在m a x f d s 域中。在1 i n u x 中进 程是通过文件描述符( f i l ed e s c r i p t o r s ) 而不是文件名来访问文件的,文件描 述符实际上是一个整数。对于在f d 数组中有入口地址的每个文件来说,数组的索 引就是文件描述符。 通过内核函数f g e t ,能够在进程打开表中找到文件对象。这个函数接受文件 描述符f d 作为参数,返回在文件打开表中的文件对象指针,f g e t 函数同时会将 f i l e 文件对象的引用计数器的值加一。当内核完成对文件对象的使用时,调用内 核提供的f p u t 函数,递减文件对象引用计数器的值,如果计数器的值为零,这个 函数还要调用文件操作中的释放方法。 2 5 子进程和父进程 l i n u x 使用s y s f o r k 系统调用来从父进程中生成子进程。这个系统调用的主 体函数是d o f o r k 。这个函数首先会生成进程控制块,分配进程的p i d ,初始化进 程控制块的一系列结构。根据系统调用时的参数,进程会共享父进程的一些结构。 可以共享的主要资源有: 父进程的虚拟空间子进程的虚拟空间 物理内存 、r 一1 力二 图2 5 1 予进程共享父进程空间 父进程的虚拟地址空间,如图2 5 1 所示,子进程和父进程的虚拟空间所映 射的物理空间完全相同。即同一个虚拟地址能访问相同的物理地址,子进程接受 南京理工大学硕士学位论文支持集群系统的1 i n u x 内核技术研究 父进程地址空间的一个逻辑拷贝。其中有两神情况:第一,可以共享m ms t r u c t 结构,即子进程没有自己的衄一s t r u c t 结构,子进程中m m _ s t r u c t 域中的指针和 父进程的这个域是指向同一个结构,这时子进程和父进程中的页目录,中间页目 录,页表都是同一个结构。第二,子进程的这些结构和父进程的这些结构里面的 值相同,但不是同一个结构,程序为子进程另外分配了这些结构。传统的f o r k 调用使用后一种方法共享。 父进程中的打开文件,子进程将会共享父进程的文件打开表,这时的共享也 有两种情况:第一,子进程和父进程使用同一个f i l e s s t r u c t 结构。第二,使用 不同的f i l e s s t r u c t 结构,但子进程这个结构中的值和父进程相同,使用这种共 享方式之后文件对象的引用计数会加一,传统的f o r k 也会用后一种方法。还有一 些其它的结构也会从父进程拷贝到子进程。 在个进程创建时,它几乎与父迸程相同。并从进程调用s y s f o r k 系统调用 的下一条指令开始执行与父进程相同的代码。程序执行是通过系统调用的返回值 来区分两个进程的。具体是这样做的,在d o f o r k 中有一个c o p y t h r e a d 函数, 内核分配了两个页面作为的进程控制块,这两个页面的顶端作为内核堆栈。这个 堆栈里保存了c p u 在进入内核前夕各个寄存器的值,并形成了p t r e g s 结构,这 个函数会设置子进程内核堆栈的p t r e g s 结构中的e a x 域将其设为了零,以及e s p 域和e i p 域,前者表示了系统调用得返回值,后者代表了用户空间的堆栈指针和 指令指针。同时设置的还有进程控制块中t h r e a d 域中的e s p 域和e i p 域。程序将 前者设置为子进程内核堆栈的指针,后者则指向一个叫r e t f r o m f o r k 程序块的 起始地址。设置好之后就会将进程控制块放到可执行队列中去。子进程等待调度 程序调度。父进程继续执行。最后父进程从系统调用中返回,返回值是子进程的 进程号。 在某个时刻,调度程序选到了这个子进程,然后进行进程切换。在切换时会 将上面t h r e a d 域中e s p 的值放到c p u 的e s p 寄存器中,把e i p 域中的值放到e i p 寄存器中去。这样内核堆栈就切换到子进程的内核堆栈去了,子进程从 r e t f r o m _ f o r k 开始执行。最后返回用户空间,在返回之前首先要退栈,将内核 堆栈顶端的中的值按顺序放到寄存器中。p t r e g s 中e a x 域中的值将会放到e a x 寄存其中去。这样子进程从系统调用返回后的返回值就为0 。在d o f o r k 中,生 成并设置子进程的控制块之后,父进程和子进程是按不同的路径从内核空间返回 到用户空间的。但返回到用户空问之后,却又是从同一条用户空间程序开始执行。 用户空间程序通过系统调用的返回值来判断是父进程还是子进程。 9 l i n u x 内核分析硕士论文 2 6s o c k e t 套接字 s o c k e t 套接字一般来说任何操作系统都必须在用户态程序和网路代码之间 定义一个通用的应用程序编程接口即a p i 。l i n u x 网络的a p i 是基于b s d 套接字, 这些s o c k e t 套接字在b e r k e l e y 的u n i x 4 1 b s d 中引入。s o c k e t 套接字是一个通 信端点,它可以连接两个进程,一个进程向套接字中写入数据,而另一个进程从 套接字中取出数据并进行相应的处理。而这两个进程可以位于一个主机上也可以 分别在不同的主机上,在两个端点之间转发数据是网络内核代码的任务。或者可 以这么说,一个s o c k e t 套接字描述一个通讯连接的一端,两个通讯程序中各自有 一个s o c k e t 套接字来描述它们自己那一端。s o c k e t 套接字可以被看成是一个专 门的管道,但又不像管道,因为s o c k e t 套接字对它们能容纳的数据量是没有限制 的。 一个s o c k e t 套接字在逻辑上有三个特征或是三要素,那就是网域、类型、规 程。首先是网域,它表明s o c k e t 套接字是用于哪种网络,一个网域也就是一种网 络体系结构。由于各种网络对节点地址命名方法不同,所以被称为地址族,例如 a f i n e t 表示互联网套接字,a f i p x 则为n o v e l l 的i p x 网套接字,a f x 2 5 为x 2 5 网套接字,l i n u x 支持的网域还有a f _ a p p l e t a l k ,a f _ u n i x 。 其次是类型,li n u x 支持的套接字类型有( 1 ) s o c k _ s t r e a m 这些套接字提供 可靠的双工顺序数据流,能够保证传送过程中数据不丢失、不被弄混和复制。 i n t e r n e t 地址中的t c p 协议支持流套接字。( 2 ) s o c k _ d g r a m ,这些套接字提供双 工数据传送,但与流套接字不同,它并不保证信息的到达。即使它们到达了,也 不能保证其到达的顺序。这类套接字由i n t e r n e t 地址族的u d p 协议所支持。( 3 ) s o c k r a w ,原始套接字,它允许直接处理下层协议,例如可能打开一个r a w 套接 字到以太网设备,看原始i p 数据的传送。当用r a w 套接字传送数据时,可以由用 户自己填写分组的头部。( 4 ) s o c k _ p a c k e t 这不是一个标准的b s d 套接字类型, 而是一个l i n u x 特定的扩展。 最后是规程,它表明具体的网路规程,一般来说,网域和类型结合在一起大 体上就确定了使用的规程,例如要是网域是a f i n e t ,类型为s o c k _ d g r a m ,则规 程基本上就是u d p ,而如果类型是s o c ks t r e a m ,规程则是t c p ,当然在有些情况 下,可能有别的选择,此时就由网络规程来进一步明确具体的规程。每个套接字 后面都隐藏着网络规程,本文将会具体分析由a f _ i n e t 和s o c k _ s t r e a m 结合而形 成的t c p 规程。 对套接字进行准确操作要依赖于它下面的地址族设置。象虚拟文件系统一样, l i n u x 从套接字层抽象出套接字接口。应用程序和套接字由每个地址族的特定软 件来支持。内核初始化时,地址族被置入内核中并将自己注册到套接字接口。注 l o 南京理工大学硕士学位论文支持集群系统的l i n u x 内核技术研究 册函数是s o c k r e g i s t e r ,这个函数的功能就是对n e t f a m i l i e s 这个内核全局数 组赋值,在这个数组中,每个地址族,即数组中的每个分量,由地址族的名称来 表征,例如a f - i n e t 。内核将这些地址族的处理函数组织在一个结构体中 ( n e tp r o t o f a m i l y ) ,注册函数实际是将结构体的指针赋给全局数组中的分量。 当应用程序建立和使用套接字时,在套接字与它支持的地址族之间将产生一个联 接,所谓的联接,就是通过地址族来查询全局数组,找到与该地址族相对应的分 量。然后就可以通过这个分量( 结构体指针) 调用注册在该地址族上的初始化程 序。 2 7 套接字缓冲区 套接字缓冲区描述了内存中的一块数据区域,这个数据区域存放着网络传输 的数据,在整个网络传输中,套接字作为数据的载体而存在。在数据的发送端, 这个结构创建于套接字层,沿着网络从上而下传递,分别经过t c p 层、i p 层、链 路层,最后在物理层消失。在数据的接收端,这个结构创建于网络驱动程序中, 缓冲区自下而上传递到主机的高层。在流动过程中,每个协议在发送数据时都向 缓冲区添加自己的协议头和协议尾,在接收数据时将会去掉这些协议头和协议尾。 在用协议处理方法处理数据时,套接字缓冲区中最有用的部分就是:( 1 ) 传 输层报文段头部( 例如:u d p 、t c p 、i c m p ) ( 2 ) 网络层分组头部( 例如:i p v 4 6 、 i p x ) ( 3 ) 链路层帧头部( 例如:以太网帧) 。这三个头部名字分别是h 、n h 以及 m a c 。在传输层,协议使用缓冲区中的h 域来找到t c p 报文段头部。在网络层,协 议使用缓冲区中的n h 域来找i p 分组头部。 , 在缓冲区中还有几个重要的指针域。d a t a 域,这个域指向协议数据的当前起 始地址,这个指针值随着当前的协议层变化而变化。在缓冲区中有一个e n d 指 针,e n d 指向内存数据区的结尾。这个末尾并不是真正的末尾,在末尾还有一个数 据结构s k b s h i n f o 。这个结构中有一个数组,数组大小是六,这个数组中又存放 了一些指针,每个指针指向一个页面大小的空间。这些页面是按需分配的,最大 能有六个页面。在拷贝数据时它会首先向d a t a 所指向的数据区拷贝,如果拷不下 了就会用到s k b s h i n f o 这个结构。这时就有可能分配一个页面,将页面地址赋给 上面的数组的一个分量,然后再向页面拷贝数据。当然为了节省页面,几个s k b 可以共享一个页面。在缓冲区中还有一个目录高速缓存项指针,关于目录高速缓 存在后面的章节中将会分析。 o p e r m m s i x 的进程迁移原理硕士论文 3o p e n m o s i x 的进程迁移的原理 o p e n m o s i x 通过修改1 i n u x 内核,实现了节点间的进程迁移。系统有两个部 分组成( 1 ) 一系列的信息收集算法和资源共享算法( 2 ) 进程迁移机制。这个系 统主要有四个功能。( 1 ) 信息收集,它会定期的收集集群内其它主机的信息,收 集的信息包括其它节点c p u 的使用状况,节点的内存使用状况。( 2 ) 在本节点上 选择一个合适的进程,然后将这个进程迁移到其它指定的或空闲的节点上去。( 3 ) 进程被迁移出去之后,本节点还要不断的接收和处理远程节点发过来的处理请求。 ( 4 ) 每个节点还要运行一个服务器,这个服务器用来接受和处理集群中其它节点 的进程迁移请求 8 9 】。 在l i n u x 中,一个进程是由用户级上下文( 用户空间) 和系统级上下文( 内 核空间) 这两部分组成的。集群系统在迁移进程时,进程用户级上下文将会被迁 移到集群中其它节点上去,这个节点称为进程的远程节点或远程端。远程端包含 着用户空问的程序代码、用户栈、数据,是对进程在用户态运行的封装。进程被 迁移之时,进程的系统级上下文是不会被迁移的。在集群系统中,进程在创建时 所处的节点称为进程的宿主节点或宿主端。在宿主节点上,系统保存了进程所依 附的资源描述和系统代码运行时的核心堆栈等。迁移之后,宿主节点上的代理程 序将会处理来自远程节点的请求。代理程序是远程进程在宿主节点上的表示体 1 0 - l 甜。 那么为什么只迁移用户级上下文( 用户空间) ,而不迁移系统级上下文( 内核 空间) 呢。l i n u x 系统的内核空间被所有进程所共享,如果每次在迁移进程时都 将进程的内核空间进行迁移,那么如何来维持内核空间的一致性呢。如果一个节 点上有十个进程被迁移,那么在集群系统上将要维护内核空间的十个备份,并需 要时刻保持这十个备份的一致性,这样做的代价将会十分大,而且这样的实现将 会变得十分复杂,所以o p e n m o s i x 只将用户空间进行迁移。 系统调用是用户和内核的接口,用户空间程序通过系统调用来获得内核所提 供的服务。系统调用是在内核空间中实现的,而内核空间留在了宿主节点。所以 远程节点上的用户空间程序在使用系统调用时,就需要向宿主节点发送请求,宿 主节点上的代理程序收到请求之后就会处理这个请求。 本文将会分析o p e n m o s i x 系统实现的具体细节,其中有集群的入口函数,迁 移进程时迁出了哪些信息,在远程节点上如何建立用户空间的运行环境,迁移之 南京理工大学硕士学位论文支持集群系统的l i n u x 内核技术研究 后的用户空间程序如何进行系统调用。 3 2 集群系统的入口函数 进程的用户空间被迁移后,内核空间留在了宿主端,在宿主端保留了进程的 控制块,这个控制块仍然在系统运行队列中存在着,在宿主端这个进程仍然能得 到系统的调度,称它为代理。那么在宿主端的代理进程是如何得到调度的,在得 到调度之后它将做哪些工作昵。第一个问题很简单,当调度函数根据进程的优先 级,选中了这个进程,这个进程就能得到调度,当然在宿主端,进程始终会在内 核中运行程序,而不会跳到用户空间中去。【1 孓1 4 】 从系统调用返回或是从中断程序中返回用户空间时,要经过一段汇编代码。 o p e n m o s i x 修改了l i n u x 的这段代码。如果需要运行调度程序,系统会首先运行 调度程序,进行进程切换改变当前运行的进程。然后是信号的处理,紧接着就是 m o s i x _ p r e u s e r m o d e a c t i o n s 函数,这就是进入集群处理程序的入口,本文称它 为o p e n m o s i x 的入口函数。这个函数既包含了对远程节点的处理,也包含了对宿 主节点的处理。它是根据进程控制块中标志位来处理的。如果控制块的标志位表 明当前进程控制块是某个进程的宿主或说是某个进程的宿主代理端,那么当前进 程的内核部分就会利用d e p u t y _ m a i n _ l o o p 函数来处理,本文称它为请求处理函 数。这个函数将会检查是否有远程节点的请求需要处理,如果有就会调用相应的 处理函数进行处理,如果没有就会进入睡眠。作为一个宿主端代理,它既会处理 远程主机的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年新疆昌吉回族自治州单招职业倾向性考试题库带答案解析
- 2026年无锡商业职业技术学院单招职业适应性测试必刷测试卷附答案解析
- 2026年信阳涉外职业技术学院单招职业适应性测试题库及答案解析(夺冠系列)
- 2026年上海师范大学单招职业倾向性测试必刷测试卷带答案解析
- 2026年克拉玛依职业技术学院单招职业技能测试必刷测试卷带答案解析
- 2026年山西信息职业技术学院单招职业技能测试必刷测试卷带答案解析
- 2026年山西管理职业学院单招职业倾向性测试题库及答案解析(名师系列)
- 2026年洛阳文化旅游职业学院单招职业技能测试必刷测试卷及答案解析(夺冠系列)
- 2026年四川化工职业技术学院单招职业适应性测试必刷测试卷附答案解析
- 2020-2025年教师资格之中学美术学科知识与教学能力基础试题库和答案要点
- 房屋市政工程重大事故隐患2025版
- 装饰设计师转正述职报告
- 2026年lng加气站建设项目可行性研究报告
- 初中生学业评价表模板
- 餐梯电梯维保合同范本
- 2025年10月北京门头沟区龙泉镇流动人口协管员招聘2人笔试考试参考试题及答案解析
- 司法鉴定咨询服务方案
- 施工安全保证体系和措施
- DB32-T 4353-2022 房屋建筑和市政基础设施工程档案资料管理规程
- 制造企业能源管理系统建设方案
- 脑出血知识培训课件
评论
0/150
提交评论