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

第17章节 线程控制.ppt

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

第17章 线程控制 进程是操作系统中资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程最主要的目的就是更好的支持多处理器以及减少上下文切换开销。线程和进程十分相似,不同的只是线程比进程小。一个进程至少需要一个线程作为它的指令执行体,进程管理着计算机资源,而将线程分配到某个CPU上执行。本章将介绍线程的基本概念和相关系统调用函数,以及在Linux系统上设计多线程的方法。 17.1 线程基本概念 线程是在共享内存空间中并发的多道执行路径,他们共享一个进程的资源,如文件描述符和信号处理。操作系统在两个进程间进行切换时,要对前一个进程进行保护现场操作,对后一个进程进行还原现场操作。反复进行上下文切换会带来极大的系统开销,CPU必须为此分配一定的时钟周期。线程则无需进行上下文切换,因为多个线程共享同一个进程的上下文。多个线程也共享同一个进程的CPU时钟周期,进程的状态并为因线程切换而改变。 17.2 线程的实现 早期Linux系统中的线程是通过fork系统调用实现的,这种线程即为轻量级进程。 NPTL与POSIX标准保持了兼容性,其创建、启动和链接开销都非常的低,并且提供了良好的软硬件扩展能力。对于运行负荷繁重的线程应用,以及多路处理器、多核处理器而言,NPTL线程性能提高显著。除此以外,NPTL引入了线程组、线程独立的本地存储区等概念,在多线程和内存管理机制上也进行了大量改进。 17.2.1 用户态线程 用户态线程是由进程负责调度管理,高度抽象化的,与硬件平台无关的线程机制。其最为显著的标志是,进程在创建多个线程时,不需要Linux内核支持,也不直接对CPU标志寄存器进行操作。用户态的优势在于: 减少多线程的系统开销。进程下的线程进行调度切换时,不需要进行系统调用。同一个进程可创建的线程数没有限制。 用户态实现方式灵活。可根据实际需要设计相应的用户态线程机制,对于实时性要求高的程序格外重要。 17.2.2 内核态线程 内核态线程是由Linux操作系统根据CPU硬件的特点,以硬件底层模式实现的线程机制。内核态将所有线程按照同一调度算法调度,更有利于发挥多路处理器和多核处理器所支持的并发处理特性。内核态线程可自由访问内存空间,并且在某一线程阻塞时,其他线程还能正常运行。但是,相对于用户态线程,内核态线程的系统开销稍大,并且必须通过系统调用实现,对硬件和Linux内核版本的依赖性较高,不利于程序移植。 17.3 POSIX线程库 本节将以Pthread线程为标准讲解POSIX线程库的使用方法。Pthread线程对应的函数库为libpthread,是目前Linux系统上最常用的线程库。它支持NPTL线程模型,以用户态线程实现。该函数库的接口被定义在“pthread.h”头文件中。 17.3.1 创建线程 创建线程可通过函数pthread_create()实现。线程没有独立的PID等信息,无法直观的证明已创建成功。 17.3.2 结束线程 线程结束时可调用函数pthread_exit(),该函数的原理与结束进程的exit系统调用相似。它的作用是结束调用了这个函数的线程,返回一个指向某个变量的指针。这个指针绝对不能是局部变量的指针,因为局部变量会在线程出现严重问题时消失。 17.4 同步 线程同时运行时,有一组函数可以帮助我们更好地控制线程的执行情况和更好地访问代码的关键部分。其中包括两种基本方法,第一种是“信号量”,第二种是“互斥量”。这两种方法非常相似并能互相实现,选择哪种方法取决与程序的实际需要。例如控制共享内存,使之在任何一个时刻只有一个线程能够对它进行访问,使用互斥量更为合适。但如果需要控制一组同等对象的访问权,例如从五条电话线里给某个线程分配一条,计数信号量就更合适。 17.4.1 用信号量进行同步 与信号量相关的函数名字都以“sem_”作为前缀,线程里使用的基本信号量函数有四个,被包含在头文件“semaphore.h”。 修改信号量可使用函数sem_wait()和sem_post()实现,这两个函数进行的都是原子操作,即同时对同一个信号量操作的两个线程不会冲突。sem_wait()函数的作用是使信号量减1,如果信号量的值为零值,那么sem_wait()函数会保留控制权,等待信号量变为非零值后进行操作,再将控制权还给调用者。 17.4.2 用互斥量进行同步 互斥量同步是另一种在多线程程序中的同步访问手段,互斥量的作用犹如给某个对象加上一把锁,每次只允许一个线程去访问它。如果想对代码关键部分的访问进行控制,可以在进入这段代码之前锁定一把互斥量,完成操作之后再解开它。使用互斥量要用到的基本函数与信号量需要使用的函数很相识,同样是四个,他们的一般形式如下: int pthread_mut

文档评论(0)

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

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

1亿VIP精品文档

相关文档