模拟全局共享内存的方法和装置的制作方法

文档序号:6471208阅读:163来源:国知局
专利名称:模拟全局共享内存的方法和装置的制作方法
技术领域
本发明涉及共享内存领域,特别涉及一种模拟全局共享内存的方法和装置。
背景技术
共享内存是进程间通讯的常用技术,也是进程间通信的最有用的方式。由于进程可以直 接读写内存,而不需要任何数据的拷贝,因此采用共享内存通信的一个显而易见的好处就是 效率高,共享内存只需拷贝两次数据 一次从输入文件到共享内存区,另一次从共享内存区 到输出文件。而对于像管道、消息队列等通信方式,则需要在内核和用户空间进行四次的数 据拷贝。
在实际操作中,进程之间在使用共享内存时,并不总是在读写少量数据后就解除映射, 等有新的通信时再重新建立共享内存区域,而是保持共享区域,直到进程间通信完毕为止。 由于共享内存中的内容往往是在解除映射时才写回文件的,因此,保持共享区域直至进程间
通信完毕,数据内容就会在解除映射之前一直保存在共享内存中,并不写回文件。如果共享 内存是系统页面文件的映射,那么甚至不需要和磁盘文件进行交互,都是内存之间的数据交 换,更加高效。
目前,在部分计算机的操作系统,比如Windows XP及之后Windows的操作系统上引入 了会话(Session)的概念。每个用户登录时,同时创建了一个会话,每个进程都和唯一一个 会话相关联,即运行在该会话中。当同一会话的多个进程或不同会话的进程希望访问同一共 享内存来达到数据交互的目的时,该共享内存对于各个进程都必须是可见的,并且是可以访 问的。 一般情况下的共享内存都是全局共享内存,即创建时在名称前加上"GlobalW",这种 共享内存存在于"会话0"中。
但是,由于有些计算机的操作系统(如在Vista操作系统)中引入了 "会话0"隔离技术。 "会话0"隔离技术具体为在"会话0"中只存在应用服务程序,在"会话0"中运行的进 程都必须是系统(System)权限的,并且用户登录后运行的程序都必须在其它会话中,而且 用户运行的进程都是普通用户权限的。此时由于权限的限制,普通用户进程就无法简单地创 建全局共享内存。当然,如果使用服务,还是可以创建全局共享内存,但是又对一般比较简单的程序带来管理的复杂性比如编写要使用全局共享内存的共享库(DLL)程序,而引入 一个服务则必然引入了安装和注册该服务的复杂的过程。

