




已阅读5页,还剩94页未读, 继续免费阅读
(计算机软件与理论专业论文)高速邮件系统的研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高速邮件系统的研究与实现 中文摘要 本课题来源于电子科技大学计算机学院8 0 2 0 教研室承担的信息产业部电子 生产发展基金项耳。目标是提供一个适合中小型企业的性价比高、功能齐全的高 速电子邮件系统。 在i n t e r n e t 迅猛发展的今天,电子邮件已经成为信息交换的重要载体,是 目前网络上最常用的功能之一,而国内市场上却缺少适合中小型企业的专业邮件 系统,我们的高速电子邮件系统正是在这样的背景下开发的。 本论文首先讨论和总结了电子自g 件系统的基本理论、工作原理和相关协议。 通过对现有的服务器内部架构进行分析和比较,我们提出:基于进程池的s 6 a t p 服务器、p o p 3 服务器、咖g 服务器等模块和基于s p c s ( 单进程并发服务) 的服务器 模型。 我们对邮件系统的提速主要体现在三个方面。第一,通过对比,采用了更为 合理的邮件存储格式_ _ m a i l d i r ;第二,提出了f a s t q u e u e 磁盘队列存储管理机 制:第三,采用了高效的服务器模型来架构整个邮件系统。 通过s p e c m a i l 专业由s 件测试软件的澳4 试,我们的服务器实现了设计目标并 具有较高的性能。 关键词:电子邮件,s l x r p ,p o p 3 m t a ,f a s tq u e u e ,s p c s ,文件系统 高速邮件系统的研究与实现 a b s t r a c t t h ed e s i 【印o ff a s te m a l ls e r v e ri sa p r o j e c tf u n d e db y e l e c t r o n i cd e v e l o p m e n t f u n d so fm i n i s t r yo fi n f o r m a t i o ni n d u s t r y w i t ht h ee x p l o s i v e l yg r o w i n go ft h e i n t e m e ta tp r e s e n t , e m a l li sb e c o m i n gam a i nc a r r i e ro ft h ei n f o r m a t i o ne x c h a n g ea n d t h em o s tc o m m o nf u n c t i o n m e a n w h i l e ,i nt h ed o m e s t i cm a r k e tt h e r ei sal a c ko ft h e p r o f e s s i o n a l e m a i ls y s t e mw i t hh i 酞p e r f o r m a n c e ,r e l i a n c ea n ds e c u r i t y , w h i c hi s s u i t a b l et om i d d l eo rs m a l le n t e r p r i s e sa n do f o u ro w n k n o w l e d g er i g h t s t h u s ,f a s t m a i li sc o m i n gi n t ob e i n g b ya n a l y s i n ga n dc o m p a r i n g d i f f e r e n ti n t e r n a la r c h i t e c t u r e so fn e t w o r ks e r v e r , f a s tm a i lb r i n g su pp r o c e s s - p o o l - b a s e ds m t ps e r v e r , p o p 3s e r v e r , w m gs e r v e r a n ds p c s t e c h n o l o g y w e s p e e du p t h i ss y s t e mi nt h r e ef i e l d s f i r s t l y , w eu s em a i l d i r ;s e c o n d l y , w eu s e f a s tq u e u em e c h a n i s mt od e v e l o pt h ep e r f o r m a n c eo fi 0 ;f i n a l l y , w ei l s es p c st o b u i i dt h ew h o l em t a t h es p e c m a i lt e s t i n ga b o u tt h ef u n c t i o n sa n dt h ep e r f o r m a n c eo ff a s tm a i l a p p r o v e st h a t f a s tm a l lr e a c h e so u rd e s i g n i n gg o a l sa n dh a sa c c o m p l i s h e dh i g h p e r f o r m a n c e k e yw o r d s :e m a i l ,s m t p , p o p 3 ,m t a ,f a s tq u e u e ,s p c s ,f i l e s y s t e m 聪 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工 作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地 方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含 为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。 与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明 确的说明并表示谢意。 签名:二啦一日期:2 。烽。月t 占日 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文 的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文 的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或 扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解密后应遵守此规定) 签名:三连 导师签名: e t 期:2 0 0 高速邮件系统的研究与实现 第一章引言 1 1 背景 在i n t e r n e t 迅猛发展的今天,电子邮件己经成为信息交换的重要载体,是 目前i n t e r n e t 上最常用的功能之一。随着万维网( w w w ) 的普及,电子邮件也凭 借其快速,高效,安全和可包含多媒体的特点在学术界,商业界和人们日常工作, 生活中成为最为流行的一种通信方式。 通过电子邮件,我们可以与远程用户进行迅速、方便的联系,而且费用低廉。 同时,电子邮件可以包含多媒体的内容,这使得我们的通讯变得生动形象,如文 本、图象、声音、视频等。另外,我们还可以利用数字签名与认证、p g p 加密等 技术来保证电子邮件传递的安全性与可靠性。正是由于电子邮件系统的这些良好 特性,越来越多的用户采用基于电子邮件系统的应用。 目前市场上邮件系统主要分为两类,一类是以大型的邮件服务器开发商为代 表的,针对百万级用户所开发的巨型邮件系统。而另外一类则是针对中小型企业 的基于s e n d m a i l 和q m a i l 的小型邮件系统。市场上缺少适合中小型企业的功能 完善、性价比高、管理维护简单的专业邮件系统。 正是基于目前服务器市场的切实需求,我们8 0 2 0 教研室着手开发了具有自 主知识产权的高速邮件系统。 1 2 课题优势 我们教研室长期从事操作系统和计算机网络方面的研究,而且与国外公司有 良好的合作关系。笔者因有丰富的邮件系统设计和研发经验,因此作为主研参加 了这一项目。 1 ,3 论文内容组织 本文从邮件的基本概念入手,分析了i n t e r a c t 邮件系统的基本原理和相关的 网络协议。文中比较了现有的邮件系统产品,还分析了不同的服务器结构。在以 上研究的基础上,设计并实现了我们的高速邮件系统,并提出了我们的高性能的 磁盘队列存储管理机制。后续章节的主要内容安排如下。 第二章理论基础 主要讲述了l i n u x 下文件系统的概念和i n t e r n e t 邮件服务的基本原理以及相 关应用层的协议。 第三章l i n u x 下现有邮件服务器的比较 主要比较了l i n u x 下现有的s e n d m i l 和q m a i l 的优缺点。为我们开发自己的 邮件系统做了铺垫。 第四章服务器结构的研究 研究了e m m l 系统实现中的关键问题服务器的内部结构,分析并比较了 五种服务器结构,在此基础上提出了,s p c s ( 单进程并发服务) 构架适合用于实 现高性能的e m a i l 系统的m t a 。 高速邮件系统的研究与实现 第五章高速邮件系统的设计 主要讲述了高速邮件系统的框架以及各个模块的设计和架构。并且针对邮件 系统的特点一大量小文件的存储和访问,我们提出了一种高性能的磁盘队列存储 管理机制,来解决文件l y o 的瓶颈问题。 第六章高速邮件系统的实现 着重讲述了高速邮件系统的实现中的关键技术、相关算法和主要流程等。 第七章功能及性能测试 从功能和性能两方面对高速邮件系统进行了测试,测试结果表明系统实现了 设计的功能并达到较高的性能。 第八章结论 第二章理论基础及相关协议 2 1 l i f l u x 下的文件系统 文件系统是操作系统用于明确磁盘或分区上文件的方法和数据结构,即在磁 盘上组织文件的方法。 文件系统中的文件包含了数据的集合:一个文件系统不仅保存它包括的文件 的数据,也保存文件系统的结构。它保存了l i n u x 用户和进程看到的所有信息, 例如文件、目录、软链接、文件保护信息等等。另外,它必须安全地保存这些信 息,操作系统的基本一致性依赖于它的文件系统。没有人可以使用一个随机丢失 数据和文件的操作系统。 2 1 1 虚拟文件系统( v f s ) l i n u x 的最重要特征之一就是支持多种文件系统。v f s 使得l i n u x 可以支持 多个不同的文件系统,v f s 向文件系统提供通用的接口。由于软件将l i n u x 文件 系统的所有细节进行了转换,所以l i n u x 核心的其它部分及系统中运行的程序将 看到统一的文件系统。 虚拟文件系统是物理文件系统与服务之间的一个接口层,对l i n u x 的每个 文件系统的所有细节进行抽象,使得不同的文件系统在l i n u x 内核以及系统中运 行的其他进程看来,都是相同的。严格说来,v f s 并不是种实际的文件系统。 它只存在于内核中,不存在于任何外存空间。v f s 在系统启动时建立,在系统关 闭时消亡。 l i n u x 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。当 每一个文件系统初始化的时候,它自身向v f s 登记。这发生在系统启动操作系 统初始化自身的时候。真实的文件系统自身建立在内核中或者是作为可加载的模 块。文件系统模块在系统需要的时候加载,所以,如果v f a t 文件系统用核心模 块的方式实现,那么它只有在一个v f a t 文件系统安装的时候才加载。当一个块 设备文件系统安装的时候,( 包括r o o t 文件系统) ,v f s 必须读取它的超级块。 每一个文件系统类型的超级块的读取例程必须找出这个文件系统的拓扑结构,并 把这些信息映射到一个v f s 超级块的数据结构上。v f s 保存系统中安装的文件 系统的列表和它们的v f s 超级块列表。每一个v f s 超级块包括了文件系统的信 息和完成特定功能的例程的指针。例如,表示一个安装的e x t 2 文件系统的超级 高速邮件系统的研究与实现 块包括一个e x t 2 相关的i n o d e 的读取例程的指针。这个e x t 2i n o d e 读取例程, 象所有的和文件系统相关的i n o d e 读取例程一样,填充v f si n o d e 的域。每一个 v f s 超级块包括文件系统中的一个v f si n o d e 的指针。 虚拟文件系统的设计目标是为l i n u x 用户提供快速且高效的文件访问服务。 同时它必须保证文件及其数据的正确性和安全性。这两个目标相互间可能存在冲 突。当安装一个文件系统并使用时,l i n u xv f s 为其缓存相关信息。此缓存中数 据在创建、写入和删除文件与目录时如果被修改,则必须更新文件系统中对应内 容。如果能够在运行核心内看到文件系统的数据结构,那么就可以看到那些正 被文件系统读写的数据块。描叙文件与目录的数据结构被不断的创建与删除而设 备驱动将不停地读取与写入数据。这些缓存中最重要的是b u f f e rc a c h e ,它被集 成到独立文件系统访问底层块设备的例程中。当进行块存取时数据块首先将被放 入b u f f e rc a c h e 里并根据其状态保存在各个队列中,此b u f f e rc a c h e 不仅缓存数 据而且帮助管理块设备驱动中的异步接口。 v f s 使l i n u x 同时安装、支持许多不同类型的文件系统成为可能。v f s 拥有 关于各种特殊文件系统的公共接口,如超级块、i n o d e 、文件操作函数入口等。 特殊文件系统的细节问题统一由v f s 的公共接口来翻译,它们对系统内核和用 户进程来说是透明的。 v f s 的功能包括 夺记录可用的文件系统的类型。 夺将设备同对应的文件系统联系起来。 夺处理一些面向文件的通用操作。 夺涉及到针对文件系统的操作时,v f s 把它们映射到与控制文件、目录以 及i n o d e 相关的物理文件系统。 当进程发布一个面向文件的的系统调用时,内核将调用v f s 相应的函数, 这个函数处理一些与物理结构无关的操作,并且把它重定向为真实文件系统中相 应的函数调用。v f s 结构见图2 一l 。 高速邮件系统的研究与实现 图2 - lv f s 文件系统在l i n u x 内核中的结构 所有的l i n u x 文件系统使用一个共同的b u f f e rc a c h e 来缓存底层的设备的数 据缓冲区,这样可以加速对于存放文件系统的物理设备的访问,从而加快对文件 系统的访问。这个b u f f e rc a c h e 独立于文件系统,集成在l i n u x 核心分配、读和 写数据缓冲区的机制中。让l i n u x 文件系统独立于底层的介质和支撑的设备驱动 程序有特殊的好处。所有的块结构的设备向l i n u x 核心登记,并表现为一个统一 的,以块为基础的,通常是异步的接口当真实的文件系统从底层的物理磁盘读取 4 高速邮件系统的研究与实现 数据的引起块设备驱动程序从它们控制的设备上读取物理块。在这个块设备接 口中集成了b u f f e rc a c h e 。当文件系统读取了块的时候,它们被存放到了所有的 文件系统和l i n u x 核心共享的全局的b u f f e rc a c h e 中。其中的b u f f e r ( 缓冲区) 用 它们的块编号和被读取设备的一个唯一的标识符来标记。所以,如果相同的数据 经常需要,它会从b u f f e r c a c h e 中读取,而不是从磁盘读取( 会花费更多时间) 。 一些设备支持超前读( r e a da h e a d ) ,数据块会预先读取,以备以后可能的读取。 当系统的进程访问目录和文件的时候,调用系统例程,游历系统中的v f s i n o d e 。例如在一个目录中输入i s 或者c a t 一个文件,让v f s 查找代表这个文件 系统的v f si n o d e 。因为系统中的每一个文件和目录都用一个v f si n o d e 代表, 所以一些i n o d e 会被重复访问。这些i n o d e 保存在i n o d ec a c h e ,这让对它们的访 问更快。如果一个i n o d e 不在i n o d ec a c h e 中,那么必须调用一个和文件系统相关 的例程来读取适当的i n o d e 。读取这个i n o d e 的动作让它被放到了i n o d ec a c h e , 以后对这个i n o d e 的访问会让它保留在c a c h e 中。较少使用的v f si n o d e 会从这 个高速缓存中删除。 v f s 也保存了一个目录查找的缓存,所以一个常用的目录的i n o d e 可以快速 找到。作为一个试验,试着对于你最近没有列表的目录列表。第一次你列表的时 候,你会注意到短暂的停顿。当时第二次你列表的时候,结果会立即出来。目录 缓存本身不存储目录里的i n o d e ,这是i n o d ec a c h e 负责的,目录缓存只是存储目 录项目全称和它们的i n o d e 编号。 p a g ec a c h e 用来加快对磁盘上映像和数据的访问。它用于缓存文件的逻辑 内容,一次一页,并通过文件和文件内的偏移来访问。 2 1 2b u f f e r _ c a c h e 当使用安装的文件系统的时候,它们会对块设备产生大量的读写数据块的请 求。所有的块数据读写的请求都通过标准的核心例程调用,以b u f f e r 数据_head 结构的形式传递给设备驱动程序。这些数据结构给出了设备驱动程序需要的所有 信息:设备标识符唯一标识了设备,块编号告诉了驱动程序读去哪一块。所有的 块设备被看成同样大小的块的线性组合。为了加速对于物理块设备的访问,l i n u x 维护了一个块缓冲区的缓存。系统中所有的块缓冲区都保存在这个b u f f e rc a c h e , 甚至包括那些新的、未使用的缓冲区。这个缓存区被所有的物理块设备共享:任 何时候缓存区中都有许多块缓冲区,可以属于任何一个系统块设备,通常具有不 同的状态。如果在b u f f e rc a c h e 中有有效的数据,这就可以节省系统对于物理设 备的访问。任何用于从向块设备读取写入数据的块缓冲区都进入这个b u f f e r c a c h e 。随着时间的推移,它可能从这个缓存区中删除,为其它更需要的缓冲区 让出空间,或者如果它经常被访问,就可能一直留在缓存区中。 这个缓存区中的块缓冲区用这个缓冲区所属的设备标识符和块编号唯一标 识。这个b u f f e rc a c h e 由两个功能部分组成。第一部分是空闲的块缓冲区列表。 每一个同样大小的缓冲区( 系统可以支持的) 一个列表。系统的空闲的块缓冲区 当第一次创建或者被废弃的时候就在这些列表中排队。当前支持的缓冲区大小是 5 1 2 、1 0 2 4 、2 0 4 8 、4 0 9 6 和8 1 9 2 字节。第二个功能部分是缓存区( c a c h e ) 本身。 这是一个h a s ht a b l e ,是一个指针的向量表,用于链接具有相同h a s hi n d e x 的 b u f f e r 。h a s hi n d e x 从数据块所属的设备标识符和块编号产生出来。块缓冲区要 么在空闲列表之一。要么在b u f f e rc a c h e 中。当它们在b u f f e rc a c h e 的时候,它们 高速邮件系统的研究与实现 也在l r u 列表中排队。每一个缓冲区类型一个l r u 列表,系统使用这些类型在 一种类型的缓冲区上执行操作。 不论何时文件系统需要从它的底层的物理设备读取一个缓冲区的时候,它都 试图从b u f f e rc a c h e 中得到一个块。如果它不能从b u f f e rc a c h e 中得到一个缓冲区, 它就从适当大小的空闲列表中取出一个干净的缓冲区,这个新的缓冲区会进入到 b u f f e rc a c h e 中。如果它需要的缓冲区已经在b u f f e rc a c h e 中,那么它可能是也可 能不是最新。如果它不是最新,或者它是一个新的块缓冲区,文件系统必须请求 设备驱动程序从磁盘上读取适当的数据块。 象所有的高速缓存一样,b u f f e r c a c h e 必须被维护,这样它才能有效地运行, 并在使用b u f f e r c a c h e 的块设备之间公平地分配缓存条目。l i n u x 使用核心守护进 程b d f l u s h 在这个缓存区上执行大量的整理工作不过另一些是在使用缓存区的 过程中自动进行的。 2 l3 注册文件系统 当重新建立l m u ) ( 核心时安装程序会询问是否需要所有可支持的文件系统。 核心重建时文件系统启动代码包含了所有那些编入核心的文件系统的初始化例 程。 l i n u x 文件系统可构造成模块,此时它们会仅在需要时加载或者使用i n s m o d 来载入。当文件系统模块被加载时,它将向核心注册并在卸载时撤除注册。每个 文件系统的初始化例程还将向虚拟文件系统注册,它用一个包含文件系统名称和 指向其v f s 超块读例程的指针的f i l e _ s y s t e m _ t y p e 结构表示,每个f i l e _ s y s t e m _ t y p e 结构包含下列信息: s u p e r b l o c k r e a dr o u t i n e此例程载文件系统的一个实例被安装时由v f s 调用。 f i l es y s t e mn a m e文件系统的名称如e x t 2 。 d e v i c en e e d e d文件系统是否需要设备支持。并不是所有的文件系统 都需要设备来保存它。可以通过显示 p r o c f i l e s y s t e m s 文件中的内容找出已注册的文件 系统。 如图2 2 所示,内核中的f i l e s y s t e mt y p e 的组织: 图2 - 2文件类型在内核中的数据结构 2 1 4 安装文件系统 当超级用户试图安装一个文件系统时,l i n u x 核心首先使系统调用中的参数 有效化。尽管m o u n t 程序会做一些基本的检查,但是它并不知道核心构造时已经 高速自口件系统的研究与实现 支持那些文件系统,同时那些建议的安装点的确存在。看如下的一个m o u n t 命令: $ m o u n t ti s 0 9 6 6 0 一or o d e v c d r o m m n t c d r o m m o u n t 命令将传递三个参数给核心:文件系统名,包含文件系统的物理块设 备以及此新文件系统要安装到的已存在的目录名。 虚拟文件系统首先必须做的是找到此文件系统。它将通过由链指针 f i l e s y s t e m s 指向的f i l e s y s t e m _ t y p e 结构来在所有已知文件系统中搜寻。 如果找到了一个相匹配的文件系统名,那么它就知道核心支持此文件系统并 可得到读取此文件系统超块相关例程的指针。如果找不到,但文件系统使用了可 动态加载核心模块,则操作仍可继续。此时核心将请求核心后台进程加载相应的 文件系统模块。 接下来如果由m o u n t 传递的物理设备还没有安装,则必须找到新文件系统 将要安装到的那个目录的v f si n o d e 。这个v f si n o d e 可能在i n o d ec a c h e 中 也可能在支撑这个安装点所在文件系统的块设备中。一旦找到这个i n o d e 则将对 它进行检查以确定在此目录中是否已经安装了其它类型的文件系统。多个文件系 统不能使用相同目录作为安装点。 此时v f s 安装代码必须分配一个v f s 超块并将安装信息传递到此文件系统的 超块读例程中。系统中所有的v f s 超块都被保存在由s u p e r b l o c k 结构构成的 s u p e rb l o c k s 数组中,并且对应此安装应有一个这种结构。超块读例程将基于 这些从物理设备中读取的信息来填充这些v f s 超块域。对于e x t2 文件系统此信 息的转化过程十分简便,仅需要读取e x t 2 超块并填充v f s 超块。但其它文件系 统如m s - d o s 文件系统就不那么容易了。不管哪种文件系统,对v f s 超块的填充 意味着文件系统必须从支持它的块设备中读取描叙它的所有信息。如果块设备驱 动不能从中读取或不包含这种类型文件系统则m o u n t 命令会失败。 每个文件系统用一个v f s m o u n t 结构来描叙。它们被排入由v f s m n t l i s t 指向 的链表中。另外一个指针:v f s m n t t a i l 指向链表的最后一个入口同时 m r u v f s m n t 指针指向最近使用最多的文件系统。每个v f s m o u n t 结构中由以下 部分组成:包含此文件系统的块设备的设备号,此文件系统安装的目录以及文件 系统安装时分配的v f s 超块指针。v f s 超块指向这种类型文件系统和此文件系统 根i n o d e 的f il e s y s t e m _ t y p e 结构。一旦此文件系统被加载,这个i n o d e 将一 直驻留在v f si n o dc a c h e 中。 2 1 ,5 卸载文件系统 如果已安装文件系统中有些文件还在被系统使用则不能卸载此文件系统。例 如有进程使用r a n v c d r o m 或其子目录时将不能卸载此文件系统。如果将要卸载的 文件系统中有些文件还在被使用,那么在v f si n o d cc a c h e 中有与其对应的v f s i n o d e 。通过在i n o d e 链表中查找此文件系统占用设备的i n o d c 来完成此工作。对 应此已安装文件系统的v f s 超块为d i n y ,表示它已被修改过所以必须写回到磁 盘的文件系统中。一旦写入磁盘,v f s 超块占用的内存将归还到核心的空闲内存 池中。最后对应的v f s m o u n t 结构将从v f s m n t l i s t 中释放。 高速邮件系统的研究与实现 2 2 块设备驱动程序 操作系统其中个目的就是向用户掩盖系统硬件设备的特殊性。例如,虚拟 文件系统呈现了安装的文件系统的一个统一的示图,而和底层的物理设备无关。 2 2 1l i n u x 下设备的管理 l i n u x 的一个基本特点是它抽象了设备的处理。所有的硬件设备都象常规文 件一样看待:它们可以使用和操作文件相同的、标准的系统调用来进行打开、关 闭和读写。系统中的每一个设备都用一个设备特殊文件代表。例如系统中第一个 i d e 硬盘用d e v h d a 表示。对于块( 磁盘) 和字符设备,这些设备特殊文件用 m k n o d 命令创建,并使用主( m a j o r ) 和次( m i n o r ) 设备编号来描述设备。网络 设备也用设备特殊文件表达,但是它们由l i n u x 在找到并初始化系统中的网络控 制器的时候创建。同一个设备驱动程序控制的所有设备都由一个共同的m a j o r 设 备编号。次设备编号用于在不同的设备和它们的控制器之间进行区分。l i n u x 使 用主设备号表和一些系统表( 例如字符设备表c h r d e v s ) 把系统调用中传递的设 备特殊文件( 比如在一个块设备上安装一个文件系统) 映射到这个设备的设备驱 动程序中。 l i n u x 支持三类的硬件设备:字符、块和网络。字符设备直接读写,没有缓 冲区,例如系统的串行端1 2 d e v c u a o 和d e v c u a l 。块设备只能按照一个块( 一般 是5 1 2 字节或者1 0 2 4 字节) 的倍数进行读写。块设备通过b u f f e rc a c h e 访问,可 以随机存取。就是说,任何块都可以读写而不必考虑它在设备的什么地方。块设 备可以通过它们的设备特殊文件访问,但是更常见的是通过文件系统进行访问。 2 2 2 块设备驱动程序的设计 注册驱动程序 核心里的块设备驱动程序也是由一个主设备号来标识。用来对其进行注册和 取消注册的函数是: i n t r e g i s t e r b l k d e v ( u n s i g n e di n :m a j o r ,c o n s tc h a r * n a m e s t r u c t f i l e o p e r a t i o n s * f o p s ) i n tu n r e g i s t e rb l k d e v ( u n s i g n e di n tm a j o r ,c o n s tc h a r * n a m e ) : 参数含义; u n s i g n e d i n tm a j o r :主设备号。 c o n mc h a r + n a m e :设备名。 s t r u c tf i l e o p e r a t i o n s * f o p s :有关的操作函数结构。 s t r u c tf i l e _ o p e r a t i o n s l o f f _ t ( + l l s e e k ) ( s t r u c tf i l e + ,l o f f _ t ,i n t ) ; s s i z et ( + r e a d ) ( s t r u c tf i l e + ,c h a r + ,s i z e _ _ t , l o f f _ t + ) ; s s i z et ( + w r i t e ) ( s t r u c tf i l e ,c o n s tc h a r + ,s i z e _ t ,l o f it + ) ; i n t ( + r e a d d i o ( s t m c tf i l e ,v o i d + ,f i l l d i r _ _ t ) ;r e a d d i r u n s i g n e di n t ( + p o l l ) ( s t r u c tf i l e + ,s t r u c tp o l l _ t a b l es t r u c t + ) ; i n t ( + i o c t l ) ( s t r u c ti n o d e + ,s t r u c tf i l e + ,u n s i g n e di n t ,u n s i g n e dl o n g ) ; i m ( + m m a p ) ( s t r u c tf i l e + ,s t r u c tv m a r e a s 劬c t ) ; i n t ( + o p e n ) ( s t r u c ti n o d e + ,s t r u c tf i l e + ) ; i n t ( + f l u s h ) ( s t r e e tf i l e + ) ; 8 高速邮件系统的研究与实现 m t ( r e l e a s e ) ( s t r u c ti n o d e + ,s t r u c tf i l e + ) ; i n t ( * f s y n c ) ( s t r u c tf i l e + ,s t r t t c td e n t r y + ,h a td a t a s y n c ) ; i m ( f a s y n c ) ( i n t ,s t r u c tf i l e + ,i n t ) ; i n t ( + l o c k ) ( s t r u c tf i l e + ,i n t ,s t r u c tf i l e _ l o c k + ) ; s s i z e _ t ( + r e a d y ) ( s t r b c tf i l e + ,c o a s ts t r u c ti o v e c + ,u n s i g n e dl o n g ,l o f f _ t + ) ; s s i z e _ t ( + w r i t e v ) ( s t r u c tf i l e + ,c o n s ts t r u c ti o v e c + ,u n s i g n e dl o n g ,l o f f _ t + ) ; ) ; 读写操作 通用的读写操作通过数据缓冲获得加速,这在字符设备驱动程序中是没有 的。块设备驱动程序可以被缓冲是因为它们的数据服从于计算机的文件层次结 构,任何应用程序都无法直接访问,而字符设备驱动程序则不是这样。 不过,当缓冲的高速缓存不能满足一个读请求或当一个待处理的写操作要刷 新到物理磁盘上时,驱动程序必须被调用来进行真正的数据传送。f o p s 结构除了 r e a d 和w r 眈外,并不带有入口点,因此,必须要个额外的结构b l kd e vs t r u c t 来发出对实际数据传送的请求。 如图2 3 ,当核心需要为块设备产生一个i 0 操作时,它便调用函数 b l kd e v m a j o r r e q u e s t f n 。因此这个模块的初始化函数须设置这个域使其指向它 自己的请求函数。这个结构中的其它域只供核心函数或宏进行内部使用。 图2 3 设备驱动与文件系统之间的关系图 相关数据结构 除了b l k _ d e v 还有几个数组带有块设备驱动程序的信息。这些数组一般由主 设备号( 有时也用次设备号) 进行索引。它们在d r i v e r s b l o c k l l _ r wb l o c 七c 中被 9 高速邮件系统的研究与实现 声明和描述。 i n t b l ks i z e ; 这个数组由主设备号和次设备号索引。它以k b 为单位描述了每个设备的大 小。如果b l ks i z e m a j o r 是n u l l ,则不对这个设备的大小进行检查( 也就是说, 核心可能要求数据传送通过e n do fd e v i c e ) 。 i n tb l k s i z e _ s i z e ; 被每个设备所使用的块的大小,以字节为单位。与上一个数组类似,这个二 维数组也是由主设备号和次设备号索引。 i n t h a r d s e c t _ s i z e : 这个数据结构也是由主设备号和次设备号索引。硬件扇区的缺省大小为 1 0 2 4 字节。 i mr e a da h e a d ; 这个数组由主设备号索引,它定义了一个文件被顺序读取时,核心可以提前 读取多少扇区。在进程请求数据之前将其读出可以改善系统的性能及总的吞吐 率。慢速设备最好指定一个较大的提前读的值,而一个快速设备则可以在较小的 提前读的值下工作的很好。 请求管理 b l k d e v s 以设备的主设备号作下标,当做文件访问时,对不同类型的块设备 上的文件的访问采用的方法也不同。数据结构d e v i c es t r u c t 为不同类型的块设备 访问提供了统一的界面。当块设备登记上后,d e v i c es t r u c t 中的域f o p s 指向该块 设备的访问操作函数。 向量表b l kd e v s 为文件系统访问块设备提供了一致的界面:同样,对于缓冲 区c a c h e ,块设备也要向其提供一致的界面。向量表b l kd e v 解决了这一问题。 s t r u c tb l k d e v s t r u c t v o i d f + r e q u e s t _ f n ) ( v o i d ) ; 请求处理函数指针,在系统初启时由每种设备的初始化函数分 别进行初始化。请求处理函数是写设备驱动程序的重要一环,设备驱 动程序在此函数中通过o u t b 向位于i 0 空间中的设备命令寄存器发出 命令,以后通过中断接受请求的处理结果; s t r u c t r e q u e s t + c u r r e n t r e q u e s t ; 指向当前正在处理的请求。每个设备拥有一个请求队列,该请求 队列由p l u g 维持,当系统准备处理请求时,设备对应的请求队列就 被插上去( 令c u r r e n t r e q u e s t = & p l u g ) ,请求处理过程由u n p l u g _ d e v i c e 完成。 s t r u c t r e q u e s tp l u g ; p l u g 主要被用于异步提前读写操作,在这种情况下,由于没特 别的请求,为了提高系统性能,需要等发送完所有的提前读写请求 才开始进行请求处理。 s t r u c t t q _ s t r u c tp l u 幽; 维持了设备对应的任务队列 数据结构b l k d e v s t r u c t 的说明请参见上面注释部分。b l kd e v 是个一维 o 高速邮件系统的研究与实现 数组,数组下标对应块设备的主设备号,因此系统中的每一种块设备都唯一对应 了一个b l kd e vs t r u c t 结构,用来维护与该块设备相关的请求信息。从上面与 块设备有关的数据结构中可看到,对块设备的访问是以发请求的方式进行的,每 一个对块设备的请求用数据结构r e q u e s t 表示,对同一块设备的不同请求按 e l e v a t o r 算法排序。对不同块设备的所有请求都放在请求数组a l l _ r e q u e s t s 中, 请求数组a l lr e q u e s t s 实际上是一个请求缓冲池,请求的释放与申请都是针对 这个缓冲池进行。请求结构里的n e x t 指针用来联结各个请求,形成请求队列。 系统中的每一种设备都拥有自己的请求队列,这个队列由c u r r e n t r e q u e s t 和 p l u g 共同维护。 了解了与请求管理有关的主要数据结构后,让我们来看看系统是如何实现请 求管理的。首先调用宏i n i tr e q u e s t ,以确定请求队列正常无误,请求队列通 过函数a d dr e q u e s t0 得到。然后调用函数e n d r e q u e s t ( 1 ) ,将当前请求从请求 队列取下,然后用w a k e u p 0 唤醒别的进程。以下是在请求管理中用道的函数。 s t a t i cv o i dm a k e r e q u e s t ( i n tm a j o r ,i n tr w ,s t r u c tb u f f e r h e a d b h ) 本函数用来申请一个请求缓冲区,调用者需要提供主设备号m a j o r ,操 作命令c m d ( r e a do rw r i t e ) 以及读写缓冲区b h 。m a k er e q u e s t 先检查当 前设备是否有c u r r e n t r e q u e s t ,接着,m a k e _ r e q u e s t 以不等待方式申请一 个请求缓冲区,如果申请不成功,则以等待方式申请。等待方式申请时,通 过r u n t a s k q u e u e ( ) 来重新调度i o 任务,从而获得其他i o 任务结束后 释放的缓冲区。当缓冲区申请到后,就用a d d _ r e q u e s t ( ) 它添加到设备的 请求队列中。添加原则是:如果c u r r e n tr e q u e s t = n u l l ,就令 c u r r e n t r e q u e s t 指向当前申请到的请求缓冲区,同时调用请求结构里的 r e q u e s t f n ( ) 开始处理请求;要是c u r r e n t _ r e q u e s t ! = n u l l ,就把当前请 求根据一定规则放到c u r r e n t _ r e q u e s t 维护的请求队列中,插入规则按主设 备号从低到高、读写扇区数从少到多进行。在上述缓冲区申请过程中,如果 进行的是提前读写请求,则系统在不等待方式下缓冲区申请失败时立即返回: v o i d1 l r w b l o c k ( i n tr w ,i n tn r 。s t r u c tb u f f e rh e a d b h ) 这个函数是请求管理的对外接口,它封装了m a k er e q u e s t ( ) 。文件系 统可以用它来发出同一设备多个数据块的读写请求。函数的参数很简单,r w 是读写命令,n r 是数据缓冲区的个数,b h 是数据缓冲区列表; v o i d u n p l u g _ d e v i c e ( v o i d + d a m ) 本函数的功能已在前面作了论述,其主要功能是处理c u r r e n ts t 向的请求队列。该函数的地址在系统初始化时被赋给d e v - p l u gt q g o u t i n e 因此每次设备对应的y o 任务被唤醒时,系统都会回调本函数,处理 c u r r e n t _ r e q u e s t 累积起来的请求队列。除此外,设备驱动程序也在适当的地方 调用本函数。函数参数是一个v o i d 指针d a t a ,d a t a 实际上指向设备对应的 b l k d e v s t r u c t ; i n t b l k d e v i n i t ( v o i d ) 本函数功能很简单,主要完成块设备初始化,即通过调用各种设备的初 始化函数完成b l k _ d e v 的初始化。 安装( m o u n t ) 块设备与字符设备及一般文件的不同在于它们可以被安装到计算机的文件 系统上。这与一般的访问方式不同。一般的访问方式通过结构f i l e 进行,这个 高速邮件系统的研究与实现 结构与特定的进程相关联,并且只在o p e n 到c l o s e 之间存在。当一个文件系统 被安装后,没有进程拥有一个f i l p 。 当核心把一个设备安装到文件系统上,它调用一般的o p e n 方法来访问驱动 程序。然而,这种情况下o p e n 的参数f i l p 是个虚的变量,它唯一有意义的域是 fm o d e 。fm o d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部队安全培训学习记录课件
- 部队军事课件蓝地图
- 河北省保定市高阳县2024-2025学年五年级上学期期末数学试题
- 2024-2025学年云南省大理州统编版五年级下册期末考试语文试卷
- 48m槽型梁建筑施工组织设计及对策
- 部门安全规章制度培训课件
- 部门安全培训感受及收获课件
- 边境渔业安全培训课件
- 车险理赔防诉讼课件
- 基于区块链技术的变频器故障数据共享中的隐私保护与溯源机制设计
- 《基本医疗保险门诊特殊慢性病药品目录(2023 年)》
- 安全保障服务方案及承诺
- 结核病营养支持
- 业务知识演讲稿:“三重一大”事项集体决策制度规范运用的思考
- 起搏器植入围手术期护理
- 中学生天文知识竞赛考试题库500题(含答案)
- 生活妆课件教学课件
- 现代农业课件教学课件
- 地质灾害防治工程勘察规范DB50143-2003
- 光伏并网系统中的网络安全分析
- 2024年图形化编程竞赛选拔试题
评论
0/150
提交评论