读锁操作方法、写锁操作方法及系统的制作方法

文档序号:8258442阅读:333来源:国知局
读锁操作方法、写锁操作方法及系统的制作方法
【技术领域】
[0001]本申请涉及计算机系统结构技术领域,特别涉及一种读锁操作方法、写锁操作方法及系统。
【背景技术】
[0002]线程(thread),也被称为轻量级进程(Lightweight Process, LffP),是进程中某个单一顺序的控制流,并作为程序执行的最小单元。在引入线程的操作系统中,通常把进程作为分配资源的基本单位,把线程作为独立运行和独立调度的基本单位。线程可以并发执行,例如一个进程中的多个线程可以并发执行。不同进程中的线程也能并发执行。特别的,在多计算核心的计算机系统中,例如具有多个CPU核心的计算机系统中,不同核心的线程也可以并发执行。
[0003]多个线程并发执行时,往往需要访问同一数据。从该被访问的数据看,该数据共享给不同线程。在多个线程访问该共享数据时,需要保证该共享数据的完整性。例如,不能两个线程同时修改共享数据;一个线程不能读到修改了一半的共享数据。经典的方式是使用锁(Lock)机制。例如,在线程对数据进行读操作的过程中为该数据加上“读锁”,在线程对数据进行写操作的过程中为该数据加上“写锁”。进程对一个数据进行读操作前,先对该数据加读锁,读操作执行毕之后,再解读锁。类似的,进程对一个数据进行写操作前,先对该数据加写锁,写操作执行毕之后,再解写锁。通常用reacLref作为读操作线程的引用计数,用writer_ID表示写操作线程的ID。
[0004]对于不同线程对同一数据执行的都是读操作来说,可以加多次读锁。例如,线程I对一数据要执行读操作,则在执行读操作之前,对该数据加读锁,具体是将reacLref的值加I (例如reacLref的数据类型为整形,且初始值为0),之后对该数据进行读取。在读取的过程中,线程2也要对同一数据执行读操作,则将read_ref的值加I,并对该数据进行读取。则此时read_ref的值为2。线程I的读操作执行完毕之后,将read_ref的值减I,并解读锁。此时,read_ref的值为I。之后,线程2对该数据的读操作执行完毕,将read_ref的值减1,并解读锁。此时,reacLref的值为O。对同一数据的读锁可以重复加,因此,读锁之间具有共享性。
[0005]对于不同线程对同一数据执行的都是写操作来说,只能加一次写锁。例如,线程I对一数据要执行写操作,则在执行写操作之前,对该数据加写锁,具体是将writer_ID的值更新为线程I的ID (例如writer_ID的数据类型为整形,且初始值为O ;任一线程的ID不为0),之后对该数据进行写操作。在写的过程中,线程2也要对同一数据执行写操作,但因writer_ID的值此时不为0,因此线程2不能加写锁,也不能对该数据进行写操作。线程I的写操作执行完毕之后,解写锁,即将writer_ID的值更新为O。线程2在前次加写锁失败并等待一段时间后,得知writer_ID的值此时为O,可以加写锁。之后,writer_ID的值更新为线程2的ID,之后对该数据进行写操作。线程2的写操作执行完毕之后,解写锁,即将writer_ID的值更新为O。可见,对同一数据的写锁不可以重复加,因此,写锁之间具有互斥性。
[0006]此外,写锁和读锁也是互斥的,即在任一时刻,对同一数据加了读锁就不能再加写锁,加了写锁也不能再加读锁。这样,某一线程在对一数据进行读操作前,需要检查该数据的writer_ID值是否为O。如果为O,才可以进行读操作;如果不为O,需要等待writer_ID值变为O。类似的,某一线程在对一数据进行写操作前,需要检查该数据的reacLref值是否为O。如果为0,才可以进行写操作;如果不为0,需要等待reacLref值变为O。实际上,对于加读锁,更多情况下,为了进一步避免在检查writer_ID值的操作与相应的读操作之间有另一线程同时为写操作而进行的加写锁操作,即为了避免该种情况下导致的冲突检测失效,将read_ref的值加I之后,还将再次检查此时的该writer_ID值是否为O。如果不为0,才执行读操作。类似的,对于加写锁,更多情况下,为了进一步避免在检查reacLref值的操作与相应的写操作之间有另一线程同时为读操作而进行的加读锁操作,即为了避免该种情况下导致的冲突检测失效,将writer_ID的值更新为写线程的ID之后,还将再次检查此时的该read_ref值是否为O。如果不为O,才执行写操作。
[0007]上述线程对read_ref值、writer_ID的值更改,属于原子操作。原子操作一般是(PU提供的指令,具有不可分割性。一个线程在执行一个原子操作时,不会被别的线程打断,不会切换到其他线程。换句话说,这种原子操作一旦开始,就一直运行到该操作结束。
[0008]在实现本申请过程中,发明人发现现有技术中至少存在如下问题:
[0009]在多计算核心的计算机系统中,不同核心的线程可能会对同一数据执行读、写操作。特别是经常会出现一段时间内对同一数据执行大量读操作,而没有写操作的情况。每个核心一般都对应一个缓存(cache)。每个核心在其对应的缓存中维护一个read_ref值。并且,按照现有技术中的实现方式,每个核心对应的缓存中的reacLref值要保持一致。这样,对于多计算核心的计算机系统来说,一个核心对应的缓存中的read_ref值一旦发生改变之后,要与其它核心通信以通知这一改变。其它核心收到通知后更新自身对应缓存中的read_ref 值。
[0010]这样,现有技术中的这一方式,导致不同核心的多个线程对同一数据进行读操作时,由于核心之间的通信要花费一定时间,每个核心对应缓存中更改read_ref值的原子操作都需要花费一定时间,因而执行效率较低。

【发明内容】

[0011]本申请实施例的目的是提供一种读锁操作方法、写锁操作方法及系统,以提高执行效率。
[0012]为解决上述技术问题,本申请实施例提供一种读锁操作方法、写锁操作方法及系统是这样实现的:
[0013]一种读锁操作方法,包括:
[0014]设置每个核心对应的私有引用计数;
[0015]在不同核心的线程对同一数据进行读取过程中,以不同核心对应的私有引用计数进行加读锁、解读锁操作。
[0016]一种读锁操作系统,包括数据单元,一缓存单元,第二缓存单元,第一计算核心和第二计算核心,其中,
[0017]数据单元,用于存储数据;
[0018]第一缓存单元,用于保存为第一计算核心的分配的第一私有引用计数;
[0019]第二缓存单元,用于保存为第二计算核心的分配的第二私有引用计数;
[0020]第一计算核心和第二计算核心,用于对所述数据单元中的同一数据进行读取;且,
[0021]第一计算核心的线程对所述数据进行读取过程中,以第一核心对应的私有引用计数进行加读锁、解读锁操作;
[0022]第二计算核心的线程对所述数据进行读取过程中,以第二核心对应的私有引用计数进行加读锁、解读锁操作。
[0023]一种写锁操作方法,包括:
[0024]对数据执行写操作前,判断所有计算核心中是否存在对该数据的读操作过程;
[0025]对数据执行写操作前,判断所述数据是否处于另一个写操作过程中;
[0026]如果上述两个判断结果均为否,则对该数据进行写操作的过程中,以所述全局写锁进行加写锁、解写锁的操作。
[0027]一种写锁操作系统,包括数据单元,第一判断单元,第二判断单元,加、解写锁单元,其中,
[0028]数据单元,用于存储数据;
[0029]第一判断单元,用于在对数据执行写操作前,判断所有计算核心中是否存在对该数据的读操作过程;
[0030]第二判断单元,用于在对数据执行写操作前,判断所述数据是否处于另一个写操作过程中;
[0031]力卩、解写锁单元,用于在第一判断单元和第二判断单元的判断结果皆为否的情况下,在对所述数据进行写操作的过程中,以所述全局写锁进行加写锁、解写锁的操作。
[0032]由以上本申请实施例提供的技术方案可见,本申请实施例使得不同核心的线程对同一数据进行读操作时,独立的对该核心对应的私有引用计数操作。这些不同核心对应的私有引用计数不需要在各个核之间同步,因此执行效率得到提升。而且,读锁的扩展性也得以提高,即无论多少个核心的线程并发加、解读锁,加解读锁的时间几乎都不会增加,从而提闻了执行效率。
【附图说明】
[0033]为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1