对来自多处理器系统上的多线程程序的存储器访问进行管理的方法和系统的制作方法

文档序号:6456802阅读:364来源:国知局
专利名称:对来自多处理器系统上的多线程程序的存储器访问进行管理的方法和系统的制作方法
技术领域
本发明总体上涉及在多处理器系统上执行的多线程应用程序之
间的共享存储器访问;更具体地,本发明涉及使共享存储器访问成 为确定性事件,以用于例如促进虚拟化的多线程应用的复制。
背景技术
对线程之间的共享存储器访问进行虚拟化的 一 种安全而简单的 方式是登记对存储器的每个访问以及在复制机器中重放(replay) 这些访问。这在性能方面尤其低效。
因此,需要使多线程程序的共享存储器访问具有确定性,例如 以便能够通过简单地在复制机器上重新执行应用程序的代码而在备 份机器上对在主机器上虚拟化的应用进行复制。
一个主要的用途可能是在容错系统中。在容错系统中,应用运 行在主机器上,并且其执行被完全复制在第二机器上(以便在主机 器失效时进行恢复)。通过记录和重放产生非确定性结果的事件或 者重新执行用于复制产生确定性结果的事件的代码来实现复制。使 得多线程程序进行的共享存储器访问具有确定性的另 一种用途是调 试虛拟化程序,该调试通过将代码(此情况下在同一机器上)重新 执行所需的次数来进行。
进程针对可写共享存储器区域的交替执行是一种潜在的非确定 性资源。为了能够使得共享存储器访问具有确定性,需要记录并发 进程访问共享存储器的顺序。在单处理器机器的情况下,可以仅仅 通过每个调度周期登记一条记录来优化记录操作。代替登记对共享 存储器区域的每个访问,如果记录指定进程标识符,连同在调度周期内所访问的第 一 条指令的位置以及在该调度周期结束以前该进程 所执行的用户指令的数目,则在访问共享存储器区域的每个调度周 期登记一条记录是足够的。因此,对于一个调度周期,共享存储器 访问已变为确定性事件。为了在备份机器中重现此事件,恢复调度 周期的记录以及重新执行此周期的代码就已足够。
为了将此优化法扩展至多处理器机器,需要将单处理器互斥属 性强制为对共享存储器区域的串行访问。转让给国际商业机器公司
的法国专利申请WO2006/077261描述了如何实现多处理器系统上的 多进程应用的确定性重放。其中描述了共享存储器访问控制机制; 该机制使用处理器的存储器管理单元(MMU)。对访问共享存储器 的控制是通过对一个处理器的MMU (存储器管理单元)硬件设备进 行编程以允许授权访问存储器页面来实现的,其他处理器的MMU -故编程为拒绝对同 一 页面的任何访问。
在调度周期内,在多处理器机器上,给予每个单独的进程对共 享存储器的排他性访问权。利用进程的页表在每个调度周期内将访 问权选择性地授予单个进程。然而,在多线程程序的情况下,参与 的进程共享它们的地址空间;通过利用共享页表来应用单处理器解 决方案会影响整个线程组。进一步地,与单处理器环境中的进程相 比,整个地址空间会在线程之间共享,并且为了监视和控制这些地 址,必须跟踪对共享地址空间的可写部分的任何访问。这意p木着, 即使存储器页面是共享的,每个任务也可以具有其自己的私有存储 器描述符集合。对于多线程程序却不是这种情况,在多线程程序中, 所有的存储器描述符是共享的。此专利申请建议为了跟踪创建不 止一个线程的一个任务的共享存储器访问,页表条目的结构需要扩 展为在每个任务内克隆的每个线程,其中每个任务按照本发明所描 述地进行监视。该发明的原理可以应用到每个任务或者一个任务内 的每个线程,对共享存储器页面的访问在调度器所定义的激活周期 的整个持续时间内是排他的。在此周期期间,共享存储器页面保持 一致。因此,需要扩展内核的虛拟存储器管理模块以使得现有技术的 共享存储器访问串行化机制能够应用于完全共享其整个存储器空间 的多线程程序(而不是只共享其存储器空间的子集的进程)。
美国专利号6854108描迷了 一种用于确定性地重放在多处理器 上的分布式多线程程序的可观察运行时间行为的方法。该方法依赖 于对JVM中锁定例程的使用。此方案意味着改动JVM并且受限于 运行在JVM顶层的纯Java应用,还受限于所有存储器访问必须由 JVM将进行的锁定来保护的事实。
需要提供一种应用于多处理器计算机上的多线程进程的共享存 储器访问控制,该共享存储器访问控制是通用的并且可透明地应用 于任何类型的应用。

