已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 并行计算与多核程序设计理论课11 12Linux多线程 陈天洲 施青松 胡威 tzchen zjsqs ehu 2009年12月11日 玉泉校区曹西101 2 Agenda Pthread库Pthread属性线程互斥和同步Solaris多线程UNIX多线程 3 POSIX线程库Pthreads介绍 IEEEPOSIX标准p1003 1c Pthreads 定义了处理线程的一系列C语言类型的API pthreads是最常用的POSIX系统如Linux和Unix在Linux中 线程一般被认为是 轻量级的进程 Linux创建进程所使用的函数是fork 或者vfork 对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs 4 使用fork创建进程和使用POSIX线程库差别 使用fork 创建进程的特点代价昂贵 通常子进程需要拷贝父进程的整个上下文 比如数据等 进程间的通信方式比较复杂 比如使用管道 消息 共享内存等方法 操作系统在实现进程间的切换比线程切换更费时 使用POSIXpthreads库创建线程的特点线程可使用存在于进程中的资源 因此创建进程比创建线程更快 线程间的通信方式更容易 比如通过进程中的变量 可以让多个线程共享数据 操作系统对线程的切换比对进程的切换更容易和快速 5 POSIXpthreads库 线程的创建pthreads线程库中提供的创建线程的函数是pthread create includeintpthread create pthread t thread pthread attr t attr void start routine void void arg 线程的退出在线程的处理函数中 可以显示的调用pthread exit 结束线程执行 也可以不调用pthread exit 而只是让线程处理程序返回 除了pthread exit 函数 可以让当前调用pthread exit 的线程显示地退出外 线程也可以使用pthread cancel 函数终止其他线程的执行 6 POSIXpthreads库 续 等待线程结束pthread join 函数会挂起创建线程的线程的执行 直到等待到想要等待的子线程 intpthread join pthread tth void thread return 线程的分离主线程创建子线程 且子线程本身自己有自我回收内存资源的能力intpthread detach pthread tth 获得当前线程标志使用pthread self 函数可以获得当前线程的标志 pthread self 的返回值就是当前线程的标志 pthread tpthread self void 7 初始化线程为了让这个键只被创建一次函数pthread once声明一个初始化函数 第一次调用pthread once时它执行这个函数 以后的调用将被它忽略intpthread once pthread once t once control void init routine void 停止执行线程使用sched yield 可以使当前线程停止执行 以便执行另一个具有相同或更高优先级的线程intsched yield void 设置线程的优先级使用pthread setschedparam 修改现有线程的优先级此函数对于调度策略不起作用intpthread setschedparam pthread ttid intpolicy conststructsched param param 8 获取线程的优先级pthread getschedparam 可用来获取现有线程的优先级intpthread getschedparam pthread ttid intpolicy structschedparam param 向线程发送信号使用pthread kill 向线程发送信号 将信号sig发送到由tid指定的线程 tid所指定的线程必须与调用线程在同一个进程中 intpthread kill thread ttid intsig 访问调用线程的信号掩码使用pthread sigmask 更改或检查调用线程的信号掩码 intpthread sigmask inthow constsigset t new sigset t old 9 线程取消pthread cancel 不希望或不需要对一组相关的线程执行进一步操作时 可以选择执行取消操作取消点 仅当取消操作安全时才应取消线程执行取消操作存在一定的危险pthreads标准指定了几个取消点 其中包括 通过pthread testcancel调用以编程方式建立线程取消点 线程等待pthread cond wait或pthread cond timedwait 中的特定条件出现 被sigwait 2 阻塞的线程 一些标准的库调用 通常 这些调用包括线程可基于其阻塞的函数 10 启用或禁用取消功能使用pthread setcancelstate 启用或禁用线程取消功能设置取消类型使用pthread setcanceltype 可以将取消类型设置为延迟或异步模式创建取消点使用pthread testcancel 3C 为线程建立取消点 11 使用Pthreads编写的程序例子 include include include include defineTHREAD NUMBER2intretval hello1 2 retval hello2 3 void hello1 void arg char hello str char arg sleep 1 printf s n hello str pthread exit 12 使用Pthreads编写的程序例子 续 intmain intargc char argv inti intret val int retval hello 2 pthread tpt THREAD NUMBER constchar arg THREAD NUMBER arg 0 helloworldfromthread1 arg 1 helloworldfromthread2 printf Begintocreatethreads n ret val pthread create 13 使用Pthreads编写的程序例子 续2 ret val pthread create 14 线程可通过三种方法来终止执行 从线程的第一个 最外面的 过程返回 使线程启动例程 pthread create 调用pthread exit 提供退出状态 使用POSIX取消函数执行终止操作pthread cancel 取消操作允许线程请求终止其所在进程中的任何其他线程 15 线程的撤销 一个线程可以通过向另个线程发送 请求 来结束另一个线程的执行 POSIXpthreads库中关于撤销操作的函数有 intpthread setcancelstate intstate int oldstate intpthread setcanceltype inttype int oldtype voidpthread testcancel void 在撤销线程的时候 可以编写程序让线程进一步进行所谓的 清理 工作 比如已经拥有了某个mutex 在清理例程中可以释放这个mutex 如果动态分配了内存 那么可以在清理例程中释放动态分配的内存 16 Agenda Pthread库Pthread属性线程互斥和同步Solaris多线程UNIX多线程 17 线程的属性 18 POSIX标准指定了三种调度策略先入先出策略 SCHED FIFO SCHED FIFO是基于队列的调度程序 对于每个优先级都会使用不同的队列 循环策略 SCHED RR SCHED RR与FIFO相似 不同的是前者的每个线程都有一个执行时间配额 自定义策略 SCHED OTHER SCHED FIFO和SCHED RR是对POSIXRealtime的扩展SCHED OTHER是缺省的调度策略使用pthread attr setschedpolicy设置调度策略使用pthread attr getschedpolicy检索调度策略 19 CPU亲和力 CPU亲和力软亲和力硬亲和力 Linux软亲和力 affinity 进程通常不会在处理器之间频繁迁移进程迁移的频率小就意味着产生的负载小不代表不会进行小范围的迁移CPU硬亲和力进程固定在某个处理器上运行 而不是在不同的处理器之间进行频繁的迁移不仅改善了程序的性能 还提高了程序的可靠性2 6版本的Linux内核可以编程实现硬亲和性 20 task struct中的cpus allowed位掩码由n位组成 与系统中的n个逻辑处理器一一对应具有4个物理CPU的系统可以有4位如果CPU带超线程 那么这个系统就有一个8位的位掩码为给定的进程设置了给定的位 那么这个进程就可以在相关的CPU上运行如果一个进程可以在任何CPU上运行 并且能够根据需要在处理器之间进行迁移 那么位掩码就全是1这就是Linux中进程的缺省状态sched set affinity 用来修改位掩码 sched get affinity 用来查看当前的位掩码 21 栈溢出保护区 guardsize属性设置原因溢出保护可能会导致系统资源浪费 如果应用程序创建大量线程 并且已知这些线程永远不会溢出其栈 则可以关闭溢出保护区 通过关闭溢出保护区 可以节省系统资源 线程在栈上分配大型数据结构时 可能需要较大的溢出保护区来检测栈溢出guardsize参数提供了对栈指针溢出的保护 22 线程并行级别 应用程序使用pthread setconcurrency 通知系统其所需的并发级别获取线程并行级别pthread getconcurrency 返回先前调用pthread setconcurrency 时设置的值 23 栈大小 线程栈从页边界开始的任何指定的大小都被向上舍入到下一个页边界不具备访问权限的页将被附加到栈的溢出端大多数栈溢出都会导致将SIGSEGV信号发送到违例线程将直接使用调用方分配的线程栈 而不进行修改一般情况下 不需要为线程分配栈空间系统会为每个线程的栈分配1MB 对于32位系统 或2MB 对于64位系统 的虚拟内存 而不保留任何交换空间stacksize属性定义系统分配的栈大小不应小于系统定义的最小栈大小size为零 则使用缺省大小栈APIpthread attr setstacksize 3C 可以设置线程栈大小 pthread attr getstacksize 3C 将返回由栈大小pthread attr setstack 3C 可以设置线程栈地址和大小pthread attr getstack 3C 获取栈地址和大小 24 线程数据类型 在进程中共享的变量必须用关键字volatile来定义变量的三种类型全局变量局部变量线程数据 TSD Thread SpecificData 在线程内部 各个函数可以象使用全局变量一样调用它对线程外部的其它线程是不可见的每个线程数据创建一个键线程数据和这个键相关联在线程里使用键来指代线程数据在不同的线程里这个键代表的数据是不同的在同一个线程里代表同样的数据内容和线程数据相关的函数主要有4个创建一个键为一个键指定线程数据从一个键读取线程数据删除键 25 创建键的函数原型externintpthread key create P pthread key t key void destr function void 第一个参数为指向一个键值的指针第二个参数指明了一个destructor函数如果这个参数不为空 那么当每个线程结束时 系统将调用这个函数来释放绑定在这个键上的内存块这个函数常和函数pthread once一起使用删除线程特定数据键pthread key delete设置线程特定数据pthread setspecific获取线程特定数据pthread getspecific 26 Agenda Pthread库Pthread属性线程互斥和同步Solaris多线程UNIX多线程 27 Agenda Pthread库Pthread属性线程互斥和同步Solaris多线程UNIX多线程 28 Mutex 原子性对mutex的加锁和解锁操作是原子的 一个线程进行mutex操作的过程中 其他线程不能对同一个mutex进行其他操作 单一性拥有mutex的线程除非释放mutex 否则其他线程不能拥有此mutex 非忙等待等待mutex的线程处于等待状态 直到要等待的mutex处于未加锁状态 这时操作系统负责唤醒等待此mutex的线程 POSIX线程库对mutex提供了以下函数进行操作intpthread mutex init pthread mutex t mutex constpthread mutexattr t mutexattr intpthread mutex lock pthread mutex t mutex intpthread mutex trylock pthread mutex t mutex intpthread mutex unlock pthread mutex t mutex intpthread mutex destroy pthread mutex t mutex 29 条件变量 在线程间使用条件变量可以使得一个线程在执行过程中 因满足某个条件而发出信号通知另一个线程另一个线程可以处于挂起状态 等待某个条件的满足后 才继续执行 条件变量必须和mutex一起使用来避免竞争情况 pthread cond tcond PTHREAD COND INITIALIZER intpthread cond init pthread cond t cond pthread condattr t cond attr intpthread cond signal pthread cond t cond intpthread cond broadcast pthread cond t cond intpthread cond wait pthread cond t cond pthread mutex t mutex intpthread cond timedwait pthread cond t cond pthread mutex t mutex conststructtimespec abstime intpthread cond destroy pthread cond t cond 30 信号量 POSIX信号量在多线程编程中可以起到同步或互斥的作用 用POSIX信号量可以实现传统操作系统P V操作 由于POSIX信号量不是内核负责维护 所以当进程退出后 POSIX信号量自动消亡 一个非负的整数计数器信号量的数据类型为结构sem t 它本质上是一个长整型的数用来控制对公共资源的访问函数sem init 用来初始化一个信号量当公共资源增加时 调用函数sem post 增加信号量 只有当信号量值大于 时 才能使用公共资源使用资源后 函数sem wait 减少信号量函数sem wait sem t sem 被用来阻塞当前线程直到信号量sem的值大于0 解除阻塞后将sem的值减一 表明公共资源经使用后减少 函数sem trywait 和函数pthread mutex trylock 起同样的作用是函数sem wait 的非阻塞版本 31 读写锁 通过读写锁 可以对受保护的共享资源进行并发读取和独占写入读写锁是可以在读取或写入模式下锁定的单一实体要修改资源 线程必须首先获取互斥写锁必须释放所有读锁之后 才允许使用互斥写锁APIpthread rwlockattr init初始化读写锁属性pthread rwlockattr destroy销毁读写锁属性pthread rwlockattr setpshared设置读写锁属性pthread rwlockattr getpshared获取读写锁属性pthread rwlock init初始化读写锁pthread rwlock rdlock获取读写锁中的读锁pthread rwlock tryrdlock读取非阻塞读写锁中的锁pthread rwlock wrlock写入读写锁中的锁pthread rwlock trywrlock写入非阻塞读写锁中的锁pthread rwlock unlock解除锁定读写锁pthread rwlock destroy销毁读写锁 32 线程和信号处理 includeintpthread sigmask inthow constsigset t newmask sigset t oldmask 用来改变或者设置线程的信号屏蔽 signalmask newmask用来执行新的信号屏蔽 设置新信号屏蔽以前的信号屏蔽被存放到oldmask指向的位置 intpthread kill pthread tthread intsigno 可以向其他线程发送信号 intsigwait constsigset t set int sig 挂起调用sigwait 的线程 直到收到第一个参数set指向的信号集中指定的信号 且等待到信号被存放到第二个参数sig指向的位置 33 Agenda Pthread库Pthread属性线程互斥和同步Solaris多线程UNIX多线程 34 Unix系列是推动多线程的原始动力 大型主机一般可运行Linux或Unix变种单内核SUN的Solaris多线程最为著名基于BSDUnix 后转向转向SystemVRelease480年代开始使用多线程05年起以CDDL许可开放源码HP的HP UX以SystemV为基础IBM的AIX基于SystemVRelease3 35 SUNSolaris Solaris支持内核线程 轻量进程和用户线程一个进程可有大量用户线程轻量进程是用户级线程和内核线程之间的映射大量用户线程复用少量的轻量进程 轻量进程与内核线程一一对应LWP用户级线程在调用核心服务时 如文件读写 需要 捆绑 bound 在一个LWP上永久捆绑 一个LWP固定被一个用户级线程占用 该LWP移到LWP池之外 临时捆绑 从LWP池中临时分配一个未被占用的LWP 在调用系统服务时 如果所有LWP已被其他用户级线程所占用 捆绑 则该线程阻塞直到有可用的LWP如果LWP执行系统线程时阻塞 如read 调用 则当前捆绑在LWP上的用户级线程也阻塞 36 与基于SunSPARC处理器的硬件体系结构结合紧密支持SMT技术SMT同步多线程 Simultaneousmultithreading复制处理器上的结构状态有多线程时同一个处理器上的多个线程同步执行并共享处理器的执行资源最大限度地实现宽发射 乱序的超标量处理 提高处理器运算部件的利用率缓和由于数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《生活科学启蒙课堂|发现身边的吸铁石知识》
- MASH治疗进展与个体化管理2026
- 精密产业园片区排水管建设项目可行性研究报告模板拿地申报
- 2026版届高三数学高考三模模拟试卷(含参考答案解析)全流程SOP与执行检查表轻量版模板
- 2026年开封市顺河回族区网格员招聘考试备考试题及答案详解
- 2026年伊春市金山屯区网格员招聘考试备考试题及答案详解
- 2026年鸡西市滴道区网格员招聘笔试参考试题及答案详解
- 2026年河南省开封市社区工作者招聘考试备考题库及答案详解
- 医药领域腐败问题集中整治工作总结
- 2026年哈尔滨市道里区网格员招聘考试备考试题及答案详解
- 2025老年人能力评估师题库及答案
- 医院安全生产考核细则
- 2025初一历史填空题专项练习500题
- 中国软件行业协会:2025中国软件行业基准数据报告 SSM-BK-202509
- 医院招聘检验试题及答案
- 剑桥国际音标课件pdf
- 企业资料档案管理制度化模板
- 退伙协议范本:有限责任公司股权退出操作细则
- 医院培训课件:《心脏体格检查》
- 2023-2024学年广东省深圳市高一(下)期末化学试题及答案
- 2024-2025学年云南省玉溪市江川县人教版四年级下册期末考试数学试卷(含答案)
评论
0/150
提交评论