发明内容
为了使各个进程之间通过共享内存进行数据交互,本发明实施例提供了一种模拟全局共 享内存的方法和装置。所述技术方案如下-一种模拟全局共享内存的方法,包括 进程在其所在的会话中创建预先约定名称的共享内存; 所述进程列举系统中的其他会话;
所述进程打开所述其他会话中预先约定名称的共享内存;
所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先约 定名称的共享内存中。
所述进程在其所在的会话中创建预先约定名称的共享内存,具体包括
当所述进程所在的会话中不存在所述预先约定名称的共享内存时,所述进程在其所在的 会话中创建所述预先约定名称的共享内存。
所述进程在其所在的会话中创建预先约定名称的共享内存,具体包括
所述进程打开全局互斥量,并获取所述全局互斥量的锁定权;
然后,所述进程在其所在的会话中创建所述预先约定名称的共享内存。
所述方法还包括
所述进程判断是否存在所述全局互斥量; 若不存在,则所述进程创建所述全局互斥量; 若存在,则所述进程直接打开所述全局互斥量; 所述方法还包括
在所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先 约定名称的共享内存中之后,所述进程释放所述全局互斥量的锁定权。
在所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先 约定名称的共享内存中之后,所述方法还包括
所述进程修改其所在的会话中预先约定名称的共享内存的内容;
所述进程列举系统中的其他会话;
所述进程打开所述其他会话中预先约定名称的共享内存;所述进程将所述会话中预先约定名称的共享内存中的内容复制到所述其他会话中预先约 定名称的共享内存中。
所述进程修改其所在的会话中预先约定名称的共享内存的内容,具体包括
所述进程打开全局互斥量,并获取所述全局互斥量的锁定权;
然后,所述进程在其所在的会话中修改预先约定名称的共享内存的内容。
所述方法还包括
所述进程判断是否存在所述全局互斥量; 若不存在,则所述进程创建所述全局互斥量; 若存在,则所述进程直接打开所述全局互斥量; 所述方法还包括
在所述进程将所述会话中预先约定名称的共享内存中的内容复制到所述其他会话中预先 约定名称的共享内存中之后,所述进程释放所述全局互斥量的锁定权。 所述预先约定名称为访问同一共享内存的进程之间相互约定的名称。 一种模拟全局共享内存的装置,包括会话管理模块和共享内存管理模块; 所述会话管理模块包括
列举单元,用于进程列举系统中的其他会话; 所述共享内存管理模块包括-
创建单元,用于所述进程在其所在的会话中创建预先约定名称的共享内存; 打开单元,用于所述进程打开与所述其他会话对应的共享内存;
复制单元,用于所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所 述会话中预先约定名称的共享内存中。 所述创建单元具体用于-
当所述进程所在的会话中不存在所述预先约定名称的共享内存时,所述进程在其所在的 会话中创建预先约定名称的共享内存。 所述装置还包括互斥量管理模块; 所述互斥量管理模块包括
判断单元,用于所述进程判断是否存在全局互斥量;
创建单元,用于若所述判断单元的判断结果为不存在所述全局互斥量,所述进程创建所 述全局互斥量;
获取单元,用于所述进程打开所述全局互斥量,并获取所述全局互斥量的锁定权;
8相应地,所述共享内存管理模块中的所述创建单元具体用于
在所述进程获取所述全局互斥量的锁定权之后,在其所在的会话中创建预先约定名称的 共享内存。
所述互斥量管理模块还包括
释放单元,用于在所述共享管理模块中的所述复制单元将所述会话中预先约定名称的共 享内存中的内容复制到所述其他会话中预先约定名称的共享内存中之后,所述进程释放所述 全局互斥量的锁定权。
所述共享内存管理模块还包括
修改单元,用于进程修改其所在的会话中预先约定名称的共享内存的内容; 相应地,
所述复制单元还用于所述进程将所述修改单元修改后的所述会话中预先约定名称的共享 内存中的内容复制到所述其他会话中预先约定名称的共享内存中。
所述预先约定名称为访问同一共享内存的进程之间相互约定的名称。 本发明实施例提供的技术方案带来的有益效果是
通过在系统的每一个会话当中创建相同名称的共享内存,并将这些共享内存中的内容复 制到每个相同名称的共享内存中,创建一种模拟全局共享内存,使得在各进程之间不需要采 用服务就可以通过共享内存进行数据交互,有效解决了操作系统中各会话内及各会话间的进 程之间数据交互困难的问题,使得普通用户进程也能够创建和使用全局共享内存。


