一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种大规模锁系统实现方法、装置、存储介质和服务器与流程

2022-02-21 08:05:26 来源:中国专利 TAG:


1.本发明涉及大规模资源对象线程安全保护领域,具体涉及一种大规模锁系统实现方法、装置、存储介质和服务器。


背景技术:

2.锁是多任务操作系统提供的一种重要资源,常见的有临界区、信号量、互斥量等多种形式,其核心功能是在并行程序设计领域,当两个或多个线程面临同时访问某一个资源(同一个变量、同一个内存块、同一个socket句柄、同一个io句柄等)的可能时,为避免发生读写冲突,需要对这些读写操作进行排他性保护,确保某个线程对这个资源进行操作时,其他线程处于等待状态。
3.在大型服务器开发领域,由于需要涉及对大规模的变量、内存对象、句柄对象等资源进行多线程、大并发的并行访问,这种高密集的资源访问,需要高效和海量的锁资源支持,才能保证数据访问的完整性和安全性,以及保证资源访问的效率。但是锁是一种系统资源,每个进程允许持有的锁数量是有限的,大量使用锁资源,将会大规模消耗系统的句柄资源和内存资源,严重影响服务进程的性能,甚至导致操作系统因资源不足而崩溃。所以一般在大规模使用锁资源的服务器应用中,会通过以下几种方法来解决:
4.1、提升锁的保护范围,降低锁句柄的占用,使用一把锁保护一个完整的数据结构,比如一把锁保护一个数组、队列或链表中的所有数据。这对操作系统资源占用很少,但会导致大并发访问时锁碰撞过于密集,大部分线程都消耗大量的时间在抢占锁上,访问效率很低。
5.2、使用自旋锁来对数据资源提供独立的锁保护,由于自旋锁工作在用户态,不占用操作系统的句柄资源和内存资源,所以不会出现系统资源不足的情况。但大规模的使用自旋锁,会大量占用cpu资源,特别是对于一些业务复杂、比较耗时的操作,使用自旋锁会严重影响服务器性能。
6.3、使用状态表来登记数据资源的加锁和解锁状态,从而实现数据资源锁保护,这种状态表一般使用hash表或bit-map表来实现。这种设计方法大量使用在数据库的行锁中,它可实现占用操作系统资源不太多的情况下,有效降低锁冲突,可在一定程度上提高服务器性能。但这种设计方案中,需要通过查表来获取资源的锁状态,对性能有一定的影响,同时线程在抢占锁资源时,和自旋锁一样运行于用户态中,存在和自旋锁一样的缺点,很难在cpu占用和cpu利用率两者之间进行平衡。
7.上述三种方案都不完美,要么性能低下,要么资源浪费严重,二者很难折中,难以满足大型服务器领域中既兼顾性能又占用少量资源的针对海量数据的锁保护需求。


技术实现要素:

