适用于Linux容器应用的多进程同步方法技术

技术编号:30427676 阅读:10 留言:0更新日期:2021-10-24 17:14
本发明专利技术涉及一种适用于Linux容器应用的多进程同步方法,所述方法包括S1、初始化线程锁和进程锁;S2、获取线程锁,再获取进程锁,实现多线程多进程同步互斥以保护临界区资源;S3、完成任务后,释放进程锁,再释放线程锁,结束任务。本发明专利技术实现了多线程和多进程的同步。本发明专利技术实现了多线程和多进程的同步。

【技术实现步骤摘要】
适用于Linux容器应用的多进程同步方法


[0001]本专利技术涉及通信
,尤其涉及适用于Linux容器应用的多进程同步方法。

技术介绍

[0002]目前终端产品已经迭代到能源控制器,它采用模组化设计,通过不同种类的功能模组配合,实现对终端形态的重新定义。同时在软件形态上,统一使用linux系统,并加入了容器(Docker)技术,达到各应用程序之间互相隔离的目的。这使得linux多进程的同步,不单单要解决传统的单主机多进程资源共享、竞争问题,同时也要解决容器内进程和主机进程间的资源共享、竞争问题
[0003]传统的进程间通信方式(IPC)种类有很多,但在解决容器内、外多进程间临界区资源保护上,存在欠缺。比如system V信号量要适用在无亲缘关系的进程间,必须要满足生成键值一致。这就要求容器在安装时必须映射主机的某个特定目录。同时,为了达到IPC命名空间一致,容器安装时必须附带“IPC=host”参数来共享主机的IPC命名空间,而这一点破坏了容器作为虚拟化技术,和宿主主机系统间隔离的初衷。
[0004]再比如posix信号量要适用在无亲缘关系的进程间,首先需要使用有名信号量,这就必须要求容器共享主机的“/dev/shm”目录,以达到创建信号量时自动生成的文件对象是同一个。并且posix信号量本身在持有锁期间进程终止的场景下不会自动释放,直接导致信号量死锁。目前容器内往往存在守护进程,容器内应用程序意外终止时,不会重启整机而是由守护进程重启应用程序,而这操作容易导致死锁情况发生,这是灾难性的问题。
[0005]综上,就目前的技术方案来说,无论是需要特别的部署方式(映射主机共享目录、特定的运行参数)还是本身存在的死锁问题,都存在缺陷,不适用于多厂家共同开发和互换容器应用的场景。

技术实现思路

[0006]鉴于上述问题,本专利技术的目的在于提供一种适用于Linux容器应用的多进程同步方法,以解决上述问题。
[0007]为了实现上述目的,本专利技术采用的技术方案为:一种适用于Linux容器应用的多进程同步方法,其特征在于:
[0008]S1、初始化线程锁和进程锁;
[0009]S2、获取线程锁,再获取进程锁,实现多线程多进程同步互斥以保护临界区资源;
[0010]S3、完成任务后,释放进程锁,再释放线程锁,结束任务。
[0011]进一步的,所述S2的具体操作过程如下:
[0012]S21、定义线程互斥锁、条件变量以及无符号32位整型信号值;
[0013]S22、获取线程互斥锁,实现多线程对信号值进行保护;
[0014]S23、判断信号值是否大于0,若是,执行S25,反之,执行S24;
[0015]S24、等待条件变量,线程进入阻塞状态,并在收到条件变量的通知时,执行S25;
[0016]S25、对信号值减1;
[0017]S26、释放线程互斥锁;
[0018]S27、执行进程锁加锁操作。
[0019]进一步的,所述S3释放进程锁和线程锁的具体操作过程如下:
[0020]S31、执行进程所解锁过程;
[0021]S32、获取线程互斥锁,实现多线程对信号值进行保护;
[0022]S33、对信号值加1;
[0023]S34、广播通知条件变量;
[0024]S35、释放线程互斥锁。
[0025]进一步的,所述方法在执行S24过程中还存在如下操作:
[0026]S241、接受用户定义的最大超时时间T1,并获取系统当前时间T2;
[0027]S242、判断等待条件变量通知的已耗时间是否大于T2+T1,若是,结束加锁过程,反之,执行S243;
[0028]S243、记录得到条件变量通知时的系统当前时间T3,获取线程同步已耗费的等待时间为T3

T2;
[0029]S244、计算剩余的超时时间ΔT=T1

