一种多线程链表操作系统及方法与流程

文档序号:31546135发布日期:2022-09-17 01:13阅读:128来源:国知局

1.本发明属于数据管理技术领域,涉及一种链表操作系统及方法,尤其是一种多线程链表操作系统及方法;通过采用本技术的多线程链表操作系统及方法,在提高代码执行效率的同时,减少了同步锁的使用。


背景技术:

2.存储控制器主要用于存储端的硬盘及其上存储的数据管理,同时对服务器端提供数据访问服务。在对服务器端提供数据访问的过程中,由于短时间内处理的io数量巨大,存储控制器中的cpu承担了大量的解包、读盘、写盘操作,在存储领域,一个数据i/o在后端的处理中会经历存储卷、存储池、raid、存储盘等多个操作阶段,每个阶段都会处理大量io数据,这些io数据一般通过链表的形式组织起来,这就涉及到多线程对链表的处理。
3.在多线程同时处理链表时,为避免并发性问题,一般在链表的数据结构中添加spinlock(自旋锁)或mutex(互斥锁),各线程通过抢锁来争夺对链表的处理权;容易导致线程卡顿,降低代码执行效率。此为现有技术的不足之处。
4.有鉴于此,本发明提供一种链表操作系统及方法,以解决现有技术中存在的上述技术缺陷,是非常有必要的。


技术实现要素:

