




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、线程控制和线程资源保护第十五篇线程控制和线程资源保护1、引言1)从前面的课程我们知道,每个进程都有自己的进程空间(也称为虚拟内存空间),并且在内核中每个进程都有属于自己的task_struct进程表项来描述自己,这个表项中包含一个很重要的东西,那就是虚拟地址与实际物理地址的映射表。2)每个进程的空间的范围都是0到4G,而且都是自己私有的,进程间的切换,会导致虚拟空间的切换,需要os+mmu起实现,进程切换会导致TLB更新新的映射表,而且cahce里面的内容也会更新。除此外还需要对被切换进程的状态进行保存,所以实际上进程间实现切换的开销(时间和空间)是非常大的,所以利用多进程实现多任务是比较费力
2、的事情,但是又必须需要进程,因为它需要作为资源分配的最小单元而存在。正是由于进程的这些的缺点,本篇我们正式引入线程的概念。2、线程(也称为轻量级的进程)2.1、线程基本特点a)线程依赖于进程而存在,在一个进程里面开出的多个线程共享同一进程空间,这样利用多线程实现多任务时,就能避免因为大量频繁的进程间切换而带来的开销。b)每个线程也同样有一个task_truct结构体来描述,但是共享同一进程的所有线程共享入口地址c)进程与线程都参与统一的内核调度(切换)。d)线程的本质就是指针函数。2.2、线程好处1)大大提高了进程间的切换效率2)避免了不必要的TLB和cache刷新,节省了空间的消耗2.3、线
3、程的实现(线程控制函数)1)不由内核实现,而是由第三方线程库实现的,编译时需要连接才行2)同一进程内的所有线程都会共享进程的哪些资源呢?a)指令代码b)静态数据(主要是用于线程间通信用的全局变量)c)进程打开的所有的文件描述符d)进程的当前工作目录e)进程的实际用户ID和有效用户IDf)实际组ID和有效组ID3)每个线程的私有资源有哪些?a)线程ID(TID)b)自己的PC(程序计数器值)和相关的状态寄存器(存放该线程被切换时的状态)c)自己的局部变量(每个线程其实就是一个函数),每个线程都会从进程栈中开出自己的线程栈(也可称为线程函数栈)d)自己的错误号errnoe)自己的信号掩码(屏蔽字,
4、起初是继承进程(主线程)的),和未决信号集(继承于主线程,但是会被立即清空)f)有自己的执行状态4)线程实现过程a)创建线程,pthread_create函数b)控制线程,pthreadoin,pthread_detach,pthread_cancle,pthread_exit等函数5)线程的资源保护我们知道,对于进程来说资源保护是天然的,因为它们拥有独立虚拟内存空间,互相不能互访,这也导致相互通信也很不容易。但是对于同一进程内的多个线程来说,由于它们共享进程的虚拟内存地址,因此它们相互之间可以很容易地进行资源的共享,但是资源间的保护却成为了一个问题。线程资源保护机制有:a)无名信号量(进程用
5、的是有名信号量或称为系统V信号量)互斥同步b)线程间的互斥锁互斥c)条件变量一种线程间的异步通信机制,类似于进程间的信号通信6)注意,如果主线程先死,那么所有次线程都会跟着死调,所以任何线程调了exit函数后整个进程将会结束3、进程与线程的异同+1程不同占心3.111+-ex5W1.kfor;1?1II.s數函载谓编a.才5.if=冽号疽忌住_需涓a间,二曰=程道号进管宿也B为1_大_号(亠-FT护引保无中协中-I-t资锁i麦要斥号件需互信寮1_?1匚-4LT.1!.内管拥m.甲宀匚=-T-y.-.I.-程応P7利可I4J、相同占心里-备、使进程电线程黔列(帖在内核題角度)的关社实现多任詢到底
6、1还呈編呈要看mmu+od!M进程间的切测毬程切换的时间需鮒概1000个指令勰:当然还要参考叡程时信号的问题要曲蹲基卅创亘益牌讲:多任务都是用线辭做,因为更省开I)所有线程共享信号处理方式,比如其中一个线程改变了信号处理方式后,大家都会共享这一改变后的信号处理方式。2)处理方式如果是捕获的话,大家共享信号的捕获函数3)刚开始各次线程会继承主线程(进程)的信号屏蔽字,每个线程拥有属于自己的信号屏蔽字,每个线程可以通过自己的屏蔽字任意的打开和屏蔽与自己相关的某个信号。但是每个线程的未决信号集虽然会继承主线程的,但即便主线程的未决信号集中有味觉信号,但是在次线程中的未决信号集会被全部清空4)发生的信
7、号会被发送给任意一个未屏蔽该信号的线程,如果所有线程都屏蔽了该信号,当此信号发生时,该信号将会设置到当前正在运行线程的未决信号集之中,谁响应了信号处理函数,该线程将会被这个信号捕获函数阻塞(换句话说该信号捕获函数和这个线程是一条线的运行的)5、线程创建和取消相关的函数a)线程创建函数intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);b)线程等待函数:阻塞等待线程结束,结束后由主回收线程的资源intpthread_join(pthread_tthre
8、ad,void*retval);c)线程分离函数:分离后,资源在线程结束时自己释放,不有主线程回收intpthreaddetach(pthreadtthread);这个函数和pthreadjoin二者只能有一个被用d)主动取消线程函数intpthread_cancel(pthread_tthread);取消是否是使能设置函数:默认情况是使能intpthread_setcancelstate(intstate,int*oldstate);PTHREAD_CANCEL_ENABLE使能(default)PTHREAD_CANCEL_DISABLE:不使能-与取消方式相关函数intpthread_s
9、etcanceltype(inttype,int*oldtype);获取线程取消方式函数intpthreadsetcancelstate(intstate,int*oldstate);设置取消方式函数取消方式:必须运行到取消点函数正常取消(调用时间长或回引起阻塞的函数都是取消点函数,但是胡斥锁除外)有些阻塞函数不是取消点,导致线程长期阻塞而无法取利用PTHREAD_CANCEL_ASYNCHRONOUS宏设置为强制取消,风险是被取消的函数返回状态是未定义的,PTHREAD_CANCEL_DEFERRED默认是按照取消点取消,这个不设置也可以因为没有取消点而无法取消,但又不想设置为强制取消voi
10、dpthread_testcancel(void),认为设置一个可取消点e)线程主动退出函数1、return2、voidpthread_exit(void*retval);这两个函数有区别,区别后面讲f)线程退出处理函数的设置1、注册线程退出处理函数(函数压栈)voidpthread_cleanup_push(void(*routine)(void*),void*arg);2、线程退出处理函数弹栈(参数非0就弹栈),出栈顺序与入栈顺序相反voidpthread_cleanup_pop(intexecute);/3、需要了解的集中情况以上两个函数必须配对使用线程被被别人调用pthread_can
11、cel函数取消(这种情况下返回值为-1),这时即便thread_cleanup_pop函数没有得到调用,也将会弹栈线程主动调用pthread_exit函数退出,这时同样是即便thread_cleanup_pop函数没有得到调用,也会弹栈。但是return函数不会,这就是pthread_exit和return之间的区别主动的调用thread_cleanup_pop(!0),当参数是非0时就会弹栈,一般线程return返回时,这个函数必须写在return的前面,只有pop函数得到调用后才会弹栈g)获取线程id(是个非负数)的函数,口的形式打印出来pthread_self(void);6、线程属性设
12、置函数(非教学既定内容,了解)1)线程属性有哪些:a)绑定属性:用户线程和内核服务线程是否绑定(default:非绑定),cpu时间片的调度是面向内核线程实现的b)分离属性:线程结束时,线程资源由谁回收,设置了分离,就由自己释放,未设置分离,资源由等待线程(join函数等待)回收,(default:非分离),分离属性也可由前面的pthread_detach函数来设置c)堆栈的地址和堆栈的大小:线程的堆栈其实就是函数的堆栈,是从进程的堆栈中刮分出来的,默认情况下,线程具体的堆栈地址由内核决定,堆栈大小默认1M,当然我也可以认为的更改它d)线程的优先级:由于线程是与它的生父进程(主线程)一样统一地
13、参与内核的调度器的调度,所以存在着调度优先级的问题,默认情况是他和生父进程有着同样的优先级别e)般情况下,我们都采用默认设置即可2)线程属性设置函数a)线程属性初始化函数intpthread_attr_init(pthread_attr_t*attr);b)线程属性删除函数:删除为属性设置,恢复内核原有默认的属性设置,防止永远的篡改了默认的属性设置intpthreadattrdestroy(pthreadattrt*attr);c)设置绑定函数intpthread_attr_setscope(pthread_attr_t*attr,intscope);/设置intpthreadattrgets
14、cope(pthreadattrt*attr,int*scope);获取d)设置分离属性intpthread_attr_setdetachstate(pthread_attr_t*attr,intdetachstate);/设置intpthreadattrgetdetachstate(pthreadattrt*attr,int*detachstate);获取e)设置堆栈属性/*设置*/intpthread_attr_setstack(pthread_attr_t*attr,void*stackaddr,size_tstacksize)/*获取*/intpthread_attr_getstack
15、(pthread_attr_t*attr,void*stackaddr,size_t*stacksize)f)设置优先级属性/*设置*/intpthread_attr_setschedparam(pthread_attr_t*attr,conststructsched_param*param);/*获取*/intpthread_attr_getschedparam(pthread_attr_t*attr,structsched_param*param);g)其它函数等:略7、设置互斥锁相关的函数1)互斥锁初始化函数intpthread_mutexnit(pthread_mutex_t*rest
16、rictmutex,constpthread_mutexattr_t*restrictattr);2)互斥锁直接初始化,只能初始化,不能赋值,因为pthread_mutex_t是结构体类型pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;3)互斥锁销毁函数intpthread_mutex_destroy(pthread_mutex_t*mutex);加锁解锁函数阻塞解锁:intpthread_mutex_lock(pthread_mutex_t*mutex);非阻塞加锁:intpthread_mutex_trylock(pthread_mutex_t
17、*mutex);解锁:intpthread_mutex_unlock(pthread_mutex_t*mutex);互斥锁属性设置函数(非教学内容,了解)互斥锁属性初始化和删除/*属性初始化*/intpthread_mutexattr_init(pthread_mutexattr_t*attr);/*互斥所属性删除:类似线程的属性删除*/intpthread_mutexattr_destroy(pthread_mutexattr_t*attr);互斥锁类型设置和获取互斥锁类型分类:PTHREAD_MUTEX_DEFAULT:快速互斥锁(或叫阻塞互斥锁),默认此种锁,统一把锁,不能多次加锁,已经
18、解开了的锁也不能再次解锁,这些都会出错返回PTHREAD_MUTEX_ERRORCHECK:检错互斥锁,快速互斥锁的费阻塞版本PTHREAD_MUTEX_RECURSIVE:递归互斥锁,同一把锁可多次枷锁,每加一次锁,锁的连接计数加1,解锁时的解锁顺序与加锁顺序相反,每解一次连接技术减1,加过多少次锁,就必须接多少次intpthread_mutexattr_settype(pthread_mutexattr_t*attr,inttype);/设置intpthread_mutexattr_gettype(constpthread_mutexattr_t*restrictattr,int*rest
19、ricttype);/获取其它还有大概十几个函数,这里省略7、设置线程信号量相关的函数1)初始化函数intsem_init(sem_t*sem,intpshared,unsignedintvalue);2)删除函数intsem_destroy(sem_t*sem);P操作:等资源intsem_wait(sem_t*sem);阻塞等待资源intsem_trywait(sem_t*sem);非阻塞等待资源/*可设置超时,阻塞超过一定时间,超时不在阻塞*/intsem_timedwait(sem_t*sem,conststructtimespec*abs_timeout);v操作:释放资源intse
20、m_post(sem_t*sem);信号量无属性设置8、条件变量设置1)初始化和删除函数/*初始化条件变量*/intpthread_cond_init(pthread_cond_t*restrictcond,constpthread_condattr_t*restrictattr);intpthread_cond_destroy(pthread_cond_t*cond)/删除条件变量pthreadcondtcond=PTHREADCONDINITIALIZER;/直接变量初始化(不能赋值)2)条件变量发送信号函数/*唤醒全部因为该条件变量而休眠的线程*/intpthread_cond_broadcast(pthread_cond_t*cond);/*唤醒其中一个因为该条件变量而休眠的线程*/intpthrea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中书法概述课件
- 离婚双方贷款房产分割及共同还款协议
- 生猪、菜牛、菜羊、家禽养殖基地养殖资金购销合同
- 离婚后特殊病患子女抚养权及医疗费用承担协议
- 生物质能源项目贷款合同附共同担保人及环保责任
- 电信IDC机房服务-移动数据业务标包合作协议
- 公务员面试培训咨询服务合同
- 化学工业新产品推广细则
- 物业管理矛盾调解手册
- 园艺工程:参与或观赏园林景观工程
- 古茗合同协议书
- 湖北省技能高考(学前教育)专业知识考试必刷题及答案(含往年真题)
- 《跨国供应链管理案例解析》课件
- 临床案例谈护理文书规范化法律意义与纠纷防范
- CNAS-CI01:2012 检查机构能力认可准则
- 麻风病防治知识讲座
- 2023年威海桃威铁路有限公司招聘笔试参考题库附带答案详解
- 急性心梗诊疗(2025指南)解读课件
- 2025至2030年中国综合能源服务产业投资规划及前景预测报告
- 虾滑产品知识培训课件
- 2025-2030全球宠物电器行业发展趋势分析及投资前景预测研究报告
评论
0/150
提交评论