实现任务间共享数据的方法
技术领域
本发明涉及计算机系统领域,具体涉及一种实现任务间共享数据的方法。尤其适用于定时器、后台等任务对共享数据的访问处理。
背景技术
计算机系统,无论是大的图形化操作系统还是小小的芯片上运行的程序,经常采用多任务的处理方式。每个任务具备不同的功能,任务间通过消息交互一些信息。这些任务有时需要访问同一个数据区,这些被多个任务访问的数据就是共享数据,也被称作临界区。由于多任务访问,临界区必须保证在某个任务的访问过程中不被修改,即直到当前任务使用完毕,才允许其他任务访问临界区。这样才能保证临界区数据的正确。例如银行系统,用户的账户信息就是临界区,而存取款的动作就是一个个任务,必须完成一笔业务再处理另外一笔业务。
为了保证临界区是互斥访问的,即一个时间只能有一个任务对其访问。操作系统提供了很多手段,例如锁机制和事务。可以对临界区进行锁保护,任何一个任务访问临界区,必须先获得锁,得到锁后,才能操作临界区,访问完毕后释放锁。如果得不到锁,任务就处于等待状态。事务是数据库系统的概念,与锁类似。
这个方法在嵌入式操作系统上存在一些缺点:
1.一些嵌入式操作系统用中断实现锁,使得加锁和解锁的开销比较大。有的时候对临界区的数据操作简单,指令不多,操作很快就能完成,但是加锁和解锁的操作占用较多时间,代码无法提高效率。
2.编码复杂,一旦发生死锁,不易定位故障。由于任务中可以多次访问临界区,如果某次访问没有释放锁,后面的访问无法进行,但是锁的占用者却是自己,只能走读代码查找问题。
发明内容
针对现有技术存在的缺陷和不足,本发明提供一种无须对共享数据进行保护,而且多任务能够访问共享数据区的实现任务间共享数据的方法。
为达到上述目的,本发明采用以下技术方案:一种实现任务间共享数据的方法,包括如下步骤:
步骤A,没有访问共享数据区权限的任务向具备访问权限的任务发ACTION消息;
步骤B,具备访问权限的任务收到该消息后,按照消息的内容,运行相应程序,操作共享数据区;
步骤C,运行结束,具备访问权限的任务向ACTION消息的发送者发送应答消息,该应答消息包含运行结果;
优选的:在所述实现任务间共享数据的方法中,还包括如下步骤:
步骤D,ACTION的发送者收到所述应答消息,判断运行结果;
步骤E,如果所述运行结果是未完,那么ACTION的发送者再向具备访问权限的任务发送ACTION消息;
步骤F,如果应答消息里的结果是结束,那么ACTION的发送者不再向具备访问权限的任务发ACTION消息。
优选的:在所述实现任务间共享数据的方法中,PROTOCOL任务为具备访问共享数据区权限的任务;CLEAR_SUB任务为没有访问共享数据区权限的任务;CLEAR_SUB的优先级低于PROTOCOL的优先级;活动用户表为共享数据区。
优选的:在所述实现任务间共享数据的方法中,所述PROTOCOL任务在用户上、下线时,向活动用户表增加、删除该用户所对应的纪录;当网管下踢用户命令时,CLEAR_SUB任务查询活动用户表,删除符合条件的用户的纪录,CLEAR_SUB任务的优先级低于PROTOCOL任务的优先级。
优选的:在所述实现任务间共享数据的方法中,所述步骤A具体为:
步骤A1,CLEAR_SUB任务收到clear sub domain 100命令,构造踢用户消息;
步骤A2,CLEAR_SUB任务把构造好踢用户消息发送给PROTOCOL任务。
优选的:在所述实现任务间共享数据的方法中,所述踢用户消息的内容包含:用户标志1,表示从第一个用户开始;DomainID置为100,删除的条件,活动用户DomainID是100;当前时刻,表示删除此时刻前上线的用户;操作用户个数,表示一次处理几个用户;本次命令编号,为了区分多个网管命令。
优选的:在所述实现任务间共享数据的方法中,所述步骤B具体为:
步骤B1,PROTOCOL收到踢用户消息,按照消息中的用户标志1定位到起始用户;
步骤B2,读取当前用户,先判断当前用户的DomainID是否等于100,然后判断用户上线时间是否在当前时刻之前;
步骤B3,如果两个条件都满足,踢掉当前用户,处理的用户数加1,执行步骤B2;
步骤B4,如果当前用户的DomainID大于100,步骤结束。
优选的:在所述实现任务间共享数据的方法中,所述步骤C具体为:
步骤C1,退出步骤B的运行;
步骤C2,如果当前用户的DomainID大于100,PROTOCOL给CLEAR_SUB发应答消息,该消息的内容是END,表示处理结束;
步骤C3,如果当前用户的DomainID等于100,记录当前用户的DomainID作为断点,PROTOCOL给CLEAR_SUB发应答消息,消息内容是CONTINUE,表示没有结束。
优选的:在所述实现任务间共享数据的方法中,所述步骤D、E具体为:
步骤D,CLEAR_SUB任务收到具备访问权限的PROTOCOL任务发送的应答消息;
步骤E,如果应答消息的内容是CONTINUE,CLEAR_SUB任务再向具备访问权限的PROTOCOL任务发一个ACTION消息;如果应答消息的内容是END,CLEAR_SUB任务不再向PROTOCOL任务发消息。
本发明的共享数据区不用保护,任务间可以安全的访问共享数据区数据。不用考虑锁等保护机制,编码得以简化;没有锁,不会出现死锁,完全避免了死锁问题。多个任务通过发消息给有权限的任务来操作共享数据区,那么高优先级的任务先发出消息,低优先级的任务后发出消息,不会出现因为锁导致的任务优先级逆转问题。共享数据实际上是串行访问的,类似底层CPU的处理,非常安全。
此方法尤其适合定时器、后台任务等操作,这些任务一般采用低优先级任务,周期性规律性的访问共享数据区,对执行动作的实时性要求不高,不要求立即返回操作结果。
附图说明
图1以两个任务为例的消息交互示意图。
具体实施方式
实现任务间共享数据的方法要做到免保护,关键是只让一个任务访问临界区,其他任务不允许访问临界区。例如有n个任务,它们共享数据区D。那么规定只有一个任务能够访问数据区D,其他任务不能直接访问数据区D,只能发消息给具备访问权限的任务,消息里说明访问的动作,可以是一个函数名或其他能够表明动作的编号。具备访问权限的任务收到消息后,执行动作,操作共享数据。运行结束后,给动作的发起方发一个应答消息。发起动作的任务根据应答消息,决定后续的操作。
消息交互过程如图1所示,下面是该方法实现两个任务间共享数据的例子。
实施步骤:
在接入服务器设备上有许多任务,其中PROTOCOL任务处理协议信息,完成用户的上下线动作,任务优先级为100;CLEAR_SUB任务处理网管的所有踢用户命令,任务优先级是140。
活动用户表是两个任务都要访问的数据。当用户上线、下线时,PROTOCOL向活动用户表增加、删除表项。当网管下踢用户命令时,CLEAR_SUB任务查询活动用户表,删除符合条件的用户。由于网管踢用户的命令往往会影响一大批用户,可能会删除上万个用户,如果用高优先级的任务完成这个工作,会影响设备对其他事件的响应速度,网管命令也会很久无响应。所以用低优先级的CLEAR_SUB任务完成这个工作,分批的删除符合条件的活动用户。CLEAR_SUB任务用上面描述的方法访问活动用户表。步骤如下:
第一步:某个任务(此任务没有访问权限)向具备访问权限的任务发ACTION消息。
CLEAR_SUB任务没有访问活动用户的权限,PROTOCOL具备访问活动用户的权限。CLEAR_SUB不能直接操作活动用户数据,当它收到一条网管指令,要求删除domain 100里的所有在线用户。那么CLEAR_SUB任务做下面动作:
1.CLEAR_SUB任务收到clear sub domain 100命令,构造踢用户的消息,内容包含:
用户标志1(表示从第一个用户开始),DomainID置为100(删除的条件,活动用户DomainID是100),当前时刻(表示删除此时刻前上线的用户),操作用户个数(表示一次处理几个用户),本次命令编号(为了区分多个网管命令)。
2.CLEAR_SUB任务把构造好的消息发送给PROTOCOL任务
第二步:具备访问权限的任务收到ACTION,按照消息的内容,运行一段程序,操作共享数据区D。
PROTOCOL是具备访问权限的任务。
1.PROTOCOL收到踢用户消息。
2.按照消息中的用户标志定位到起始用户。
3.读取用户,判断用户的DomainID是否与消息中条件一致,用户上线时间是否在消息时刻之前。
4.如果条件不满足执行步骤5,否则到7。
5.踢掉这个用户。
6.处理的用户数增一。
7.处理下一个用户记录。
8.如果下一个记录为空,或处理的用户数达到消息中操作用户个数,退出循环,否则到3循环处理。
第三步:运行结束,具备访问权限的任务向ACTION消息的发送者发ACK消息,包含运行的结果。
退出第二步的循环,如果达到活动用户表尾部,说明已经查完所有记录,给CLEAR_SUB发ACK消息,消息内容是END,表示处理结束。反之,记录断点,消息内容是CONTINUE,表示没有结束。断点表示下次处理开始的地方,断点的生成方式为:拷贝收到的消息,修改用户标志为下一个要处理的记录标志。
第四步:ACTION的发送者收到ACK消息,判断运行的结果。
CLEAR_SUB是ACTION的发送者,那么它收到PROTOCOL的应答ACK消息。
第五步:如果结果是未完,那么ACTION的发送者再向具备访问权限的任务发一个ACTION消息,重复上面过程。
CLEAR_SUB查看消息内容,如果是CONTINUE消息,那么提取消息中的断点,再向PROTOCOL任务发ACTION消息,重复上面过程。
第六步:如果ACK消息里的结果是结束,那么ACTION的发送者不再向具备访问权限的任务发消息,继续其他工作。
CLEAR_SUB查看消息内容,如果是END消息,表示处理结束,那么CLEAR_SUB任务结束这个网管命令的处理,回到等待命令的状态。
采用这样的方式,能够达到多任务共享访问数据的目的,并不局限于两个任务间共享,可以是任意多个任务共享数据,还把访问大批用户的命令分割成一小块一小块的执行,不会由于长时间占据共享数据,而造成其他任务无法处理。并且由于任务间存在优先级的差异,会随着任务的忙闲调节处理大批量数据的速度,不象定时器是个固定的处理频率。定时器的任务执行时间是固定的,忙的时候它让系统更忙,闲的时候也不能多做一些。而我们这个方法却能够自动调节,忙的时候低优先级任务调度不到无法执行,不会造成系统更忙;而闲的时候能够加快运行,快速把命令做完。