第12章 纤程.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第12章 纤程.PDF

下载 第1 2章 纤 程 M i c r o s o f t公司给Wi n d o w s添加了一种纤程,以便能够非常容易地将现有的 U N I X服务器应 用程序移植到Wi n d o w s 中。U N I X服务器应用程序属于单线程应用程序(由 Wi n d o w s定义),但 是它能够为多个客户程序提供服务。换句话说, U N I X应用程序的开发人员已经创建了他们自 己的线程结构库,他们能够使用这种线程结构库来仿真纯线程。该线程包能够创建多个堆栈, 保存某些C P U寄存器,并且在它们之间进行切换,以便为客户机请求提供服务。 显然,若要取得最佳的性能,这些 U N I X 应用程序必须重新设计,仿真的线程库应该用 Wi n d o w s提供的纯线程来替代。然而,这种重新设计需要花费数月甚至更长的时间才能完成, 因此许多公司首先将它们现有的 U N I X代码移植到Wi n d o w s 中,这样就能够将某些应用软件推 向Wi n d o w s市场。 当你将U N I X代码移植到Wi n d o w s 中时,一些问题就会因此而产生。尤其是 Wi n d o w s 管理 线程的内存栈的方法要比简单地分配内存复杂得多。 Wi n d o w s 内存栈开始时的物理存储器的容 量比较小,然后根据需要逐步扩大。这个过程在第 1 6章“线程的堆栈”中详细介绍。由于结构 化异常处理机制的原因,代码的移植就更加复杂了。 为了能够更快和更正确地将它们的代码移植到 Wi n d o w s 中,M i c r o s o f t公司在操作系统中添 加了纤程。本章将要介绍纤程的概念、负责操作纤程的函数以及如何利用纤程的特性。要记住, 如果有设计得更好的使用Wi n d o w s 自身线程的应用程序,那么应该避免使用纤程。 12.1 纤程的操作 首先要注意的一个问题是,实现线程的是Wi n d o w s 内核。操作系统清楚地知道线程的情况, 并且根据M i c r o s o f t定义的算法对线程进行调度。纤程是以用户方式代码来实现的,内核并不知 道纤程,并且它们是根据用户定义的算法来调度的。由于你定义了纤程的调度算法,因此,就 内核而言,纤程采用非抢占式调度方式。 需要了解的下一个问题是,单线程可以包含一个或多个纤程。就内核而言,线程是抢占调 度的,是正在执行的代码。然而,线程每次执行一个纤程的代码—你决定究竟执行哪个纤程 (随着我们讲解的深入,这些概念将会越来越清楚)。 当使用纤程时,你必须执行的第一步操作是将现有的线程转换成一个纤程。可以通过调用 C o n v e r t T h r e a d To F i b e r 函数来执行这项操作: 该函数为纤程的执行环境分配相应的内存(约为2 0 0字节)。该执行环境由下列元素组成: • 一个用户定义的值,它被初始化为传递给C o n v e r t T h r e a d To F i b e r 的p v P a r a m参数的值。 • 结构化异常处理链的头。 • 纤程内存栈的最高和最低地址(当将线程转换成纤程时,这也是线程的内存栈)。 • CPU寄存器,包括堆栈指针、指令指针和其他。 当对纤程的执行环境进行分配和初始化后,就可以将执行环境的地址与线程关联起来。该 线程被转换成一个纤程,而纤程则在该线程上运行。 C o n v e r t T h r e a d To F i b e r 函数实际上返回纤 程的执行环境的内存地址。虽然必须在晚些时候使用该地址,但是决不应该自己对该执行环境 288计计第二部分 编程的具体方法 下载 数据进行读写操作,因为必要时纤程函数会为你对该结构的内容进行操作。现在,如果你的纤 程(线程)返回或调用E x i t T h r e a d函数,那么纤程和线程都会终止运行。 除非打算创建更多的纤程以便在同一个线程上运行,否则没有理由将线程转换成纤程。若 要创建另一个纤程,该线程(当前正在运行纤程的线程)可以调用 C r e a t e F i b e r 函数: C r e a t e F i b e r首先设法创建一个新内存栈,它的大小由 d w S t a c k S i z e参

文档评论(0)

专业好文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6110200002000000

1亿VIP精品文档

相关文档