(T3

T2),将其作为进程锁加锁的最大超时时间。
[0030]进一步的,所述进程锁由记录锁构造得到。
[0031]进一步的,所述进程锁具体构造方式如下:
[0032]1)初始化锁,获取文件句柄fd;
[0033]2)使用记录锁fcntl方法请求文件句柄fd对应的整个文件写锁,进行加锁操作;
[0034]3)使用记录锁fcntl方法请求文件句柄fd对应的整个文件释放锁,进行解锁操作;
[0035]4)通过close方法关闭文件句柄fd对应的整个文件,进行删除锁操作。
[0036]进一步的,所述方法在构造进程锁过程中,初始化锁的操作具体包括:
[0037]1)提供由路径path、特征字符c以及固定前缀sem组合生成的上锁文件全路径filepath;
[0038]2)通过open方法以读写方式和读写权限创建并打开filepath,获取文件句柄fd。
[0039]进一步的,所述方法对应的进程间同步过程包括当进程间正常同步时,对应操作:
[0040]1)进程1、进程2初始化锁;
[0041]2)进程1先于进程2加锁,并持有锁,进程2后于进程1加锁,进入阻塞等待状态;
[0042]3)进程1处理完事务解锁,进程2取得锁并持有;
[0043]4)进程2处理完事务解锁。
[0044]进一步的,所述方法对应的进程间同步过程还包括当进程间异常同步时,对应操作:
[0045]1)进程1、进程2初始化锁;
[0046]2)进程1先于进程2加锁,并持有锁,进程2后于进程1加锁,进入阻塞等待状态;
[0047]3)进程1持有锁期间异常退出,内核清理进程1的锁,由进程2取得锁并持有;
[0048]4)进程2处理完事务解锁。
[0049]进一步的,所述信号值初始值为1,所述T1单位为毫秒,T2单位为纳秒。
[0050]与现有技术相比,本专利技术的优点在于:通过使用linux互斥锁以及条件变量构造适用于多线程的信号量即线程锁,配合通过记录锁构成的进程锁,形成新的组合锁,能同时支持多线程和多进程的同步;且该方法支持容器进程和宿主机进程之前的同步,无需容器共享主机的特定目录,符合线程或进程互锁的独立性要求。
附图说明
[0051]图1为本申请方法的总体流程图。
[0052]图2为组合加锁流程图。
[0053]图3为组合解锁流程图。
[0054]图4为超时算法流程图。
[0055]图5(a)和图5(b)分别为进程锁正常同步和异常同步时的流程图。
[0056]图6为进程锁构造过程中初始化锁过程图。
具体实施方式
[0057]下面详细描述本专利技术的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种适用于Linux容器应用的多进程同步方法,其特征在于:所述方法包括,S1、初始化线程锁和进程锁;S2、获取线程锁,再获取进程锁,实现多线程多进程同步互斥以保护临界区资源;S3、完成任务后,释放进程锁,再释放线程锁,结束任务。2.根据权利要求1所述适用于Linux容器应用的多进程同步方法,其特征在于:所述S2的具体操作过程如下,S21、定义线程互斥锁、条件变量以及无符号32位整型信号值;S22、获取线程互斥锁,实现多线程对信号值进行保护;S23、判断信号值是否大于0,若是,执行S25,反之,执行S24;S24、等待条件变量,线程进入阻塞状态,并在收到条件变量的通知时,执行S25;S25、对信号值减1;S26、释放线程互斥锁;S27、执行进程锁加锁操作。3.根据权利要求1所述适用于Linux容器应用的多进程同步方法,其特征在于:所述S3释放进程锁和线程锁的具体操作过程如下,S31、执行进程所解锁过程;S32、获取线程互斥锁,实现多线程对信号值进行保护;S33、对信号值加1;S34、广播通知条件变量;S35、释放线程互斥锁。4.根据权利要求2所述适用于Linux容器应用的多进程同步方法,其特征在于:所述方法在执行S24过程中还存在如下操作,S241、接受用户定义的最大超时时间T1,并获取系统当前时间T2;S242、判断等待条件变量通知的已耗时间是否大于T2+T1,若是,结束加锁过程,反之,执行S243;S243、记录得到条件变量通知时的系统当前时间T3,获取线程同步已耗费的等待时间为T3

T2;S244、计算剩余的超时时间ΔT=T1

(T3

T2),将其作为进程锁加锁的最大超时时间。5.根据权利要求1所述适用于Linux容器应用的多进...

【专利技术属性】
技术研发人员:邬科科王燕刘宁冯丹荣
申请(专利权)人:宁波三星医疗电气股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1