欢迎来到天天文库
浏览记录
ID:59416607
大小:2.85 MB
页数:41页
时间:2020-09-19
《Linux内核并发与同步ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、制作:平台研发部日期:2012-04-26作者:彭耀Linux内核并发与同步培训目的了解抢占式内核和SMP环境下的同步方法学习重点1、并发名词解释2、内核抢占实现分析3、中断处理4、linuxkernel同步方法TBS研发人员培训对象2小时彭耀培训讲师培训课时第一篇:并发名词解释竞态条件:两个或更多线程同时操作资源时将会导致不一致的结果。临界段:用于协调对共享资源的访问的代码段,坚持互斥原则,为解决竞态条件而产生。互斥锁确保对共享资源进行排他访问的软件特性。死锁由两个或更多进程和资源锁导致的一种特别情形,将会降低进程的工作效率。并发名字解释抢占(pree
2、mption):kernel的一种调度特性,通过临时中断一个线程以执行另一个线程的方式来实现CPU共享。并发:并发是一种特性,即在同一时间段出现两个或更多进程并且这些进程彼此交互(例如,共享相同的资源)。UP:单处理器,靠抢占创造并行执行。SMP:对称多处理器,天然的并行执行,抢占也可以创造并行执行。并发名字解释第二篇:内核抢占实现分析内核抢占概述:2.6.x新的可抢占式内核是指内核抢占,即进程于内核空间,有更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。2.5.4版本之前,Linux内核是不可抢占的,高优先级的进程不
3、能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核。内核抢占实现分析用户抢占:2.6.x新的可抢占式内核是指内核抢占,即进程于内核空间,有更高优先级的任务出现时,如果当前任务允许抢占,则可以将当前任务挂起,执行优先级更高的进程。2.5.4之前,Linux内核是不可抢占的,高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直
4、至完成或退出内核。内核抢占实现分析用户抢占:内核即将返回用户空间的时候,如果needresched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。用户抢占在以下情况时产生:1、从系统调返回用户空间。2、从中断处理程序返回用户空间。内核抢占实现分析不可抢占内核特点:不支持内核抢占的内核中,内核代码可以一直执行,到它完成为止。调度程序没有办法在一个内核级的任务正在执行的时候重新调度。内核代码一直要执行到完成(返回用户空间)或明显的阻塞为止。单CPU情况下,这样的设定大大简化了内核的同步和保护机制,可以分两步对此加以分析:内核抢占实现分析首先,不
5、考虑进程在内核中自愿放弃cpu的情况(也即在内核中不发生进程的切换)。一个进程一旦进入内核就将一直运行下去,直到完成或退出内核。即进程在内核中的执行是串行的,不用考虑多个进程同时执行所带来的并发问题,只需再考虑中断的情况。其次是自愿放弃CPU的情况,因为对CPU的放弃是自愿的、主动的,也就意味着进程在内核中的切换是预先知道的,不会出现在不知道的情况下发生进程的切换,内核范围内无需考虑并发问题。内核抢占实现分析为什么要内核抢占:实现内核的可抢占对Linux具有重要意义。首先,这是将Linux应用于实时系统所必需的。其次可解决Linux对多媒体(video,aud
6、io)等要求低延迟的应用支持不够好的缺陷。在Linux2.5.4版本发布时,可抢占被并入内核,同SMP一样作为内核的一项标准可选配置。内核抢占实现分析什么情况不允许内核抢占:为保证Linux内核在特殊情况下不会被抢占,抢占式内核使用了一个变量preempt_count,称为内核抢占锁。这一变量被设置在进程的PCB结构task_struct中。1、内核正进行中断处理;例如:#define__irq_enter()do{account_system_vtime(current);add_preempt_count(HARDIRQ_OFFSET);trace
7、_hardirq_enter();}while(0)//进入中断处理前会增加HARDIRQ_OFFSET。内核抢占实现分析2、内核正在进行中断上下文的BottomHalf处理;voidirq_exit(void){trace_hardirq_exit();//hardirqtextcontent计数减一//IRQ_EXIT_OFFSET=HARDIRQ_OFFSET-1,preempt_count>0sub_preempt_count(IRQ_EXIT_OFFSET);//如果没有上一行代码,这里逻辑判断必是falseif(!in_interrupt()&&
8、local_softirq_pendi
此文档下载收益归作者所有