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

国外无版权图片网站网站推广应该坚持什么策略

国外无版权图片网站,网站推广应该坚持什么策略,组建网站需多少钱,网站手机版方案一、什么是自旋锁一直以为自旋锁也是用于多线程互斥的一种锁#xff0c;原来不是#xff01;自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制。自旋锁与互斥锁比较类似#xff0c;它们都是为了解决对某项资源的互斥使用。无论是互斥锁#xff0c;还是自…一、什么是自旋锁一直以为自旋锁也是用于多线程互斥的一种锁原来不是自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制。自旋锁与互斥锁比较类似它们都是为了解决对某项资源的互斥使用。无论是互斥锁还是自旋锁在任何时刻最多只能有一个保持者也就说在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁如果资源已经被占用资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠如果自旋锁已经被别的执行单元保持调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁“自旋”一词就是因此而得名。自旋锁在内核中大量应用于中断处理等部分(对于单处理器来说防止中断处理中的并发可简单采用关闭中断的方式即在标志寄存器中关闭/打开中断标志位不需要自旋锁)。自旋锁的初衷就是在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间)所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要在单CPU且不可抢占的内核下自旋锁的所有操作都是空操作。二、自旋锁的缺陷自旋锁是一种比较低级的保护数据结构或代码片段的原始方式这种锁可能存在两个问题(1)死锁。试图递归地获得自旋锁必然会引起死锁例如递归程序的持有实例在第二个实例循环以试图获得相同自旋锁时就不会释放此自旋锁。所以在递归程序中使用自旋锁应遵守下列策略递归程序决不能在持有自旋锁时调用它自己也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定那么即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源从而进入死循环。(2)过多占用cpu资源。如果不加限制由于申请者一直在循环等待因此自旋锁在锁定的时候如果不成功不会睡眠会持续的尝试单cpu的时候自旋锁会让其它process动不了。因此一般自旋锁实现会有一个参数限定最多持续尝试次数。超出后自旋锁放弃当前time slice等下一次机会。由此可见自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短因此选择自旋而不是睡眠是非常必要的自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况它们会导致调用者睡眠因此只能在进程上下文使用而自旋锁适合于保持时间非常短的情况它可以在任何上下文使用。三、Linux环境下的自旋锁自旋锁的实现基于共享变量。一个线程通过给共享变量设置一个值来获取锁其他等待线程查询共享变量是否为0来确定锁现是否可用然后在忙等待的循环中“自旋”直到锁可用为止。自旋锁的状态值为1表示解锁状态说明有1个资源可用0或负值表示加锁状态0说明可用资源数为0。Linux内核为通用自旋锁提供了API函数初始化、测试和设置自旋锁。API函数功能说明如下表所示宏定义功能说明spin_lock_init(lock)初始化自旋锁将自旋锁设置为1表示有一个资源可用。spin_is_locked(lock)如果自旋锁被置为1(未锁)返回0否则返回1。spin_unlock_wait(lock)等待直到自旋锁解锁(为1)返回0否则返回1。spin_trylock(lock)尝试锁上自旋锁(置0)如果原来锁的值为1返回1否则返回0。spin_lock(lock)循环等待直到自旋锁解锁(置为1)然后将自旋锁锁上(置为0)。spin_unlock(lock)将自旋锁解锁(置为1)。spin_lock_irqsave(lock, flags)循环等待直到自旋锁解锁(置为1)然后将自旋锁锁上(置为0)。关中断将状态寄存器值存入flags。spin_unlock_irqrestore(lock, flags)将自旋锁解锁(置为1)。开中断将状态寄存器值从flags存入状态寄存器。spin_lock_irq(lock)循环等待直到自旋锁解锁(置为1)然后将自旋锁锁上(置为0)。关中断。spin_unlock_irq(lock)将自旋锁解锁(置为1)。开中断。spin_unlock_bh(lock)将自旋锁解锁(置为1)。开启底半部的执行。spin_lock_bh(lock)循环等待直到自旋锁解锁(置为1)然后将自旋锁锁上(置为0)。阻止软中断的底半部的执行。在实际编程中何时使用spin_lock何时使用spin_lock_irq呢这两者有点区别。(1)spin_lockspin_lock 的实现关系为spin_lock - raw_spin_lock - _raw_spin_lock - __raw_spin_lock 而__raw_spin_lock 的实现为static inline void __raw_spin_lock(raw_spinlock_t *lock){preempt_disable();spin_acquire(lock-dep_map, 0, 0, _RET_IP_);LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);}(2)spin_lock_irqspin_lock_irq 的实现关系为spin_lock_irq - raw_spin_lock_irq - _raw_spin_lock_irq - __raw_spin_lock_irq而__raw_spin_lock_irq 的实现为static inline void __raw_spin_lock_irq(raw_spinlock_t *lock){local_irq_disable();preempt_disable();spin_acquire(lock-dep_map, 0, 0, _RET_IP_);LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);}由此可见这两者之间只有一个差别是否调用local_irq_disable()函数 即是否禁止本地中断。这两者的区别可以总结为在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断又禁止内核抢占。spin_lock比spin_lock_irq速度快但是它并不是任何情况下都是安全的。举例来说明进程A中调用了spin_lock(lock)然后进入临界区此时来了一个中断(interrupt)该中断也运行在和进程A相同的CPU上并且在该中断处理程序中恰巧也会spin_lock(lock)试图获取同一个锁。由于是在同一个CPU上被中断进程A会被设置为TASK_INTERRUPT状态中断处理程序无法获得锁会不停的忙等由于进程A被设置为中断状态schedule()进程调度就无法再调度进程A运行这样就导致了死锁但是如果该中断处理程序运行在不同的CPU上就不会触发死锁。 因为在不同的CPU上出现中断不会导致进程A的状态被设为TASK_INTERRUPT只是换出。当中断处理程序忙等被换出后进程A还是有机会获得CPU执行并退出临界区。所以在使用spin_lock时要明确知道该锁不会在中断处理程序中使用。
http://wiki.neutronadmin.com/news/317183/

相关文章:

  • 个人能进行网站开发互联网项目网
  • 酒店网站建设一般考虑哪些因素沙朗做网站公司
  • php app网站建设访问网站 403.14错误
  • 免备案网站空间购买谷歌搜索引擎入口2022
  • 网站建设与管理实训心得怎么写网站服务器使用
  • 盐城市规划建设局网站微信网站建设开发
  • 做网站网站的代理算网站罪吗网站建设与推广合肥
  • 三步做一个抓娃娃机天津seo网站排名优化公司
  • 宁波网站建设caiyiduo有专门做ppt的网站有哪些
  • 网站设计论文题目参考网站没有域名
  • 珠海建设信息网站手机排行榜2024前十名最新
  • 企业不建立网站吗wordpress博客实战
  • 手机网站发号系统源码用自己网站域名这么做邮箱
  • 网站建设摊销会计分录精品网站建设多少钱
  • 盐城网站开发代理商做家装的设计公司网站
  • 成都前几年网站建设公司网站建设板块
  • 奢侈品+++网站建设方案网站推销怎么做ppt模板
  • 中职网站建设与管理专业做特卖网站有哪些
  • 动易网站 设置背景图片进入公众号会不会泄露个人信息
  • 优秀网站设计百度关键字
  • 设计网站建设合同书建设一个同城购物网站
  • 手机软件开发和网站开发含山县查询建设工程的网站
  • 保山公司网站建设淘宝优惠券网站怎么做
  • 网红营销网站免费网站后台管理系统html
  • 广州建网站公司排名浙江省杭州市建设厅网站
  • 对网站建设的要求wordpress中文是什么?
  • vps设置网站访问用户权限js代码 嵌入网站
  • 有什么网站建设软件有哪些网站维护运营好做吗
  • 如何搭建公司内部网站wordpress 邮件通知
  • dede批量建站网页qq登录不了怎么回事