CN102073493B - 一种多队列的高速存储设备驱动程序设计方法 - Google Patents
一种多队列的高速存储设备驱动程序设计方法 Download PDFInfo
- Publication number
- CN102073493B CN102073493B CN 201010598553 CN201010598553A CN102073493B CN 102073493 B CN102073493 B CN 102073493B CN 201010598553 CN201010598553 CN 201010598553 CN 201010598553 A CN201010598553 A CN 201010598553A CN 102073493 B CN102073493 B CN 102073493B
- Authority
- CN
- China
- Prior art keywords
- request
- formation
- equipment
- queue
- activity queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Multi Processors (AREA)
Abstract
本发明提供了一种多队列的高速存储设备驱动程序设计方法,请求格式转换之后不直接发送到设备,而是将其缓冲在预备队列中,而且对该请求的发送操作并不一定由当前进程来执行;只有当预备队列变成活动队列之后,其中的请求才可以被发送到设备,此发送过程是由某一个进程代表活动队列上请求的所有者来集中完成的,所以高效且资源消耗少。
Description
技术领域
本发明涉及高速存储设备在操作***中的驱动程序设计和实现技术,特别涉及Linux内核块设备驱动程序设计方法。
背景技术
存储设备是最重要的计算机***设备之一,常见的包括软盘、磁盘、CD-ROM和闪存等。一般地,这些存储设备主要由存储介质、设备控制器和设备接口组成,它们通过设备接口与计算机总线相连,而操作***中则需要有合适的驱动程序来对设备进行存取。
存储设备的驱动程序位于操作***中文件***之下,与设备直接打交道。典型的存储设备驱动程序通过如下步骤来完成对设备的存取:
1.从文件***获取对该设备的I/O请求。这种请求的格式是设备无关的,也就是说它决定于操作***数据结构的定义,而非决定于设备的约定。这里所述“获取”并不一定是设备驱动程序主动去获得文件***所产生的I/O请求,更多的情形是设备驱动程序提供一个接口,当文件***产生请求时,将请求作为参数来调用这个接口,从而使操作***代码的执行路径离开文件***层、进入到设备驱动程序。
2.将获得的I/O请求转化为设备可识别的请求。设备驱动程序解析文件***递交的I/O请求,获得至少包括设备地址、主机内存地址、操作类型(读还是写)、数据长度这些信息。然后按照设备的约定,将这些信息组装成设备可识别的请求格式。
3.将转化后的请求发送给设备。设备驱动程序通过设备控制寄存器告知设备有新的请求。可以将整个请求写入控制寄存器,也可以将请求置于主机内存某个位置,然后将这个地址通过控制寄存器告知设备,由设备来获取请求。
4.等待设备完成数据传输。目前的存储设备都是以中断方式来反馈I/O操作结果,驱动程序则通常会在某个条件上等待,而这个条件将由中断处理程序来使其满足。等待的方式不限,如轮询、睡眠。设备以DMA(Direct MemoryAccess)的方式在存储介质和主机内存之间传输数据,这个过程与CPU的指令执行是并行进行的。传输完成之后,设备将产生中断,告知操作***。
5.接收中断,激活等待条件。中断处理程序是驱动程序的一部分,当设备产生中断时被调用。中断处理程序获取I/O操作的完成状态,对相应请求的等待条件实施改变,使得等待中的进程可以继续执行。
上述步骤是某一次I/O操作所经历的过程,包括了操作***和设备各自的行为以及二者之间的交互。实际情况中,多个I/O操作通常是并发的,即在同一个时间片段内,多个进程或者线程可能一起发出大量I/O请求,操作***和驱动程序处理这些请求的大部分过程是并行进行的,如错误!未找到引用源。所示。
并发意味着竞争,对一些关键数据结构的访问需要保证互斥;特别地,在向设备发送请求时,必须保证发送过程处于临界区内,即当某一个进程开始操作设备时,其它进程必须等待此进程完成操作,错误!未找到引用源。展示了这种情形。实现互斥功能的常见方法有原子操作、自旋锁、信号量、等待队列等。SMP(Symmetric Multi-Processing)和多核技术的快速发展使得单一操作***映像运行于十几个甚至几十个核上的情形越来越普遍,上述各种互斥手段都存在一些弊端:
·自旋锁效率高、延迟小,但是只适用于临界区较小的情形,否则容易导致CPU资源严重浪费
·原子操作效率高,但只适用于对单条指令保证其原子性,不适用于复杂的操作
·等待队列通常会使暂不能进入临界区的里程睡眠,不适用于对性能或实时性要求高的情形
·信号量通常由自旋锁或者等待队列实现,因此也存在这两种机制所存在的弊端
本文中,高速存储设备是指当前能获得较高性能的主流存储设备,或者新兴的性能更好的存储设备。对性能的衡量没有明确的量化指标,I/O带宽等于或大于主流存储设备带宽的设备都属于高速存储设备。
当存储设备本身能提供比较高的读写带宽时,设备的用户都期望操作***可以将该设备的I/O能力充分利用起来,这就要求设备驱动程序必须写得足够好。尽管各种存储设备所提供给计算机的软/硬件接口并不一样,但是我们依然可以从上述设备驱动程序的通用处理流程中找到关键路径。一般地,从文件***获得请求、分析并转换请求格式都是可以完全并行化的,即各个进程可以互不干涉地执行;而在将请求发送给设备的时候,需要互斥地对设备进行访问。这里的互斥访问如果效率低了(如采用等待队列、信号量),则发送的请求并不能使设备的I/O能力达到饱和,若为了效率而采用比较激进的互斥手段如自旋锁,则CPU资源的浪费将十分可观。现有的存储设备驱动程序多采用等待队列方式,对于高速存储设备而言,无法充分发挥其性能。
发明内容
为克服高速存储设备中效率和资源消耗之间的矛盾,本发明给出一种既可以保证I/O高效及时、又不会过多消耗CPU资源的设备驱动程序设计方法。
一种多队列的高速存储设备驱动程序设计方法,步骤如下:
A、从文件***获得IO请求;
B、在持有ready lock的情况下将请求入队;
C、在持有队列切换自旋锁的情况下检查活动队列,若为空则将预备队列和活动队列互换,若非空则不进行操作;
D、对请求发送标志进行原子的test and set操作;
E、处理请求的进程向设备循环发送活动队列上的请求,已发送的则从活动队列中移除;若队列为空或队列已满,则中止这一轮发送;
F、清空发送标志;
G、检查活动队列,若为空则将预备队列和活动队列互换;
H、检查活动队列,若非空,则启动一个定时器,在短时间内再次从步骤D开始执行。
本发明一种优选技术方案在于:所述步骤D test and set操作过程为测试若为0则置1,否则不对其进行修改;若置位成功,则当前进程进入发送请求临界区,将其发送至设备;若置位不成功,则表明已有一个进程正在活动队列上处理请求,跳转至步骤H。
本发明的有益效果在于请求格式转换之后不直接发送到设备,而是将其缓冲在预备队列中,而且对该请求的发送操作并不一定由当前进程来执行;只有当预备队列变成活动队列之后,其中的请求才可以被发送到设备,此发送过程是由某一个进程代表活动队列上请求的所有者来集中完成的,所以高效且资源消耗少。
附图说明
图1是一般情况下操作***和驱动处理请求的过程
图2是本发明I/O请求从文件***到设备的处理过程
具体实施方式
本发明提出的一种基于多队列的存储设备驱动程序设计方法。它包括如下数据结构:
·一个活动队列(active queue):存放即将发送至设备的I/O请求
·一个预备队列(ready queue):存放暂不能发送至设备的I/O请求
·一个请求发送标志(request flag):若置为1则表示当前已经有一个进程正在将活动队列上的请求发送至设备,若置为0则表示
·一个保护队列切换操作的自旋锁(switch lock):保证对活动队列和预备队列的切换过程处于一个临界区
·一个用于互斥访问预备队列的自旋锁(ready lock):保证对预备队列的入队(euqueue)操作是互斥的
·一个定时器(timer):用于激活对潜在的最后一批I/O请求的处理
设备驱动程序获得文件***的请求并最终向设备发送I/O请求的过程遵循如下步骤:
1.从文件***获得I/O请求。这通常的实现方法是设备驱动程序实现了一个操作***规定的处理I/O请求的接口,当文件***层产生新的I/O请求时,将调用这一接口,从而进入到设备驱动程序代码段。
2.将请求入队(enqueue)到预备队列。这一步要在持有ready lock的前提下执行,保证各个并发的入队操作都是完整进行的,从而不会破坏预备队列的完整性。
3.检查活动队列,若为空则将预备队列和活动队列互换;若非空则不做任何操作。这一步要在持有队列切换自旋锁的前提下执行,保证活动队列或者预备队列指针始终指向正确的目标队列。
4.对请求发送标志(request flag)进行原子的test and set操作:测试若为0则置为1,否则不对其进行修改。若置位成功,则当前进程进入发送请求的临界区,它代表活动队列上的所有请求的拥有者来处理这些请求(本文称之为代表进程),将其发送至设备。若置位不成功,表明已经有一个进程正在活动队列上处理请求,则跳至8
5.处理请求的进程向设备循环发送活动队列上的请求,已发送的则从活动队列中移除。若队列变为空,或者设备不能再接受更多的请求,则这一轮发送终止。
6.清空发送标志(request flag)。
7.检查活动队列,若为空则将预备队列和活动队列互换。
8.检查活动队列,若非空,则启动一个定时器,在很短的时间(如1毫秒)之后再次从步骤4开始执行。这一步可以结合内核定时器及内核线程来完成,在Linux内核2.6以上的版本中,已提供了相应的实现。
Claims (1)
1.一种多队列的高速存储设备驱动程序设计方法,其特征在于:步骤如下:
A、从文件***获得IO请求;
B、在持有预备队列的自旋锁的情况下将请求入队;
C、在持有队列切换自旋锁的情况下检查活动队列,若为空则将预备队列和活动队列互换,若非空则不进行操作;
D、对请求发送标志进行原子的测试和设置操作;
E、处理请求的进程向设备循环发送活动队列上的请求,已发送的则从活动队列中移除;若队列为空或队列已满,则中止这一轮发送;
F、清空发送标志;
G、检查活动队列,若为空则将预备队列和活动队列互换;
H、检查活动队列,若非空,则启动一个定时器,在短时间内再次从步骤D开始执行;
所述步骤D测试和设置操作过程为测试若为0则置1,否则不对其进行修改;若置位成功,则当前进程进入发送请求临界区,将其发送至设备;若置位不成功,则表明已有一个进程正在活动队列上处理请求,跳转至步骤H。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010598553 CN102073493B (zh) | 2010-12-17 | 2010-12-17 | 一种多队列的高速存储设备驱动程序设计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010598553 CN102073493B (zh) | 2010-12-17 | 2010-12-17 | 一种多队列的高速存储设备驱动程序设计方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102073493A CN102073493A (zh) | 2011-05-25 |
CN102073493B true CN102073493B (zh) | 2013-08-28 |
Family
ID=44032040
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010598553 Active CN102073493B (zh) | 2010-12-17 | 2010-12-17 | 一种多队列的高速存储设备驱动程序设计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102073493B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5997868B2 (ja) * | 2014-09-19 | 2016-09-28 | 株式会社aLab | デバイスプロキシ装置及びその制御方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101465863A (zh) * | 2009-01-14 | 2009-06-24 | 北京航空航天大学 | 一种内核虚拟机环境下高效网络i/o的实现方法 |
CN101894047A (zh) * | 2010-06-24 | 2010-11-24 | 北京航空航天大学 | 一种基于内核虚拟机调度策略的实现方法 |
-
2010
- 2010-12-17 CN CN 201010598553 patent/CN102073493B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101465863A (zh) * | 2009-01-14 | 2009-06-24 | 北京航空航天大学 | 一种内核虚拟机环境下高效网络i/o的实现方法 |
CN101894047A (zh) * | 2010-06-24 | 2010-11-24 | 北京航空航天大学 | 一种基于内核虚拟机调度策略的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102073493A (zh) | 2011-05-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110647480B (zh) | 数据处理方法、远程直接访存网卡和设备 | |
EP3462326B1 (en) | Nvme device, and methods for reading and writing nvme data | |
CN101667284B (zh) | 用于中央处理单元和图形处理单元之间通信的设备和方法 | |
US10331595B2 (en) | Collaborative hardware interaction by multiple entities using a shared queue | |
JP2564805B2 (ja) | 情報処理装置 | |
EP3140729B1 (en) | Thread waiting in a multithreaded processor architecture | |
KR20210011451A (ko) | 하드웨어 가속을 위한 하드웨어 리소스들의 임베디드 스케줄링 | |
CN103109274A (zh) | 多处理器计算平台中的处理器间通信技术 | |
US10459773B2 (en) | PLD management method and PLD management system | |
US20110265093A1 (en) | Computer System and Program Product | |
JPH01131949A (ja) | 処理依頼機能を持つ並列計算機 | |
CN104094235A (zh) | 多线程计算 | |
US20140143524A1 (en) | Information processing apparatus, information processing apparatus control method, and a computer-readable storage medium storing a control program for controlling an information processing apparatus | |
WO2014169637A1 (zh) | Dma控制器、移动终端以及数据搬运方法 | |
JP2021022379A (ja) | ハードウェアアクセラレータの自律ジョブキューイングシステム | |
CN101373444A (zh) | 向执行环境揭示***拓扑 | |
EP1700203B1 (en) | Behavioral model based multi-threaded architecture | |
CN102073493B (zh) | 一种多队列的高速存储设备驱动程序设计方法 | |
CN109284074A (zh) | 一种基于多核***的打印驱动方法、多核***及终端设备 | |
CN116561091A (zh) | 一种日志存储方法、装置、设备及可读存储介质 | |
CN102736949B (zh) | 改善对非连贯设备要执行的任务的调度 | |
JP2010152645A (ja) | シミュレーション支援プログラム、シミュレーション装置、およびシミュレーション支援方法 | |
CN106997278A (zh) | 一种提高固态硬盘中双核间通信效率的方法 | |
WO2014058759A1 (en) | Virtualized communication sockets for multi-flow access to message channel infrastructure within cpu | |
CN115061779B (zh) | 一种用户态虚拟机的内核锁管理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |