网站大量收购独家精品文档,联系QQ:2885784924

苏州大学操作系统概念第六章全解.ppt

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
苏州大学操作系统概念第六章全解

* * 每个哲学家按照以下的顺序轮流调用操作 pickup() 和putdown() dp.pickup (i) EAT dp.putdown (i) 哲学家就餐问题的管程解决方案 7、同步实例 Solaris同步 Solaris 实现了多种锁来支持多任务、多线程(包括实时线程)和多进程处理。 - 适应互斥量:保护那些为较短代码段所访问的数据 - 条件变量 - 信号量 - 读–写锁:用于保护经常访问但通常是只读访问的数据 - 十字转门:用于安排等待获取适应互斥和读写锁的线程链表 Linux: 使用禁止中断来实现短的临界区 Linux 提供: 信号量 自旋锁 Linux 同步 在单处理器系统中,使用中断屏蔽来保护全局资源的访问 在多处理器系统中使用自旋锁 也提供调度对象,这些对象类似于互斥、信号量等 调度对象也可以提供事件来同步(events) 事件的使用与条件变量类似 Windows 同步 Pthreads API 操作系统无关 提供了: 互斥锁 条件变量 不可移植的扩展包括: 读写锁 自旋锁 Pthreads同步 Windows同步机制 事件(Event) 临界区(Critical Section) 信号量(Semaphore) 事件 事件(Event)对象可通过通知操作的方式来保持同步,可实现不同进程中的线程同步操作(跨进程) 事件是WIN32中最灵活的线程间同步机制 事件存在两种状态: 激发状态(Signaled or True) 未激发状态(Unsignaled or False) 事件可分为两类: 手动设置: 这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。 自动恢复: 一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。 事件 API 创建事件: HANDLE CreateEvent(  LPSECURITY_ATTRIBUTES lpEventAttributes,  // SECURITY_ATTRIBUTES结构指针,可为NULL  BOOL bManualReset,  // 手动/自动  // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号  // FALSE:在WaitForSingleObject后,系统自动清除事件信号  BOOL bInitialState, //初始状态  LPCTSTR lpName //事件的名称 ) 打开事件 HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true,“MyEvent”); 其它 ResetEvent() SetEvent() WaitForMultipleObjects() 事件例子 三个线程: 主线程 读线程 写线程 读线程必须在写线程操作结束后才能进行读; 主线程必须等读和写线程结束后才能结束 代码 include stdafx.h #include windows.h #include process.h #include iostream.h #include fstream.h HANDLE evRead,evFinish; void ReadThread(LPVOID param) { WaitForSingleObject(evRead, INFINITE); coutReadingendl; SetEvent(evFinish); } void WriteThread(LPVOID param) { coutWritingendl; SetEvent(evRead); } int main(int argc, char* argv[]) { evRead= CreateEvent(NULL,FALSE,FALSE,NULL); evFinish= CreateEvent(NULL,FALSE,FALSE,NULL); _beginthread(ReadThread,0,NULL); _beginthread(WriteThread,0,NULL); WaitForSingleObject(evFinish, INFINITE); coutEnd.endl; return 0; } 临界区 临界区:保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问 临界区包含两个操作原语: EnterCriticalSection() :进入临界区 Lea

文档评论(0)

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

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

1亿VIP精品文档

相关文档