操作系统课程课件5.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统概念 第五章:线程 本章主要内容 概述 多线程模型 若干线程问题 Pthread线程 Java线程 单线程与多线程 动机 考虑一个网页服务器可能有多个(可能数百个)客户并发访问它 如果网页服务器作为传统单个线程的进程来执行,该如何处理? 作为多线程进程来运行又是如何处理的? 优点 响应度高 增加了对用户的响应程度 资源共享 线程默认共享它们所属进程的内存和资源 允许一个应用程序在同一地址空间内有多个不同的活动线程 经济 线程创建和上下文切换比进程创建与上下文切换更经济 多处理器体系结构的利用 单线程进程只能运行在一个CPU上 在多CPU机器上使用多线程增加了并发功能。 用户线程 由用户层通过线程库来实现 三种主要的线程库 POSIX Pthread POSIX:Portable Operating System Interface Java threads 内核线程 由操作系统直接支持:内核在其空间内执行线程创建、调度和管理 如 Windows XP/2000 Solaris Tru64 UNIX Mac OS X 多线程模型 许多系统都提供对用户和内核线程的支持,从而有不同的多线程模型 多对一模型 一对一模型 多对多模型 多对一模型 将许多用户级线程映射到一个内核线程 一对一模型 将每个用户线程映射到一个内核线程 多对多模型 多路复用了许多用户级线程到同样数量或更小数量的内核线程上。 允许OS创建足够数量的内核线程 5.3 若干线程问题 fork() 和 exec()系统调用的语义 线程取消 信号处理 线程池 线程特定数据 系统调用fork和exec 如果程序中的一个线程调用fork,那么新进程会复制所有线程还是新进程只有单个线程? fork后紧接着调用exec的情况 fork后不调用exec的情况 线程取消 线程取消是在线程完成之前来终止线程的任务。 线程的取消可在如下两种情况下发生: 异步取消(Asynchronous cancellation):立即终止目标线程 延迟取消(Deferred cancellation):目标线程不断地检查它是否应终止,这允许目标线程有机会按着有序方式来终止自己。 取消点(cancellation point) 信号处理(Signal Handling) 信号在UNIX系统中用做通知进程某个特定事件已经发生。 不管信号是同步或异步的,所有信号具有同样模式 信号是由特定事件的发生所产生的 产生的信号要发送到进程 一旦发送,信号必须要加以处理 缺省信号处理 & 用户自定义的信号处理程序 对于多线程进程,信号应被发送到哪里? 发送信号到信号所应用的线程 发送信号到进程内的每个线程 发送信号到进程内的某些线程 规定一个特定线程以接收进程的所有信号 线程池 线程池的主要总体思想是在进程开始时创建一定数量的线程,并放入到池中坐以等待工作。 优点 通常用现有线程处理请求要比等待创建新的线程要快 线程池限制了在任何时候可存在线程的数量。 线程特定数据 允许每个线程拥有自己的数据 当你没有线程创建过程的控制权时,线程特定数据就非常重要(如,使用线程池的时候) 如,对于事务处理系统,可能需要通过独立线程以处理各个请求。而且每个事务都有一个惟一的标识符。为了让每个线程与其惟一标识符相关联,可以使用线程特定数据。 5.4 Pthread线程 Pthread是POSIX标准(IEEE 1003.1c)定义的线程创建API和同步API。 API只定义了线程库的行为,而不是实现。不同的线程库其实现允许不同。 通常,实现Pthread规范的库局限于基于UNIX的系统,如Solaris, Linux, Mac OSX等。 Pthreads int sum; /*this data is shared by the thread(s) */ void *runner(void *param); /*the thread*/ Main(int argc, char *argv[]) { pthread_t tid; /*the thread identifier*/ pthread_attr_t attr; /* set of attributes for the thread*/ pthread_attr_init(attr); pthread_create(tid, attr, runner, argv[1]); pthread_join(tid, NULL); printf(“sum= %d\n”, sum); } void *runner(void *param) { int upper = atoi(param); int I; sum = 0; if (upper 0) { f

文档评论(0)

yyh892289 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档