图1是本发明实施例1中提供的模拟全局共享内存的创建方法流程图2是本发明实施例1中提供的模拟全局共享内存的更新方法流程图3是本发明实施例2中提供的模拟全局共享内存的装置结构示意图4是本发明实施例2中提供的另一种模拟全局共享内存的装置结构示意图5是本发明实施例2中提供的互斥量管理模块的结构示意图6是本发明实施例2中提供的共享内存管理模块的结构示意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进 一步地详细描述。实施例1
参见图l,本实施例提供了一种模拟全局共享内存的方法,该方法包括 步骤101:进程判断其所在的会话中是否存在预先约定名称的共享内存; 如果不存在,执行步骤102; 如果存在,退出;
步骤102:进程判断是否存在全局互斥量MutexT;
如果不存在,则执行步骤103;
如果存在,则执行步骤104。
步骤103:进程创建全局互斥量MutexT;
步骤104:进程打开全局互斥量MutexT,并等待获取该全局互斥量MutexT的锁定权; 步骤105:进程获取该全局互斥量MutexT的锁定权,创建其所在会话中预先约定名称的 共享内存;
步骤106:进程将系统中存在的其他会话列举出来;
步骤107:进程尝试打开列举得到的会话中的其中一个会话的预先约定名称的共享内存; 如果打开失败,则执行步骤108; 如果打开成功,则执行步骤110;
步骤108:进程判断是否所有其他的会话均已尝试打开; 如果不是,则执行步骤109; 如果是,则执行步骤lll;
步骤109:进程尝试打开列举得到的会话中的另一个会话的预先约定名称的共享内存; 如果失败,则执行步骤108; 如果成功,则执行步骤110;
步骤110:进程将成功打开的会话中预先约定名称的共享内存的内容复制到其所在会话 中预先约定名称的共享内存中后,执行步骤lll;
步骤111:进程释放全局互斥量MutexT的锁定权;
例如,Vista操作系统下存在三个会话,分别为Sessionl、 Session2禾n Session3;这三个 会话中由访问同一共享内存的进程之间预先约定的共享内存的名称为ShareMemoryName,假 设Sessionl中不存在名称为ShareMemoryName的共享内存。以Sessionl中的进程A为例 Sessionl中的进程A判断出Sessionl中不存在名称为ShareMemoryName的共享内存;创建全局互斥量MutexT,并打开全局互斥量MutexT,获取全局互斥量MutexT的锁定权;创建 名称为ShareMemoryName的共享内存;打开Session2中名称为ShareMemoryName的共享内 存,将里面的内容复制到Sessionl中名称为ShareMemoryName的共享内存中;释放全局互 斥量MutexT的锁定权。
进一步地,参见图2,在步骤110之后,该方法还包括
步骤201:进程判断是否存在全局互斥量MutexT;
若不存在,则执行步骤202;
若存在,则执行步骤203;
步骤202:进程创建全局互斥量MutexT;
步骤203:进程打开全局互斥量MutexT,并等待获取该全局互斥量MutexT的锁定权; 步骤204:进程获取到全局互斥量MutexT的锁定权,修改其所在会话中预先约定名称的 共享内存中的内容;
步骤205:进程将系统中存在的其他会话列举出来;
步骤206:进程尝试打开列举得到的会话中的其中一个会话的预先约定名称的共享内存; 若打开成功,则执行步骤207; 若打开失败,则执行步骤208;
步骤207:进程将其所在的会话中预先约定名称的共享内存的内容复制到成功打开的其
他会话中预先约定名称的共享内存中后,执行步骤208;
步骤208:进程判断是否所有其他的会话均已尝试打开;
如果不是,则执行步骤209;
如果是,则执行步骤210;
步骤209:进程尝试打开列举得到的会话中的另一个会话的预先约定名称的共享内存; 如果成功,则执行步骤207; 如果失败,则执行步骤208;
步骤210:进程释放互斥量MutexT的锁定权。
例如,Vista操作系统下存在三个会话,分别为Sessionl 、 Session2禾tl Session3;这三个 会话中由访问同一共享内存的进程之间预先约定的共享内存的名称为ShareMemoryName,假 设Sessionl中的进程A准备修改其所在会话Sessionl中名称为ShareMemoryName的共享内 存中的内容Sessionl中的进程A创建全局互斥量MutexT,并打开全局互斥量MutexT,获 取全局互斥量MutexT的锁定权;修改Sessionl中名称为ShareMemoryName的共享内存中的内容;打开Session2中名称为ShareMemoryName的共享内存,将Sessionl中名称为 ShareMemoryName的共享内存中的内容复制到Session2中名称为ShareMemoryName的共享 内存中;打开Session3中名称为ShareMemoryName的共享内存,将Sessionl中名称为 ShareMemoryName的共享内存中的内容复制到Session3中名称为ShareMemoryName的共享 内存中;释放全局互斥量MutexT的锁定权。
这里需要说明的是如果两个会话中的进程同时需要创建或更新模拟全局共享内存,则 先获得互斥量MutexT的锁定权的进程先执行其步骤,另一个进程需要等待获取互斥量 MutexT的锁定权。
本发明实施例通过在系统的每一个会话当中创建相同名称的共享内存,并将这些共享内 存中的内容复制到每个相同名称的共享内存中,创建一种模拟全局共享内存,使得在各进程 之间不需要采用服务就可以通过共享内存进行数据交互,有效解决了操作系统中各会话内及 各会话间的进程之间数据交互困难的问题,使得普通用户进程也能够创建和使用全局共享内 存,使得普通用户进程也能够创建和使用全局共享内存。
实施例2
参见图3,本发明实施例提供了一种模拟全局共享内存的装置300,包括会话管理模块 301和共享内存管理模块302; 会话管理模块301包括
列举单元301A,用于进程列举系统中的其他会话; 共享内存管理模块302包括
创建单元302A,用于进程在其所在的会话中创建预先约定名称的共享内存; 打开单元302B,用于进程打开与其他会话对应的共享内存;
复制单元302C,用于进程将其他会话中预先约定名称的共享内存中的内容复制到会话中 预先约定名称的共享内存中。
其中,创建单元302A具体用于
当进程所在的会话中不存在预先约定名称的共享内存时,进程在其所在的会话中创建预 先约定名称的共享内存。
进一步地,参见图4,装置300还包括互斥量管理模块303; 互斥量管理模块303包括
判断单元303A,用于进程判断是否存在全局互斥量;
创建单元303B,用于若判断单元303A的判断结果为不存在全局互斥量,进程创建全局互斥量;
获取单元303C,用于进程打开全局互斥量,并获取全局互斥量的锁定权; 相应地,共享内存管理模块302中的创建单元302A具体用于
在进程获取全局互斥量的锁定权之后,在其所在的会话中创建预先约定名称的共享内存。 进一步地,参见图5,互斥量管理模块303还包括
释放单元303D,用于在共享管理模块302中的复制单元302C将会话中预先约定名称的 共享内存中的内容复制到其他会话中预先约定名称的共享内存中之后,进程释放全局互斥量 的锁定权。
进一步地,参见图6,共享内存管理模块302还包括
修改单元302D,用于第一进程修改其所在的会话中预先约定名称的共享内存的内容; 相应地,
复制单元302C还用于第一进程将修改单元302D修改后的会话中预先约定名称的共享内 存中的内容复制到其他会话中预先约定名称的共享内存中。
其中,预先约定名称为访问同一共享内存的进程之间相互约定的名称。
本发明实施例利用模拟全局共享内存的装置,实现了在系统的每一个会话当中创建相同 名称的共享内存,并将这些共享内存中的内容复制到每个相同名称的共享内存中,创建一种 模拟全局共享内存,使得在各进程之间不需要采用服务就可以通过共享内存进行数据交互, 有效解决了操作系统中各会话内及各会话间的进程之间数据交互困难的问题,使得普通用户 进程也能够创建和使用全局共享内存,使得普通用户进程也能够创建和使用全局共享内存。
本发明实施例可以利用软件实现,相应的软件程序可以存储在可读取的存储介质中,例 如,路由器的硬盘、缓存或光盘中。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之 内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
1权利要求
1、一种模拟全局共享内存的方法,其特征在于,所述方法包括进程在其所在的会话中创建预先约定名称的共享内存;所述进程列举系统中的其他会话;所述进程打开所述其他会话中预先约定名称的共享内存;所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先约定名称的共享内存中。
2、 如权利要求1所述的模拟全局共享内存的方法,其特征在于,所述进程在其所在的会 话中创建预先约定名称的共享内存,具体包括-当所述进程所在的会话中不存在所述预先约定名称的共享内存时,所述进程在其所在的 会话中创建所述预先约定名称的共享内存。
3、 如权利要求l所述的模拟全局共享内存的方法,其特征在于,所述进程在其所在的会 话中创建预先约定名称的共享内存,具体包括所述进程打开全局互斥量,并获取所述全局互斥量的锁定权;然后,所述进程在其所在的会话中创建所述预先约定名称的共享内存。
4、 如权利要求3所述的模拟全局共享内存的方法,其特征在于,在所述进程打开全局互 斥量之前,所述方法还包括所述进程判断是否存在所述全局互斥量; 若不存在,则所述进程创建所述全局互斥量; 若存在,则所述进程直接打开所述全局互斥量。
5、 如权利要求3所述的模拟全局共享内存的方法,其特征在于,所述方法还包括 在所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先约定名称的共享内存中之后,所述进程释放所述全局互斥量的锁定权。
6、 如权利要求1所述的模拟全局共享内存的方法,其特征在于,在所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先约定名称的共享内存中之 后,所述方法还包括-所述进程修改其所在的会话中预先约定名称的共享内存的内容;所述进程列举系统中的其他会话;所述进程打开所述其他会话中预先约定名称的共享内存;所述进程将所述会话中预先约定名称的共享内存中的内容复制到所述其他会话中预先约 定名称的共享内存中。
7、 如权利要求6所述的模拟全局共享内存的方法,其特征在于,所述进程修改其所在的 会话中预先约定名称的共享内存的内容,具体包括-所述进程打开全局互斥量,并获取所述全局互斥量的锁定权;然后 ,所述进程在其所在的会话中修改预先约定名称的共享内存的内容。
8、 如权利要求7所述的模拟全局共亨内存的方法,其特征在于,所述进程打开全局互斥 量之前,所述方法还包括所述进程判断是否存在所述全局互斥量; 若不存在,则所述进程创建所述全局互斥量; 若存在,则所述进程直接打开所述全局互斥量。
9、 如权利要求7所述的模拟全局内存的方法,其特征在于,所述方法还包括 在所述进程将所述会话中预先约定名称的共享内存中的内容复制到所述其他会话中预先约定名称的共享内存中之后,所述进程释放所述全局互斥量的锁定权。
10、 如权利要求1至9中任一项权利要求所述的模拟全局共享内存的方法,其特征在于, 所述预先约定名称为访问同一共享内存的进程之间相互约定的名称。
11、 一种模拟全局共享内存的装置,其特征在于,所述装置包括会话管理模块和共享 内存管理模块;所述会话管理模块包括列举单元,用于进程列举系统中的其他会话;所述共享内存管理模块包括创建单元,用于所述进程在其所在的会话中创建预先约定名称的共享内存; 打开单元,用于所述进程打开与所述其他会话对应的共享内存;复制单元,用于所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所 述会话中预先约定名称的共享内存中。
12、 如权利要求ll所述的模拟全局共享内存的装置,其特征在于,所述创建单元具体用于当所述进程所在的会话中不存在所述预先约定名称的共享内存时,所述进程在其所在的 会话中创建预先约定名称的共享内存。
13、 如权利要求11所述的模拟全局共享内存的装置,其特征在于,所述装置还包括互 斥量管理模块;所述互斥量管理模块包括判断单元,用于所述进程判断是否存在全局互斥量;创建单元,用于若所述判断单元的判断结果为不存在所述全局互斥量,所述进程创建所 述全局互斥量;获取单元,用于所述进程打开所述全局互斥量,并获取所述全局互斥量的锁定权; 相应地,所述共享内存管理模块中的所述创建单元具体用于在所述进程获取所述全局互斥量的锁定权之后,在其所在的会话中创建预先约定名称的 共享内存。
14、 如权利要求13所述的模拟全局共享内存的装置,其特征在于,所述互斥量管理模块 还包括释放单元,用于在所述共享管理模块中的所述复制单元将所述会话中预先约定名称的共 享内存中的内容复制到所述其他会话中预先约定名称的共享内存中之后,所述进程释放所述 全局互斥量的锁定权。
15、 如权利要求ll所述的模拟全局共享内存的装置,其特征在于,所述共享内存管理模 块还包括修改单元,用于进程修改其所在的会话中预先约定名称的共享内存的内容; 相应地,所述复制单元还用于所述进程将所述修改单元修改后的所述会话中预先约定名称的共享 内存中的内容复制到所述其他会话中预先约定名称的共享内存中。
16、如权利要求11至15中任一项权利要求所述的模拟全局共享内存的装置,其特征在于,所述预先约定名称为访问同一共享内存的进程之间相互约定的名称。
全文摘要
本发明公开了一种模拟全局共享内存的方法和装置,属于共享内存领域。所述方法包括进程在其所在的会话中创建预先约定名称的共享内存;所述进程列举系统中的其他会话;所述进程打开所述其他会话中预先约定名称的共享内存;所述进程将所述其他会话中预先约定名称的共享内存中的内容复制到所述会话中预先约定名称的共享内存中。所述装置包括会话管理模块和共享内存管理模块。本发明通过创建一种模拟全局共享内存,使得在各进程之间不需要采用服务就可以通过共享内存进行数据交互,有效解决了操作系统中各会话内及各会话间的进程之间数据交互困难的问题。
文档编号G06F9/46GK101430655SQ200810226880
公开日2009年5月13日 申请日期2008年11月19日 优先权日2008年11月19日
发明者于华章, 舟 陆 申请人:北京飞天诚信科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1