- 1、本文档共138页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 分布式系统中的进程及处理器 研究分布式系统中线程 怎样组织处理器和进程 分布式系统中的处理器分配和调度 11.1 线程(1) 例:服务器有时因等待磁盘而进入阻塞状态 如果服务器有多个线程 当一个线程睡眠时 第二个线程就可以投入运行 引入多线程 为了得到更大的吞吐量和更高的效率 (a)三个各只有一个线程的进程(b)一个拥有三个线程的进程 线程(2) 线程 一个进程的线程都在同一个地址空间中 拥有自己的程序计数器和堆栈 线程严格按顺序执行 在多处理器系统中,它们真正并行执行 线程可以建立子线程,因等待系统调用而阻塞 当一个线程被阻塞时,同一进程中的另一个线程可以运行 线程(3) 线程共享CPU 可以共享相同的全局变量 共享同一个打开文件集,子进程、定时器、信号等 线程(4) 每个线程都可以存取任何一个虚拟地址 一个线程能够读、写、甚至完全破坏另一个线程的堆栈 在线程之间没有设置保护措施 (1)不可能;(2)没必要 进程通常来自不同的用户,可能会发生冲突 用户建立多个线程是为了协同工作, 而不是冲突 线程 (6) 线程 (8) 线程状态:运行,阻塞,就绪,完成 运行状态,正在使用CPU,处于活动状态 阻塞状态,等待另一线程激活它 就绪状态, 已被调度,只要一轮到就运行 完成状态,已退出,但还没被父线程收回 11.1.2 线程使用 进程中线程的三种组织方式 (a) 调度员/工作者模式 (b) 队列模式 (c) 管道模式 有限状态机(1) 假定不能使用多线程 单线程造成了无法接受的性能就下降 可把服务器看作一个有限状态机 当请求到达时,唯一的线程检查请求信息 如果缓存中数据能满足要求,就接着处理 如果不能满足要求,它给磁盘发送消息 有限状态机(2) 然而,这时它并不进入阻塞状态 仅在表中记下请求的状态,处理下个请求 如果是新的工作请求,就开始新工作 若是磁盘的反馈信息 则从表中取出相关信息,答复请求 有限状态机(3) 不允许发消息后因等答复而进入阻塞 调用原语也必须是非阻塞式调用 对接收和发送的消息 必须在表格中保存或恢复状态 以困难的方式模拟多线程和它们的堆栈 进程以有限状态机方式运行 根据接收作出相应反应 构造服务器的三种方式 模式 特性 11.1.3 线程包的设计问题 给用户的线程的原语集叫线程包 静态线程 在程序编制或编译阶段 就决定使用多少个线程 给每个线程分配固定的堆栈 方式简单,但不灵活 动态线程(1) 在运行中 动态创建和注销线程 需要指定线程主程序(作为指向过程的指针) 堆栈的大小,指定参数,如调度的优先级等 调用通常返回一个线程标识符 标识符在该线程的调用中被用到 进程启动时只拥有一个(隐含)线程 可据需要创建多个线程 线程的终止 当线程完成任务时,可自行退出 或者被杀掉 互斥信号量(1) 多个线程使用同一内存块保存共享的数据 要防止多个线程同时存取同一个数据 经常使用得技术:互斥信号量 互斥信号量(2) 一种小型信号量 信号量在两个状态之一:关锁和开锁 二元信号量(即只有0, 1两个值的信号量) 两种操作被定义为互斥 互斥信号量的改变是一个原子动作 LOCK,试图锁住互斥信号量 如果互斥信号量处于开锁状态 LOCK将成功执行 互斥信号量(3) 在多处理器系统中 多个线程运行在不同的CPU上 如果两个线程在同一个实例上 试图加锁同一个互斥信号量 只有一个线程能赢,别的将失败 如果线程试图加锁已被锁住的互斥信号量 它将被阻塞 互斥信号量(4) UNLOCK操作解锁一个互斥信号量 如果一个或多个线程在一个互斥信号量上等待,只有一个线程解锁,其余的线程继续等待 TRYLOCK操作 该操作试着加锁一个互斥信号量 如果该互斥信号量未被锁定 TRYLOCK返回状态码,说明操作成功 若该互斥信号量是锁着的 TRYLOCK并不阻塞该线程 而返回指示失败的状态码 容易实现 条件变量(1) 一个线程锁住互斥信号量进入临界区 在临界区,发现所需资源已被占用 锁住第二个互斥信号量(与被占资源相关的) 外面的互斥信号量将保持在关锁状态 拥有被占资源的线程不能进入临界区释放它 产生了死锁 如果解锁外面的互斥信号量 别的线程进入临界区,又会引起混乱 条件变量(2) 解决方案:使用条件变量来申请资源 条件变量定义 原子性的自动地等待和解锁互斥信号量 当使用资源的线程释放资源后 它执行 wakeup操作 wakeup 定义:一次可以唤一个线程 也可唤醒特定的条件变量上等待的所有线程 使用WHILE而不用IF 防止线程被唤醒但还
文档评论(0)