发明内容
因此,本发明的一个目的是使得多线程程序的共享存储器访问 可监视且可控制,以便串行化这些访问并将其变成确定性事件。 本发明的另一目的是提供一种透明地实施于应用的方法。 本发明的又一目的是使用已有方法来管理对多处理器环境中的 共享资源的访问,该方法以更有效的方式为任何任务或线程提供了 ^卜他性访问。
如权利要求1中所要求的,这些目的通过一种用于控制由多处 理器计算机上执行的进程所创建的线程对存储器的访问的方法来实
现,所述方法包括
-进程请求创建新线程;
-在存储器描述符中分配新页表目录,以及创建已有线程的页表的
畐'J本; -等待事件;
-当发生页面错误时,对指示页面存在于存储器中并且可写的两个 4立进4亍测"^式;
-如果页面存在并且可写,并且如果测试到线程将要退出,则-授权导致页面错误的线程访问页面,以及设置指示页面存在于
存储器中并且可写的位; -执行等待事件的步骤; -如果页面存在并且可写,如果另一线程具有对该页面的访问权并
且等待其他线程释放该页面,则等待其他线程释放; -当线程已经释放访问权时,
-授权导致页面错误的所述线程访问所述页面,以及设置指示页 面存在于存储器中并且可写的位; -执行等待事件的步骤。
根据权利要求2,上述目的还可以如此实现,权利要求1的方法 还包括
步骤之后,如果页面不存在或者不可写,则让内核来处理所述页面 错误;
-通过测试相应的位来测试所述新页面在由内核进程创建之后是否 可写;
-如果所述新页面可写,则重置所述新页面的存在位; -将所述内核创建的页表条目传播到所有线程的其他页表; -执行等待事件的步骤。
这些目的也可以通过针对优选实施方式的解决方案的权利要求 3-4的方法来实现,以及针对第二实施方式的两页表结构的权利要求 5-7的方法来实现。
这些目的也可以通过根据权利要求8的计算机程序和根据权利 要求9的系统来实现。
本发明的解决方案允许针对在多处理器系统上执行的每个多线 程应用管理引用共享存储器页面的独立的存储器描述符。
使得多线程程序的共享存储器访问可监视和可控制,除了获得 本发明的主要目的之外,还具有其他优势如下 -性能当粒度变化时,共享存储器访问控制可以改善应用性能(时
8间从指令持续时间到调度周期持续时间,空间从4字节的字到
4K字节的页面),因为其减少了共享对象的竟争比率。
-根据本发明第三目的所描述的解决方案非常有效,足以优化处理
器中已有硬件功能的使用。如在优选实施方式的详细描述中所提到
的,本发明的解决方案不仅通过避免处理器中的硬件改动而且通过
避免操作系统的内核中的某些重大软件变化,限制了对已有计算机
的重大改动。
-非虚拟化任务不受改动的影响。原始的存储器管理系统保持用于
非虛拟化任务。对于可能具有不可预知结果的所有任务,其他解决
方案可能使所述改动全局化。此解决方案则可以选择性地实施。例
如,对于所有任务来说,额外使用存储器可能是不可接受的。同样,
某些任务可能不支持粒度变化正常的访问控制(硬件准许的)是
针对一条指令以及存储器中一个存储器字的大小,即使没有观察或 控制其的空间。不利影响的一个例子是兵乓效应,在此效应中,两
个任务交替访问共享页面本发明的解决方案阻止了此情况的出现, 因为利用时间片来分配排他性存储器字,下一任务必须等待大约数 千条指令。对此存在一种解决方案修改应用以允许通过特定指令 明确释放页面。


