CN112612582A - 信号量功能实现方法和装置 - Google Patents
信号量功能实现方法和装置 Download PDFInfo
- Publication number
- CN112612582A CN112612582A CN202011471392.1A CN202011471392A CN112612582A CN 112612582 A CN112612582 A CN 112612582A CN 202011471392 A CN202011471392 A CN 202011471392A CN 112612582 A CN112612582 A CN 112612582A
- Authority
- CN
- China
- Prior art keywords
- semaphore
- thread
- ipc
- waiting
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 45
- 230000004044 response Effects 0.000 claims abstract description 94
- 238000004891 communication Methods 0.000 claims abstract description 7
- 230000006870 function Effects 0.000 claims description 213
- 238000004590 computer program Methods 0.000 claims description 3
- 230000002618 waking effect Effects 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 12
- 230000008569 process Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 2
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000004886 process control Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4812—Task transfer initiation or dispatching by interrupt, e.g. masked
- G06F9/4831—Task transfer initiation or dispatching by interrupt, e.g. masked with variable priority
- G06F9/4837—Task transfer initiation or dispatching by interrupt, e.g. masked with variable priority time dependent
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Communication Control (AREA)
Abstract
本公开实施例提出了一种信号量功能实现方法、装置以及计算机可读存储介质,该方法包括:用户线程调用用户空间的信号量接口函数,当信号量接口函数向信号量管理线程发送进程间通信IPC消息后,所述用户线程被阻塞;当信号量管理线程接收到IPC消息后,所述信号量管理线程调用与所述IPC消息的消息类型对应的处理函数,被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数,并唤醒被阻塞的用户线程。本发明公开的方法、装置以及计算机可读存储介质实现了基于微内核操作系统的PLC控制器的信号量功能。
Description
技术领域
本公开涉及计算机领域,尤其涉及信号量功能实现方法和装置。
背景技术
PLC控制器广泛应用于过程控制领域,提高PLC控制器的安全性意义重大。和利时公司基于国产MIPS架构处理器研发了高安全的微内核操作系统内核(简称微内核),该微内核运行在内核空间。和利时公司基于该微内核开发了PLC控制器软件,该PLC控制器软件运行在用户空间。
对于运行在用户空间的PLC软件,信号量功能是系统必须提供的一个基本功能。PLC软件使用信号量来实现多个线程并发时的进程间通信,全局数据访问保护,线程间同步等功能。信号量功能通常由运行在内核空间的内核实现,例如linux、vxworks等。对于微内核系统,内核没有提供信号量功能。
发明内容
本公开实施例提供了一种信号量功能实现方法,包括:
用户线程调用用户空间的信号量接口函数,当信号量接口函数向信号量管理线程发送进程间通信IPC消息后,所述用户线程被阻塞;
当信号量管理线程接收到IPC消息后,所述信号量管理线程调用与所述IPC消息的消息类型对应的处理函数,被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数,并唤醒被阻塞的用户线程。
一种示例性的实施例中,当所述消息类型为请求信号量时,所述被调用的信号量接口函数为用于请求信号量的接口函数;所述IPC消息包括信号量的值和请求信号量的用户线程的标识ID;
所述消息类型对应的处理函数为用于生成信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量的用户线程的ID和信号量的值;
为请求信号量的用户线程生成信号量,设置信号量标识ID并给所述信号量赋值;
生成包含所述信号量ID和请求信号量的线程ID的IPC应答消息,返回给所述用于请求信号量的接口函数。
一种示例性的实施例中,当所述消息类型为尝试获取信号量时;所述被调用的信号量接口函数为用于尝试获取信号量的接口函数;所述IPC消息包括信号量标识ID;
所述消息类型对应的处理函数为用于分配信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量ID;
检查所述信号量ID对应的信号量的值;
当所述信号量ID对应的信号量的值大于0时,将该信号量的值减1,并生成包含信号量分配成功的IPC应答消息,返回给所述用于尝试获取信号量的接口函数;
当所述信号量ID对应的信号量的值小于或等于0时,生成包含信号量分配失败的IPC应答消息,返回给所述用于尝试获取信号量的接口函数。
一种示例性的实施例中,当所述消息类型为等待信号量时;所述被调用的接口函数为用于等待信号量的接口函数;所述IPC消息还包括信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
所述消息类型对应的处理函数为用于等待信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
检查所述信号量ID对应的信号量的值;
当信号量的值大于0时,将该信号量的值减1,生成包括信号量ID和等待成功的IPC应答消息,返回给所述用于等待信号量的接口函数以唤醒所述用户线程;
当信号量的值小于或等于0时,记录等待该信号量的用户线程的ID和timeout;
每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时,如果超时则生成包括等待失败的IPC应答消息,返回给所述用于等待信号量的接口函数。
一种示例性的实施例中,当所述消息类型为释放信号量时;所述被调用的接口函数为用于释放信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于释放信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
将所述信号量ID对应的信号量的值加1;
当判断存在等待该信号量的用户线程时,将该信号量的值减1,并唤醒等待该信号量的用户线程,直到检查完队列里的所有等待该信号量的用户线程或者该信号量的值为0为止;
生成包含释放信号量成功的IPC应答消息,返回给所述用于释放信号量的接口函数;
当释放信号量失败时,生成包含释放信号量失败的IPC应答消息,返回给所述用于释放信号量的接口函数。
一种示例性的实施例中,当所述消息类型为关闭信号量时;所述被调用的接口函数为用于关闭信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于关闭信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
查找到所有正在等待该信号量的线程并删除;
释放该信号量占用的资源;
当释放资源成功时,生成包括所有等待该信号量的用户线程的ID以及关闭信号量成功的IPC应答消息,返回给所述用于关闭信号量的接口函数以唤醒被删除的用户线程;
当释放资源失败时,生成包含关闭信号量失败的IPC应答消息,返回给所述用于关闭信号量的接口函数。
一种示例性的实施例中,所述用户空间的信号量管理线程的优先级低于初始线程且高于用户空间中任何其他使用信号量的线程的优先级。
一种示例性的实施例中,所述每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时包括:
每当发生定时器事件时,通过所述用户线程对应的计数值tick,判断所述用户线程是否超时;用户线程对应的tick的初始值为该用户线程的timeout;
其中,当定时器为固定时间定时器时,每当发生定时器事件时将tick的值减去第一预设时间得到当前tick的值;
当定时器为动态时间定时器时,每当发生定时器事件时将tick的值减去第二预设时间得到当前tick的值;
其中,第二预设时间是根据等待任一信号量的用户线程的timeout中,最小的非0的timeout确定;所述第一预设时间和第二预设时间为系统发出定时器事件消息的时间。
一种示例性的实施例中,所述信号量通过信号量数组保存;
其中,信号量数组包括多个信号量元素;每个信号量元素各自对应一个信号量;
每个信号量元素的数据结构包括信号量ID、信号量的值和等待线程链表;其中,等待线程链表包括N个等待该信号量元素对应的信号量的用户线程的信息,每个用户线程的信息的数据结构包括该用户线程的ID、超时时间timeout和时钟计数tick;所述tick的初始值为所述timeout,其中,N为自然数。
一种示例性的实施例中,每当发生定时器事件时,遍历信号量数组,并分别根据所遍历到的每个信号量元素进行相应处理,包括:
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick已小于或等于0时,唤醒该等待线程,并将信号量的值减1;其中,一个信号量元素的等待线程是指等待该信号量元素对应的信号量的一个或多个用户线程;
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick减去预设时间后的值小于或等于0时,对等待线程进行超时处理;
其中,进行超时处理包括将超时的等待线程从等待线程链表中删除,将超时结果填充到IPC应答消息中,并唤醒该线程。
本公开实施例还提供了一种信号量功能实现装置,包括:存储器和处理器;
所述存储器,设置为保存用于信号量功能实现的程序;
所述处理器,设置为读取所述用于信号量功能实现的程序,执行上述信号量功能实现方法。
本公开实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时上述的信号量功能实现方法。
本公开实施例提供的信号量功能实现方法、装置及计算机可读存储介质,实现了基于微内核操作系统的PLC控制器的信号量功能。
附图说明
图1为本公开实施例的信号量功能实现方法的示意图。
图2为本公开实施例的PLC控制器结构框图。
图3为本公开实施例的信号量使用方法示例。
图4为本公开实施例的信号量管理线程的流程图示例。
图5为本公开实施例的信号量管理线程内部数据结构图示例。
图6为本公开实施例的信号量管理线程的优先级设置图示例。
图7为本公开实施例的信号量功能实现装置的示意图。
具体实施方式
下文中将结合附图对本公开的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
图1为本公开实施例的信号量功能实现方法的示意图,如图1所示,本实施例的信号量功能实现方法包括:
S11、用户线程调用用户空间的信号量接口函数,当信号量接口函数向信号量管理线程发送进程间通信IPC消息后,所述用户线程被阻塞;
S12、当信号量管理线程接收到IPC消息后,所述信号量管理线程调用与所述IPC消息的消息类型对应的处理函数;
S13、被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数,并唤醒被阻塞的用户线程。
一种示例性的实施例中,当所述消息类型为请求信号量时,所述被调用的信号量接口函数为用于请求信号量的接口函数;所述IPC消息包括信号量的值和请求信号量的用户线程的标识ID;
所述消息类型对应的处理函数为用于生成信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量的用户线程的ID和信号量的值;
为请求信号量的用户线程生成信号量,设置信号量标识ID并给所述信号量赋值;
生成包含所述信号量ID和请求信号量的线程ID的IPC应答消息,返回给所述用于请求信号量的接口函数。
其中,信号量管理线程运行在用户空间,为本公开实施例创建的线程。
一种示例性的实施例中,例如信号量管理线程内部维护着一个信号量数组SemArray,在应用请求信号量时,从数组中空闲的项目中获取一个位置,并将该位置的索引SemIndex和一个MAGIC数字组合成一个4字节的数值作为信号量ID返回。信号量ID的计算方法如下:
信号量ID=MAGIC||SemIdex,MAGIC为数字0x53450000,SemIdex的值的范围为数字0到0xFFFF,并且小于信号量SemArray数组的元素个数。
一种示例性的实施例中,当所述消息类型为尝试获取信号量时;所述被调用的信号量接口函数为用于尝试获取信号量的接口函数;所述IPC消息包括信号量标识ID;
所述消息类型对应的处理函数为用于分配信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量ID;
检查所述信号量ID对应的信号量的值;
当所述信号量ID对应的信号量的值大于0时,将该信号量的值减1,并生成包含信号量分配成功的IPC应答消息,返回给所述用于尝试获取信号量的接口函数;
当所述信号量ID对应的信号量的值小于或等于0时,生成包含信号量分配失败的IPC应答消息,返回给所述用于尝试获取信号量的接口函数。
一种示例性的实施例中,当所述消息类型为等待信号量时;所述被调用的接口函数为用于等待信号量的接口函数;所述IPC消息还包括信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
所述消息类型对应的处理函数为用于等待信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
检查所述信号量ID对应的信号量的值;
当信号量的值大于0时,将该信号量的值减1,生成包括信号量ID和等待成功的IPC应答消息,返回给所述用于等待信号量的接口函数以唤醒所述用户线程;
当信号量的值小于或等于0时,记录等待该信号量的用户线程的ID和timeout;
每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时,如果超时则生成包括等待失败的IPC应答消息,返回给所述用于等待信号量的接口函数。
一种示例性的实施例中,当所述消息类型为释放信号量时;所述被调用的接口函数为用于释放信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于释放信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
将所述信号量ID对应的信号量的值加1;
当判断存在等待该信号量的用户线程时,将该信号量的值减1,并唤醒等待该信号量的用户线程,直到检查完队列里的所有等待该信号量的用户线程或者该信号量的值为0为止;
生成包含释放信号量成功的IPC应答消息,返回给所述用于释放信号量的接口函数;
当释放信号量失败时,生成包含释放信号量失败的IPC应答消息,返回给所述用于释放信号量的接口函数。
一种示例性的实施例中,当所述消息类型为关闭信号量时;所述被调用的接口函数为用于关闭信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于关闭信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
查找到所有正在等待该信号量的线程并删除;
释放该信号量占用的资源;
当释放资源成功时,生成包括所有等待该信号量的用户线程的ID以及关闭信号量成功的IPC应答消息,返回给所述用于关闭信号量的接口函数以唤醒被删除的用户线程;
当释放资源失败时,生成包含关闭信号量失败的IPC应答消息,返回给所述用于关闭信号量的接口函数。
一种示例性的实施例中,所述用户空间的信号量管理线程的优先级低于初始线程且高于用户空间中任何其他使用信号量的线程的优先级。例如,信号管理线程的优先级高于其他调用信号量接口函数的线程。一般情况下,信号量管理线程的优先级应设置的尽可能高。
一种示例性的实施例中,所述每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时包括:
每当发生定时器事件时,通过所述用户线程对应的计数值tick,判断所述用户线程是否超时;用户线程对应的tick的初始值为该用户线程的timeout;
其中,当定时器为固定时间定时器时,每当发生定时器事件时将tick的值减去第一预设时间得到当前tick的值;
当定时器为动态时间定时器时,每当发生定时器事件时将tick的值减去第二预设时间得到当前tick的值;
其中,第二预设时间是根据等待任一信号量的用户线程的timeout中,最小的非0的timeout确定;所述第一预设时间和第二预设时间为系统发出定时器事件消息的时间。例如,第一预设时间可以为1毫秒,第二预设时间可以为3毫秒。
一种示例性的实施例中,其特征在于,所述信号量通过信号量数组保存;
其中,信号量数组包括多个信号量元素;每个信号量元素各自对应一个信号量;
每个信号量元素的数据结构包括信号量ID、信号量的值和等待线程链表;其中,等待线程链表包括N个等待该信号量元素对应的信号量的用户线程的信息,每个用户线程的信息的数据结构包括该用户线程的ID、超时时间timeout和时钟计数tick;所述tick的初始值为所述timeout,其中,N为自然数。
一种示例性的实施例中,每当发生定时器事件时,遍历信号量数组,并分别根据所遍历到的每个信号量元素进行相应处理,包括:
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick已减至小于或等于0到时时,唤醒该等待线程,并将信号量的值减1;其中,一个信号量元素的等待线程是指等待该信号量元素对应的信号量的一个或多个用户线程;
当信号量的ID不为0、等待线程的所述timeout为0时,由于该线程为永不超时等待线程,不做处理;
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick减去预设时间后的值小于或等于0时,对等待线程进行超时处理;
当信号量的ID为0,该信号量为空闲信号量,等待线程必为空,不做处理;
其中,进行超时处理包括将超时的等待线程从等待线程链表中删除,将超时结果填充到IPC应答消息中,并唤醒该线程。
下面结合基于微内核操作系统的运行在用户空间的信号量功能实现方法对上述的信号量功能实现方法及装置的具体应用进行详细说明。
本公开实施例包括信号量管理线程(简称sem_task)和软件接口两部分。信号量管理线程对应图2PLC控制器结构框图之部件18信号量管理线程,软件接口对应图2PLC控制器结构框图之部件22软件接口。
本公开实施例的信号量管理线程(sem_task)运行在用户空间。一般操作系统均在内核空间实现信号量功能,该微内核操作系统没有提供获取内核信息的途径;在内核中增加信号量功能的系统调用会破坏微内核的架构。因此设计了一种能够运行在用户空间的信号量功能实现方法。本公开实施例所设计的信号量管理线程和软件接口两部分均在用户空间运行。
本公开实施例的信号量使用方法对应图3。用户线程调用信号量接口函数,信号量接口函数通过内核提供的线程间通信机制IPC功能,将消息发送给信号量管理线程,然后阻塞等待执行结果。信号量管理线程收到消息后做相应的处理,处理完毕后返回结果给被阻塞的用户线程并唤醒该线程,然后该线程可以继续执行。用户线程可以有若干个,并且可以同时调用信号量接口函数,即这些接口函数是可重入的。线程间的通信机制由内核提供。
本公开实施例的信号量管理线程,负责完成分配信号量资源、尝试获取信号量、等待信号量、释放信号量、释放信号量资源等功能。
本公开实施例所指的软件接口,对应图2PLC控制器结构框图之部件22软件接口模块中的信号量接口函数。本公开实施例在原有的软件接口模块中增加了信号量功能的接口函数,该函数运行在用户空间。该函数可以由有需要的应用软件调用。软件接口有五个函数:请求信号量接口函数os_api_sem_create,尝试获取信号量接口函数os_api_sem_try,等待信号量接口函数os_api_sem_wait,释放信号量接口函数os_api_sem_post,关闭信号量接口函数os_api_sem_free。函数定义如下:
int os_api_sem_create(int initvalue,int maxvalue);
函数说明:
参数:initvalue表示信号量的初始值,maxvalue为信号量的最大取值;
返回值:为信号量的标识ID,如果失败返回0
int os_api_sem_try(int sem);
函数说明:
参数:sem表示信号量ID
返回值:成功返回0,失败返回-1
int os_api_sem_wait(int sem,unsigned int timeout);
函数说明:
参数:sem表示信号量ID,timeout表示等待的时间,timeout为0表示一直等待
返回值:成功返回0,其他失败除超时失败外返回-1,超时失败时返回-2
int os_api_sem_post(int sem);
函数说明:
参数:sem表示信号量ID
返回值:成功返回0,失败返回-1
int os_api_sem_free(int sem);
函数说明:
参数:sem表示信号量ID
返回值:成功返回0,失败返回-1
本公开实施例所设计的sem_task线程如图4信号量管理线程流程图所示。sem_task线程由定时器事件消息和信号量接口消息驱动。
sem_task线程内部维护着一个信号量数组SemArray,在应用请求信号量时,从数组中空闲的项目中获取一个位置,并将该位置的索引SemIndex和一个MAGIC数字组合成一个4字节的数值作为信号量ID返回。信号量ID的计算方法如下:
信号量ID=MAGIC||SemIdex,MAGIC为数字0x53450000,SemIdex的值的范围为数字0到0xFFFF,并且小于信号量SemArray数组的元素个数。
sem_task线程的信号量数组的元素SemDataStruct的定义为:
SemID为该信号量的ID;
Value为信号量的值,随着信号量被获取或释放而减小或者增加,获取一次减小1,释放一次增加1;
Valuemax为信号量能达到的最大值,当value和valuemax的值相同时则不能再增大;
WaitThreadList为等待线程链表,将正在等待该信号量的线程的信息加入该链表;
sem_task信号量线程内部,对应每个信号量,维护着一个信号量等待线程链表,用于将需要等待到时的线程加入该等待线程。定时器到时时,会遍历线程链表,检查到有到时的线程时,会唤醒该线程(即当线程数据结构中的timeout值不为0,且tick值小于等于0时,到达超时时间,这时唤醒该线程并返回超时处理结果)。信号量等待链表WaitThreadList是一个等待线程数据结构组成的双向链表。等待线程数据结构的定义如下:
threadID为等待线程的ID,唯一标识等待的线程,信号量可以通过该值唤醒等待的线程。
timeout为等待线程设置的超时时间,该值为0时表示永不超时。
tick为信号量管理线程内部维护的一个时钟计数,用于计算是否到时,初始值等于timeout,每次减去预设时间。
Sem_task信号量管理线程内部的信号量SemArray数组,信号量数据结构SemDataStruct,等待线程链表SemWaitThreadList,等待线程SemWaitThread的关系见图5信号量管理线程内部数据结构图。
sem_task信号量管理线程,根据这个关系图,在定时器到时,会遍历所有信号量的等待线程链表,遍历的过程如下:
1、定时器到时时,从索引0处开始遍历信号量数组SemArray的每一项;
2、如果该信号量的SemID(信号量ID)不为0,则继续检查其value值,否则跳过该信号量,到步骤1检查下一项;
3、如果该信号量的value小于或等于0,则继续检查等待线程链表SemWaitThreadList,否则跳过该信号量,跳到步骤1;
4、遍历检查等待线程链表SemWaitThreadList的每一项,计算检查tick的值,如果超时,则做超时处理;没有超时,则继续下一项直到检查完毕;
5、直到信号量数组的最后一项,否则跳到步骤1
sem_task线程的定时器有两种实现方法,分别使用固定时间定时器和动态时间定时器,两种方法遍历过程相同,但计算信号量的等待线程的tick值的方法不同。
第一种方法,使用固定时间定时器,向系统注册一个1秒定时器,这样每1毫秒会受到一个定时器到时的时间。在定时器到时时遍历信号量数组以及信号量的等待线程链表;在计算tick值时,将tick减一,如果tick为0,则超时时间到,做超时处理。
第二种方法,使用动态时间定时器,内部计算一个超时时间,计算的方法为,检查所有信号量的线程等待队列,取其最小的非0的timeout值,作为要使用的定时器超时时间,向系统注册该时间。在定时器到时时遍历信号量数组以及信号量的等待线程链表;在计算tick值时,将tick减去注册的时间,如果tick小于等于0,则超时时间到,做超时处理。遍历完毕信号量数组以及信号量的等待线程链表后,重新计算动态时间定时器的超时时间,然后向系统更新注册的超时时间为新计算的值。
sem_task线程接到信号量接口消息后,针对不同的消息进行处理。
对于请求信号量消息,记录请求线程的线程ID(唯一标识了该线程,可以用于线程唤醒操作),分配信号量资源,赋初值和最大值,并返回一个可以唯一标识该信号量的标识ID给调用者;
对于尝试获取信号量消息,检查信号量的值,如果值大于0,则减一并返回给调用者;如果小于等于0,则返回-1。
对于等待信号量消息,检查信号量的值,如果值大于0,则减一并返回给调用者;如果小于等于0,则将该信号量加入等待队列,同时检查和计算队列里的信号量的等待时间并更新注册的定时器事件的时间,然后等待定时器事件处理。调用者此时因为阻塞停止执行,等待被唤醒。
对于释放信号量消息,将信号量的值加一,然后检查等待信号量队列,如果有等待该信号量的线程,则将该信号量减一并唤醒等待该信号量的线程,直到检查完队列里的所有与该信号量有关联的项目或者到该信号量已经减为0为止,然后返回处理结果给调用者。
对于关闭信号量消息,检查等待信号量队列,对于所有正在等待该信号量的线程返回-1,然后释放改信号量占用的资源,最后返回处理结果给调用者。
定时器事件在信号量管理线程通过注册系统的定时器接口实现。对于固定时间定时器,在信号量管理线程初始化时向系统注册一个1秒定时器;对于动态时间定时器,则是在信号量等待队列里加入了新的信号量等待线程后,重新计算并得到最近一次需要时间事件响应的时间,然后将该时间更新到定时器事件的中断响应里。sem_task线程接到定时器事件后,对信号量管理线程里的信号量等待队列进行检查,发现到时的信号量后,将等待该信号量的线程唤醒。
定时器事件的产生过程。通常情况下,操作系统都会提供定时器功能,我们的信号量功能的实现也要求操作系统具备这个功能。如果操作系统提供的定时器函数,可以在我们注册后会定时给我们的线程发时间到时的消息,则信号量管理线程可以在收到这个定时器事件消息后做相应处理。如果操作系统提供的是一个回调函数,则需要在回调函数中创建一个定时器事件消息发送给信号量管理线程,信号量管理线程在收到这个定时器事件消息后做相应处理。
由于微内核操作系统采用基于优先级的抢占式调度策略,共支持256个优先级,0代表最高优先级,255代表最低优先级。本公开实施例的sem_task线程优先级必须低于初始线程且必须高于用户空间的任何其它使用信号量线程的优先级。如果sem_task线程优先级比较低于使用者的线程优先级,会被这些用户空间的任务抢占,会导致信号量响应的精确度。在不影响系统功能的情况下,sem_task的优先级应设置的尽可能高。sem_task的优先级设置情况参见图6信号量管理线程的优先级设置图。
本公开实施例通过在用户空间创建了一个信号量管理线程(sem_task),并在用户空间实现了信号量的软件接口函数,实现了能够运行在用户空间的信号量功能,本公开实施例的基于微内核的用户空间的信号量功能,可以满足PLC控制器软件对于信号量的用户需求,基于该信号量功能可以实现互斥锁功能,并且可以扩展到基于该微内核的SMP系统。
图7为本公开实施例的信号量功能实现装置的示意图,如图7所示,本实施例的信号量功能实现装置包括:存储器和处理器;
所述存储器,设置为保存用于信号量功能实现的程序;
所述处理器,设置为读取执行上述的用于信号量功能实现的程序。
本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本公开不限制于任何特定形式的硬件和软件的结合。
以上仅为本公开的优选实施例,当然,本公开还可有其他多种实施例,在不背离本公开精神及其实质的情况下,熟悉本领域的技术人员当可根据本公开作出各种相应的改变和变形,但这些相应的改变和变形都应属于本公开所附的权利要求的保护范围。
Claims (12)
1.一种信号量功能实现方法,包括:
用户线程调用用户空间的信号量接口函数,当信号量接口函数向信号量管理线程发送进程间通信IPC消息后,所述用户线程被阻塞;
当信号量管理线程接收到IPC消息后,所述信号量管理线程调用与所述IPC消息的消息类型对应的处理函数,被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数,并唤醒被阻塞的用户线程。
2.如权利要求1所述的方法,其特征在于:
当所述消息类型为请求信号量时,所述被调用的信号量接口函数为用于请求信号量的接口函数;所述IPC消息包括信号量的值和请求信号量的用户线程的标识ID;
所述消息类型对应的处理函数为用于生成信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量的用户线程的ID和信号量的值;
为请求信号量的用户线程生成信号量,设置信号量标识ID并给所述信号量赋值;
生成包含所述信号量ID和请求信号量的线程ID的IPC应答消息,返回给所述用于请求信号量的接口函数。
3.如权利要求1所述的方法,其特征在于:
当所述消息类型为尝试获取信号量时;所述被调用的信号量接口函数为用于尝试获取信号量的接口函数;所述IPC消息包括信号量标识ID;
所述消息类型对应的处理函数为用于分配信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出请求信号量ID;
检查所述信号量ID对应的信号量的值;
当所述信号量ID对应的信号量的值大于0时,将该信号量的值减1,并生成包含信号量分配成功的IPC应答消息,返回给所述用于尝试获取信号量的接口函数;
当所述信号量ID对应的信号量的值小于或等于0时,生成包含信号量分配失败的IPC应答消息,返回给所述用于尝试获取信号量的接口函数。
4.如权利要求1所述的方法,其特征在于:
当所述消息类型为等待信号量时;所述被调用的接口函数为用于等待信号量的接口函数;所述IPC消息还包括信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
所述消息类型对应的处理函数为用于等待信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID、所述用户线程对应的超时时间timeout、所述用户线程的ID;
检查所述信号量ID对应的信号量的值;
当信号量的值大于0时,将该信号量的值减1,生成包括信号量ID和等待成功的IPC应答消息,返回给所述用于等待信号量的接口函数以唤醒所述用户线程;
当信号量的值小于或等于0时,记录等待该信号量的用户线程的ID和timeout;
每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时,如果超时则生成包括等待失败的IPC应答消息,返回给所述用于等待信号量的接口函数。
5.如权利要求1所述的方法,其特征在于:
当所述消息类型为释放信号量时;所述被调用的接口函数为用于释放信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于释放信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
将所述信号量ID对应的信号量的值加1;
当判断存在等待该信号量的用户线程时,将该信号量的值减1,并唤醒等待该信号量的用户线程,直到检查完队列里的所有等待该信号量的用户线程或者该信号量的值为0为止;
生成包含释放信号量成功的IPC应答消息,返回给所述用于释放信号量的接口函数;
当释放信号量失败时,生成包含释放信号量失败的IPC应答消息,返回给所述用于释放信号量的接口函数。
6.如权利要求1所述的方法,其特征在于:
当所述消息类型为关闭信号量时;所述被调用的接口函数为用于关闭信号量的接口函数;所述IPC消息还包括信号量ID;
所述消息类型对应的处理函数为用于关闭信号量的处理函数;所述被调用的处理函数执行相应的信号量处理功能后,根据处理结果构建IPC应答消息返回给所述被调用的信号量接口函数包括:
从所述IPC消息中解析出信号量ID;
查找到所有正在等待该信号量的线程并删除;
释放该信号量占用的资源;
当释放资源成功时,生成包括所有等待该信号量的用户线程的ID以及关闭信号量成功的IPC应答消息,返回给所述用于关闭信号量的接口函数以唤醒被删除的用户线程;
当释放资源失败时,生成包含关闭信号量失败的IPC应答消息,返回给所述用于关闭信号量的接口函数。
7.如权利要求1所述的方法,其特征在于:
所述用户空间的信号量管理线程的优先级低于初始线程且高于用户空间中任何其他使用信号量的线程的优先级。
8.如权利要求4所述的方法,所述每当发生定时器事件时,根据所述timeout判断所述用户线程是否超时包括:
每当发生定时器事件时,通过所述用户线程对应的计数值tick,判断所述用户线程是否超时;用户线程对应的tick的初始值为该用户线程的timeout;
其中,当定时器为固定时间定时器时,每当发生定时器事件时将tick的值减去第一预设时间得到当前tick的值;
当定时器为动态时间定时器时,每当发生定时器事件时将tick的值减去第二预设时间得到当前tick的值;
其中,第二预设时间是根据等待任一信号量的用户线程的timeout中,最小的非0的timeout确定;所述第一预设时间和第二预设时间为系统发出定时器事件消息的时间。
9.如权利要求1-8中任一项所述的方法,其特征在于,所述信号量通过信号量数组保存;
其中,信号量数组包括多个信号量元素;每个信号量元素各自对应一个信号量;
每个信号量元素的数据结构包括信号量ID、信号量的值和等待线程链表;其中,等待线程链表包括N个等待该信号量元素对应的信号量的用户线程的信息,每个用户线程的信息的数据结构包括该用户线程的ID、超时时间timeout和时钟计数tick;所述tick的初始值为所述timeout,其中,N为自然数。
10.如权利要求9所述的方法,其特征在于,还包括:
每当发生定时器事件时,遍历信号量数组,并分别根据所遍历到的每个信号量元素进行相应处理,包括:
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick已小于或等于0时,唤醒该等待线程,并将信号量的值减1;其中,一个信号量元素的等待线程是指等待该信号量元素对应的信号量的一个或多个用户线程;
当信号量的ID不为0、等待线程的所述timeout不为0以及等待线程的tick减去预设时间后的值小于或等于0时,对等待线程进行超时处理;
其中,进行超时处理包括将超时的等待线程从等待线程链表中删除,将超时结果填充到IPC应答消息中,并唤醒该线程。
11.一种信号量功能实现装置,包括:存储器和处理器;其特征在于:
所述存储器,设置为保存用于信号量功能实现的程序;
所述处理器,设置为读取所述用于信号量功能实现的程序,执行如权利要求1-10中任一项的信号量功能实现方法。
12.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-10中任一项所述的信号量功能实现方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011471392.1A CN112612582B (zh) | 2020-12-14 | 2020-12-14 | 信号量功能实现方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011471392.1A CN112612582B (zh) | 2020-12-14 | 2020-12-14 | 信号量功能实现方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112612582A true CN112612582A (zh) | 2021-04-06 |
CN112612582B CN112612582B (zh) | 2024-05-28 |
Family
ID=75233949
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011471392.1A Active CN112612582B (zh) | 2020-12-14 | 2020-12-14 | 信号量功能实现方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112612582B (zh) |
Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH1185546A (ja) * | 1997-09-12 | 1999-03-30 | Hitachi Ltd | 異種os上プロセス間通信方法 |
US20030060898A1 (en) * | 2001-09-26 | 2003-03-27 | International Business Machines Corporation | Flow lookahead in an ordered semaphore management subsystem |
CN1991767A (zh) * | 2005-12-27 | 2007-07-04 | 三菱电机株式会社 | 信号量管理方法和信号量管理程序 |
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN101674326A (zh) * | 2009-09-21 | 2010-03-17 | 中兴通讯股份有限公司 | 进程间同步通信实现方法及代理单元 |
CN102622271A (zh) * | 2003-12-31 | 2012-08-01 | 英特尔公司 | 用于多线程处理的使用信号量的方法和设备 |
CN102780613A (zh) * | 2012-06-19 | 2012-11-14 | 瑞斯康达科技发展股份有限公司 | 一种分布式设备板间通信的方法与装置 |
EP3056991A1 (en) * | 2015-02-13 | 2016-08-17 | Honeywell International Inc. | Apparatus and method for managing a plurality of threads in an operating system |
CN106293634A (zh) * | 2015-05-13 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 数据处理的方法及系统 |
CN106681836A (zh) * | 2016-12-28 | 2017-05-17 | 华为技术有限公司 | 一种信号量的创建方法及装置 |
CN107678867A (zh) * | 2017-09-26 | 2018-02-09 | 武汉斗鱼网络科技有限公司 | 一种进行远程过程调用的方法及装置 |
CN108427640A (zh) * | 2018-01-25 | 2018-08-21 | 南京翼辉信息技术有限公司 | 一种在用户态下调试驱动程序的方法 |
CN110058592A (zh) * | 2019-04-25 | 2019-07-26 | 重庆大学 | 一种移动机器人控制方法 |
US20200034212A1 (en) * | 2018-07-24 | 2020-01-30 | EMC IP Holding Company LLC | Synchronization object prioritization systems and methods |
CN111258684A (zh) * | 2020-01-22 | 2020-06-09 | 北京和利时系统工程有限公司 | 一种控制方法和装置 |
-
2020
- 2020-12-14 CN CN202011471392.1A patent/CN112612582B/zh active Active
Patent Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH1185546A (ja) * | 1997-09-12 | 1999-03-30 | Hitachi Ltd | 異種os上プロセス間通信方法 |
US20030060898A1 (en) * | 2001-09-26 | 2003-03-27 | International Business Machines Corporation | Flow lookahead in an ordered semaphore management subsystem |
CN102622271A (zh) * | 2003-12-31 | 2012-08-01 | 英特尔公司 | 用于多线程处理的使用信号量的方法和设备 |
CN1991767A (zh) * | 2005-12-27 | 2007-07-04 | 三菱电机株式会社 | 信号量管理方法和信号量管理程序 |
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN101674326A (zh) * | 2009-09-21 | 2010-03-17 | 中兴通讯股份有限公司 | 进程间同步通信实现方法及代理单元 |
CN102780613A (zh) * | 2012-06-19 | 2012-11-14 | 瑞斯康达科技发展股份有限公司 | 一种分布式设备板间通信的方法与装置 |
EP3056991A1 (en) * | 2015-02-13 | 2016-08-17 | Honeywell International Inc. | Apparatus and method for managing a plurality of threads in an operating system |
CN106293634A (zh) * | 2015-05-13 | 2017-01-04 | 阿里巴巴集团控股有限公司 | 数据处理的方法及系统 |
CN106681836A (zh) * | 2016-12-28 | 2017-05-17 | 华为技术有限公司 | 一种信号量的创建方法及装置 |
CN107678867A (zh) * | 2017-09-26 | 2018-02-09 | 武汉斗鱼网络科技有限公司 | 一种进行远程过程调用的方法及装置 |
CN108427640A (zh) * | 2018-01-25 | 2018-08-21 | 南京翼辉信息技术有限公司 | 一种在用户态下调试驱动程序的方法 |
US20200034212A1 (en) * | 2018-07-24 | 2020-01-30 | EMC IP Holding Company LLC | Synchronization object prioritization systems and methods |
CN110058592A (zh) * | 2019-04-25 | 2019-07-26 | 重庆大学 | 一种移动机器人控制方法 |
CN111258684A (zh) * | 2020-01-22 | 2020-06-09 | 北京和利时系统工程有限公司 | 一种控制方法和装置 |
Non-Patent Citations (4)
Title |
---|
M. EMMANUEL: ""Approach for debugging in a single session GDB"", 《2007 IET-UK INTERNATIONAL CONFERENCE ON INFORMATION AND COMMUNICATION TECHNOLOGY IN ELECTRICAL SCIENCES (ICTES 2007)》, 30 December 2008 (2008-12-30) * |
萧美阳;叶晓俊;: "并发控制实现方法的比较研究", 计算机应用研究, no. 06, 10 June 2006 (2006-06-10) * |
许庆春: ""Ethernut技术的研究与应用"", 《中国优秀硕士学位论文全文数据库信息科技辑》, 15 September 2008 (2008-09-15) * |
高罗卿;庄源昌;: "基于LWIP协议的嵌入式远程监控终端的研发与实现", 电气自动化, no. 01, 30 January 2015 (2015-01-30) * |
Also Published As
Publication number | Publication date |
---|---|
CN112612582B (zh) | 2024-05-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Hohmuth et al. | Pragmatic Nonblocking Synchronization for Real-Time Systems. | |
US8161453B2 (en) | Method and apparatus for implementing task management of computer operations | |
Meghanathan | A survey of contemporary real-time operating systems | |
EP0767938B1 (en) | Method for enforcing a hierarchical invocation structure in real time asynchronous software applications | |
US5991790A (en) | Generation and delivery of signals in a two-level, multithreaded system | |
US6687903B1 (en) | Inhibiting starvation in a multitasking operating system | |
Drepper | Futexes are tricky | |
Rivas et al. | POSIX-compatible application-defined scheduling in MaRTE OS | |
US20040117793A1 (en) | Operating system architecture employing synchronous tasks | |
US8769546B2 (en) | Busy-wait time for threads | |
US20020178208A1 (en) | Priority inversion in computer system supporting multiple processes | |
US6662364B1 (en) | System and method for reducing synchronization overhead in multithreaded code | |
Caccamo et al. | Sharing resources among periodic and aperiodic tasks with dynamic deadlines | |
Spliet et al. | Fast on average, predictable in the worst case: Exploring real-time futexes in LITMUSRT | |
Lee et al. | Implementing priority inheritance semaphore on uC/OS real-time kernel | |
CN112612582B (zh) | 信号量功能实现方法和装置 | |
Podzimek | Read-copy-update for opensolaris | |
Arnold et al. | Design of tightly-coupled multiprocessing programming | |
Lee et al. | Interrupt handler migration and direct interrupt scheduling for rapid scheduling of interrupt-driven tasks | |
Rothberg | Interrupt handling in Linux | |
Parmer et al. | Predictable and configurable component-based scheduling in the Composite OS | |
CN114327828B (zh) | 一种共享数据的无锁并发访问方法、装置、设备及介质 | |
US7788529B2 (en) | Method for safely interrupting blocked work in a server | |
Takada et al. | Inter-and intra-processor synchronizations in multiprocessor real-time kernel | |
Sánchez et al. | Distributed priority inheritance for real-time and embedded systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20211129 Address after: Room 1613, 6 / F, building 1, yard 2, Desheng Middle Road, Beijing Economic and Technological Development Zone, Daxing District, Beijing 100176 Applicant after: Beijing Helishi Control Technology Co.,Ltd. Address before: 100176 courtyard 2, Disheng Middle Road, Beijing Economic and Technological Development Zone, Daxing District, Beijing Applicant before: BEIJING HOLLYSYS Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |