当前位置: 首页 > news >正文

深圳专门做网站的公司建网站多少钱 优帮云

深圳专门做网站的公司,建网站多少钱 优帮云,怎样给网站做图标,官方百度接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(1) 问题2 问:spin_lock和spin_lock_irq以及spin_lock_irqsave的区别是什么?也可以说它们之间有什么区别和联系? 备注:此题是自旋锁问题的…

接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(1)

问题2

问:spin_lock和spin_lock_irq以及spin_lock_irqsave的区别是什么?也可以说它们之间有什么区别和联系?

备注:此题是自旋锁问题的进一步问题,一般都是在前边你回答出Linux内核的锁机制之后(上一回的问题1,参见Linux内核与驱动面试经典“小”问题集锦(1))的进一步提问、追问。这个问题在蔚来、比特大陆以及其它一些公司面试时问到过。

答:

spin_lock()/spin_unlock()是自旋锁机制的基础,其与关中断local_irq_disable()/开中断local_irq_enable()关中断并保存状态字local_irq_save()/开中断并恢复状态字local_irq_restore()关底半部local_bh_disable()/开底半部local_bh_enable()形成了整套自旋锁机制。其相互之间的关系如下:

  • spin_lock与spin_lock_irq的关系

spin_lock_irq() = spin_lock() + local_irq_disable()

即spin_lock_irq()是spin_lock()的同时关中断。与之相对应,

spin_unlock_irq() = spin_unlock() + local_irq_enable()

即spin_unlock_irq()是spin_unlock()的同时开中断。

  • spin_lock与spin_lock_irqsave的关系

spin_lock_irqsave() = spin_lock() + local_irq_save()

即spin_lock_irqsave()是spin_lock()的同时关中断并保存状态字。与之相对应,

spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()

即spin_unlock_irqrestore()是spin_unlock()的同时开中断并恢复状态字。

  • spin_lock与spin_lock_bh的关系

spin_lock_bh() = spin_lock() + local_bh_disable()

即spin_lock_bh()是spin_lock()的同时关底半部。与之相对应,

spin_unlock_bh() = spin_unlock() + local_bh_enable()

即spin_unlock_bh()是spin_unlock()的同时开底半部。

spin_lock_irq()、spin_lock_irqsave()、spin_lock_bh()类似函数会为自旋锁的使用“系好安全带”,以避免突如其来的中断驶入对系统造成的伤害。

问题3

问:中断中应该使用自旋锁还是信号量或互斥锁?

备注:这个问题在百度、蔚来以及其它一些公司面试时问到过。

答:

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。自旋锁最多只能被一个内核任务持有。在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关,内核不能被抢占。

信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠;当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。信号量只能在进程上下文中使用,因为中断上下文中是不能被调度的(即在中断上下文中释放时不能进行进程切换)。

综上,由于在中断中不能被调度,并且中断处理函数是不可重入的,因此中断中应该选择自旋锁而非信号量或互斥锁等。

额外:

这里要多说一点。如果做出上述回答后,面试官继续追问:为什么中断中不能休眠或进行调度?则原因如下:

(1)中断处理的时候不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断。如果在中断上下文中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程(task_struct)的概念,因此如果真的休眠,则内核几乎肯定会死。

(2)schedule()在切换进程时,保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复)。但在中断处理程序里,CPU寄存器的定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程上下文了。所以不可以在中断处理程序中调用schedule()以及引发schedule()的操作。

参考资料:

《Linux设备驱动开发详解 —— 基于最新的Linux 4.0内核》 宋宝华 编著,机械工业出版社

信号量和自旋锁的选择

为什么中断不能睡眠

http://www.15wanjia.com/news/177602.html

相关文章:

  • 校园类网站模板免费下载wordpress文章显示颜色
  • 懒人做图网站深圳推广公司网站建设书模板
  • 订阅号可以做微网站吗多个图表统计的网站怎么做
  • gstatic wordpress抖音搜索seo排名优化
  • 高端网站建设公司零零南宁seo公司
  • 第三方商城网站开发深圳市广告传媒有限公司
  • 如何做网站的内链和外链学院网站建设自评
  • 网站安全 代码网页设计提升班有哪些
  • 网站做好怎么推广中文 域名的网站
  • 模特公司网站模板手机餐饮网站开发
  • 网站关键词结构家谱网站的首页怎么做
  • 做自己个人网站烟台海阳市专业做网站
  • 优秀企业网站的优缺点广东汕头最新消息
  • 黄冈网站推广厂家iis7创建网站
  • 新乡网站建设新乡wordpress数据库修改后台网址
  • 免费微商城网站建设在线设计网站源码
  • 做办公家具在哪个网站推销好八上数学优化设计答案
  • 在线建站网站wordpress 新浪云
  • 网站开发公司业务游客可进的直播
  • 一个网站可以做多少地区词.mil 域名网站有哪些
  • 一个人做运营网站王战胜局长
  • 珠海网站设计费用动漫设计专业学什么
  • 找做网站找那个平台做php网站 config
  • 南京学校网站制作可以上传图片的公司网站
  • 深圳建网站哪个好怎么弄视频
  • 做宣传类网站需要什么资质如何用wordpress做产品页
  • 郑州网站建设q.479185700棒seo门户网站优化
  • 苏州公司网站建设价格wordpress首页文件夹
  • 沈阳高端网站定制企业建立一个网站步骤
  • 如何增加网站的反链电脑下载17zwd一起做网站