一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

适用于Linux容器应用的多进程同步方法与流程

2021-10-24 11:59:00 来源:中国专利 TAG:适用于 容器 进程 同步 方法

适用于linux容器应用的多进程同步方法
技术领域
1.本发明涉及通信技术领域,尤其涉及适用于linux容器应用的多进程同步方法。


背景技术:

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


技术实现要素:

6.鉴于上述问题,本发明的目的在于提供一种适用于linux容器应用的多进程同步方法,以解决上述问题。
7.为了实现上述目的,本发明采用的技术方案为:一种适用于linux容器应用的多进程同步方法,其特征在于:
8.s1、初始化线程锁和进程锁;
9.s2、获取线程锁,再获取进程锁,实现多线程多进程同步互斥以保护临界区资源;
10.s3、完成任务后,释放进程锁,再释放线程锁,结束任务。
11.进一步的,所述s2的具体操作过程如下:
12.s21、定义线程互斥锁、条件变量以及无符号32位整型信号值;
13.s22、获取线程互斥锁,实现多线程对信号值进行保护;
14.s23、判断信号值是否大于0,若是,执行s25,反之,执行s24;
15.s24、等待条件变量,线程进入阻塞状态,并在收到条件变量的通知时,执行s25;
16.s25、对信号值减1;
17.s26、释放线程互斥锁;
18.s27、执行进程锁加锁操作。
19.进一步的,所述s3释放进程锁和线程锁的具体操作过程如下:
20.s31、执行进程所解锁过程;
21.s32、获取线程互斥锁,实现多线程对信号值进行保护;
22.s33、对信号值加1;
23.s34、广播通知条件变量;
24.s35、释放线程互斥锁。
25.进一步的,所述方法在执行s24过程中还存在如下操作:
26.s241、接受用户定义的最大超时时间t1,并获取系统当前时间t2;
27.s242、判断等待条件变量通知的已耗时间是否大于t2 t1,若是,结束加锁过程,反之,执行s243;
28.s243、记录得到条件变量通知时的系统当前时间t3,获取线程同步已耗费的等待时间为t3

t2;
29.s244、计算剩余的超时时间δt=t1