5.本发明的目的在于,针对上述现有技术存在的缺陷,提供设计一种链表操作系统及方法,以解决上述技术问题。
6.为实现上述目的,本发明给出以下技术方案:一种链表操作系统,包括:定义数据结构模块,该模块通过定义数据结构io_data以及该种链表数据结构的list_new列表;多线程访问模块,该模块用于当多个线程需要将新的io_data数据挂载到链表上时,嵌入汇编语言通过对list_new链表中tail变量的原子性互斥操作,完成数据的多线程并发一致性访问;所述的原子性互斥操作包括:运用smp_lock及cmpxchg两条指令级操作,锁住对list_new链表的访问,从而享有独占权(该两条指令首先会取得对tail内存地址的访问权,取得访问权后锁住总线,即针对该内存地址的其他总线访问将被锁住,进而对该内存地址内的值进行修改,完毕后释放总线,其他访问需求再次通过竞争得到获取访问权),规避多线程并发问题,其次在取得独占权的同时完成新io_data new的入表操作,节省时间提高效率。
7.作为优选,所述的定义数据结构模块中,定义的数据结构io_data为:typedef struct io_data{struct io_data*next;
intio其他变量}io_data。
8.作为优选,所述的定义数据结构模块中,链表数据结构的list_new列表为:typedefstructlist_new_s{structio_date*head;structio_date*tail;structio_datedummy;}listnew。
9.与常规多线程共用链表相比,该链表只在表头指针、表尾指针两个成员变量的基础上添加了一个链表元素成员变量,并不存在为避免并发处理而单独设置的同步锁或互斥锁变量。
10.作为优选,所述的原子性互斥操作采用原子操作函数,所述的原子操作函数为:boollist_cmpxchgp(io_date*poniter_i,io_data*old_i,io_date*new_i){io_data*volatile*result;_asm__volataile_(smp_lock“cmpxchgp%1%2”:”=a”(result):”q”(new_i),”m”(pointer_i),”0”(old_i):”memory”);returnresult==old_i;}。
11.作为优选,原子操作函数原子性(即不可打断)判断pointer指向的值是否与old_i相等,只有在相等的条件下,才将new_i的值赋值给pointer,并返回真,即修改pointer的值的操作顺利完成。
12.本发明还提供一种链表操作系方法,包括以下步骤:步骤s1:定义数据结构的步骤,该步骤中定义数据结构io_data以及该种链表数据结构的list_new列表;步骤s2:多线程访问的步骤,该步骤中当多个线程需要将新的io_data数据挂载到链表上时,嵌入汇编语言通过对list_new链表中tail变量的原子性互斥操作,完成数据的多线程并发一致性访问;所述步骤s2中的原子性互斥操作包括:运用smp_lock及cmpxchg两条指令级操作,锁住对list_new链表的访问,从而享有独占权(该两条指令首先会取得对tail内存地址的访问权,取得访问权后锁住总线,即针对该内存地址的其他总线访问将被锁住,进而对该内存地址内的值进行修改,完毕后释放总线,其他访问需求再次通过竞争得到获取访问权),规避多线程并发问题,其次在取得独占权的同时完成新io_datanew的入表操作,节省时间提高效率。
13.作为优选,所述的步骤s1中,定义的数据结构io_data为:typedefstructio_data{structio_data*next;intio其他变量}io_data。
14.作为优选,所述的步骤s1中,链表数据结构的list_new列表为:typedefstructlist_new_s{structio_date*head;structio_date*tail;structio_datedummy;}listnew。
15.与常规多线程共用链表相比,该链表只在表头指针、表尾指针两个成员变量的基础上添加了一个链表元素成员变量,并不存在为避免并发处理而单独设置的同步锁或互斥锁变量。
16.作为优选,所述步骤s2中的原子性互斥操作采用原子操作函数,所述的原子操作函数为:boollist_cmpxchgp(io_date*poniter_i,io_data*old_i,io_date*new_i){io_data*volatile*result;_asm__volataile_(smp_lock“cmpxchgp%1%2”:”=a”(result):”q”(new_i),”m”(pointer_i),”0”(old_i):”memory”);returnresult==old_i;}。
17.作为优选,原子操作函数原子性(即不可打断)判断pointer指向的值是否与old_i相等,只有在相等的条件下,才将new_i的值赋值给pointer,并返回真,即修改pointer的值的操作顺利完成。
18.本发明的有益效果在于,链表自带元素(dummy)的添加及使用,在链表初始化时就将dummy添加到链表之中,之后在链表中取元素处理时,对取出的元素判断是否为dummy,若是在将其再次入队,如此一来,dummy元素始终存在于链表中,即链表头指针永不为空,则生产者在将新元素加入链表时,无需判断head指针的情况,只需获得tail的独占访问权将其入队即可。通过采用这种多线程链表机制,在提高代码执行效率的同时,减少了同步锁的使用。
19.此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。
20.由此可见,本发明与现有技术相比,具有突出的实质性特点和显著地进步,其实施
的有益效果也是显而易见的。
附图说明
21.图1是本发明提供的一种链表操作系统的原理框图。
22.图2是本发明提供的一种链表操作系方法的流程图。
23.其中,1-定义数据结构模块,2-多线程访问模块。
具体实施方式
24.下面结合附图并通过具体实施例对本发明进行详细阐述,以下实施例是对本发明的解释,而本发明并不局限于以下实施方式。
25.实施例1:如图1所示,本实施提供的一种链表操作系统,包括:定义数据结构模块1,该模块通过定义数据结构io_data以及该种链表数据结构的list_new列表;多线程访问模块2,该模块用于当多个线程需要将新的io_data数据挂载到链表上时,嵌入汇编语言通过对list_new链表中tail变量的原子性互斥操作,完成数据的多线程并发一致性访问;所述的原子性互斥操作包括:运用smp_lock及cmpxchg两条指令级操作,锁住对list_new链表的访问,从而享有独占权(该两条指令首先会取得对tail内存地址的访问权,取得访问权后锁住总线,即针对该内存地址的其他总线访问将被锁住,进而对该内存地址内的值进行修改,完毕后释放总线,其他访问需求再次通过竞争得到获取访问权),规避多线程并发问题,其次在取得独占权的同时完成新io_datanew的入表操作,节省时间提高效率。
26.所述的定义数据结构模块中,定义的数据结构io_data为:typedefstructio_data{structio_data*next;intio其他变量}io_data。
27.所述的定义数据结构模块中,链表数据结构的list_new列表为:typedefstructlist_new_s{structio_date*head;structio_date*tail;structio_datedummy;}listnew。
28.与常规多线程共用链表相比,该链表只在表头指针、表尾指针两个成员变量的基础上添加了一个链表元素成员变量,并不存在为避免并发处理而单独设置的同步锁或互斥锁变量。
29.所述的原子性互斥操作采用原子操作函数,所述的原子操作函数为:
boollist_cmpxchgp(io_date*poniter_i,io_data*old_i,io_date*new_i){io_data*volatile*result;_asm__volataile_(smp_lock“cmpxchgp%1%2”:”=a”(result):”q”(new_i),”m”(pointer_i),”0”(old_i):”memory”);returnresult==old_i;}。
30.原子操作函数原子性(即不可打断)判断pointer指向的值是否与old_i相等,只有在相等的条件下,才将new_i的值赋值给pointer,并返回真,即修改pointer的值的操作顺利完成。
31.实施例2:如图2所示,本实施例提供的一种链表操作系方法,包括以下步骤:步骤s1:定义数据结构的步骤,该步骤中定义数据结构io_data以及该种链表数据结构的list_new列表;步骤s2:多线程访问的步骤,该步骤中当多个线程需要将新的io_data数据挂载到链表上时,嵌入汇编语言通过对list_new链表中tail变量的原子性互斥操作,完成数据的多线程并发一致性访问;所述步骤s2中的原子性互斥操作包括:运用smp_lock及cmpxchg两条指令级操作,锁住对list_new链表的访问,从而享有独占权(该两条指令首先会取得对tail内存地址的访问权,取得访问权后锁住总线,即针对该内存地址的其他总线访问将被锁住,进而对该内存地址内的值进行修改,完毕后释放总线,其他访问需求再次通过竞争得到获取访问权),规避多线程并发问题,其次在取得独占权的同时完成新io_datanew的入表操作,节省时间提高效率。
32.所述的步骤s1中,定义的数据结构io_data为:typedefstructio_data{structio_data*next;intio其他变量}io_data。
33.所述的步骤s1中,链表数据结构的list_new列表为:typedefstructlist_new_s{structio_date*head;structio_date*tail;structio_datedummy;}listnew。
34.与常规多线程共用链表相比,该链表只在表头指针、表尾指针两个成员变量的基础上添加了一个链表元素成员变量,并不存在为避免并发处理而单独设置的同步锁或互斥锁变量。
35.所述步骤s2中的原子性互斥操作采用原子操作函数,所述的原子操作函数为:boollist_cmpxchgp(io_date*poniter_i,io_data*old_i,io_date*new_i){io_data*volatile*result;_asm__volataile_(smp_lock“cmpxchgp %1 %2”:”=a”(result):”q”(new_i),”m”(pointer_i),”0”(old_i):”memory”);return result==old_i;}。
36.原子操作函数原子性(即不可打断)判断pointer指向的值是否与old_i相等,只有在相等的条件下,才将new_i的值赋值给pointer,并返回真,即修改pointer的值的操作顺利完成。
37.本实施例中:操作链表的线程分别绑定不同cpu核心,要求硬件有足够的cpu核心供线程使用,将链表中的两个指针变量指向dummy,dummy的指针置空,即void list_init(list_new*list){list-》head=&list-》dummy;list-》tail=&list-》dummy;list-》dummy.next=null;}。
38.多个线程将新io_data添加到链表队列时,先将io_data中next指针置空,再调用list_new_add函数借助smp_lock与cmpxchg指令获得tail变量的访问权完成添加,如下:void list_add_tail(list_new*list,io_date*new_io){io_data*old_tail;new_io-》next=null;do{oldtail=list-》tail;}while(list_cmpxchgp(&list-》tail,old_tail,new_io));oldtail-》next=new_io;}。
39.消费者线程在链表上摘取io_data数据作进一步处理时,先判断表内是否有真实
需处理元素存在,进而判断取下的元素是否为dummy,若是则直接再次入队,具体操作如下:io_data*list_remove_from_head(list_new*list){io_data*task;if(list-》head-》next==null)return null;task=list-》head;list-》head=task-》next;if(task==&list-》dummy)list_add_tail(list,task);elsereturn task;}。
40.本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的方法而言,由于其与实施例公开的系统相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
41.专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
42.在本发明所提供的几个实施例中,应该理解到,所揭露的系统、系统和方法,可以通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,系统或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
43.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
44.另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。
45.同理,在本发明各个实施例中的各处理单元可以集成在一个功能模块中,也可以是各个处理单元物理存在,也可以两个或两个以上处理单元集成在一个功能模块中。
46.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存
储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
47.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
48.以上公开的仅为本发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1