CN107577539A - 用于内核态和用户态通讯的共享内存结构及其应用 - Google Patents
用于内核态和用户态通讯的共享内存结构及其应用 Download PDFInfo
- Publication number
- CN107577539A CN107577539A CN201610526265.4A CN201610526265A CN107577539A CN 107577539 A CN107577539 A CN 107577539A CN 201610526265 A CN201610526265 A CN 201610526265A CN 107577539 A CN107577539 A CN 107577539A
- Authority
- CN
- China
- Prior art keywords
- data page
- data
- user space
- status information
- page
- 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
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请提供了一种用于内核态和用户态通讯共享内存结构及其应用,其中的共享内存结构包括:所述共享内存被划分为多个内存片;所述多个内存片中的其中一个内存片为存储有用户态状态信息的控制页,且其余内存片为数据页;每一个数据页均包括:第一区域和第二区域,所述第一区域用于存储针对内核态和用户态通讯数据的数据页分配信息以及数据页状态信息,所述第二区域用于存储内核态和用户态的通讯数据。本申请的提供的技术方案提高了共享内存的性能,并提高了内核态和用户态的通讯性能。
Description
技术领域
本申请涉及通讯技术,尤其涉及一种用于内核态和用户态通讯的共享内存结构、内核态和用户态通讯方法、内核态和用户态通讯装置以及数据存取系统。
背景技术
共享内存由于其可以有效避免通讯过程中的数据全量拷贝等问题,而被广泛应用于内核态和用户态之间通讯应用中,即内核态和用户态通过共享内存实现通讯。
目前,基于共享内存实现内核态和用户态之间通讯的方式通常为:内核态(如内核态进程)在完成共享内存写操作后,通过系统调用来通知用户态(如用户态进程)读取共享内存中的相应数据,用户态根据内核态的通知读取共享内存中的相应数据;另外,用户态是通过信号量或者互斥锁来访问共享内存的,如持有信号量或互斥锁的线程才可以访问共享内存,且在共享内存访问结束后释放其所持有的信号量或互斥锁(如通过调用Syscall等来使线程持有信号量或释放信号量)。
发明人在实现本申请过程中发现,为了保证通讯过程中的共享内存中的数据同步,内核态必须在完成写操作后才能够通知用户态读取共享内存中的数据,这使得内核态和用户态的读写操作不能够并发执行;另外,内核态在每次完成写操作后均需要通知用户态读取共享内存中的数据,在需要通讯的数据量较大而单次传输的数据量较小时,通知(如包含数据读取位置等信息的通知)自身所消耗的系统资源较大,且对用户态的信号量以及互斥锁的管理(如使用户态线程持有或释放信号量/互斥锁)所消耗的系统资源也会随之大幅度上升,有时甚至会相当于或者超过通讯过程中的数据全量拷贝所消耗的系统资源。
发明内容
本申请的目的是提供一种用于内核态和用户态通讯的共享内存结构、内核态和用户态通讯方法以及内核态和用户态通讯装置。
根据本申请提供的一个方面,提供了一种用于内核态和用户态通讯的共享内存结构,包括:所述共享内存被划分为多个内存片;所述多个内存片中的其中一个内存片为存储有用户态状态信息的控制页,且其余内存片为数据页;每一个数据页均包括:第一区域和第二区域,所述第一区域用于存储针对内核态和用户态通讯数据的数据页分配信息以及数据页状态信息,所述第二区域用于存储内核态和用户态的通讯数据。
根据本申请提供的另一个方面,还提供了一种内核态和用户态通讯方法,该方法包括:确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数;根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作;在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知;其中,所述共享内存具有上述共享内存结构。
根据本申请提供的再一个方面,还提供了一种内核态和用户态通讯装置,该装置包括:确定页数模块,用于确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数;内核态写模块,用于根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作;通知模块,用于在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知。
可选的,前述的内核态和用户态通讯装置,其中,所述装置还包括:内核态初始化模块,用于在内核态,创建并注册设备,为所述设备分配共享内存;将所述共享内存中的控制页中的用户态状态信息设置为表征用户态未执行共享内存地址映射的状态信息,并将共享内存中的各数据页中的数据页状态信息均设置为表征数据页空闲且允许被内核态分配的状态信息;用户态初始化模块,用于在针对所述共享内存执行用户态进程地址空间映射操作的过程中,将共享内存中的控制页中的用户态状态信息设置为表征用户态空闲的状态信息。
可选的,前述的内核态和用户态通讯装置,其中,所述内核态写模块包括:第一子模块,用于:按照从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,根据共享内存的数据页中的数据页状态信息以及所述页数查看是否存在可供分配的数据页;在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量不小于所述页数的情况下,确定出共享内存中存在可供分配的数据页。
可选的,前述的内核态和用户态通讯装置,其中,所述内核态写模块包括:第二子模块,用于:将可供分配的数据页中的第一个数据页中的数据页分配信息设置为所述页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;将所述当前可分配数据页起始地址设置为所述可供分配的数据页的下一个数据页地址;将所述待传输数据写入所述可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
可选的,前述的内核态和用户态通讯装置,其中,所述内核态写模块还包括:第三子模块,用于:在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量小于所述页数的情况下,按照从环形队列的队首到内核态当前可分配数据页起始地址方向,根据共享内存的数据页中的数据页状态信息以及所述页数查看是否存在可供分配的数据页。
可选的,前述的内核态和用户态通讯装置,其中,所述内核态写模块包括:第四子模块,用于:将可供分配的数据页中的第一个数据页中的数据页分配信息设置为所述页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;将所述当前可分配数据页起始地址到队尾的各数据页中的数据页状态信息设置为表征数据页允许被内核态分配且用户态忽略该数据页的状态信息;将所述待传输数据写入所述可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
可选的,前述的内核态和用户态通讯装置,其中,所述装置还包括:用户态读模块,用于在接收到来自内核态的所述通知的情况下,将控制页中的用户态状态信息设置为表征用户态繁忙的状态信息,根据数据页中的数据页分配信息确定需要读取数据的数据页,从所述需要读取数据的数据页中的数据页状态信息为表征数据页允许被用户态读写的状态信息,并读取数据页中的数据;在读取数据页中的数据过程中,每读完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。
可选的,前述的内核态和用户态通讯装置,其中,所述装置还包括:用户态写模块,用于针对用户态需要向内核态传输的待传输数据,在将所述待传输数据写入所述可供分配的数据页之后,通知内核态读取所述可供分配的数据页中的数据,并将所述可供分配的数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。
根据本申请提供的再一个方面,还提供了一种数据存取系统,该数据存取系统包括:内核态进程;用户态进程;以及共享内存,所述共享内存被划分为多个内存片;其中,所述多个内存片中的其中一个内存片为存储有所述用户态进程的状态信息的控制页,且其余内存片为数据页;其中,每一个数据页均包括:第一区域和第二区域,所述第一区域用于存储针对内核态进程和用户态进程通讯数据的数据页分配信息以及数据页状态信息,所述第二区域用于存储内核态进程和用户态进程的通讯数据。
与现有技术相比,本申请各个实施例体现了以下优点:本申请将共享内存划分为多个内存片,且在作为控制页的内存片中存储用户态状态信息,并在作为数据页的内存片中存储数据页分配信息以及数据页状态信息,使内核态可以通过控制页及时准确的获知用户态的当前状态,并使用户态可以通过数据页获知内核态一次分配的数据页的数量以及所分配的各数据页是否可读写等,从而内核态可以根据用户态的当前状态掌握通知用户态读取数据的时机,而用户态可以准确的掌握其读取数据页中的数据以及其向数据页中写数据的时机,进而使内核态的写数据操作与用户态的读/写数据操作可以并发执行,例如在内核态一次分配了多个数据页,且在其写完一个数据页之后执行下一个数据页的写数据操作的同时,用户态可以针对内核态已经写完的数据页执行数据读取操作;另外,由于数据页中设置了数据页状态信息以及数据页分配信息,因此,内核态向用户态传输的通知可以不包含数据读取位置等信息,而仅唤醒用户态执行数据读取操作即可,从而可以有效减少通知所消耗的系统资源;还有,利用数据页状态信息可以使用户态在不使用信号量或者互斥锁的情况下即可实现共享内存中的数据同步;由此可知,本申请提供的技术方案提高了共享内存的性能,并提高了内核态和用户态的通讯性能。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1为本申请的共享内存结构的一个具体的应用场景的示意图;
图2为本申请的用户态状态跳转的一个具体例子的示意图;
图3为本申请的数据页状态跳转的一个具体例子的示意图;
图4为本申请的内核态和用户态通过共享内存实现通讯的一个具体例子的流程图;
图5为本申请实施例二的内核态和用户态通讯装置的一个具体例子的结构图;
图6为本申请实施例二的内核态和用户态通讯装置的另一个具体例子的结构图;
图7为本申请实施例二的内核态写模块的结构示意图;
图8为本申请实施例三的内核态和用户态通讯方法的一个具体例子的流程图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请的实施例作详细描述。
在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然本申请的流程图将各项操作描述成顺序的处理,但是,其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
本实施例中的服务器包括但不限于单个网络服务器、多个网络服务器组成的服务器组或者基于云计算(Cloud Computing)的由大量计算机或者网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。其中,所述服务器可以接入网络并与网络中的其他设备进行信息交互操作。其中,所述服务器所能够接入的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。
需要说明的是,所述服务器以及网络等仅为举例,其他现有的或今后可能出现的服务器或者网络如可适用于本申请,也应包含在本申请保护范围以内,并以引用方式包含于此。
后面描述所讨论的方法(其中一些通过流程图示出)实施例可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合的形式来实施。当用软件、固件、中间件或者微代码来实施时,用以实施必要任务的程序代码或者代码段可以被存储在机器或计算机可读介质(比如存储介质)中。(一个或多个)处理器可以实施必要的任务。
这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本申请的示例性实施例的目的,但是,本申请可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。
应当理解的是,虽然在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但是这些单元不应当受这些术语限制。使用这些术语仅仅是为了将一个单元与另一个单元进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或更多所列出的相关联项目的任意和所有组合。
应当理解的是,当一个单元被称为“连接”或者“耦合”到另一个单元时,其可以直接连接或者耦合到所述另一个单元,也可以存在中间单元。与此相对的,当一个单元被称为“直接连接”或者“直接耦合”到另一个单元时,则不存在中间单元。应当按照类似的方式来解释被用于描述单元之间的关系的其他词语(例如,“处于...之间”相比于“直接处于...之间”,“与...邻近”相比于“与...直接邻近”等等)。
这里所使用的术语仅仅是为了描述具体实施例,而不是意图限制示例性实施例。除非上下文中明确地另有所指,否则,这里所使用的单数形式“一个”、“一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括”和/或“包含”规定了所陈述的特征、整数、步骤、操作、单元和/或组件的存在,而不排除存在或者添加一个或更多的其他特征、整数、步骤、操作、单元、组件和/或其组合。
还应当提到的是,在一些替换的实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可以基本上同时执行或者有时可以按照相反的顺序来执行。
技术术语说明:
共享内存,通常为允许两个或者更多进程共同访问的内存;
用户态(即User),通常处于非特权状态;
内核态(即Kernel),通常处于特权状态;
环形队列,通常采用首尾相连的先进先出队列的数据结构。
下面结合附图对本申请的技术方案作进一步详细描述。
本申请的共享内存结构的一个具体的应用场景如图1所示。
图1中,在计算机或者服务器(如基于Linux、Windows、IOS或者Android操作系统的计算机或者服务器)等设备中,设备内部的用户态(如用户态进程S)和内核态(如内核态进程X或者内核态软中断线程等)需要利用共享内存M进行通讯。
本申请中的共享内存M通常是由内核态(下述以内核态为内核态进程X为例,对本申请进行说明)创建的,且该共享内存M被内核态进程X划分为多个内存片,例如共享内存M被内核态进程X划分为1024个内存片,且内存片的存储空间大小可以为4Kb,当然,内存片的存储空间大小也可以根据实际需求设置。另外,共享内存M通常为系统公共区中的共享内存。
本申请中的各内存片通常具有相同的存储空间大小;当然,各内存片的存储空间大小也可以不同;共享内存M所包含的所有内存片中的其中一个内存片被作为控制页,而其余的内存片被作为数据页,且所有的数据页可以形成环形队列的结构,如内核态进程X使所有的数据页形成环形队列。
本申请中的用户态具有三种不同的状态,这三种状态分别为初始态、空闲态以及繁忙态;其中的初始态表示用户态尚未获得共享内存在用户态中的地址信息,且用户态可以通过执行共享内存地址映射操作获得共享内存在用户态中的地址信息;用户态处于初始态如用户态进程S处于初始态;其中的空闲态表示用户态已处理完所有数据页中的数据,用户态处于空闲态如用户态进程S处于空闲态,即用户态进程S已处理完所有数据页中的数据;其中的繁忙态表示用户态正在处理数据页中的数据,用户态处于繁忙态如用户态进程S处于繁忙态,即用户态进程S正在处理数据页中的数据。
本申请中的控制页通常为共享内存M中的第一个内存片,如将图1中的内存片0作为控制页。控制页主要用于存储用户态(例如用户态进程)状态信息,该用户态状态信息可以表示出用户态的三种不同的状态,这三种状态即上述的初始态、空闲态(以及繁忙态。
控制页中的用户态状态信息的三种取值的变化使用户态的状态发生跳转,用户态状态的跳转如图2所示;在图2中,用户态状态可以由初始态跳转至空闲态,由空闲态跳转至繁忙态,由繁忙态跳转至空闲态。具体的,在内核态创建注册设备,并为该设备分配共享内存后,用户态进入初始态;在用户态执行共享内存地址映射操作后,用户态由初始态跳转至空闲态;在用户态开始对共享内存中的数据页进行处理时,用户态由空闲态跳转至繁忙态;在用户态对共享内存中的所有数据页均处理完毕时,用户态由繁忙态跳转至空闲态。
本申请中的数据页通常为共享内存M中的第二个内存片至最后一个内存片,如将图1中的内存片1至内存片N作为数据页,其中的N大于2。每一个数据页中均可以包括第一区域和第二区域,第一区域用于存储针对内核态和用户态通讯数据的数据页分配信息以及数据页状态信息,而第二区域用于存储内核态和用户态之间的通讯数据。
数据页中的数据页分配信息可以具体为在内核态针对待传输给用户态的待传输数据分配数据页的一次分配过程中,内核态所分配的数据页的页数。
数据页中的数据页状态信息可以表示出其所在的数据页的五种不同的状态,这五种状态分别为空闲态(即数据页处于空闲态)、内核态写状态(即数据页处于内核态写状态)、用户态可读写状态(即数据页处于用户态可读写状态)、用户态正在读写状态(即数据页处于用户态正在读写状态)以及空闲忽略态(即数据页处于空闲忽略态)。每一个数据页均会在这五种状态间跳转,从而每一个数据页均可以被看做是具有状态机结构的内存片。
数据页态状态的跳转如图3所示;在图3中,数据页状态可以由空闲态跳转至内核态写状态,由内核态写状态跳转至用户态可读写状态,由用户态可读写状态跳转至用户态正在读写状态,由用户态正在读写状态跳转至空闲态,另外,数据页状态可以由空闲态跳转至空闲忽略态,由空闲忽略态跳转至内核态写状态。
具体的,在内核态创建注册设备,并为该设备分配共享内存后,数据页进入空闲态;在内核态为待传输数据分配数据页后,被分配的数据页由空闲态跳转至内核态写状态;在内核态写完一个数据页后,该数据页由内核态写状态跳转至用户态可读写状态;在用户态从一个数据页中读取数据或者写入数据时,该数据页由用户态可读写状态跳转至用户态正在读写状态;在环形队列的尾部的处于空闲态的数据页不能够满足内核态一次分配需求时,环形队列尾部的处于空闲态的数据页由空闲态跳转至空闲忽略态;在环形队列的尾部的处于空闲忽略态的数据页能够满足内核态针对待传输数据的一次分配需求时,环形队列尾部的处于空闲忽略态的可供分配的数据页由空闲忽略态跳转至内核态写状态。
本申请的内核态和用户态通过共享内存实现通讯的一个具体例子为:内核态进程X和用户态进程S通过具有上述结构的共享内存实现通讯,该通讯过程如图4所示。
图4中,S400、在内核态进程X被创建,且其确定需要与用户态进程S通讯的情况下,内核态进程X执行初始化操作。
内核态进程X执行初始化操作的一个具体的例子如下:
内核态进程X创建注册一个设备(如字符设备D),并为该设备分配共享内存M,该共享内存M中的第一个内存片被内核态进程X作为控制页F,第二个内存片至最后一个内存片均被内核态进程X作为数据页P(如数据页P1-数据页Pn,其中n为大于等于2的整数),且所有的数据页P被内核态进程X设置为环形队列的形式。
内核态进程X还应将控制页F中的用户态状态信息设置为初始态,并将各数据页P中的数据页状态信息均设置为空闲态。另外,内核态进程X还可以将当前可分配数据页起始地址设置为环形队列的队首数据页P(如数据页P1)的地址。
内核态进程X将当前可分配数据页起始地址均设置为该起始地址。
S410、用户态进程S执行初始化操作。
用户态进程S执行初始化操作的一个具体的例子如下:
用户态进程S打开内核态进程X创建并注册的设备,获得句柄,并执行Mmap操作,以获得共享内存M的相关信息,如获得各数据页的大小、数据页的数量、控制页F在进程内的地址以及环形队列的队首数据页P在进程内的地址等;用户态进程S将控制页F中的用户态状态信息设置为空闲态。
用户态进程S还可以创建线程池,且该线程池中包括一个主线程(也可以称为主控线程或者调度线程等)以及多个工作线程,主线程主要用于控制各工作线程执行相应的操作,如控制工作线程从共享内存中读数据或者向共享内存中写数据等。
用户态进程S(如主线程)可以将用户态当前处理数据页地址设置为队首数据页P的地址。
S420、内核态进程X针对需要发送给用户态进程S的待传输数据,执行数据页分配操作。
内核态进程X执行数据页分配操作的一个具体的例子如下:
内核态进程X根据待传输数据的大小以及数据页的大小计算需要为待传输数据分配的数据页的页数C,然后,内核态进程X查看环形队列中是否存在可分配的数据页,如首先从当前可分配数据页起始地址向队尾方向查看是否存在足够可分配的数据页,如果当前可分配数据页起始地址到队尾中的处于空闲态或者空闲忽略态的数据页的数量不小于计算出的页数C,则确定从当前可分配数据页起始地址所对应的数据页开始到第C-1页为针对待传输数据分配的数据页,则将当前可分配数据页起始地址设置为从当前可分配数据页起始地址所对应的数据页开始的第C页,并到S430;而如果当前可分配数据页起始地址到队尾中的处于空闲态或者空闲忽略态的数据页的数量小于计算出的页数C,则可以将从当前可分配数据页起始地址所对应的数据页开始到队尾的处于空闲态的数据页中的数据页状态信息设置为空闲忽略态,然后从队首开始查看是否存在足够可分配的数据页,如果查看结果为处于空闲态或者空闲忽略态的数据页的数量不小于上述计算出的页数C,则到S430;而如果查看结果为处于空闲态或者空闲忽略态的数据页的数量小于上述计算出的页数C,则可以将处于空闲态的数据页中的数据页状态信息设置为空闲忽略态,并到S421。
S421、内核态进程X放弃本次与用户态进程S的通讯,且内核态进程X可以在等待预定时间间隔后,返回步骤S420,以便于再次尝试与用户态进程S进行通讯。
S430、内核态进程X设置可分配的数据页中的数据页分配信息和数据页状态信息,如内核态进程X将可分配的数据页中的第一个数据页中的数据页分配信息(即一次分配页数)设置为上述计算出的页数,并将各个可分配的数据页中的数据页状态信息均设置为内核态写状态。
S440、内核态进程X执行写操作以及通知操作。
内核态进程X执行写操作以及通知操作一个具体的例子为:
内核态进程X将待传输数据顺序写入本次分配的数据页中,且在写数据的过程中,内核态进程X每写完一个数据页,均应将该数据页的数据页状态信息设置为用户态可读写状态。
内核态进程X可以在写完本次分配的数据页中的第一个数据页时,读取控制页F中的用户态状态信息,在用户态状态信息为空闲态的情况下,通知用户态进程S读取共享内存M中的数据。内核态进程X发送的通知中通常不包含数据读取位置等信息,该通知仅用于唤醒用户态执行数据读取操作;当然,该通知包含有数据读取位置等信息也是完全可行的;在控制页F中的用户态状态信息为繁忙态的情况下,内核态进程X可以放弃本次通知操作,并等待预定时间间隔后再次读取控制页中的用户态状态信息并判断用户态状态信息是否为空闲态,以便于通知用户态进程S读取共享内存中的数据。
由于内核态进程X将第一个可分配的数据页中的分配页数设置为计算出的页数,因此,用户态进程S可以根据该页数获知本次需要读取的数据页的数量,从而内核态进程X可以仅在写完本次分配的数据页中的第一个数据页时执行通知操作即可,而不需要每次写完一个数据页均执行一次通知操作。
S450、用户态进程S接收来自内核态进程X的通知,用户态进程S执行数据读取操作。
用户态进程S执行数据读取操作的一个具体的例子如下:
用户态进程S中的调度线程调度处于空闲态的工作线程执行数据读取操作,同时,调度线程将控制页中的用户态状态信息设置为繁忙态。在来自内核态进程X的通知中没有包含数据读取位置等信息的情况下,调度线程可以根据用户态当前处理数据页地址以及数据页中的数据页状态信息来确定需要读取的数据所在的第一个数据页,用户态进程S可以从该第一个数据页中获知内核态进程X为待传输数据所分配的数据页的页数;用户态进程S在确定出第一个数据页中的数据页状态信息为用户态可读写状态时,调度线程将该数据页状态信息设置为用户态正在读写状态,调度线程调度相应的工作线程从该数据页中读取数据。
在用户态的工作线程读取完一个数据页中的数据,且在用户态进程S没有需要传输给内核态进程X的待传输数据时,调度线程可以将该数据页中的数据页状态信息设置为空闲态,且调度线程可以将用户态当前处理数据页地址设置为下一个数据页地址;调度线程继续根据第一个数据页中的分配页数继续调度工作线程读取后续数据页中的数据。在调度线程确定出工作线程已经将C个数据页中的数据均读取完成后,调度线程将控制页F中的用户态状态信息设置为空闲态。
在工作线程读取完数据页中的数据,且在用户态进程S存在需要传输给内核态进程X的待传输数据时,调度线程可以先不对该数据页中的数据页状态信息以及控制页F中的用户态状态信息进行设置。
在来自内核态进程X的通知中包含有数据读取位置等信息的情况下,调度线程可以根据通知中的数据读取位置等信息确定需要读取的数据所在的第一个数据页,且调度线程可以根据该第一个数据页中设置的分配页数确定出本次需要读取数据的所有数据页。
在用户态进程S需要向内核态进程X传输数据的情况下,到S460。
S460、调度线程调度相应的工作线程将需要传输给内核态进程X的待传输数据写入内核态进程X所分配的数据页中,并通知内核态读取数据页中的数据,该通知中可以包含有数据读取位置等信息。
调度线程可以在通知内核态进程X之后,将由工作线程写入待传输数据的数据页中的数据页状态信息设置为空闲态,并将控制页F中的用户态状态信息设置为空闲态。当然,该设置数据页中的数据页状态信息的操作也可以由内核态进程X执行。
S470、内核态进程X根据用户态进程S的通知从相应的数据页中读取数据,在数据页中的数据页状态信息由内核态进程X设置的情况下,内核态进程X将数据页中的数据页状态信息设置为空闲态。
实施例一、用于内核态和用户态通讯的共享内存结构。
本实施例中的共享内存包括多个内存片,且所有内存片的存储空间通常相同,例如共享内存的存储空间总共为4Mb,该共享内存总共包括1024个内存片,且在本实施例中,每个内存片的存储空间均为4Kb。当然,本实施例并不排除各内存片的存储空间不同的可能性。
多个内存片中的其中一个内存片被作为控制页(如第一个内存片被作为控制页),而其余的内存片被作为数据页,且所有的数据页形成环形队列。
控制页中存储有用户态状态信息,该用户态状态信息可以表示出用户态的三种不同的状态,这三种状态分别为初始态(即用户态由于未执行共享内存地址映射操作而处于初始态)、空闲态(即用户态处于空闲态,用户态已处理完所有数据页中的数据)以及繁忙态(即用户态处于繁忙态,用户态正在处理数据页中的数据)。
控制页中的数据结构可以使用下述形式来表示:
其中的order和data[0]暂且未被使用,其中的reading的不同取值可以定义为如下形式:
#define FLUSHED 0
#define READING 1
#define INITING 128
其中,FLUSHED表示空闲态(即用户态处于空闲态),即环形队列中所有的数据页都已经被用户态处理完毕,READING表示繁忙态(即用户态处于繁忙态),即用户态正在处理环形队列中的数据页,INITING表示初始态(即用户态处于初始态),即用户态尚未执行共享内存地址映射操作。
控制页会在这三种状态中跳转,其跳转的过程通常为:
FLUSHED->READING->FLUSHED以及INITING->FLUSHED。
控制页状态跳转的触发条件至少包括下述内容:
A1、在内核态创建共享内存的过程中,控制页中的用户态状态信息被设置为初始态INITING,即控制页进入初始态,表示用户态尚未执行共享内存地址映射操作;
A2、在用户态执行进程地址空间映射操作后,控制页中的用户态状态信息被设置为空闲态FLUSHED,即控制页由初始态INITING跳转至空闲态FLUSHED,表示目前没有数据页需要用户态处理;
A3、在用户态开始执行数据读写操作时,控制页中的用户态状态信息被设置为繁忙态READING,控制页由空闲态FLUSHED跳转至繁忙态READING,表示用户态正在对数据页进行处理;
A4、在用户态执行完成数据读写操作时,控制页中的用户态状态信息被设置为空闲态FLUSHED,控制页由繁忙态READING跳转至空闲态FLUSHED,表示目前没有数据页需要用户态处理。
本实施例中的每一个数据页中均包括第一区域和第二区域,第一区域用于存储针对内核态和用户态通讯数据的数据页分配信息以及数据页状态信息,而第二区域用于存储内核态和用户态之间的通讯数据。
数据页中的数据结构可以使用下述形式来表示:
其中的order表示数据页分配信息,即内核态在一次数据页分配过程中所分配的数据页的页数,且0可以表示单页分配;其中的data[0]表示内核态和用户态的通讯数据;其中的reading的不同取值可以定义为如下形式:
#define FREEZE 0
#define WRITING 1
#define READABLE 2
#define FLUSHING 4
#define INGORE 8
其中的FREEZE表示空闲态,即数据页可以被内核态分配;其中的WRITING表示内核态写状态,即数据页已经被内核态分配,且内核态正在向数据页中写数据;其中的READABLE表示用户态可读写状态,即数据页可以被用户态读写;其中的FLUSHING表示用户态读写状态,即数据页正在被用户态处理;其中的INGORE表示空闲忽略状态,即数据页可以被内核态分配,用户态则忽略该数据页中的内容。
每一个数据页均会在这五种状态中跳转,其跳转的过程通常为:
FREEZE->WRITING->READABLE->FLUSHING->FREEZE、FREEZE->INGORE以及INGORE->WRITING。
数据页状态跳转的触发条件至少包括下述内容:
B1、在内核态创建共享内存的过程中,各数据页中的数据页状态信息均被设置为空闲态FREEZE,各数据页分别进入空闲态FREEZE,表示数据页空闲且允许被内核态分配;
B2、在内核态针对需要向用户态传输的数据(即待传输数据)分配数据页且存在可分配的数据页时,本次可分配的数据页的数据页状态信息均被设置为内核态写状态WRITING,本次可分配的各数据页分别由空闲态FREEZE跳转至内核态写状态WRITING,表示数据页已经被内核态分配且内核态正在向数据页中写入数据;另外,本次可分配的数据页也可以由空闲忽略状态INGORE跳转至内核态写状态WRITING;
B3、在内核态开始将需要向用户态传输的数据(即待传输数据)写入一个数据页后,该数据页中的数据页状态信息被设置为用户态可读写状态READABLE,该数据页由内核态写状态WRITING跳转至用户态可读写状态READABLE,表示该数据页允许被用户态读写;
B4、在用户态开始从一个数据页中读取数据时,该数据页中的数据页状态信息被设置为用户态读写状态FLUSHING,该数据页由用户态可读写状态READABLE跳转至用户态读写状态FLUSHING,表示该数据页中的数据正在被用户态读取;另外,用户态在从一个数据页中读取数据之后,还需要向该数据页中写入用户态需要向内核态传输的数据时,该数据页维持在用户态读写状态FLUSHING;
B5、在用户态从一个数据页中读取数据完成或者向一个数据页中写入数据完成后,该数据页中的数据页状态信息被设置为空闲态FREEZE,即数据页由用户态读写状态FLUSHING跳转至空闲态FREEZE,表示该数据页空闲且允许被内核态分配;
B6、在内核态针对需要向用户态传输的数据分配数据页且可分配的数据页不能满足待传输数据的要求时,从当前可分配数据页起始地址开始到队列队尾的数据页中的数据页状态信息被设置为空闲忽略状态INGORE,即数据页由空闲态FREEZE跳转至空闲忽略状态INGORE,表示该数据页允许被内核态分配且用户态忽略该数据页。
实施例二、内核态和用户态通讯装置。
图5为本实施例的内核态和用户态通讯装置的结构示意图。
图5中,本实施例的装置包括:确定页数模块500、内核态写模块510以及通知模块520,可选的,本实施例的装置还可以包括:内核态初始化模块530、用户态初始化模块540、用户态读模块550以及用户态写模块560(如图6所示)。
下面对本实施例的装置所包含的各模块分别进行说明。
确定页数模块500主要用于确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数。
作为示例,本实施例中的共享内存是内核态(如内核态初始化模块530)设置的,例如设置于内核态进程中的内核态初始化模块530创建并注册一个字符设备,为该字符设备分配共享内存。在内核态初始化模块530为该字符设备分配共享内存后,内核态初始化模块530将共享内存划分为均具有预设存储空间大小的多个内存片,并将其中一个内存片作为控制页,内核态初始化模块530将控制页中的用户态状态信息设置为表征用户态未执行共享内存地址映射的状态信息,内核态初始化模块530将共享内存中的其他内存片均作为数据页,并使各数据页形成环形队列的结构;内核态初始化模块530将各数据页中的数据页状态信息均设置为表征数据页空闲且允许被内核态分配的状态信息,并将内核态当前可分配数据页起始地址设置为位于环形队列的队首位置的数据页的地址。
用户态进程(如用户态初始化模块540)在打开字符设备,并获得了句柄后,执行共享内存地址映射操作,用户态初始化模块540将共享内存中的控制页中的用户态状态信息设置为表征用户态空闲的状态信息。
作为示例,确定页数模块500通常根据待传输数据的大小以及上述预设存储空间大小确定待传输数据所需占用的数据页的页数,如在待传输数据的大小为13Kb,而预设存储空间大小为4Kb的情况下,确定页数模块500确定出待传输数据所需占用的数据页的页数为4页。
内核态写模块510主要用于根据共享内存的数据页中的数据页状态信息以及页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作;且该内核态写模块510包括:第一子模块511、第二子模块512、第三子模块513以及第四子模块514(如图7所示)。
第一子模块511主要用于按照从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,根据共享内存的数据页中的数据页状态信息以及所述页数查看是否存在可供分配的数据页;在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量不小于页数的情况下,确定出共享内存中存在可供分配的数据页。
第二子模块512主要用于将可供分配的数据页中的第一个数据页中的数据页分配信息设置为上述计算出的页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;将当前可分配数据页起始地址设置为可供分配的数据页的下一个数据页地址;将待传输数据写入可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
第三子模块513主要用于在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量小于上述计算出的页数的情况下,按照从环形队列的队首到内核态当前可分配数据页起始地址方向,根据共享内存的数据页中的数据页状态信息以及上述页数查看是否存在可供分配的数据页。
第四子模块514主要用于将可供分配的数据页中的第一个数据页中的数据页分配信息设置为上述页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;将当前可分配数据页起始地址到队尾的各数据页中的数据页状态信息设置为表征数据页允许被内核态分配且用户态忽略该数据页的状态信息;将待传输数据写入可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
通知模块520主要用于在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知。
作为示例,无论待传输数据所需占用的数据页为单数据页,还是多数据页,在内核态写模块510将待传输数据写入可供分配的数据页中的第一个数据页之后,通知模块520通知用户态进程读取数据页中的数据,且该通知中通常不包括数据读取位置等信息,而仅用于唤醒用户态执行数据读取操作。
一个具体的例子,在确定页数模块500计算出待传输数据需要占用4个数据页的情况下,在内核态写模块510将待传输数据写入第一个数据页,且第一个数据页的写操作完成后,通知模块520读取控制页中的用户态状态信息,在确定出该用户态状态信息为表征用户态空闲的状态信息时,通知模块520调用用于唤醒用户态执行读取数据操作的通知并发送,以触发用户态进程从数据页中读取数据;与此同时,内核态写模块510可以继续进行第二个数据页的写操作,从而使内核态和用户态的读写操作可以并发执行。
用户态读模块550主要用于在用户态接收到来自内核态的通知的情况下,将控制页中的用户态状态信息设置为表征用户态繁忙的状态信息,根据数据页中的数据页分配信息确定需要读取数据的数据页,从需要读取数据的数据页中的数据页状态信息为表征数据页允许被用户态读写的状态信息的数据页中读取数据;且用户态读模块550在读取数据页中的数据过程中,每读完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。
用户态写模块560主要用于针对用户态需要向内核态传输的待传输数据,在将待传输数据写入所述可供分配的数据页之后,通知内核态读取可供分配的数据页中的数据,并将可供分配的数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。
实施例三、内核态和用户态通讯方法。
图8为本实施例的内核态和用户态通讯方法的流程图。图8所示的方法主要包括:S500、S510以及S520。
下面对本实施例的方法所包含的各步骤分别进行说明。
图8中,S800、确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数。
作为示例,本实施例中的共享内存是内核态设置的,例如内核态进程创建并注册一个字符设备,为该字符设备分配共享内存。内核态进程在为该字符设备分配共享内存后,将共享内存划分为均具有预设存储空间大小的多个内存片,并将其中一个内存片作为控制页,内核态进程将控制页中的用户态状态信息设置为表征用户态未执行共享内存地址映射的状态信息,内核态进程将其他内存片均作为数据页,并使各数据页形成环形队列的结构;内核态进程还可以将各数据页中的数据页状态信息均设置为表征数据页空闲且允许被内核态分配的状态信息,并将内核态当前可分配数据页起始地址设置为位于环形队列的队首位置的数据页的地址。
用户态进程在打开字符设备,获得了句柄,并执行了共享内存地址映射操作之后,将共享内存中的控制页中的用户态状态信息设置为表征用户态空闲的状态信息。
作为示例,内核态进程通常根据待传输数据的大小以及上述预设存储空间大小确定待传输数据所需占用的数据页的页数,如在待传输数据的大小为13Kb,而预设存储空间大小为4Kb的情况下,内核态进程确定出待传输数据所需占用的数据页的页数为4页。
S810、根据共享内存的数据页中的数据页状态信息以及页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作。
作为示例,本实施例中的内核态进程可以先按照从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,根据共享内存的数据页中的数据页状态信息以及上述计算出的页数(如上述计算出的4页)查看是否存在可供分配的数据页;具体的过程可以包括:
1、在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量不小于上述计算出的页数的情况下,内核态进程确定出共享内存中存在可供分配的数据页,此时,内核态进程可以将可供分配的数据页中的第一个数据页中的数据页分配信息设置为上述计算出的页数,并将可供分配的各数据页中的数据页状态信息均设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;内核态进程将当前可分配数据页起始地址设置为可供分配的数据页的下一个数据页地址;内核态进程将待传输数据写入可供分配的数据页中,且在每写完一个数据页时,内核态进程将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
2、在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量小于上述计算出的页数的情况下,按照从环形队列的队首到内核态当前可分配数据页起始地址方向,根据共享内存的数据页中的数据页状态信息以及上述计算出的页数查看是否存在可供分配的数据页;如果存在可供分配的数据页,则内核态进程将可供分配的数据页中的第一个数据页中的数据页分配信息设置为上述计算出的页数,并将可供分配的各数据页中的数据页状态信息均设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;内核态进程将当前可分配数据页起始地址到队尾的各数据页中的数据页状态信息设置为表征数据页允许被内核态分配且用户态忽略该数据页的状态信息;内核态进程将上述待传输数据写入可供分配的数据页中,且在每写完一个数据页时,内核态进程将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
S820、在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知。
作为示例,无论待传输数据所需占用的数据页为单数据页,还是多数据页,内核态进程在将待传输数据写入可供分配的数据页中的第一个数据页之后,即通知用户态进程读取数据页中的数据,且该通知中通常不包括数据读取位置等信息,而仅用于唤醒用户态执行数据读取操作。
一个具体的例子,在内核态进程计算出待传输数据需要占用4个数据页的情况下,其在将待传输数据写入第一个数据页,且第一个数据页的写操作完成后,读取控制页中的用户态状态信息,在确定出该用户态状态信息为表征用户态空闲的状态信息时,调用用于唤醒用户态执行读取数据操作的通知并发送,以触发用户态进程从数据页中读取数据;与此同时,内核态进程可以继续进行第二个数据页的写操作,从而使内核态和用户态的读写操作可以并发执行。
用户态进程在接收到来自内核态进程的通知的情况下,用户态进程执行的操作包括:
1、用户态进程(如调度线程)先将控制页中的用户态状态信息设置为表征用户态繁忙的状态信息;
2、用户态进程(如调度线程)根据用户态当前处理数据页地址以及相应数据页中的数据页状态信息判断需要读取的数据是否位于用户态当前处理数据页地址所对应的数据页中;例如判断用户态当前处理数据页地址所对应的数据页中的数据页状态信息,如果数据页状态信息是表征用户态可读写的状态信息,则确定出需要读取的数据位于用户态当前处理数据页地址所对应的数据页中,否则,确定出需要读取的数据并未位于用户态当前处理数据页地址所对应的数据页中;再例如,判断用户态当前处理数据页地址所对应的数据页中的数据页状态信息,如果数据页状态信息是表征用户态可读写的状态信息,则从该数据页中获取数据页分配信息(如分配页数),在确定出用户态当前处理数据页地址所对应的数据页与上述分配页数之和不超过环形队列的最后一个数据页时,确定需要读取的数据位于用户态当前处理数据页地址所对应的数据页中,否则,确定出需要读取的数据并未位于用户态当前处理数据页地址所对应的数据页中;
3、在确定出需要读取的数据并未位于用户态当前处理数据页地址所对应的数据页,且用户态当前处理数据页地址并没有对应环形队列中的最后一个数据页的情况下,用户态进程(如调度线程)应将当前处理数据页地址设置为下一个数据页的地址,并返回到上述步骤2;
4、在确定出需要读取的数据并未位于用户态当前处理数据页地址所对应的数据页,且用户态当前处理数据页地址对应环形队列中的最后一个数据页的情况下,用户态进程(如调度线程)应将当前处理数据页地址设置为环形队列中的第一个数据页的地址,并返回到上述步骤2;
5、在确定出需要读取的数据位于用户态当前处理数据页地址所对应的数据页的情况下,用户态进程(如调度线程)将用户态当前处理数据页地址所对应的数据页中的数据页状态信息设置为表征用户态正在读写数据的状态信息,且用户态进程从该数据页中读取数据,如调度线程调度相应的工作线程读取该数据页中的数据,在数据读取完毕后,可以将该数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息,并将用户态当前处理数据页地址设置为下一个数据页的地址,且在用户态当前处理数据页地址已经是环形队列的最后一个数据页的地址的情况下,应将用户态当前处理数据页地址设置为环形队列的第一个数据页的地址。
6、用户态进程根据上述获得的分配页数判断是否需要读取下一个数据页中的数据,在确定出需要读取下一个数据页中的数据时,用户态进程(如调度线程)查看下一个数据页中的数据页状态信息,在确定出数据页状态信息为表征内核态写数据的状态信息时,等待预定时间间隔后继续查看该数据页中的数据页状态信息;在确定出数据页状态信息为表征用户态可读写的状态信息时,用户态进程(如调度线程)将用户态当前处理数据页地址所对应的数据页中的数据页状态信息设置为表征用户态正在读写数据的状态信息,且用户态进程从该数据页中读取数据,如调度线程调度相应的工作线程读取该数据页中的数据,在数据读取完毕后,可以将该数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息,并将用户态当前处理数据页地址设置为下一个数据页的地址,且在用户态当前处理数据页地址已经是环形队列的最后一个数据页的地址的情况下,应将用户态当前处理数据页地址设置为环形队列的第一个数据页的地址。重复步骤6,直到分配的各数据页中的数据均被读取完成。
在用户态需要向内核态传输的待传输数据的情况下,该待传输数据只能位于内核态本次分配的数据页中,用户态进程(如调度线程)可以在其读取了一个数据页中的数据之后,调度相应的工作线程,将待传输数据写入该数据读取完成的数据页中,在用户态读取了数据页中的数据且没有将数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息的情况下,调度线程应将写入待传输数据的数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。用户态进程应通知内核态读取相应的数据页中的数据,如用户态进程(如调度线程)使用ioctl进行通知。
实施例四、数据存取系统。
该数据存取系统包括:内核态进程、用户态进程以及共享内存。其中的共享内存被划分为多个内存片,共享内存所包含的所有内存片中的其中一个内存片被作为控制页,而其余的内存片被作为数据页,且所有的数据页可以形成环形队列的结构;控制页用于存储用户态进程状态信息;且每一个数据页均包括:第一区域和第二区域,第一区域用于存储数据页分配信息以及数据页状态信息,第二区域用于存储内核态进程和用户态进程的通讯数据。上述数据页分配信息通常为针对内核态进程和用户态进程通讯数据进行数据页分配而产生的数据页分配信息(如分配页数)。共享内存的具体结构可以参见上述实施例一的描述,而内核态进程和用户态进程基于该共享内存实现通讯所执行的操作可以参见上述实施例三的描述,在此不再重复说明。
需要注意的是,本申请的一部分可以被应用为计算机程序产品,例如计算机程序指令,当其被智能电子设备(如计算机或者服务器等)执行时,通过该智能电子设备的操作可以调用或者提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或者其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的智能电子设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请并不局限于上述示范性实施例的细节,而且在不背离本申请的精神或者基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将本申请的实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或者装置或者模块也可以由一个单元或者装置或者模块通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
Claims (16)
1.一种用于内核态和用户态通讯的共享内存结构,包括:
所述共享内存被划分为多个内存片;
所述多个内存片中的其中一个内存片为存储有用户态状态信息的控制页,且其余内存片为数据页;
每一个数据页均包括:第一区域和第二区域,所述第一区域用于存储针对内核态和用户态通讯数据的数据页分配信息以及数据页状态信息,所述第二区域用于存储内核态和用户态的通讯数据。
2.根据权利要求1所述的共享内存结构,其中,所述共享内存中的所有数据页形成环形队列。
3.根据权利要求1或2所述的共享内存结构,其中,所述控制页中的用户态状态信息为:表征用户态空闲的状态信息、表征用户态繁忙的状态信息或者表征用户态未执行共享内存地址映射的状态信息。
4.根据权利要求3所述的共享内存结构,其中,
在内核态创建共享内存的过程中,所述共享内存中的控制页中的用户态状态信息被设置为表征用户态未执行共享内存地址映射的状态信息;
在用户态执行进程地址空间映射操作后,所述共享内存中的控制页中的用户态状态信息被设置为表征用户态空闲的状态信息;
在用户态开始针对数据页执行读写操作时,所述用户态状态信息被设置为表征用户态繁忙的状态信息;
在用户态完成数据页中的数据读写操作时,所述用户态状态信息被设置为表征用户态繁忙的状态信息。
5.根据权利要求1或2所述的共享内存结构,其中,所述数据页中的数据页状态信息为:表征数据页空闲且允许被内核态分配的状态信息、表征数据页已经被内核态分配且内核态正在写入数据的状态信息、表征数据页允许被用户态读写的状态信息、表征数据页正在被用户态读写的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息。
6.根据权利要求5所述的共享内存结构,其中,
在内核态为其创建并注册的设备分配共享内存的过程中,所述共享内存中的各数据页中的数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息,使各数据页处于空闲态;
在内核态针对需要向用户态传输的数据分配数据页且存在可分配的数据页时,所述可分配的数据页的数据页状态信息被设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息,使可分配的数据页处于内核态写状态;
在内核态将需要向用户态传输的数据写入一个数据页后,该数据页中的数据页状态信息被设置为表征数据页允许被用户态读写的状态信息,使该数据页处于用户态可读写状态;
在用户态从一个数据页中读取数据或者向一个数据页中写入数据时,该数据页中的数据页状态信息被设置为表征数据页正在被用户态读写的状态信息,使该数据页处于用户态正在读写状态;
在用户态从一个数据页中读取数据完成或者向一个数据页中写入数据完成后,该数据页中的数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息,使该数据页处于空闲态;
在内核态针对需要向用户态传输的数据分配数据页且可分配的数据页不足时,所述不足分配的数据页被设置为表征数据页允许被内核态分配且用户态忽略该数据页的状态信息,使该数据页处于空闲忽略态。
7.一种内核态和用户态通讯方法,其中,所述方法包括:
确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数;
根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作;
在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知。
8.根据权利要求7所述的方法,其中,所述方法还包括:
在内核态,创建并注册设备并为所述设备分配共享内存;
将所述共享内存中的控制页中的用户态状态信息设置为表征用户态未执行共享内存地址映射的状态信息,并将共享内存中的各数据页中的数据页状态信息均设置为表征数据页空闲且允许被内核态分配的状态信息;
在针对所述共享内存执行用户态进程地址空间映射操作的过程中,将共享内存中的控制页中的用户态状态信息设置为表征用户态空闲的状态信息。
9.根据权利要求7所述的方法,其中,所述根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的步骤包括:
按照从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,根据共享内存的数据页中的数据页状态信息以及所述页数查看是否存在可供分配的数据页;
在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量不小于所述页数的情况下,确定出共享内存中存在可供分配的数据页。
10.根据权利要求9所述的方法,其中,所述针对待传输数据执行数据页写操作的步骤包括:
将可供分配的数据页中的第一个数据页中的数据页分配信息设置为所述页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;
将所述当前可分配数据页起始地址设置为所述可供分配的数据页的下一个数据页地址;
将所述待传输数据写入所述可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
11.根据权利要求9所述的方法,其中,所述根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的步骤还包括:
在确定出从内核态当前可分配数据页起始地址到共享内存的环形队列的队尾方向,数据页状态信息被设置为表征数据页空闲且允许被内核态分配的状态信息或者表征数据页允许被内核态分配且用户态忽略该数据页的状态信息的数据页的数量小于所述页数的情况下,按照从环形队列的队首到内核态当前可分配数据页起始地址方向,根据共享内存的数据页中的数据页状态信息以及所述页数查看是否存在可供分配的数据页。
12.根据权利要求11所述的方法,其中,所述针对待传输数据执行数据页写操作的步骤包括:
将可供分配的数据页中的第一个数据页中的数据页分配信息设置为所述页数,并将可供分配的数据页中的数据页状态信息设置为表征数据页已经被内核态分配且内核态正在写入数据的状态信息;
将所述当前可分配数据页起始地址到队尾的各数据页中的数据页状态信息设置为表征数据页允许被内核态分配且用户态忽略该数据页的状态信息;
将所述待传输数据写入所述可供分配的数据页中,且在每写完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页允许被用户态读写的状态信息。
13.根据权利要求7至13中任一权利要求所述的方法,其中,所述方法还包括:
在用户态接收到来自内核态的所述通知的情况下,将控制页中的用户态状态信息设置为表征用户态繁忙的状态信息;
根据数据页中的数据页分配信息确定需要读取数据的数据页;
从所述需要读取数据的数据页中的数据页状态信息为表征数据页允许被用户态读写的状态信息,并读取数据页中的数据。
14.根据权利要求13所述的方法,其中,所述方法还包括:
在用户态读取数据页中的数据过程中,每读完一个数据页时,将该数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息;或者
针对用户态需要向内核态传输的待传输数据,在将所述待传输数据写入所述可供分配的数据页之后,通知内核态读取所述可供分配的数据页中的数据,并将所述可供分配的数据页中的数据页状态信息设置为表征数据页空闲且允许被内核态分配的状态信息。
15.一种内核态和用户态通讯装置,其中,所述装置包括:
确定页数模块,用于确定内核态需要向用户态传输的待传输数据所需占用共享内存中的数据页的页数;
内核态写模块,用于根据共享内存的数据页中的数据页状态信息以及所述页数确定出共享内存中存在可供分配的数据页的情况下,针对待传输数据执行数据页写操作;
通知模块,用于在可供分配的数据页中的第一个数据页写完成,且根据共享内存的控制页中的用户态状态信息确定出用户态空闲的情况下,向用户态发送读取数据页中的数据的通知。
16.一种数据存取系统,包括:
内核态进程;
用户态进程;以及
共享内存,所述共享内存被划分为多个内存片;
其中,所述多个内存片中的其中一个内存片为存储有所述用户态进程的状态信息的控制页,且其余内存片为数据页;
其中,每一个数据页均包括:第一区域和第二区域,所述第一区域用于存储针对内核态进程和用户态进程通讯数据的数据页分配信息以及数据页状态信息,所述第二区域用于存储内核态进程和用户态进程的通讯数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610526265.4A CN107577539B (zh) | 2016-07-05 | 2016-07-05 | 用于内核态和用户态通讯的共享内存结构及其应用 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610526265.4A CN107577539B (zh) | 2016-07-05 | 2016-07-05 | 用于内核态和用户态通讯的共享内存结构及其应用 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107577539A true CN107577539A (zh) | 2018-01-12 |
CN107577539B CN107577539B (zh) | 2021-03-16 |
Family
ID=61049797
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610526265.4A Active CN107577539B (zh) | 2016-07-05 | 2016-07-05 | 用于内核态和用户态通讯的共享内存结构及其应用 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107577539B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109800190A (zh) * | 2019-01-22 | 2019-05-24 | 星辰天合(北京)数据科技有限公司 | 内存的加速处理方法及装置、存储介质、处理器 |
CN109857573A (zh) * | 2018-12-29 | 2019-06-07 | 深圳云天励飞技术有限公司 | 一种数据共享方法、装置、设备及系统 |
CN110597640A (zh) * | 2019-08-29 | 2019-12-20 | 深圳市优必选科技股份有限公司 | 进程间的数据传输方法、装置、终端及计算机存储介质 |
CN111190543A (zh) * | 2019-12-26 | 2020-05-22 | 曙光信息产业股份有限公司 | 一种线程间共享nvdimm存储资源的存储方法及系统 |
CN111240853A (zh) * | 2019-12-26 | 2020-06-05 | 天津中科曙光存储科技有限公司 | 一种节点内大块数据双向传输方法及系统 |
CN111857993A (zh) * | 2020-06-24 | 2020-10-30 | 烽火通信科技股份有限公司 | 一种内核态调用用户态函数的方法 |
CN111897492A (zh) * | 2020-07-15 | 2020-11-06 | 杭州海康威视系统技术有限公司 | 一种基于块设备驱动的数据处理方法、装置及电子设备 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6349355B1 (en) * | 1997-02-06 | 2002-02-19 | Microsoft Corporation | Sharing executable modules between user and kernel threads |
US20060036843A1 (en) * | 2001-10-30 | 2006-02-16 | Microsoft Corporation | Network interface sharing methods and apparatuses that support kernel mode data traffic and user mode data traffic |
CN1859461A (zh) * | 2005-11-09 | 2006-11-08 | 华为技术有限公司 | 一种基于共享的参数表实时刷新方法和系统 |
CN103034544A (zh) * | 2012-12-04 | 2013-04-10 | 杭州迪普科技有限公司 | 一种用户态与内核态共享内存的管理方法和装置 |
CN103514053A (zh) * | 2013-09-22 | 2014-01-15 | 中国科学院信息工程研究所 | 一种基于共享内存的进程间通讯方法 |
CN104123194A (zh) * | 2014-07-16 | 2014-10-29 | 上海斐讯数据通信技术有限公司 | 内核态与用户态的通信结构及通信方法 |
CN104572313A (zh) * | 2013-10-22 | 2015-04-29 | 华为技术有限公司 | 一种进程间的通信方法及装置 |
CN104881330A (zh) * | 2015-05-22 | 2015-09-02 | 大唐移动通信设备有限公司 | 一种多进程共享数据的方法和装置 |
US9280423B1 (en) * | 2013-06-27 | 2016-03-08 | Emc Corporation | Mounting block level backup images |
-
2016
- 2016-07-05 CN CN201610526265.4A patent/CN107577539B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6349355B1 (en) * | 1997-02-06 | 2002-02-19 | Microsoft Corporation | Sharing executable modules between user and kernel threads |
US20060036843A1 (en) * | 2001-10-30 | 2006-02-16 | Microsoft Corporation | Network interface sharing methods and apparatuses that support kernel mode data traffic and user mode data traffic |
CN1859461A (zh) * | 2005-11-09 | 2006-11-08 | 华为技术有限公司 | 一种基于共享的参数表实时刷新方法和系统 |
CN103034544A (zh) * | 2012-12-04 | 2013-04-10 | 杭州迪普科技有限公司 | 一种用户态与内核态共享内存的管理方法和装置 |
US9280423B1 (en) * | 2013-06-27 | 2016-03-08 | Emc Corporation | Mounting block level backup images |
CN103514053A (zh) * | 2013-09-22 | 2014-01-15 | 中国科学院信息工程研究所 | 一种基于共享内存的进程间通讯方法 |
CN104572313A (zh) * | 2013-10-22 | 2015-04-29 | 华为技术有限公司 | 一种进程间的通信方法及装置 |
CN104123194A (zh) * | 2014-07-16 | 2014-10-29 | 上海斐讯数据通信技术有限公司 | 内核态与用户态的通信结构及通信方法 |
CN104881330A (zh) * | 2015-05-22 | 2015-09-02 | 大唐移动通信设备有限公司 | 一种多进程共享数据的方法和装置 |
Non-Patent Citations (3)
Title |
---|
T.S.TREVISAN ET AL.: "《14th Symposium on Computer Architecture and High Performance Computing, 2002. Proceedings.》", 25 February 2003 * |
田泉 等: "《Linux实时内存的研究与实现》", 《微电子学与计算机》 * |
陈浩: "《Linux下用户态和内核态内存共享的实现》", 《软件开发与设计》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109857573A (zh) * | 2018-12-29 | 2019-06-07 | 深圳云天励飞技术有限公司 | 一种数据共享方法、装置、设备及系统 |
CN109857573B (zh) * | 2018-12-29 | 2021-03-05 | 深圳云天励飞技术有限公司 | 一种数据共享方法、装置、设备及系统 |
CN109800190A (zh) * | 2019-01-22 | 2019-05-24 | 星辰天合(北京)数据科技有限公司 | 内存的加速处理方法及装置、存储介质、处理器 |
CN110597640A (zh) * | 2019-08-29 | 2019-12-20 | 深圳市优必选科技股份有限公司 | 进程间的数据传输方法、装置、终端及计算机存储介质 |
CN111190543A (zh) * | 2019-12-26 | 2020-05-22 | 曙光信息产业股份有限公司 | 一种线程间共享nvdimm存储资源的存储方法及系统 |
CN111240853A (zh) * | 2019-12-26 | 2020-06-05 | 天津中科曙光存储科技有限公司 | 一种节点内大块数据双向传输方法及系统 |
CN111190543B (zh) * | 2019-12-26 | 2023-07-18 | 曙光信息产业股份有限公司 | 一种线程间共享nvdimm存储资源的存储方法及系统 |
CN111240853B (zh) * | 2019-12-26 | 2023-10-10 | 天津中科曙光存储科技有限公司 | 一种节点内大块数据双向传输方法及系统 |
CN111857993A (zh) * | 2020-06-24 | 2020-10-30 | 烽火通信科技股份有限公司 | 一种内核态调用用户态函数的方法 |
CN111857993B (zh) * | 2020-06-24 | 2022-07-08 | 烽火通信科技股份有限公司 | 一种内核态调用用户态函数的方法 |
CN111897492A (zh) * | 2020-07-15 | 2020-11-06 | 杭州海康威视系统技术有限公司 | 一种基于块设备驱动的数据处理方法、装置及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN107577539B (zh) | 2021-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107577539A (zh) | 用于内核态和用户态通讯的共享内存结构及其应用 | |
CN103514053B (zh) | 一种基于共享内存的进程间通讯方法 | |
CN101877120B (zh) | 支持多个绘图处理器的互动的方法与系统 | |
US7676646B2 (en) | Packet processor with wide register set architecture | |
US20100115236A1 (en) | Hierarchical shared semaphore registers | |
US20050060705A1 (en) | Optimizing critical section microblocks by controlling thread execution | |
CN104915151A (zh) | 多虚拟机系统中一种主动共享的内存超量分配方法 | |
US9703603B1 (en) | System and method for executing accelerator call | |
US20090100200A1 (en) | Channel-less multithreaded DMA controller | |
CN101702231A (zh) | 绘图处理单元同步系统与方法 | |
JP5309703B2 (ja) | 共有メモリの制御回路、制御方法及び制御プログラム | |
JPH03126158A (ja) | スケジユーリング方法及び装置 | |
KR20070115883A (ko) | 컴퓨터 시스템에서의 보강된 인터럽트 제어 방법, 이를구현하는 시스템, 명령어를 포함하는 컴퓨터-판독가능 매체및 하드웨어 제어 장치 | |
CN103365726A (zh) | 一种面向gpu集群的资源管理方法和系统 | |
CN104102542A (zh) | 一种网络数据包处理方法和装置 | |
WO2013117899A1 (en) | Exception handling in a data processing apparatus having a secure domain and a less secure domain | |
CN104102548A (zh) | 任务资源调度处理方法和系统 | |
CN108153596A (zh) | 一种基于无锁队列的消息处理方法和装置 | |
CN101566977A (zh) | 处理器访问共享数据的方法、装置及系统 | |
WO2021022964A1 (zh) | 一种基于多核系统的任务处理方法、装置及计算机可读存储介质 | |
CN106776023B (zh) | 一种自适应gpu统一染色阵列任务负载均衡方法 | |
CN101470636B (zh) | 一种消息的读写方法和装置 | |
CN110297662A (zh) | 指令乱序执行的方法、处理器及电子设备 | |
EP1693743A2 (en) | System, method and medium for using and/or providing operating system information to acquire a hybrid user/operating system lock | |
US8055806B2 (en) | Autonomic threading model switch based on input/output request type |
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 |