CN106681836A - 一种信号量的创建方法及装置 - Google Patents
一种信号量的创建方法及装置 Download PDFInfo
- Publication number
- CN106681836A CN106681836A CN201611239233.2A CN201611239233A CN106681836A CN 106681836 A CN106681836 A CN 106681836A CN 201611239233 A CN201611239233 A CN 201611239233A CN 106681836 A CN106681836 A CN 106681836A
- Authority
- CN
- China
- Prior art keywords
- thread
- echo signal
- signal amount
- semaphore
- value
- 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
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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Storage Device Security (AREA)
Abstract
本发明实施例提供了一种信号量的创建方法及装置。该方法由计算机中的处理器执行,计算机还包括存储器,存储器中保存多个能被用户态线程或者内核态线程访问的信号量。当线程访问数据时,根据线程待访问数据的信号量的目标名称,查询存储器是否包含名称与目标名称相同的信号量,如果存储器不包含名称与目标名称相同的信号量,表明存储器没有线程待访问数据的信号量,则选择一个名称为空的目标信号量,将目标信号量的名称定义为目标名称,以创建待访问数据的目标信号量。该目标信号量是对用户态线程和内核态线程都可见的信号量,以避免这两种类型的线程对数据的并发访问发生冲突。
Description
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种信号量的创建方法及装置。
背景技术
多线程并发访问的信号量机制分为两类,一类是采用用户态的信号量同步机制,多个用户态线程竞争申请用户态的信号量,保证多个用户态线程并发访问数据时的顺序访问。另一类是采用内核态的信号量同步机制,多个内核态线程申请内核态的信号量,保证多个内核态线程并发访问数据时的顺序访问。
申请用户态的信号量需要跨态操作,即需要调用操作系统提供的操作接口,将用户态线程的运行环境从用户态修改为内核态后,在内核态的运行环境中申请用户态的信号量,实现数据的访问。如果内核态线程同时访问该数据,内核态线程在内核态的运行环境中,申请内核态的信号量,实现对该数据的访问。由于内核态的信号量和用户态的信号量都可以标识该数据,上述两个信号量在内核态运行环境中的操作是独立的,因此无论内核态线程还是用户态线程对于信号量的操作对于对方是不可见的。那么,这两种类型的线程对数据的并发访问就会发生冲突。
发明内容
本发明公开了一种信号量的创建方法及装置,以创建能被用户态线程和内核态线程共同访问的信号量,以避免所述用户态线程和内核态线程并发访问数据时发生冲突。
第一方面提供一种信号量的创建方法,该方法由计算机的处理器执行。所述计算机还包括存储器,所述存储器中保存有一个或多个信号量,每个信号量具有唯一的名称或名称为空,所述存储器中保存的每个信号量为能被用户态线程或者内核态线程访问的信号量。当第一线程待访问数据时,所述第一线程可以是用户态线程,也可以是内核态线程。所述处理器执行所述第一线程的具体步骤是:获取待访问数据的信号量的目标名称,根据所述目标名称,查询所述存储器是否包含名称与所述目标名称相同的信号量。当所述存储器不包含名称与所述目标名称相同的信号量时,表明存储器没有供用户态线程和内核态线程共同访问所述数据的信号量。那么,处理器选择一个名称为空的目标信号量,将所述目标信号量的名称定义为所述目标名称,以创建待访问数据的目标信号量。
在本申请中,用户态线程或者内核态线程访问数据时,都可以根据待访问的数据的信号量的目标名称,查询计算机中是否包含能被所述用户态线程和内核态线程共同访问的信号量。如果没有,则选择一个名称为空的目标信号量,将其名称定义为所述目标名称。由此创建一个可被所述用户态线程和所述内核态线程共同访问的信号量,以避免所述用户态线程和内核态线程并发访问数据时发生冲突。
在第一方面的第一种实现方式中,所述目标名称是在访问数据的函数中预先定义的,当所述第一线程需要访问数据时,处理器执行所述访问数据的函数,根据访问数据的函数中定义的所述目标名称,查询存储器是否包含与所述目标名称相同的信号量。
结合第一方面或第一方面的第一种实现方式,在第二种实现方式中,创建了所述目标信号量之后,用户态线程或者内核态线程访问所述数据之前,需要申请控制所述数据的目标信号量。具体的,其申请方式是查询所述目标信号量的状态参数,所述状态参数的值表示所述目标信号量处于空闲状态或者占用状态。当所述状态参数的值表示所述目标信号量处于空闲状态时,表明所述目标信号量没有被其他线程占用,所以第一线程可以访问该目标信号量控制的数据。
结合第一方面的第二种实现方式,在第三种实现方式中,当根据所述状态参数的值查询到所述目标信号量处于空闲状态,修改所述状态参数的值,所述修改后的状态参数的值表示所述目标信号量处于占用状态,目的是向竞争申请目标信号量的其他线程证明该目标信号量当前处于被所述第一线程占用的状态,其他线程不能申请该目标信号量,以保证竞争申请目标信号量的线程有序地申请目标信号量。
结合第一方面的第三种实现方式,在第四种实现方式中,所述第一线程创建了该目标信号量之后,如果第二线程也需要访问所述数据,在竞争申请目标信号量之前,需要查找目标信号量。具体的,查找方式为获取所述目标名称,根据所述目标名称,查询所述存储器是否包含名称与所述目标名称相同的信号量。如果查找到所述存储器包含名称与所述目标名称相同的信号量,则该目标信号量可以被不是创建该目标信号量的第二线程访问。第二线程是所述两种类型的线程的其中一种,且与所述第一线程的类型不同。当第一线程是用户态线程时,第二线程是内核态线程,当第一线程为内核态线程时,第二线程为用户态线程,实现了内核态线程和用户态线程对于目标信号量的申请等操作对于对方是可见的。如果查找到所述存储器包含名称与所述目标名称相同的信号量,并且所述目标信号量的名称为所述目标名称时,所述第二线程可以同所述第一线程竞争申请该目标信号量。具体的,所述第二线程申请目标信号量的方法为查询所述状态参数。确定所述状态参数的值表示所述目标信号量处于占用状态时,表明该目标信号量当前处于被占用的状态,第二线程不能申请该目标信号量,因此第二线程停止访问所述数据。通过查询状态参数,确定该目标信号量当前的状态,所以目标信号量被第一线程申请成功与否,对于竞争申请目标信号量的第二线程是可见的,进而避免用户态线程和内核态线程并发访问数据时发生冲突。
结合第一方面的第二种至第四种实现方式中的任一种实现方式,在第五种实现方式中,查询状态参数之前,为防止参与竞争的其他线程或计算机中断、异常等进程对目标信号量的状态参数的值进行修改,对目标信号量进行加锁保护。加锁方式为查询所述目标信号量的锁保护参数;所述锁保护参数的值表示所述目标信号量处于加锁状态或者空锁状态。当所述锁保护参数的值表示所述目标信号量处于空锁状态时,修改所述锁保护参数的值;所述修改后的锁保护参数的值表示所述目标信号量处于加锁状态。加锁保护之后,再查询目标信号量的状态参数,保证当前采用加锁保护的线程可以查询目标信号量的状态参数。
结合第一方面或者第一方面的第一种至第五种实现方式中的任一种实现方式,在第六种实现方式中,创建目标信号量之后,通过目标信号量的引用次数确认需要申请目标信号量的线程的数量。如果没有线程申请目标信号量,则关闭目标信号量。具体为,在创建目标信号量之后,以及查询状态参数之前,对目标信号量的引用次数的初始值进行预设粒度的加法计数。访问数据之后,对引用次数进行同等预设粒度的减法计数,然后查询所述目标信号量的引用次数是否为初始值,如果为初始值,则初始化所述目标信号量。初始化所述目标信号量的过程为将目标信号量的名称赋值为空,修改状态参数的值,修改后的状态参数的值表示信号量处于空闲状态。如果对目标信号量采用加锁保护,还需修改所述目标信号量的锁保护参数的值,修改后的锁保护参数的值表示信号量处于空锁状态。
第二方面提供一种信号量的创建装置,所述创建装置位于计算机中,所述创建装置用于实现第一方面的方法或第一方面的任意一种实现方式的中处理器执行的功能,所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。
第三方面,本发明实施例提供一种计算机,包括存储器和处理器,所述存储器,用于保存一个或多个信号量,每个信号量具有唯一的名称或名称为空,所述每个信号量为能被两种类型的线程访问的信号量,所述两种类型的线程包括用户态线程和内核态线程。所述处理器用于执行第一方面或者第一方面的任意一种实现方式提供的方法。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的计算机的架构图;
图2为本发明实施例提供的用户态进程运行时的运行环境示意图;
图3为本发明实施例公开的用户态线程L1访问数据124的方法流程图;
图4为本发明实施例提供的内核态线程L2访问数据124的方法流程图;
图5为本发明实施例提供的一种信号量的创建装置的结构图。
具体实施方式
请参见图1,图1为本发明实施例提供的计算机的架构图。如图1所示,计算机包括处理器110、存储器120和通信总线130。处理器110与存储器120通过通信总线130进行通信。
存储器120用于存储程序121,程序121包括多个应用程序122和操作系统(英文:operating system,OS)123,应用程序122是指为完成某项或多项特定供作的计算机程序,它运行在用户空间,可以和用户进行交互,具有可视的用户界面。操作系统123是管理计算机硬件与软件资源的计算机程序,运行在内核空间,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。对于不同的程序,程序的运行环境区分为用户态和内核态,应用程序122运行在低的特权级别时,所处的运行环境为用户态,不能直接访问内核空间和计算机硬件,应用程序122运行在高的特权级别时,所处的运行环境为内核态,可以访问内核空间和计算机硬件。操作系统123的运行环境为内核态。应用程序122在用户态的运行环境中开始运行,其运行至结束的过程为用户态进程。每一个用户态进程运行时,包括若干个独立的线程。在用户态的运行环境中运行的线程为用户态线程,在内核态的运行环境中运行的线程为内核态线程。
存储器120还存储了计算机允许用户态线程和内核态线程共同访问的数据124。操作系统123包括若干个对信号量进行操作的函数例如,创建信号量的函数、申请信号量的函数、释放信号量的函数,关闭信号量的函数和唤醒信号量的等待队列中的线程的唤醒函数。信号量为在多个线程并发访问数据124时使用的一种保护机制,在线程访问数据124之前,所述线程必须获得一个目标信号量,目标信号量是指向该数据124的信号量,没有获得该目标信号量的线程不允许访问该数据124,进而通过目标信号量保证数据124不被并发调用。在计算机启动加载驱动程序进行初始化的过程中,申请存储器120中的存储空间,存储一个或多个信号量,然后对每一个信号量进行初始化,将每一个信号量的名称赋值为空。初始化结束后,允许内核态线程和用户态线程共同访问存储器120中存储信号量的存储空间,以创建、申请或者使用目标信号量。
所述创建信号量的函数用于根据目标名称,查询存储器120是否包含名称与目标名称相同的信号量,当所述存储器120中不包含名称与所述目标名称相同的信号量时,创建目标信号量,所述目标信号量的名称为所述目标名称。申请信号量的函数用于查询所述目标信号量的状态参数,根据不同的状态参数,确认目标信号量处于空闲状态还是占用状态。申请信号量的函数还用于当查询到所述目标信号量处于空闲状态时的状态参数,将所述目标信号量的状态参数的值修改为表示占用状态的状态参数的值。释放信号量的函数用于将所述目标信号量的状态参数的值修改为表示空闲状态的状态参数的值。关闭信号量的函数用于对所述目标信号量的引用次数进行自减1运算。由于有多个访问数据124的线程需要申请该目标信号量,通过引用次数可以确认有多少个线程要申请该目标信号量。每一个目标信号量的引用次数的初始值可以是0,表明没有线程准备申请该目标信号量,每一个线程申请该目标信号量之前,对目标信号量的引用次数进行自加1运算。对所述目标信号量的引用次数进行自减1运算之后,所述关闭信号量的函数还用于查询所述目标信号量的引用次数是否为初始值,如果为初始值,则初始化所述目标信号量,将目标信号量的名称赋值为空,将状态参数的值修改为表示空闲状态的状态参数的值,引用次数赋值为所述初始值。
在计算机启动加载驱动程序进行初始化的过程中,可以赋值每一个信号量的名称为空,初始化每一个信号量的状态参数为空闲状态。如果需要对申请的目标信号量的线程进行计数,在初始化过程中,还可以将每一个信号量的引用次数设置为初始值。
操作系统123还提供了系统调用层125。所述系统调用层125包括链表,所述链表包括为用户态线程提供的在内核态的运行环境中使用所述操作系统123中的每一个函数的操作接口,每一个操作接口标识和指向一个函数,通过该操作接口可以查找到所述操作系统123中的对应的函数。在初始化的过程中,操作系统123中会加载及保存包含若干个操作接口的链表。
用户态线程访问数据124时,通过系统调用层125,查找所述系统调用层125提供的所述链表从而获得对目标信号量进行操作的函数,对目标信号量进行操作,申请到目标信号量之后,再访问数据124。
存储器120包括易失性存储器,非易失性存储器或其组合。易失性存储器例如为随机访问存储器(英文:random-access memory,RAM)。非易失性存储器例如软盘、硬盘、固态硬盘(solid state disk,SSD)、光盘等各种可以存储程序代码的机器可读介质。
处理器110是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据。处理器110可能是一个中央处理器(英文:central processing unit,CPU),也可能是复杂可编程逻辑器件(英文:Complex Programmable Logic Device,CPLD)或者现场可编程门阵列(Field-Programmable Gate Array,FPGA)。
请参见图2,图2为本发明实施例提供的用户态进程运行时的运行环境示意图。如图2所示,为防止数据124被共享使用遭到破坏,用户态进程L中的用户态线程L1和内核态线程L2并发访问数据124时,对目标信号量210进行申请。申请到该目标信号量210的线程才可以访问数据124。未申请到该目标信号量210的线程,则被挂载到该目标信号量210的等待队列中,待其他线程访问数据124并释放该目标信号量210之后,再被唤醒。用户态线程L1和内核态线程L2也可以分别属于不同的用户态进程。
图2展示了用户态线程L1访问数据124时,申请到目标信号量210的过程。如图2所示,用户态线程L1需要先通过系统调用层125才可以申请目标信号量210,申请到目标信号量210后,才可以访问数据124。内核态线程L2访问数据124时申请目标信号量210的过程与用户态线程L1申请目标信号量210的过程不同。不同之处在于,内核态线程L2不需要通过系统调用层125,可直接操作目标信号量210。
下面结合图2所示的用户态进程L的应用场景,描述本发明实施例公开的用户态线程和内核态线程并发访问数据时创建、申请及使用目标信号量的方法。
请参见图3,图3为本发明实施例公开的用户态线程访问数据124的方法流程图。如图3所示,当用户态线程L1访问数据124时,处理器110执行以下步骤:
S310、根据目标名称,查询存储器120是否包含与所述目标名称相同的信号量。目标名称是预先设定的,且被用户态线程和内核态线程共同访问的信号量的名称。存储器120中保存有一个或多个信号量,每个信号量均能被用户态线程和内核态线程访问,并且每个信号量具有唯一的名称或名称为空。处理器110会查询系统调用层125中的链表,获取指向创建信号量的函数的操作接口,依据所述指向创建信号量的函数的操作接口查找到存储器120中的创建函数,执行所述创建函数。所述目标名称是访问数据124的函数中预先定义的,当线程预访问数据124时,处理器执行所述访问数据124的函数,根据访问数据124的函数中定义的所述目标名称,查询存储器120是否包含与所述目标名称相同的信号量。
S320、当所述存储器120不包含名称与所述目标名称相同的信号量时,创建目标信号量210,所述目标信号量210的名称为所述目标名称。所述目标信号量210的名称,用于唯一标识所述目标信号量210。
本实施方式中,用户态线程L1访问数据时,可以根据待访问的数据124的信号量的目标名称,查询计算机中是否包含能被所述用户态线程L1或者内核态线程L2共同访问的信号量。如果没有,则选择一个名称为空的目标信号量210,将其名称定义为所述目标名称。由此创建一个可被所述用户态线程L1或者内核态线程L2共同访问的目标信号量210,以避免所述用户态线程L1或者内核态线程L2并发访问数据124时发生冲突。
创建目标信号量210之后,并发访问数据124的用户态线程L1和内核态线程L2会竞争申请目标信号量210。下面描述用户态线程L1申请目标信号量210的申请过程,具体处理器110执行如下步骤:
S330、查询所述目标信号量210的状态参数。存储器120中的每个信号量都具有一个状态参数,所述状态参数用于表示信号量的使用状态。例如当状态参数的值为0时表示信号量处于空闲状态,当状态参数的值为1时表示信号量处于占用状态。处理器110会查询所述链表,获取指向申请信号量的函数的操作接口,依据所述指向申请信号量的函数的操作接口执行所述申请信号量的函数。
S340、当查询到所述目标信号量210处于空闲状态时,将所述目标信号量210的状态参数的值修改为表示占用状态的状态参数“1”。当所述目标信号量210的状态参数的值修改为表示占用状态的状态参数“1”,则表明用户态线程L1申请到了目标信号量210。那么,其他线程,例如内核态线程L2则不能申请到目标信号量210。修改状态参数的目的是向竞争申请目标信号量210的其他线程证明,该目标信号量210当前处于被所述用户态线程L1占用的状态,其他线程不能申请该目标信号量210,以保证竞争申请目标信号量的并发线程有序地申请目标信号量。
S350、访问所述目标名称指向的数据124。当所述目标信号量210处于空闲状态时,说明尚且没有其他线程访问所述数据124,因此处理器110可以对其进行访问。步骤S340与步骤S350可以同时执行,执行顺序不分先后。
在用户态线程L1对数据124访问完毕之后,处理器110还用于将所述目标信号量210的状态参数的值修改为表示空闲状态的状态参数“0”。处理器110会查询链表,获取指向释放信号量的函数的操作接口,依据所述指向释放信号量的函数的操作接口,查找到存储器120中的释放信号量的函数,执行所述释放信号量的函数,释放所述目标信号量210。
用户态线程L1创建目标信号量210之后,内核态线程L2查询到目标信号量210,会与用户态线程L1竞争申请目标信号量210。步骤S330至步骤S330描述的是在与内核态线程L2竞争申请目标信号量210时获胜,申请到目标信号量210的过程。相应地,内核态线程L2在申请目标信号量210时的过程可以参见图4。图4为本发明实施例提供的内核态线程L2访问数据124的方法流程图。如图4所示,当内核态线程L2访问数据124时,处理器110执行以下步骤:
S410、根据目标名称,查询存储器120是否包含与所述目标名称相同的信号量。目标名称是预先设定的,且被用户态线程和内核态线程共同访问的信号量的名称。存储器120中保存有一个或多个信号量,每个信号量均能被用户态线程和内核态线程访问,并且每个信号量具有唯一的名称或名称为空。该步骤与图3所示的步骤S310的不同之处在于,处理器110直接执行所述创建信号量的函数,不用查询系统调用层125中的链表,也不用获取指向创建信号量的函数的操作接口。内核态线程L2通过查找所述目标信号量210,可以实现该目标信号量210被没有创建目标信号量210的内核态线程L2访问,实现了内核态线程L2和用户态线程L1对于目标信号量210的申请等操作对于对方可见的可能性,避免并发的用户态线程L1和内核态线程L2访问数据124时发生冲突。
S420、当查询到所述存储器120包含名称与所述目标名称相同的目标信号量,查询所述目标信号量210的状态参数,所述状态参数用于表示信号量的使用状态。例如当状态参数的值为0时表示信号量处于空闲状态,当状态参数的值为1时表示信号量处于占用状态。该步骤与图3所示的步骤S330的不同之处在于,处理器110直接执行所述申请信号量的函数,不用查询系统调用层125中的链表,也不用获取指向所述申请信号量的函数的操作接口。通过查询状态参数,确定该目标信号量210当前的状态,所以目标信号量210被用户态线程L1申请成功与否,对于竞争申请目标信号量210的内核态线程L2是可见的,进而避免用户态线程L1和内核态线程L2并发访问数据124时发生冲突。
S430、当查询到所述目标信号量210处于占用状态时,停止执行任务。并将内核态线程L2挂载到该目标信号量210的等待队列中,等待用户态线程L1释放所述目标信号量210之后,被用户态线程唤醒申请该目标信号量210。
如果在图3所示的实施方式中,用户态线程L1在访问完数据124后,释放了目标信号量210,那么该目标信号量210处于空闲状态。然后处理器110查询链表,获取指向唤醒函数的操作接口,从存储器120中查找到所述唤醒函数,执行唤醒函数,以唤醒挂载到该目标信号量210的等待队列中内核态线程L2。内核态线程L2被唤醒后,处理器110再次查询所述目标信号量210的状态参数,如果查询到所述目标信号量210处于空闲状态,则可参照图3所示的步骤S340,申请目标信号量210去访问数据124,然后释放目标信号量210。
图3所示的用户态线程L1访问数据124的实施方式中,执行完创建该目标信号量210的步骤S320后,申请该目标信号量210之前,对目标信号量210的引用次数进行自加1运算。假设,进行加1运算之前,目标信号量210的引用次数为初始值0,那么进行加1运算之后所述目标信号量210的引用次数为1。在其他情况中,每次对目标信号量210的引用次数进行加运算的粒度可以是其他大于零的数值。图4所示的内核态线程L2查询到所述存储器120中包含信号量的名称与目标名称相同的目标信号量210,在申请该目标信号量210访问数据124之前,也对目标信号量210的引用次数进行自加1运算,此时所述目标信号量210的引用次数为2。每一个线程申请到该目标信号量210访问完数据124后,会释放该目标信号量210。释放目标信号量210之后,处理器110对所述目标信号量210的引用次数进行自减1运算,表明不再申请该目标信号量210。处理器对所述目标信号量210的引用次数进行自减1运算之后,还查询所述目标信号量210的引用次数是否为初始值,如果为初始值,则初始化所述目标信号量210,将目标信号量210的名称赋值为空,状态参数的值初始化为表示空闲状态的状态参数的值,引用次数赋值为所述初始值。用户态线程L1访问数据的实施方式中,处理器110会查询链表,获取指向关闭信号量的函数的操作接口,依据所述指向关闭信号量的函数的操作接口查找到存储器120中的关闭信号量的函数,执行所述关闭信号量的函数,关闭目标信号量210。
另外,在上述实施例中,为防止其他线程或计算机中断、异常等进程对目标信号量210的状态参数的值进行修改,还可以对目标信号量210进行加锁保护。存储器120中每个信号量还具有锁保护参数,所述锁保护参数用于表示信号量是否进行锁保护。例如,锁保护参数的值为1表示所述目标信号量210处于加锁状态,锁保护参数的值为0表示所述目标信号量210处于空锁状态。
具体的,在申请目标信号量210之前,查询所述目标信号量210的锁保护参数,当查询到表示所述目标信号量210处于空锁状态时,处理器将锁保护参数的值修改为加锁状态1。然后查询目标信号量210的状态参数,当查询到所述目标信号量210处于空闲状态时,将状态参数的值修改为表示占用状态的“1”,然后将锁保护参数的值修改为表示空锁状态的“0”。加锁保护之后,再查询目标信号量210的状态参数,保证当前采用加锁保护的线程可以查询目标信号量210的状态参数。
另外,为防止其他不属于目标信号量210的等待队列中的线程或计算机中断、异常等进程对目标信号量210的状态参数的值进行修改,在释放目标信号量210之前,处理器110查询目标信号量210的锁保护参数,当查询到表示所述目标信号量210处于空锁状态时,将目标信号量210的锁保护参数的值修改为表示加锁状态的“1”。在所述目标信号量210的使用状态从占用状态变成为空闲状态并释放所述目标信号量210之后,再将目标信号量210的锁保护参数的值修改为表示空锁状态的“0”。
请参见图5,图5为本发明实施例提供的一种信号量的创建装置的结构图。如图5所示,本发明实施例提供的信号量的创建装置510,位于计算机500中,所述创建装置510包括获取模块511和处理模块512。所述计算机500中保存有一个或多个信号量,每个信号量具有唯一的名称或名称为空,所述每个信号量为能被两种类型的线程访问的信号量,所述两种类型的线程包括用户态线程和内核态线程,所述第一线程是所述两种类型的线程的其中一种。下面描述创建装置510的每个模块的功能:
获取模块511,用于当第一线程访问数据时,获取所述第一线程待访问的所述数据的信号量的目标名称。本实施方式中获取模块511可以通过计算机中的处理器110实现,获取模块511获取目标名称的功能,可以参考图3所示的步骤S310描述的获取目标名称的具体细节,在这不再赘述。
处理模块512,用于根据所述目标名称查询所述计算机500中是否包含名称与所述目标名称相同的信号量,所述处理模块512,还用于当所述计算机500不包含名称与所述目标名称相同的信号量时,选择一个名称为空的目标信号量210,将所述目标信号量210的名称定义为所述目标名称。处理模块512可以通过计算机中的处理器110来实现,处理模块512创建目标信号量210的功能,可参考图3所示的S320描述的创建目标信号量210的具体细节,在这不再赘述。
作为一种可选的实施方式,所述处理模块512,还用于查询表示所述目标信号量210的状态参数,所述状态参数的值表示所述目标信号量210处于空闲状态或者占用状态。所述处理模块512,还用于当所述状态参数的值表示所述目标信号量210处于空闲状态时,访问所述数据。本实施方式中,处理模块512申请目标信号量210的功能可参照图3所示的步骤S330和S340申请目标信号量210的具体实现细节,在这不再赘述。
作为一种可选的实施方式,所述处理模块512,还用于修改所述状态参数的值,所述修改后的状态参数的值表示所述目标信号量210处于占用状态。
作为一种可选的实施方式,所述获取模块511,还用于当其他线程访问所述数据时,获取所述目标名称。本实施方式中,获取模块511可以通过计算机中的处理器110实现,获取模块511根据目标名称查询目标信号量210的功能,可以参考图3所示的步骤S310描述的获取目标信号量的具体细节,在这不再赘述。
所述处理模块512,还用于根据所述获取模块511在其他线程访问所述数据时获取的所述目标名称,查询所述存储器是否包含名称与所述目标名称相同的信号量。以及处理模块512可以通过计算机中的处理器110来实现,处理模块512查询目标信号量210的功能,可参考图4所示的S410描述的查询目标信号量210的具体细节,在这不再赘述。
所述处理模块512,还用于在确定所述计算机500中包含所述目标信号量210,并且所述目标信号量210的名称为所述目标名称时,查询所述状态参数,所述第二线程是所述两种类型的线程的其中一种,并且所述第二线程的类型与所述第一线程的类型不同。所述处理模块512,还用于确定所述状态参数的值表示所述目标信号量210处于占用状态时,停止访问所述数据。以及处理模块512查询状态参数的功能可以参照图4所示的S420和S430描述的查询状态参数的具体细节,在这里不再赘述。
作为一种可选的实施方式,所述处理模块512,还用于在所述处理模块512查询所述状态参数之前,查询所述目标信号量210的锁保护参数;所述锁保护参数的值表示所述目标信号量210处于加锁状态或者空锁状态;所述处理模块512,还用于当所述锁保护参数的值表示所述目标信号量210处于空锁状态时,修改所述锁保护参数的值;所述修改后的锁保护参数的值表示所述目标信号量210处于加锁状态。本实施方式中,处理模块512对目标信号量210的加锁保护功能可参照上述方法实施例中的描述,在这不再赘述。
在本发明实施例中,用户态线程或者内核态线程访问数据时,都可以根据待访问的数据124的信号量的目标名称,查询计算机中是否包含能被所述用户态线程和内核态线程共同访问的信号量。如果没有,则选择一个名称为空的目标信号量210,将其名称定义为所述目标名称。由此创建一个可被所述用户态线程和所述内核态线程共同访问的信号量,以避免所述用户态线程和内核态线程并发访问数据时发生冲突。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,设备和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储函数代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的保护范围。
Claims (10)
1.一种信号量的创建方法,其特征在于,所述方法适用于计算机,所述计算机包括处理器和存储器,当第一线程访问数据时,所述处理器执行所述第一线程时包括:
获取所述第一线程待访问的所述数据的信号量的目标名称;
根据所述目标名称查询所述存储器是否包含名称与所述目标名称相同的信号量,所述存储器中保存有一个或多个信号量,每个信号量具有唯一的名称或名称为空,所述每个信号量为能被两种类型的线程访问的信号量,所述两种类型的线程包括用户态线程和内核态线程,所述第一线程是所述两种类型的线程的其中一种;
当所述存储器不包含名称与所述目标名称相同的信号量时,选择一个名称为空的目标信号量,将所述目标信号量的名称定义为所述目标名称。
2.如权利要求1所述的方法,其特征在于,还包括:
查询所述目标信号量的状态参数,所述状态参数的值表示所述目标信号量处于空闲状态或者占用状态;
当所述状态参数的值表示所述目标信号量处于空闲状态时,访问所述数据。
3.如权利要求2所述的方法,其特征在于,还包括:
修改所述状态参数的值,所述修改后的状态参数的值表示所述目标信号量处于占用状态。
4.如权利要求3所述的方法,其特征在于,在所述修改所述目标信号量的状态参数的值之后,当第二线程访问所述数据时,所述方法还包括所述处理器还执行所述第二线程,所述处理器执行所述第二线程时包括:
获取所述目标名称;
根据所述目标名称查询所述存储器是否包含名称与所述目标名称相同的信号量;
确定所述存储器中包含所述目标信号量,并且所述目标信号量的名称为所述目标名称时,查询所述状态参数,所述第二线程是所述两种类型的线程的其中一种,并且所述第二线程的类型与所述第一线程的类型不同;
确定所述状态参数的值表示所述目标信号量处于占用状态时,停止访问所述数据。
5.如权利要求2-4中任一所述的方法,其特征在于,在所述查询所述状态参数之前,还包括:
查询所述目标信号量的锁保护参数;所述锁保护参数的值表示所述目标信号量处于加锁状态或者空锁状态;
当所述锁保护参数的值表示所述目标信号量处于空锁状态时,修改所述锁保护参数的值;所述修改后的锁保护参数的值表示所述目标信号量处于加锁状态。
6.一种信号量的创建装置,其特征在于,所述装置位于计算机中,所述装置包括:
获取模块,用于当第一线程访问数据时,获取所述第一线程待访问的所述数据的信号量的目标名称;
处理模块,用于根据所述目标名称查询所述计算机中是否包含名称与所述目标名称相同的信号量,所述计算机中保存有一个或多个信号量,每个信号量具有唯一的名称或名称为空,所述每个信号量为能被两种类型的线程访问的信号量,所述两种类型的线程包括用户态线程和内核态线程,所述第一线程是所述两种类型的线程的其中一种;
所述处理模块,还用于当所述计算机不包含名称与所述目标名称相同的信号量时,选择一个名称为空的目标信号量,将所述目标信号量的名称定义为所述目标名称。
7.如权利要求6所述的装置,其特征在于,
所述处理模块,还用于查询所述目标信号量的状态参数,所述状态参数的值表示所述目标信号量处于空闲状态或者占用状态;
所述处理模块,还用于当所述状态参数的值表示所述目标信号量处于空闲状态时,访问所述数据。
8.如权利要求7所述的装置,其特征在于,
所述处理模块,还用于修改所述状态参数的值,所述修改后的状态参数的值表示所述目标信号量处于占用状态。
9.如权利要求8所述的装置,其特征在于,
所述获取模块,还用于当第二线程访问所述数据时,获取所述目标名称;
所述处理模块,还用于根据所述获取模块在所述第二线程访问所述数据时获取的所述目标名称,查询所述存储器是否包含名称与所述目标名称相同的信号量;
所述处理模块,还用于在确定所述计算机中包含所述目标信号量,并且所述目标信号量的名称为所述目标名称时,查询所述状态参数,所述第二线程是所述两种类型的线程的其中一种,并且所述第二线程的类型与所述第一线程的类型不同;
所述处理模块,还用于确定所述状态参数的值表示所述目标信号量处于占用状态时,停止访问所述数据。
10.如权利要求7-9中任一所述的装置,其特征在于,
所述处理模块,还用于在所述处理模块查询所述状态参数之前,查询所述目标信号量的锁保护参数;所述锁保护参数的值表示所述目标信号量处于加锁状态或者空锁状态;
所述处理模块,还用于当所述锁保护参数的值表示所述目标信号量处于空锁状态时,修改所述锁保护参数的值;所述修改后的锁保护参数的值表示所述目标信号量处于加锁状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611239233.2A CN106681836B (zh) | 2016-12-28 | 2016-12-28 | 一种信号量的创建方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611239233.2A CN106681836B (zh) | 2016-12-28 | 2016-12-28 | 一种信号量的创建方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106681836A true CN106681836A (zh) | 2017-05-17 |
CN106681836B CN106681836B (zh) | 2021-03-05 |
Family
ID=58872274
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611239233.2A Active CN106681836B (zh) | 2016-12-28 | 2016-12-28 | 一种信号量的创建方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106681836B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107590015A (zh) * | 2017-09-11 | 2018-01-16 | 北京京东尚科信息技术有限公司 | 监测主线程的阻塞的方法和装置 |
CN110309024A (zh) * | 2019-04-23 | 2019-10-08 | 网宿科技股份有限公司 | 数据处理系统及其执行数据处理任务的方法 |
CN110569131A (zh) * | 2019-08-22 | 2019-12-13 | 北京华捷艾米科技有限公司 | 一种信号量管理系统及信号量管理方法 |
CN111475264A (zh) * | 2020-02-28 | 2020-07-31 | 新华三技术有限公司合肥分公司 | 一种用户态无锁转发的实现方法及装置 |
CN112612582A (zh) * | 2020-12-14 | 2021-04-06 | 北京和利时系统工程有限公司 | 信号量功能实现方法和装置 |
CN114490009A (zh) * | 2020-10-27 | 2022-05-13 | 广东美的白色家电技术创新中心有限公司 | 音频数据的处理方法、装置及计算机存储介质 |
CN117076139A (zh) * | 2023-10-17 | 2023-11-17 | 北京融为科技有限公司 | 数据处理方法及相关设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102200930A (zh) * | 2011-05-26 | 2011-09-28 | 华为数字技术有限公司 | 同步变量映射方法及装置、同步变量释放方法及同步变量删除方法 |
CN102262559A (zh) * | 2010-05-24 | 2011-11-30 | 腾讯科技(深圳)有限公司 | 一种资源共享的方法及系统 |
CN102999378A (zh) * | 2012-12-03 | 2013-03-27 | 中国科学院软件研究所 | 一种读写锁实现方法 |
CN103092784A (zh) * | 2011-10-27 | 2013-05-08 | 飞思卡尔半导体公司 | 基于信号量保护共享系统资源的系统和方法 |
CN103731328A (zh) * | 2014-01-02 | 2014-04-16 | 烽火通信科技股份有限公司 | 基于Linux共享内存实现家庭网关数据通信的系统及方法 |
CN104980454A (zh) * | 2014-04-02 | 2015-10-14 | 腾讯科技(深圳)有限公司 | 一种资源数据共享方法、服务器及系统 |
US20160344820A1 (en) * | 2015-05-21 | 2016-11-24 | Freescale Semiconductor, Inc. | Method and apparatus for controlling wake events in a data processing system |
-
2016
- 2016-12-28 CN CN201611239233.2A patent/CN106681836B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102262559A (zh) * | 2010-05-24 | 2011-11-30 | 腾讯科技(深圳)有限公司 | 一种资源共享的方法及系统 |
CN102200930A (zh) * | 2011-05-26 | 2011-09-28 | 华为数字技术有限公司 | 同步变量映射方法及装置、同步变量释放方法及同步变量删除方法 |
CN103092784A (zh) * | 2011-10-27 | 2013-05-08 | 飞思卡尔半导体公司 | 基于信号量保护共享系统资源的系统和方法 |
CN102999378A (zh) * | 2012-12-03 | 2013-03-27 | 中国科学院软件研究所 | 一种读写锁实现方法 |
CN103731328A (zh) * | 2014-01-02 | 2014-04-16 | 烽火通信科技股份有限公司 | 基于Linux共享内存实现家庭网关数据通信的系统及方法 |
CN104980454A (zh) * | 2014-04-02 | 2015-10-14 | 腾讯科技(深圳)有限公司 | 一种资源数据共享方法、服务器及系统 |
US20160344820A1 (en) * | 2015-05-21 | 2016-11-24 | Freescale Semiconductor, Inc. | Method and apparatus for controlling wake events in a data processing system |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107590015A (zh) * | 2017-09-11 | 2018-01-16 | 北京京东尚科信息技术有限公司 | 监测主线程的阻塞的方法和装置 |
CN110309024A (zh) * | 2019-04-23 | 2019-10-08 | 网宿科技股份有限公司 | 数据处理系统及其执行数据处理任务的方法 |
CN110569131A (zh) * | 2019-08-22 | 2019-12-13 | 北京华捷艾米科技有限公司 | 一种信号量管理系统及信号量管理方法 |
CN111475264A (zh) * | 2020-02-28 | 2020-07-31 | 新华三技术有限公司合肥分公司 | 一种用户态无锁转发的实现方法及装置 |
CN111475264B (zh) * | 2020-02-28 | 2023-05-12 | 新华三技术有限公司合肥分公司 | 一种用户态无锁转发的实现方法及装置 |
CN114490009A (zh) * | 2020-10-27 | 2022-05-13 | 广东美的白色家电技术创新中心有限公司 | 音频数据的处理方法、装置及计算机存储介质 |
CN112612582A (zh) * | 2020-12-14 | 2021-04-06 | 北京和利时系统工程有限公司 | 信号量功能实现方法和装置 |
CN112612582B (zh) * | 2020-12-14 | 2024-05-28 | 北京和利时控制技术有限公司 | 信号量功能实现方法和装置 |
CN117076139A (zh) * | 2023-10-17 | 2023-11-17 | 北京融为科技有限公司 | 数据处理方法及相关设备 |
CN117076139B (zh) * | 2023-10-17 | 2024-04-02 | 北京融为科技有限公司 | 数据处理方法及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN106681836B (zh) | 2021-03-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106681836A (zh) | 一种信号量的创建方法及装置 | |
CN101221514B (zh) | 选择处理器对程序而言遵循的架构级别的方法、处理器及系统 | |
CN104636202A (zh) | 计算机系统及其排程方法 | |
US8499298B2 (en) | Multiprocessing transaction recovery manager | |
US20100325633A1 (en) | Searching Regular Expressions With Virtualized Massively Parallel Programmable Hardware | |
CN101221515B (zh) | 用于调度执行单元的方法和系统 | |
CN110187835A (zh) | 用于管理访问请求的方法、装置、设备和存储介质 | |
US11366689B2 (en) | Hardware for supporting OS driven observation and anticipation based on more granular, variable sized observation units | |
CN104239134A (zh) | 一种众核系统的任务管理方法和装置 | |
CN109818810A (zh) | 一种接入服务器连接优化方法、接入服务器以及通信系统 | |
CN109359060B (zh) | 数据抽取方法、装置、计算设备及计算机存储介质 | |
CN109634714B (zh) | 一种智能调度的方法及装置 | |
CN104102549A (zh) | 一种实现多线程互斥操作的方法、装置和芯片 | |
US9170786B1 (en) | Composable context menus | |
DE102022105725A1 (de) | Verfahren und einrichtungen zur durchführung von gewichtungs- und aktivierungskomprimierung und -dekomprimierung | |
CN111258950B (zh) | 原子访存方法、存储介质、计算机设备、装置和系统 | |
CN113407343A (zh) | 一种基于资源分配的业务处理方法、装置及设备 | |
EP3702911A2 (en) | Hardware for supporting os driven load anticipation based on variable sized load units | |
CN106528551A (zh) | 申请内存的方法和装置 | |
CN111353766A (zh) | 分布式业务系统的业务流程处理系统及方法 | |
CN116260876A (zh) | 基于K8s的AI应用调度方法、装置及电子设备 | |
CN108446177A (zh) | 一种任务处理方法、计算机可读存储介质及终端设备 | |
CN115328528A (zh) | Flutter引擎管理方法、系统、介质及原生端 | |
CN109583198B (zh) | 监测页面的方法、装置、存储介质及电子设备 | |
CN110010167A (zh) | 一种提高获取描述符状态的方法、装置、计算机设备及存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |