具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明实施例中,预先设置资源与文件中的字节之间的对应关系,当进程访问资源时,针对文件中与该资源对应的字节申请文件锁,并在文件锁申请成功后,访问该资源,当进程释放该资源时,解除针对文件中与该资源对应的字节的文件锁,由于文件锁只是锁住文件的偏移量,从而文件的大小可以为任意大小,从而可以实现大量资源的跨进程互斥访问。
实施例一:
图1示出了本发明第一实施例提供的资源共享的方法的实现流程,详述如下:
在步骤S101中,设置资源与文件中的字节之间的对应关系。
其中文件是指用于实现文件锁的文件。在本发明实施例中,可以采用资源文件映射表存储设置的资源与文件中的字节之间的对应关系,当然还可以采用其他方式存储设置的资源与文件中的字节之间的对应关系,在此不一一举例说明。表1.1示出了本发明实施例提供的资源文件映射表的其中一个示例,但不以该示例为限,其中资源编号用于唯一标识资源,即根据资源编号即可获得对应的资源,字节编号是指该字节在文件中的字节偏移量:
表1.1
资源编号 |
字节编号 |
资源编号1 |
第一字节 |
资源编号2 |
第二字节 |
资源编号3 |
第三字节 |
在表1.1中,资源编号为1的资源与文件中的第一字节对应,资源编号为2的资源与文件中的第二字节对应,资源编号为3的资源与文件中的第三字节对应。在本发明实施例中,由于将资源与用于实现文件锁的文件的偏移量进行对应,从而用于实现文件锁的文件不占用用户空间的内存,仅占用内核空间的内存,因此,文件的大小不受限制,即可以为0,即文件的物理内存可以为0。但是用于表示文件偏移量的数值还是有一个容量上限的,如对于32位系统,可以表示的文偏移量为232,这样,在32位系统中,可以实现232个资源的互斥共享;如对于64位系统,可以表示的文偏移量为264,这样,在64位系统中,可以实现264个资源的互斥共享。
在步骤S102中,当进程访问资源时,针对文件中与该资源对应的字节申请文件锁,并在文件锁申请成功后,进程按照申请的文件锁访问资源。
其中文件锁为互斥锁或者共享锁。在本发明实施例中,需要根据进程对资源的访问类型确定进程申请的是互斥锁还是共享锁。其中进程对资源的访问类型包括但不限于独占型和共享型。其中独占型是指进程需要独占该资源,如进程需要修改该资源等。共享型是指进程可以与其他进程或者线程共享该资源,如进程仅读取该资源等。当进程对资源的访问类型为独占型时,针对文件中与该资源对应的字节申请互斥锁;当进程对资源的访问类型为共享型时,针对文件中与该资源对应的字节申请共享锁。
在本发明实施例中,使用文件系统标准接口中的锁功能实现对文件中该资源对应的字节的文件锁。具体可以使用文件系统提供的fcntl函数来实现对文件中该资源对应的字节的文件锁,其具体实现过程属于现有技术,在此不再赘述。
在步骤S103中,当进程释放资源时,解除进程针对文件中该资源对应的字节申请的文件锁。
在本发明实施例中,当进程访问资源结束,释放该资源时,解除进程针对文件中与该资源对应的字节申请的文件锁。具体实现时,可以调用文件系统标准接口中的解锁接口对文件中与该资源对应的字节进行解锁处理,解除针对文件中与该资源对应的字节申请的文件锁,以使其他进程或者线程可以针对文件中与该资源对应的字节申请文件锁。
在本发明实施例中,通过文件锁实现资源的互斥共享,由于对文件中与该资源对应的字节申请文件锁,即对文件中对应的偏移量申请文件锁,锁住的是文件的偏移量,而与文件的实际内容无关,因此,对文件的大小没有要求,所以资源的个数可以非常多,最多可以达到系统中文件偏移量的数据类型(off_t)所能表示的最大值。在32Bit系统中,则该off_t的最大值为32Bit的整数,在64Bit系统中,off_t的最大值为64Bit的整数,因此,在32位系统中,最大可以实现232个资源的互斥共享,在64位系统中,可以实现264个资源的互斥共享。
实施例二:
图2示出了本发明第二实施例提供的资源共享的方法的实现流程,详述如下:
在步骤S201中,设置资源与文件中的字节之间的对应关系。其具体步骤如上所述,在此不再赘述。
在步骤S202中,当进程访问资源时,针对文件中与该资源对应的字节申请文件锁。其具体步骤如上所述,在此不再赘述。
在步骤S203中,判断文件锁申请是否成功,如果是,执行步骤S205,否则执行步骤S204。
其中判断文件锁申请是否成功的步骤具体如下:
A、判断文件中与该资源对应的字节是否已经被申请了文件锁,如果是,执行步骤B,否则判定文件锁申请成功;
在本发明实施例中,当进程访问某资源,针对文件中与该资源对应的字节申请文件锁时,如果之前已经有其他进程或者线程正在访问该资源,则文件中与该资源对应的字节已经被申请了文件锁;如果之前没有其他进程或者线程正在访问该资源,则文件中与该资源对应的字节未被申请文件锁。
B、判断文件中与该资源对应的字节的文件锁是互斥锁还是共享锁,如果是互斥锁,判定文件锁申请不成功,如果是共享锁,执行步骤C;
在本发明实施例中,当文件中与该资源对应的字节的文件锁为互斥锁时,则其他进程或者线程不能再访问该资源,从而针对文件中与该资源对应的字节申请文件锁将申请失败。当文件中与该资源对应的字节的文件锁为共享锁时,则其他进程或者线程还可以访问(主要是读取)该资源,可以针对文件中与该资源对应的字节申请共享锁。
C、判断进程针对文件中与该资源对应的字节申请的文件锁是否为共享锁,如果是,判定文件锁申请成功,否则判定文件锁申请不成功。
在本发明实施例中,当进程针对文件中与该资源对应的字节申请的文件锁是共享锁时,则由于文件中与该资源对应的字节的文件锁也为共享锁,因此,文件锁申请成功。当进程针对文件中与该资源对应的字节申请的文件锁是互斥锁时,则由于文件中与该资源对应的字节已经被申请了共享锁,因此,文件锁申请不成功。
在步骤S204中,进程持续等待,直到其他进程释放该资源,或者进程直接返回不等待。
在本发明实施例中,当进程申请文件锁不成功时,可以持续等待,直到其他进程或者线程释放该资源,解除文件中与该资源对应的字节的文件锁。
在步骤S205中,进程按照申请的文件锁访问资源,并在访问完毕后,释放资源,解除针对文件中该资源对应的字节的文件锁。
在本发明实施例中,当进程针对文件中与该资源对应的字节申请的文件锁为互斥锁时,则进程采用独占方式访问资源,即可以对该资源进行读取或者修改。当进程针对文件中与该资源对应的字节申请的文件锁为共享锁时,则进程采用共享方式访问资源,即进程只能对该资源进行读取,不能对该资源进行修改。
在本发明实施例中,在进程访问资源,针对文件中与该资源对应的字节申请文件锁时,先判断文件锁是否申请成功,如果成功,则访问资源,并在访问完毕后,释放资源,解除针对文件中与该资源对应的字节的文件锁,如果不成功,则进程持续等待该资源被释放,或者不等待,直接返回,这样使资源共享更合理、严谨。
实施例三:
图3示出了本发明第三实施例提供的资源共享的方法的实现流程,图3所示的方法中的步骤S301至S305与图2所示的步骤S201至S205相同,其不同之处,仅在于还包括下述步骤:
在步骤S306中,在进程释放资源,解除针对文件中与该资源对应的字节的文件锁后,唤醒等待该资源的其他进程,唤醒的进程针对文件中该资源对应的字节申请文件锁。当唤醒的进程有多个,即多个进程同时针对文件中该资源对应的字节申请文件锁时,各进程进行竞争,获胜者对文件中该资源对应的字节的文件锁申请成功。
在本发明实施例中,在进程访问完资源,释放资源时,解除针对文件中与该资源对应的字节的文件锁,同时唤醒等待该资源被释放的其他进程。唤醒的进程均针对文件中该资源对应的字节申请文件锁,文件锁申请成功的进程访问该资源,文件锁申请不成功的进程继续等待,或者不再等待,直接返回。
为了便于理解,以下以一个具体的示例对本发明进行示例性说明,但不以该示例为限:
请参阅图4,为本发明实施例提供的资源共享的示例图。假设资源S1与文件中的第0字节对应,资源S2与文件中的第1字节对应,依次类推,资源Sn与文件中的第x字节对应。进程P1同时锁住了文件的第0、1字节,且进程P1对第0字节施加了共享锁,对第1字节施加了互斥锁。
由于进程P1对第0字节施加了共享锁,也就是说进程P1可以以共享方式访问资源S1,由于进程P1第1字节施加了互斥锁,也就是说进程P1要以独占方式访问资源S2,此时,如果进程P1需要访问资源S1,针对文件中的第0字节申请文件锁时,只能申请共享锁。如果进程P1需要访问资源S2,针对文件中的第1字节申请文件锁时,将申请不成功,从而进程P2等待资源S2被释放。
在图4所示的示例中,假设虚线箭头表示进程对文件中的字节加锁不成功,实线箭头表示进程对文件中的字节加锁成功,则可以得到进程P1同时锁住了第0、1字节,即同时占据了资源S1、S2。由于没有竞争,所以无法确定进程P1对资源S 1是施加了共享锁还是互斥锁,也就是说,进程P1对资源S1可能施加了共享锁,也可能施加了互斥锁。由于进程P1和P2同时竞争资源S2,且进程P2加锁不成功,因此进程P1对资源S2施加了互斥锁,此时其他进程不能对资源S2申请任何锁。进程P2试图锁住文件中的第1字节,但未加锁成功,且正在等待资源S1被释放。由于进程P2、Pm同时锁住了文件中的第x字节,则进程P2、Pm使用的必然是共享锁,进程P2、Pm同时占据了资源Sn,此时其他进程不能修改资源Sn,但可以读取资源Sn,即其他进程可以申请对资源Sn的共享锁,不能申请对资源Sn的互斥锁。
实施例四:
图5示出了本发明第四实施例提供的资源共享系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分。
该系统可以用于任何需要资源共享的设备,例如计算机、移动终端等,可以是运行于这些设备内的软件单元、硬件单元或者软硬件相结合的单元,也可以作为独立的挂件集成到这些需要资源共享的设备中或者运行于这些需要资源共享的设备的应用系统中,其中:
对应关系存储单元1存储设置的资源与文件中的字节之间的对应关系。
其中文件是指用于实现文件锁的文件。设置资源与文件中的字节之间的对应关系时,即是设置资源与文件的偏移量之间的对应的关系。在本发明实施例中,可以采用资源文件映射表存储设置的资源与文件中的字节之间的对应关系,当然还可以采用其他方式存储设置的资源与文件中的字节之间的对应关系,在此不一一举例说明。
文件锁申请单元2在进程访问资源时,针对文件中与该资源对应的字节申请文件锁。
其中文件锁为互斥锁或者共享锁。在本发明实施例中,需要根据进程对资源的访问类型确定进程申请的是互斥锁还是共享锁。其中进程对资源的访问类型包括但不限于独占型和共享型。其中独占型是指进程需要独占该资源,如进程需要修改该资源等。共享型是指进程可以与其他进程或者线程共享该资源,如进程仅读取该资源等。当进程对资源的访问类型为独占型时,针对文件中与该资源对应的字节申请互斥锁;当进程对资源的访问类型为共享型时,针对文件中与该资源对应的字节申请共享锁。
资源访问单元3在文件锁申请单元2的文件锁申请成功后,使进程按照申请的文件锁访问资源。
文件锁解除单元4在进程释放资源时,解除进程针对文件中该资源对应的字节申请的文件锁。
在本发明实施例中,当进程访问资源结束,释放该资源时,解除进程针对文件中与该资源对应的字节申请的文件锁。具体实现时,可以调用文件系统标准接口中的解锁接口对文件中与该资源对应的字节进行解锁处理,解除针对文件中与该资源对应的字节申请的文件锁。
实施例五:
图6示出了本发明第五实施例提供的资源共享系统的结构,为了便于说明,仅示出了与本发明实施例相关的部分。图6所示的资源共享系统在图5所示的资源共享系统的基础上增加了以下部件:
文件锁申请判断单元5判断文件锁申请单元2中文件锁申请是否成功。该文件锁申请判断单元5包括已申请判断模块51、文件锁类型判断模块52和文件锁申请判断模块53。其中:
已申请判断模块51判断文件中与该资源对应的字节是否已经被申请了文件锁,并在判定文件中与该资源对应的字节未被申请文件锁时,判定文件锁申请成功。
文件锁类型判断模块52在已申请判断模块51判定文件中与该资源对应的字节已被申请文件锁时,判断文件中与该资源对应的字节的文件锁是互斥锁还是共享锁,如果是互斥锁,判定文件锁申请不成功。
文件锁申请判断模块53在文件锁类型判断模块52判定文件中与该资源对应的字节的文件锁是共享锁时,判断进程针对文件中与该资源对应的字节申请的文件锁是否为共享锁,如果是,判定文件锁申请成功,否则判定文件锁申请不成功。
进程等待单元6在文件锁申请判断单元5判定文件锁申请不成功时,使进程持续等待,直到其他进程释放该资源,或者使进程不等待直接返回。
实施例六:
在本发明另一实施例中,该系统还包括进程唤醒单元7。该进程唤醒单元7在文件锁解除单元4释放资源并解除进程针对文件中该资源对应的字节申请的文件锁后,唤醒等待该资源的其他进程。唤醒的进程通过文件锁申请单元2针对文件中该资源对应的字节申请文件锁。
本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以在存储于一计算机可读取存储介质中,所述的存储介质,如ROM/RAM、磁盘、光盘等,该程序用来执行如下步骤:
在本发明实施例中,通过文件锁实现资源的互斥共享,由于对文件中与该资源对应的字节申请文件锁,即对文件中对应的偏移量申请文件锁,锁住的是文件的偏移量,而与文件的实际内容无关,因此,对文件的大小没有要求,所以资源的个数可以非常多,最多可以达到系统off_t的最大值,如在32位系统中,最大可以实现232个资源的互斥共享,在64位系统中,可以实现264个资源的互斥共享。通过在申请文件锁之前。判断与该资源对应的字节是否已被申请文件锁,如果已被申请文件锁,则进一步判断文件锁是互斥锁还是共享锁,以判断文件锁申请是否成功,这样使资源共享更合理、严谨。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。