8.本发明的目的在于针对上述现有技术中的问题,提供一种大规模锁系统实现方法、装置、存储介质和服务器,能够使用很少的操作系统资源(物理锁资源、内存等),提供大
规模的锁资源供应用层使用,以实现高效的“小锁”应用模型,满足多任务环境下的高性能开发需求。
9.为了实现上述目的,本发明有如下的技术方案:
10.第一方面,本发明实施例提供了一种大规模锁系统实现方法,包括以下步骤:
11.应用程序调用本软件模块应用程序调用接口,初始化锁池管理对象,应用程序调用接口接到访问请求,转到锁池管理层实现服务;
12.应用程序调用本软件模块应用程序调用接口,为需要进行锁保护的对象创建一个逻辑锁对象,应用程序调用接口接到访问请求,转到逻辑锁管理层实现服务;
13.应用程序调用本软件模块应用程序调用接口,准备持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行lock()操作,如果是读写锁的读锁则执行rdlock()操作,写锁则执行wrlock()操作;
14.应用程序调用本软件模块应用程序调用接口,准备释放持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行unlock()操作,如果是读写锁的读锁则执行rdunlock()操作,写锁则执行wrunlock()操作。
15.作为本发明大规模锁系统实现方法的一种优选方案,在同一把系统物理锁的保护下完成操作步骤,以保证操作步骤在执行过程中不被打断。
16.作为本发明大规模锁系统实现方法的一种优选方案,所述的lock()操作执行条件为多个线程同时访问同一资源。
17.作为本发明大规模锁系统实现方法的一种优选方案,所述的lock()操作执行步骤包括:首次提出加锁需求后,调用锁池接口创建一个全局的锁池,里面存放多个空闲锁等待使用;锁池接收加锁任务后,判断此资源是否为第一次发起加锁请求,如果是第一次发起加锁请求,锁池会主动分配给此资源一个空闲锁,并对此锁的引用计数值进行加一,然后进行上锁操作;如不是第一次发起加锁请求,锁池不会对此次请求分配新的空闲锁,仅在此资源原有锁的基础上进行引用计数值加一操作,用于表示此对象正在被多方使用。
18.作为本发明大规模锁系统实现方法的一种优选方案,所述的unlock()操作执行条件为当前线程对资源使用完毕。
19.作为本发明大规模锁系统实现方法的一种优选方案,所述的unlock()操作执行步骤包括:对此资源所占锁的引用计数值进行减1,并用其值与1进行判断;如果大于1则其它线程还有对此资源加锁的需求,此处不错任何处理;如果等于1则暂无后续抢占此资源的需求,无后续抢占此资源的需求时,归还此资源锁到锁池中,等待下一次加锁需求到来。
20.第二方面,本发明实施例还提供一种大规模锁系统实现装置,包括:
21.初始化模块,用于应用程序调用本软件模块应用程序调用接口,初始化锁池管理对象,应用程序调用接口接到访问请求,转到锁池管理层实现服务;
22.逻辑锁创建模块,用于应用程序调用本软件模块应用程序调用接口,为需要进行锁保护的对象创建一个逻辑锁对象,应用程序调用接口接到访问请求,转到逻辑锁管理层实现服务;
23.加锁模块,用于应用程序调用本软件模块应用程序调用接口,准备持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行lock()操作,如果是读写锁的读锁则执行rdlock()操作,写锁则执行wrlock()操作;
24.解锁模块,用于应用程序调用本软件模块应用程序调用接口,准备释放持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行unlock()操作,如果是读写锁的读锁则执行rdunlock()操作,写锁则执行wrunlock()操作。
25.第三方面,本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的大规模锁系统实现方法。
26.第四方面,本发明实施例还提供一种服务器,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述的大规模锁系统实现方法。
27.相较于现有技术,本发明至少具有如下的有益效果:服务器进程的线程数是有限的,少的几个线程,多的也只有几百个线程左右,所以,在服务器极端不出现线程冲突的情况下,服务器线程最多只会使用到几百个锁对象。即使是在服务器进程中大规模的使用锁资源,同一时间被访问到锁资源总是少数,其他大量的锁资源处于空闲状态,这其实是一种对系统资源极大的浪费。如果服务器进程可以像系统内存资源一样可以适时回收、重用,则可以达到使用很少的锁资源,实现大规模锁应用的目的。由于超过百万级对象需要线程安全,可避免锁过多对系统造成过高的内存和锁资源压力。如果大规模使用临界区锁,由于多线程竞争不断发生,event句柄也在不断被创建,如果进程超过16m的句柄数量时,进程可能无法运行。而当使用本发明设计的大规模锁系统,仅用很少的临界区锁可完成多线程的安全功能。
附图说明
28.图1本发明实施例构建出的大规模锁系统结构示意图;
29.图2本发明实施例大规模锁系统实现方法的加锁流程示意图;
30.图3本发明实施例大规模锁系统实现方法的解锁流程示意图。
具体实施方式
31.下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外,还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
32.作为大规模锁系统的实现,其中最重要的就是锁资源的调度和利用,也就是其中加锁和解锁的这个过程。
33.参见图1,本发明构建出的大规模锁系统结构,通过应用程序直接调用api接口,无需关系内部逻辑,逻辑锁管理层存储有若干个逻辑锁,通过逻辑锁对锁池中的锁进行拿取,通过锁池管理层与逻辑锁管理层进行交互,实现对锁池中锁的拿取操作。
34.应用程序调用接口:用于定义本模块的操作方法,供其他计算机编程语言调用,实现功能输出;
35.锁池管理层:用于提供基于池的锁资源回收、分配算法逻辑,实现锁资源重用;
36.逻辑锁管理层:用于定义一个逻辑锁对象,它不是一个真正的锁,而是一个逻辑锁
的管理对象,它用于存储一个真实锁的对象指针和引用计数器。逻辑锁管理层提供create()、destroy()操作方法,用于创建和释放逻辑锁对象;
37.逻辑锁操作层:用于提供锁算法逻辑,为实现的每一把锁提供相对应锁类型的操作特性,比如临界区锁提供lock()、unlock()、trylock()操作,而读写锁提供rdlock()、rdunlock()、wrlock()、wrunlock()等操作。
38.本发明提出的大规模锁系统实现方法,包括以下步骤:
39.应用程序调用本软件模块应用程序调用接口,初始化锁池管理对象,应用程序调用接口接到访问请求,转到锁池管理层实现服务;
40.应用程序调用本软件模块应用程序调用接口,为需要进行锁保护的对象创建一个逻辑锁对象,应用程序调用接口接到访问请求,转到逻辑锁管理层实现服务;
41.应用程序调用本软件模块应用程序调用接口,准备持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行lock()操作,如果是读写锁的读锁则执行rdlock()操作,写锁则执行wrlock()操作;
42.应用程序调用本软件模块应用程序调用接口,准备释放持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行unlock()操作,如果是读写锁的读锁则执行rdunlock()操作,写锁则执行wrunlock()操作。
43.上述所有动作都在同一把系统物理锁保护下完成,以保证所有动作操作时不被打断,确保本软件模块自身的多线程安全性。
44.参见图2,所述的lock()操作执行条件为多个线程同时访问同一资源,为了保证数据的完整性,可靠性,安全性所提出的诉求。多人同时操作数据库中的同一个数据时,如果在不加锁的情况下,同一个数据存在被多人争抢的情况,这样就无法保证数据最终的完整性和可靠性,也对后面数据的使用安全性造成隐患。所述的lock()操作执行步骤包括:首次提出加锁需求后,调用锁池接口创建一个全局的锁池,里面存放多个空闲锁等待使用;锁池接收加锁任务后,判断此资源是否为第一次发起加锁请求,如果是第一次发起加锁请求,锁池会主动分配给此资源一个空闲锁,并对此锁的引用计数值进行加一,然后进行上锁操作;如不是第一次发起加锁请求,锁池不会对此次请求分配新的空闲锁,仅在此资源原有锁的基础上进行引用计数值加一操作,用于表示此对象正在被多方使用。
45.参见图3,所述的unlock()操作执行条件为当前线程对资源使用完毕,为了保证其他线程能够正常访问与处理本资源所提出的诉求。所述的unlock()操作执行步骤包括:对此资源所占锁的引用计数值进行减1,并用其值与1进行判断;如果大于1则其它线程还有对此资源加锁的需求,此处不错任何处理;如果等于1则暂无后续抢占此资源的需求,无后续抢占此资源的需求时,归还此资源锁到锁池中,等待下一次加锁需求到来。
46.本发明的另一实施例还提出一种大规模锁系统实现装置,包括:
47.初始化模块,用于应用程序调用本软件模块应用程序调用接口,初始化锁池管理对象,应用程序调用接口接到访问请求,转到锁池管理层实现服务;
48.逻辑锁创建模块,用于应用程序调用本软件模块应用程序调用接口,为需要进行锁保护的对象创建一个逻辑锁对象,应用程序调用接口接到访问请求,转到逻辑锁管理层实现服务;
49.加锁模块,用于应用程序调用本软件模块应用程序调用接口,准备持有锁,应用程
序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行lock()操作,如果是读写锁的读锁则执行rdlock()操作,写锁则执行wrlock()操作;
50.解锁模块,用于应用程序调用本软件模块应用程序调用接口,准备释放持有锁,应用程序调用接口接到访问请求,转到逻辑锁操作层实现服务,如果请求的是临界区锁则执行unlock()操作,如果是读写锁的读锁则执行rdunlock()操作,写锁则执行wrunlock()操作。
51.本发明的另一实施例还提出一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的大规模锁系统实现方法。
52.本发明的另一实施例还提出一种服务器,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现所述的大规模锁系统实现方法。
53.示例性的,所述的计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在计算机可读存储介质中,并由所述处理器执行,以完成本技术所述大规模锁系统实现方法中的步骤。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机可读指令段,该指令段用于描述所述计算机程序在服务器中的执行过程。
54.所述服务器可以是智能手机、笔记本、掌上电脑及云端服务器等计算设备。所述服务器可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述服务器还可以包括更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述服务器还可以包括输入输出设备、网络接入设备、总线等。
55.所述处理器可以是中央处理单元(central processing unit,cpu),还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
56.所述存储器可以是所述服务器的内部存储单元,例如服务器的硬盘或内存。所述存储器也可以是所述服务器的外部存储设备,例如所述服务器上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。进一步地,所述存储器还可以既包括所述服务器的内部存储单元也包括外部存储设备。所述存储器用于存储所述计算机可读指令以及所述服务器所需的其他程序和数据。所述存储器还可以用于暂时地存储已经输出或者将要输出的数据。
57.需要说明的是,上述装置/单元之间的信息交互、执行过程等内容,由于与方法实施例基于同一构思,其具体功能及带来的技术效果,具体可参见方法实施例部分,此处不再赘述。
58.所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的
单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本技术的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
59.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质。例如u盘、移动硬盘、磁碟或者光盘等。
60.以上所述实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的精神和范围,均应包含在本技术的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献