- 1、本文档共101页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3_多线程
* * * * * * * * * * * * * * * * * * * Multual-exclusion with semaphores Shared data: semaphore mutex; //initially mutex = 1 Process Pi: do { wait(mutex); critical section signal(mutex); remainder section} while (1); 对于初始值为1的信号量,成对的wait和signal操作与互斥量的加锁、解锁的功能相似,可以实现多个线程对共享数据的安全访问。 和互斥量相比,信号量更加灵活,当信号量的初值大于1时,允许多个线程通过wait操作;信号量的值可以代表某类资源的数目,创建资源的线程调用signal,消耗资源的线程调用wait。 * 条件变量 要等待某个条件成立(如xy),当其他线程改变了共享变量的值时,线程应重新测试该条件 条件变量提供了阻塞线程和唤醒其他线程的方法 改变共享变量值的线程,给阻塞在条件变量上的线程发信号,唤醒该线程。 条件变量的用法是先测试谓词,若不成立则调用pthread_cond_wait阻塞在该条件变量上。 Pthread定义的条件变量类型为pthread_cond_t,在某个条件变量上等待的操作是: int pthread_cond_wait (pthread_cond_t*cond,pthread_mutex_t*mutex); int pthread_cond_signal (pthread_cond_t*cond); 条件变量 典型的条件变量测试x=y的方法如下(mut为互斥量): 1 pthread_mutex_lock(mut); 2 while(x=y){ 3 pthread_cond_wait(cond, mut); 4 } 5 pthread_mutex_unlock(mut * 死锁 两个线程分别拥有锁,并等待对方的锁 死锁避免 线程以相同的次序进行加锁 使用非阻塞的加锁操作 饿死 饥饿 – 由于分配策略不公平造成线程长期期地等待 进程可能永远无法从它等待的信号量队列中移去 当等待时间给进程推进和响应带来明显影响 当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。 活锁:在忙式等待条件下发生的饥饿 * 死锁 * 死锁 条件:资源独占、不可剥夺、保持申请、循环等待 避免的两种策略 不允许死锁—静态死锁预防、动态死锁避免 允许死锁—检测(开销)与恢复(如何选择) 具体策略 死锁的预防: 保持申请-不让再申请(预先分配所需资源) 循环请求-规定分配方向 死锁的避免:每次资源分配后,系统处于安全状态(保证至少存在一条路线可以使进程完成剩余活动)。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3.2 用户级线程和内核级线程 用户级线程(用户空间实现) 有关线程的所有管理工作都由在用户级实现的线程库来支持 用户级线程特征 用户级线程的创建和管理等操作无须内核参与,操作更快 并行性不高,一个线程被系统阻塞后,整个进程被阻塞 * 用户级线程 用户级别线程优点: 线程不依赖于操作系统,不必采用标准的调度策略,可以采用与问题相关的调度策略,灵活性好; 同一进程中的线程切换不需进入操作系统,因而实现效率较高; 有关线程的所有管理工作都由在用户级实现的线程库来支持。 用户级别线程缺点: 同一进程中的多个线程不能真正并行; 由于线程对操作系统不可见,调度在进程级别,某进程中的一个线程通过系统调用进入操作系统受阻,该进程的其它线程也不能运行 。 * 内核级线程 内核级线程 内核级线程的所有管理操作都是由操作系统内核完成的 特点 并行性高, 多个线程可被同时调度 充分利用多处理器 创建和管理代价高 * 内核级线程 核心级别线程的优点是并发性好,在多CPU环境中同一进程中的多个线程可以真正并行执行 核心级别线程的缺点是线程控制和状态转换需要进入操作系统完成,系统开销比较大. * 3.3 多线程的映射模型 对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间的可以有不同的映射方式: 多对一模型 多对一模型把多个用户级线程映射到一个内核级线程。 用户级线程的管理在用户空间实现,所以效率高。 当一个线程因调用系统调用被阻塞时,整个进程被阻塞。另外,用户级线程不能在多处理器上并发执行,不支持内核级线程的操作系统
文档评论(0)