图1示出了未实施本发明时多线程应用中的存储器描述符的结
构;
图2示出了根据本发明的优选实施方式的每个任务一个表的存 储器描述符的结构;
图3示出了根据第二实施方式的存储器描述符的简化结构; 图4是根据优选实施方式的方法的流程图; 图5是根据第二实施方式的方法的流程图。
具体实施方式
在非多线程应用中,为了有效地重现共享存储器访问的顺序, 在调度周期内对单独的进程给予对共享存储器的排他性访问权。# ,J 用进程的页表在每个调度周期内选择性地授予单个进程访问权。然 而,在多线程程序的情况下,参与的进程共享它们的地址空间,利 用共享页表会影响整个线程组。进一步地,与非多线程应用中的进 程相比,整个地址空间会在线程之间共享,并且为了监视和控制这 些地址,必须跟踪对共享地址空间的可写部分的任何访问。继而, 在容错系统中用于复制多线程程序对共享地址空间访问的访问信,包-被登记,并且将会用于通过在备份机器中重新执行程序代码来重放 这些i方问。
为了跟踪进程访问共享存储器区域的顺序,通过改变跟踪访问 的空间和时间粒度,涌现了各种设计选择。空间粒度可以从单个存 储器位置改变至页面、整个地址空间,而时间粒度可以从单条指令 访问共享区域改变至整个调度周期。通过在指令级别粒度跟踪对单 个存储器位置的访问,可以准确地重现主机器上的应用的执行。然 而,这么做既不是所希望的也不可行。
内核线程的传统实现为整个线程组提供了单页表。为了跟踪存 储器访问的顺序,可以采用以下技术。修改共享页表以拒绝对地址 空间的所有可写部分的访问。这么做会迫使任何线程尝试访问此区 域从而导致页面错误。在页面错误处理机中,登记该访问,并且在 临时激活对该存储器位置的访问权的情况下重新执行当前指令。这 确保登记了每个线程对共享存储器的每个访问。然而,此方法也强 加了由于拦截每个存储器访问而导致的高开销。
为了提高前述方法的效率,可以将粒度从指令级别的粒度改变 到调度周期的粒度。这要求在调度周期期间的访问互斥性,并且通 过维持同步的页表集合,线程组中每个线程一个表,有可能选择性 地给予单独的进程整个调度周期的访问权。当调度线程运行时,相
应的页表加载到MMU上下文中。
用于每个线程组的页表集合必须完全同步。只允许在跨集合中的两个页表的相应条目之间的存在标记有所差别。无论何时修改任 一页表的条目,此变化必须传播到其余页表。很多内核子系统(例
如aio、 swap等)修改页表,并且在每个实例中,此修改必须传播到 该组中的每个页表。
存储器粒度是要考虑的另一维度。字节(或者存储器字)级别 粒度将提供用于跟踪共享存储器访问的顺序所需的串行化的最佳程 度。如果存储器的单位是页面,则将会拒绝竟争的进程对整个页面 的访问,而不是仅仅拒绝对竟争位置的访问。当同一页面中放置了 对多个资源的锁时,这尤其将是个问题。串行化对页面的访问将会 串行化对整个资源集合的访问。尽管希望字级别的粒度,但是其取 决于底层架构所使用的存储器的单位。典型的MMU架构为了最优 化页表大小,以页面级别粒度来管理存储器。
对于另一极端,如果使用地址空间级别粒度,在调度周期期间 提供排他性访问所需的页表的数目可以压缩为2个,而不管线程组 中线程的数目。为了向一个线程提供对可写地址空间的排他性访问, 该线程的页表中的相应条目会被标记为存在,而其余页表中的可写 条目会被标记为不存在。由于已被拒绝访问地址空间的线程的页表 是一样的,因此可以使用一个页表(称为反页表)。事实上,反页 表的实际条目是不相关的,因为它们从没有在页面转换中使用。反 页表仅用于当从被拒绝访问的线程的上下文进行存储器访问时,强 制出错。当线程应当被拒绝访问地址空间时,其页表被切换到反页 表,反之亦然。
以下描述针对Linux内核上下文中的线程的共享存储器排他性 访问机制的实现以及Linux分页模型。尽管此描述使用Linux特定的 术语,但是本方法非常通用,足以应用于其他操作系统和架构。
为了提供对共享存储器的排他性访问,将本发明应用于现有技 术的专利申请,实施应当提供无缝授予单个进程访问权以及在任何 其他线程尝试访问该区域时引起错误的能力。为此目的,使用在大 部分现代架构中可用的分页机制。"page_present (页面—存在)"位
ii指示在物理存储器中是否分配了特定页面,当向另一进程指派对页 面的排他性访问时,该位会被人工重置以触发页面错误。这么^f故可 能潜在地干扰常规分页机制。通过增加页面的使用计数器来捕获页 面上的锁,避免了上述情况,使得内核交换器永远不会交换该页面。
图1示出了未实施本发明时多线程应用中的存储器描述符的结 构。其示出了页表如何被常规线程共享的示意图。在图1中,示出 了在包括虚拟存储器管理的大部分操作系统中可以找到的页表层级 的一个例子。存储器描述符(110)由需要访问存储器的进程的所有
线程(100)访问。存储器描述符是页表层级的最高级别。存储器描 述符包括指向作为树根的页面全局目录PGD ( 130)的指针(120)。 PGD指向页面中间目录(PMD) ( 140),该页面中间目录对页面条 目(150)的列表编制索引,页面条目是指向物理存储器中的页帧 (160, 165 )的指针。PGD、 PMD和PTE形成了页表结构(170), 其允许线程访问它们的公共地址空间的页面。如所描述的,三个线 程(100)通过页表结构(170)访问(155, 157)相同的页帧(160 和165)。
图2示出了根据本发明优选实施方式的存储器描述符的结构, 其中每个任务一个表。
在将本发明应用于现有技术的专利申请所包括的第 一方法中, 为每个线程复制PTE从而为每个单个线程保证排他性访问就足够 了。这是这样实现的对于给定的页表条目,选择性启用相应页表 中的存在标记。不过由于地址转换是硬线连接到CPU的MMU中, 因此需要复制整个页表层级。事实上,可以在存储器描述符(200) 的更高级别来进行隔离(segregation),其包括页表层级和与进程地 址空间有关的其他参数。在此方法中,将为每个线程提供单独的存 储器描述符。也有可能使用fork (分叉)系统调用的实现,该fork 系统调用利用Linux创建新的进程并且复制页表。使用fork意味着 实施困难的同步。存储器描述符是广泛应用的、架构独立的数据结 构,改变其用于线程的语义要求大量的内核修改。此外,需要集中的锁来同步跨越线程组中不同存储器描述符的页表,这使实现进一 步复杂化。
如图2所示,在优选实施方式中,为组中的每个线程指派私有
页表(210)。在线程组共享的存储器描述符200中维护这些私有页 表的哈希表,通过线程id对其进行索引。进一步地,指向页面目录 的指针(220)位于相应线程的进程描述符中,从而可以在上下文切 换操作期间快速访问页面目录。当在内核的虛拟存储器管理子系统 中操作时,在只有进程的存储器描述符可用的情况下,使用哈希表 来获取特定线程的页面目录。 一旦每个线程有其自己的私有页表
(210),则按照与根据现有技术的专利申请解决方案、针对常规进 程的共享存储器访问控制的情况下完全相同的方式,来控制对存储 器可写区域的访问。在线程的情况下,地址空间中的每个页面是共 享的,而在进程的情况下,共享的页面明确地标记为共享。使用结 合图5所描述的进程,两个线程(线程1和线程2)被授予(255, 257 )对存储器的某些访问,而对于所有线程拒绝其他访问(263, 265, 267, 269)。
一旦每个线程有其自己的私有页表(210),则按如下方式来授 予组中的 一个线程对存储器可写部分的访问,即针对授权线程设置 所访问页面的PTE中的pagejresent位,以及重置所有其他线程的 位,使得当其他线程尝试访问该页面时将会产生页面错误。
图3示出了在给予一个线程对整个地址空间的访问权时这一多 线程应用的特定情况下的存储器描述符的简化结构。本发明的此第 二实施方式采用本文上面描述的地址空间级别粒度。在此情况下, 在调度周期期间提供排他性访问所需的页表的数目可以压缩为2个。 每个线程组将具有与其相关联的一对页表,正页表(370)和反页表
(375 )。正页表(370)用于地址转换,并且被指派给授权在调度 周期内访问地址空间的线程(图3中的线程1 )。将反页表(375 ) 指派给被拒绝在此调度周期内访问的其余线程(线程2和线程3)。 所示页表结构包括由线程组共享的唯一的存储器描述符(300)。存储器描述符包含指向各个页表(370和375 )的两个页面目录(330, 335 )。每个页表结构包括一个页面中间目录(340, 345 ),每个页 面中间目录对条目(350, 355 )的列表编制索引。在图3中,如结 合图6所描述的那样使用进程,向线程1授予(365, 367 )访问两 个页帧(160, 165 )的访问权;对于组内的其他线程(线程2和线 程3),拒绝访问那两个页帧(160, 165 )的访问权。
方法流程图。
将私有页表创建为克隆系统调用的一部分。如果虚拟化进程没 有调用设置了 VM—CLONE标记的克隆系统调用,则不使用用于线程 的访问控制系统,并且不执行当前的方法。当虚拟化进程调用设置 了 VM—CLONE标记的调用克隆系统调用时,修改已有copy—mm函 数以分配新的页面目录,从而为正在创建的线程保持私有页表,并 将其添加到哈希表中。继而调用新的函数rr一dup一vmas来有系统地复 制整个页表层级。在称为dup—vmas的已有函数被fork调用之后,对 此函数进行建模以创建用于新创建的子进程的新的页表。这两个函 数之间的关键差别在于在rr_dup—vmas的情况下,所有页表条目无 一例外地被复制,而dup—vmas跳过设置了称为VM—DONT—COPY 的已有标记被置位的页面。进一步地,dup_vmas函数对于父(进程) 和子(进程)二者都将把地址空间的可写部分标记成只读,以实现 写入时复制,而rr一dup一vmas使得所有可写条目缺失。组内的线程所 使用的页表集合保持同步,以便维持线程的存储器共享语义。对任 一页表的任何修改被传播到其余部分,从而这些变化反映在其他对 等进程的上下文中。
针对线程的共享存储器访问控制的实现需要解决在进程情况下 不存在的特定问题。内核经常直接访问进程的地址空间。例如,当 用户级线程或进程将存储器緩存传递给读取系统调用时,内核的文 件系统组件直接写到由用户空间程序提供的緩存中。这种对共享存 储器的访问通常由访问控制机制来仲裁。然而,在线程的情况下,当线程将要退出时,内核直接将线程标识符的值写到进程地址空间 中用户提供的存储器指针。通过检查进程描述符中称为PF—
EXITING的已有标记来^r测这种访问,如果标记^皮置位,则将特定 访问从常规访问控制中排除,并且给予内核无条件访问。
一般说来,当相应的线程退出时,每个线程的页表或者是通过 显式地调用退出系统调用来释放,或者在被内核杀死时隐式地释放。 特别地,当进程中的一个线程调用exec系统调用时,其解映射进程 的当前地址空间,并且创建和杀死进程中除了已经调用exec系统调 用的线程之外的所有其他线程。修改内核的线程退出操作以释放页 面目录以及与退出线程相关联的页表层级。在exec系统调用末尾, 只留下 一 个具有新的页表集合的进程。此进程随后创建的任何线程 将继承其页表的副本,并且再次强制排他性访问控制。
在图4的流程图中,示出了相应的步骤 -利用VM—CLONE请求创建新线程(405 ); -在存储器描述符中分配新页表目录,并创建已有线程的页表的副
本(410); -等待事件(420);
-当发生页面错误时(430),对指示页面存在于存储器中并且可写
的两个位进^f亍测试(435 ); -如果页面存在并且可写(测试435为是),并且如果测试到线程
将要退出(测试到Linux PF位455:是),则
-授权导致页面错误的线程访问该页面(465 ),并设置指示页面
存在于存储器中并且可写的位;
-执行等待事件的步骤(420); -如果页面存在并且可写,如果另一线程具有对该页面的访问权并
且等待(470)其他线程释放该页面(460),则等待其他线程释
放;
-当线程已经释放访问权时,
-授予导致页面错误的线程对该页面的访问权,并设置指示页面
15存在于存储器中并且可写的位; -执行等待事件的步骤。
-在对指示页面存在于存储器中并且可写的两个位进行测试的步骤 (435 )之后,如果页面不存在或者不可写,则让内核处理所述页面 错误(440 );
-通过测试相应的位来测试(445 )新页面在由内核进程创建之后是 否可写;
-如果该新页面可写,则重置新页面的存在位(450); -将内核创建的页表条目传播(425 )到所有线程的其他页表; -执行等待事件的步骤(420)。
在等待事件的步骤之后
-当调度线程时(475 ),将存储器的硬件上下文切换(480)到将
要被调度的线程的页表;
-执行等待事件的步骤(420)。
在等待事件的步骤之后还包括
-当线程退出时(485 ),释放(490)用于该线程的页面目录; -结束用于该线程的存储器访问控制。
图5是根据两页表实施方式的用于从线程组的线程访问存储器 的方法流程图。
反页表是正页表的复本,通过重置存在标志来禁用其地址空间 的所有可写部分。当反页表分出第二线程并且线程计数超过1时, 其首先由组内的第 一线程创建。父线程和子线程二者初始地都被指 派了反页表。随后创建的线程在其创建时被指派反页表。在从分叉 返回之前,父(线程)的硬件上下文被切换为使用反页表。当调度 子(线程)首次运行时,上下文切换例程可以指派反页表。
当组内任一线程尝试访问地址空间的可写部分时,生成页面4晉误中断。页面错误中断是处理器提供的中断,其用于帮助内核实现 诸如请求分页和写入时复制的便利。提供此中断的中断处理机通过 检查正页表中相应条目的存在和写标记,将作为内核正常功能一部 分的页面错误中断与由于访问控制导致的错误区分开。如果页面存 在并且可写,则错误一定是由于访问控制导致的,若另一线程已不 再持有访问权,则给予线程对地址空间的访问权。如果页面不存在 或者如果是对只读页面的写访问,则页面错误是真的,其将通过内 核提供的常规渠道来处理。如果页面在正页表和反页表二者中都不 存在,则在仲裁对地址空间的访问权之前,首先将页面错误作为正 常页面错误来处理。
在任何给定时间,线程组中只有 一个线程有权访问地址空间。
持有访问权的线程的线程标识符(tid)存储在存储器描述符中,由 锁来保护。当线程在调度周期中首次尝试访问共享存储器并且共享 存储器未被任何其他进程占据时,将该线程的tid存储在存储器描述 符中,并且改变任务的硬件上下文以反映新页表,而旧页表的TLB 条目是无效的。有可能对任务进行调度,使其在不同于发生页面错 误的处理器的处理器上运行。不过这不会导致问题,因为在从页面 错误处理机返回之前加载了新页表。
如果不能立即授予访问权,则调度其他任务运行。当地址空间 由所有者线程释放时,等待的线程最终会得到访问权。当暂停任务 时或者当任务调用退出时,通过移除其存储在存储器描述符中的tid 来释放访问权。
在图5的流程图中,示出了相应的步骤 利用此第二实施方式,在存储器描述符中分配(410)新页表目录, 并创建作为已有线程的页表的副本的新页面目录的步骤仅在其是第 一线程时才执行;并且,还包括 -重置已经设置了可读位的所有页面的页面存在标记。
将存储器的硬件上下文切换(480)到将要被调度的线程的页表的步骤由以下步骤(500)代替
-如果线程有权访问地址空间,则将存储器的硬件上下文切换到已 有页表(正PGD);
-如果线程没有权利访问地址空间,则将存储器的硬件上下文切换 到新创建的页面目录(反PGD)。
当线程退出时释放(490)页面目录的步骤由以下步骤(510)代替: -当进程中仅剩下一个其他线程时,释放新创建的页面目录。
优选实施方式的解决方案的缺点在于有可能增加存储器管理 的复杂性,因为页表是针对每个线程而实例化的。在一个线程中映 射的改变必须传播到组内的其他线程。利用两页表的实现,访问控 制的实现变得更加简单。
权利要求
1.一种用于控制由多处理器计算机上执行的进程所创建的线程对存储器的访问的方法,所述方法包括-所述进程请求创建新线程;-在存储器描述符中分配新页表目录,并创建已有线程的页表的副本;-等待事件;-当发生页面错误时,对指示所述页面存在于存储器中并且可写的两个位进行测试;-如果所述页面存在并且可写,并且如果测试到所述线程将要退出,则-授予导致所述页面错误的所述线程对所述页面的访问权,并且设置指示所述页面存在于存储器中并且可写的位;-进行所述等待事件的步骤;-如果所述页面存在并且可写,如果其他线程拥有对所述页面的访问权并且等待所述其他线程释放所述页面,则等待所述其他线程释放;-当所述线程已经释放访问权时,-授予导致所述页面错误的所述线程对所述页面的访问权,并且设置指示所述页面存在于存储器中并且可写的位;-执行所述等待事件的步骤。
2. 如权利要求l的方法,还包括-在对指示所述页面存在于存储器中并且可写的两个位进行测 试的步骤之后,如果所述页面不存在或者不可写,则让内核来处理 所述页面4晉i吴;-通过测试相应的位,来测试所述新页面在由内核进程创建之后是否可写;-如果所述新页面可写,则重置所述新页面的存在位; -将所述内核创建的所述页表条目传播到所有线程的其他页表; -执行所述等待事件的步骤。
3. 如权利要求1或2的方法,在所述等待事件的步骤之后还包括-在调度线程时,将存储器的硬件上下文切换到将要被调度的所述线程的页表; -执行所述等待事件的步骤。
4. 如权利要求1或2的方法,在所述等待事件的步骤之后还包括-当线程退出时,释放用于所述线程的页面目录; -结束用于所述线程的存储器访问控制。
5. 如权利要求1-4中任一的方法,其中在存储器描述符中分配 新页表目录并创建作为已有线程的页表的副本的新页面目录的步骤 仅在其是第一线程时才执行;并且,还包括-重置已经设置了可读位的所有页面的页面存在标记。
6. 如权利要求5的方法,其中将存储器的硬件上下文切换到将 要被调度的线程的页表的步骤由以下步骤代替-如果所述线程有权访问地址空间,则将存储器的硬件上下文切 换到已有页表;-如果所述线程无权访问地址空间,则将存储器的硬件上下文切 换到新创建的页面目录。
7. 如权利要求5或6的方法,其中当线程退出时释放所述页面 目录的步骤由以下步骤代替-当所述进程中仅剩下一个其他线程时,释放所述新创建的页面 目录。
8. —种包括程序代码指令的计算机程序产品,当所述程序在计 算机上执行时,所述指令用于执行根据权利要求1-7中任一方法的步骤。
9. 一种系统,包括适合于执行根据权利要求1-7中任一方法的装置。
全文摘要
提供了一种用于控制由多处理器计算机上执行的进程所创建的线程对存储器的访问的方法、计算机程序和系统。为每个新的线程分配页表结构,并且从已有线程复制该分配页表结构。通过存在位和可写位来控制页面访问。当页面错误时,向一个线程提供访问权。内核处理新页面条目创建进程并且将页面存在位设置为零,从而创建页面错误。在第二实施方式中,创建两页表结构,一个页表结构用于一个有权访问地址空间的线程,另一个页表结构由无权访问地址空间的所有其他线程所共享。
文档编号G06F11/36GK101563674SQ200780047152
公开日2009年10月21日 申请日期2007年6月15日 优先权日2006年12月21日
发明者D·萨布赫拉维蒂, M·韦特斯, P·贝格埃奥德 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1