(t3

t2),将其作为进程锁加锁的最大超时时间。
30.进一步的,所述进程锁由记录锁构造得到。
31.进一步的,所述进程锁具体构造方式如下:
32.1)初始化锁,获取文件句柄fd;
33.2)使用记录锁fcntl方法请求文件句柄fd对应的整个文件写锁,进行加锁操作;
34.3)使用记录锁fcntl方法请求文件句柄fd对应的整个文件释放锁,进行解锁操作;
35.4)通过close方法关闭文件句柄fd对应的整个文件,进行删除锁操作。
36.进一步的,所述方法在构造进程锁过程中,初始化锁的操作具体包括:
37.1)提供由路径path、特征字符c以及固定前缀sem组合生成的上锁文件全路径filepath;
38.2)通过open方法以读写方式和读写权限创建并打开filepath,获取文件句柄fd。
39.进一步的,所述方法对应的进程间同步过程包括当进程间正常同步时,对应操作:
40.1)进程1、进程2初始化锁;
41.2)进程1先于进程2加锁,并持有锁,进程2后于进程1加锁,进入阻塞等待状态;
42.3)进程1处理完事务解锁,进程2取得锁并持有;
43.4)进程2处理完事务解锁。
44.进一步的,所述方法对应的进程间同步过程还包括当进程间异常同步时,对应操作:
45.1)进程1、进程2初始化锁;
46.2)进程1先于进程2加锁,并持有锁,进程2后于进程1加锁,进入阻塞等待状态;
47.3)进程1持有锁期间异常退出,内核清理进程1的锁,由进程2取得锁并持有;
48.4)进程2处理完事务解锁。
49.进一步的,所述信号值初始值为1,所述t1单位为毫秒,t2单位为纳秒。
50.与现有技术相比,本发明的优点在于:通过使用linux互斥锁以及条件变量构造适用于多线程的信号量即线程锁,配合通过记录锁构成的进程锁,形成新的组合锁,能同时支持多线程和多进程的同步;且该方法支持容器进程和宿主机进程之前的同步,无需容器共享主机的特定目录,符合线程或进程互锁的独立性要求。
附图说明
51.图1为本技术方法的总体流程图。
52.图2为组合加锁流程图。
53.图3为组合解锁流程图。
54.图4为超时算法流程图。
55.图5(a)和图5(b)分别为进程锁正常同步和异常同步时的流程图。
56.图6为进程锁构造过程中初始化锁过程图。
具体实施方式
57.下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
58.如图1所示,本技术通过分别构造线程锁和进程锁,进行组合使用,实现多线程 多进程同步,具体同步示意如下:
59.同步过程对临界区资源的保护,通过先使用特殊构造的线程锁,达到同一个进程中多线程间的互斥,再使用特殊构造的进程锁,达到多进程间的互斥。流程上先获取的后释放。其中,进程锁构造原理及过程如下,可同时参见图6:
60.记录锁(fcntl)具备在进程终止时,由内核完成已有锁清理工作的特性。利用这一特性,通过记录锁构造出的进程锁,可用于多进程间临界资源互斥保护,并且可以解决“持有锁期间进程终止“导致死锁问题。具体构造分为初始化锁、加锁、解锁、删除锁四部分,具体方法如下:
61.1.初始化锁
62.a)提供路径:path(通常如“/tmp”)和特征字符:c(通常如’a’),以及固定前缀:“sem”组合生成上锁文件的全路径filepath:“path/sem.c”;
63.b)通过open方法以读写方式和读写权限创建并打开filepath,获取文件句柄fd;
64.2.加锁操作使用记录锁fcntl方法,请求文件fd写锁(f_wrlck),范围是整个文件;
65.3.解锁操作使用记录锁fcntl方法,请求文件fd释放锁(f_unlck),范围是整个文件;
66.4.删除锁操作通过close方法关闭fd。
67.进程锁的构造,首先标准化上锁文件的命名规则,同时对于运行于容器中的进程,可以任意自定义的共享路径和特征字符,不需要固定到某一特定路径。
68.通过记录锁fcntl方法,使用最直接的整个文件加写锁和释放锁机制,来达到资源互斥的目的。多个进程间同步过程可能存在正常同步和异常同步两种情形,此时分别对应如图5(a)和图5(b)所示的流程图操作:
69.a)进程间正常同步过程:
70.1.进程1、进程2初始化锁,顺序不相关;
71.2.进程1先于进程2加锁,并持有锁;
72.3.进程2后于进程1加锁,此时因取不到锁进入阻塞等待状态;
73.4.进程1处理完事务解锁;
74.5.进程2取得锁并持有;
75.6.进程2处理完事务解锁。
76.b)进程间异常同步过程:
77.1.进程1、进程2初始化锁,顺序不相关;
78.2.进程1先于进程2加锁,并持有锁;
79.3.进程2后于进程1加锁,此时因取不到锁进入阻塞等待状态;
80.4.进程1持有锁期间异常退出;
81.5.内核清理进程1的锁;
82.6.进程2取得锁并持有;
83.7.进程2处理完事务解锁。
84.以上通过记录锁(fcntl)构造出进程间锁,只在多进程间起作用,不适用于多线程,故而,本发明还同时使用linux互斥锁以及条件变量构造适用于多线程的信号量,即线程锁,配合前面阐释的构造的进程锁,形成新的组合锁,达到同时适用于多进程和多线程的同步目的,其中,组合加锁过程对应着如下流程,具体可参见图2:
85.首先定义一个线程互斥锁、条件变量、以及无符号32位整型信号值(通常设置初值等于1)。
86.第一步,获取线程互斥锁,达到多线程对信号值操作的保护;
87.第二步,判断信号值,如果大于0执行第四步,否则执行下一步;
88.第三步,等待条件变量,线程进入阻塞状态,若收到条件变量的通知,则执行下一步;
89.第四步,对信号值减1;
90.第五步,释放线程互斥锁;
91.第六步,执行进程锁加锁过程。
92.而组合解锁过程则对应着如下流程,可参见图3:
93.第一步,先执行进程所解锁过程;
94.第二步,获取线程互斥锁,达到多线程对信号值操作的保护;
95.第三步,对信号值加1;
96.第四步,广播通知条件变量;
97.第五步,释放线程互斥锁。
98.在前述图2所示的等待条件变量,以及进程锁加锁过程都可以通过超时机制达到cpu资源合理利用的目的,因加锁过程有两处等待,需要通过超时算法,做到同步方法使用者只需关心一个超时时间的目的,其具体的超时算法流程如图4所示:
99.第一步,接受用户定义的最大超时时间t1(单位毫秒);
100.第二步,获取系统当前时间t2(单位纳秒);
101.第三步,通过t2和t1,计算超时时刻t2 t1(单位纳秒),判断等待条件变量通知的已耗时间是否大于t2 t1,若是,结束加锁过程,反之,执行下一步;
102.第四步,得到条件变量通知,记录系统当前时间t3,则t3

t2为线程同步已经等待的时间;
103.第五步,计算剩余的超时时间,δt=t1

(t3

t2);
104.第六步,把δt作为进程锁加锁的超时时间。
105.如此,通过本发明的同步方法能同时支持多线程和多进程的同步,且该方法支持容器进程和宿主机进程之前的同步,却未使用system v,不需要容器共享主机的ipc命名空间,容器和主机的共享目录可以任意指定,对比posix有名信号量,不需要容器共享主机的特定目录,支持毫秒级超时,实现了多线程和多进程的同步。
106.尽管已经示出和描述了本发明的实施例,本领域技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变形,本发明的范围由权利要求及其等同物限定。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