- 1、本文档共141页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 用户线程(User Level Thread) 不依赖于OS核心,应用进程利用线程库(运行时系统)提供创建、同步、调度和管理线程的函数来控制用户线程。 用户线程的维护由应用进程完成。 内核不了解用户线程的存在;用户线程切换不需要内核特权。 一个线程发起系统调用而阻塞,则整个进程在等待。时间片分配给进程,多个线程则每个线程就慢。 调度由应用软件内部(“运行时系统”)进行,通常采用非抢先式和更简单的规则,也无需用户态/核心态切换,所以速度特别快。用户线程调度算法可针对应用优化。 轻权进程(Light Weight Process) 它是内核支持的用户线程。 一个进程可有一个或多个轻权进程(LWP),拥有自己的数据结构(如TCB),它们共享进程所拥有的资源。 LWP通过系统调用来获得内核提供的服务。每个轻权进程由一个单独的内核线程来支持。 当一个用户级线程运行时,只要将它连接到一个LWP上,此时它便具有了内核支持线程的所有属性。 用户线程、轻权进程和内核线程的关系 用户级线程到内核线程的连接方式,形成三种模型: 多对一模型:多个用户线程(通常属于一个进程)映射到一个内核线程,一个线程阻塞,则整个进程阻塞,线程管理开销小; 一对一模型:每创建一个用户线程,就创建一个内核线程,并发性更好,开销较大; 多对多模型:将多用户线程映射到同样数量或更少数量的内核线程上,更加灵活。 线程的创建和终止 线程有生命周期,由创建而产生,由调度而执行,由终止而消亡。 应用启动时,通常仅有一个线程在执行,称为“初始化线程”,用于创建其他线程。 线程可正常终止,也可被其他线程强行终止。 第二章 小结 并发执行、进程、进程状态转换 进程控制 进程的同步与互斥、信号量机制 经典的进程同步问题 进程通信 线程 例1、有三个进程PA、PB、PC协作解决文件打印问题。PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2中,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量来保证文件的正确打印。 对缓冲区1来说,PA是生产者,PB是消费者;对缓冲区2来说,PB是生产者,PC是消费者。 Semaphore empty1=1,full1=0, empty2=1,full2=0; PA( ){ While(1){ 从磁盘读一个记录; wait(empty1); 将记录存放到缓冲区1中; signal(full1); } } PB( ){ While(1){ wait(full1); 从缓冲区1中取出一个记录; signal(empty1); wait(empty2); 将记录存放到缓冲区2中; signal(full2); } } PC( ){ While(1){ wait(full2); 从缓冲区2中取出一个记录; signal(empty2); 将取出的记录打印出来; } } main( ){ parbegin PA(); PB(); PC(); parend } 例2、有如下图所示的工作模型,三个进程P0, P1, P2和三个缓冲区B0, B1和B2,进程间借助于相邻的缓冲区传递消息,Pi每次从Bi中取一条消息,经加工送入B(i+1)%3中, B0, B1和B2分别可存放3,2,2个消息,初始时,仅B0有三条消息,用wait,signal操作写出P0, P1,P2的同步互斥流程。 M1 M2 M3 P2 P0 P1 B0 B2 B1 对B0,B1和B2缓冲区设3个互斥信号量mutex0=1,mutex1=1,mutex2=1 设P0的同步信号量,full0=3,empty0=0 设P1的同步信号量,full1=0,empty1=2 设P2的同步信号量,full2=0,empty2=2 P0: While(1){ wait(full0); wait(mutex0); 从B0取消息; signal(mutex0); signal(empty0); 加工该消息; wait(empty1); wait(mutex1); 消息放入B1; sign
文档评论(0)