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

怎么做一个网站潮州外贸网站建设

怎么做一个网站,潮州外贸网站建设,网站运营管理主要内容,建设工程造价管理总站网站原文网址#xff1a;https://lwn.net/Articles/93617 原文作者#xff1a;Corbet 原文时间#xff1a;2004年7月14日 内核提供了一种用于实现引用计数的简单机制kref#xff1b;该机制是今年3月份完成的。kref机制的核心思想是#xff0c;提供支持原子操作的计数器https://lwn.net/Articles/93617 原文作者Corbet 原文时间2004年7月14日 内核提供了一种用于实现引用计数的简单机制kref该机制是今年3月份完成的。kref机制的核心思想是提供支持原子操作的计数器用于对未决引用【outstanding references】进行计数。如果计数器数值为零内核不再需要引用对象了引用对象可以被释放掉。 kref机制的函数很简单在引用对象数据结构内直接包含一个struct kref计数器或struct kref *计数器指针在引用对象被操作之前调用kref_get函数引用计数器递增。 struct kref *kref_get(struct kref *kref) {WARN_ON(!atomic_read(kref-refcount));atomic_inc(kref-refcount);return kref; } 在对对象操作完成之后调用kref_put函数引用计数器递减如果计数器数值为零就调用回调函数释放引用对象相关资源。 void kref_put(struct kref *kref) {if (atomic_dec_and_test(kref-refcount)) {kref-release(kref); //release函数是回调函数} } 对引用计数refcount域进行原子操作使得上述两个函数可以安全地在多CPU或抢断环境下直接调用也就是说在这两个环境下引用计数器的数值总能获得正确的结果。但是如果两个内核线程在使用kref机制时存在下面情况kref机制也会出错。 内核线程1内核线程2 /* In kref_get() */ WARN_ON(!atomic_read(kref-refcount)); kref_put(kref); atomic_inc(kref-refcount); return kref; 在上面的例子中内核线程1在调用atomic_inc之前的那一刻被引用对象的相关资源很可能被释放掉了。kref代码强制要求对同一个引用对象不允许kref_get和kref_put并行运行。也就是说这种强制性要求上述两个函数都需要用锁来避免对同一个引用对象的并行访问。 但是关注高可扩展性的程序员经常会使用免锁算法。因为在线程数量比较大的时候锁往往会成为性能瓶颈因此尽可能不用锁内核的可扩展性会更好。这也是内核提供seqlock和RCU这两种技术的原因。kref机制对锁机制的需求使得seqlock和RCU很难派上用途。 Ravikiran G Thirumalai最近提交了一份题为“Refcounting of objects part of a lockfree collection”的补丁实现了一个新的锁机制refcount_t用于对象的免锁管理。并用大量篇幅介绍了和RCU一起工作时引用计数过程所有补丁构建了一种类似kref的数据类型这种数据类型不需要用锁就能避免前面提到的竞争问题。 伴随并行写的过程【as currently written】kref_get首先检查引用计数数值如果计数数值为零表示对象已经被释放了。当前的实现是检查到数值为零时仅仅是抱怨一下【我理解为信息输出而不做更多的处理】有人可能要说了这种情况下应该做进一步的处理才好。然而真正的问题是对引用计数的测试和递增如果不能在一个原子操作中实现那么在这两个操作之间就有可能插入其他操作。Ravikiran的补丁通过提供另一个XXXX_get函数来解决这个问题 static inline int refcount_get_rcu(refcount_t *rc){int c, old;c atomic_read(rc-count);while ( c (old cmpxchg(rc-count.counter, c, c1)) ! c) c old;return c;} 上面函数的核心是cmpxchg函数这是一个内联汇编函数可以直接使用CPU的cmpxchg指令。这个函数的原型是 int cmpxchg(int *location, int old, int new); cmpxchg函数实现了以下基本功能 1用原子操作实现比较location内存单元数值和old变量数值如果两者数值相等将location内存单元设置为new变量数值。 2如果上述原子操作成功即判断两者数值相等后location内存单元被修改cmpxchg函数返回old变量数值如果上述原子操作不成功cmpxchg返回location内存单元的数值。 cmpxchg指令是CPU提供的测试-设置原子指令。用cmpxchg实现的XXXX_get函数在不用锁的情况下就可以实现引用计数器的获取。 这里还是有点小问题。考虑一种情况内核线程2对引用计数对象释放后又重新使用该对象然后内核线程1才试图去获取引用计数。在这种情况下内核线程1可能看到的是一个随机的引用计数就误以为成功获取了引用计数。引入RCU机制可以避免这种情况发生。引用对象的释放是通过RCU回调函数来实现这样一来引用对象就不会被真正释放直到每一个处理器都发生了调度。只要内核线程能通过指针找到引用对象那么这个对象就一直存在即使对象的引用计数数值为零。经过一个完整静默期没有内核线程去访问这样的指针了引用对象才会被安全地删除。 另一个潜在的问题是并不是所有的体系结构都提供cmpxchg原子指令。针对这样的系统Ravikiran用到了一个从未见过但相当巧妙的方案用到了自旋锁的哈希数组如果你们好奇就自己去看补丁好了。 这些努力都是值得的这个技术已经用于文件描述符查找了tiobench测试性能提高了13% ~ 21%。内核系统里还有类似kref API一样的对象也有创建新的引用计数API。因此补丁还可能会重写。
http://www.tj-hxxt.cn/news/139678.html

相关文章:

  • 黑龙江省城乡和住房建设厅网站首页江苏省建设厅网站是
  • 巩义网站建设哪家专业公司网站点击量如何看
  • 西安网站关键词优化教育类企业网站
  • 鞍山百度做网站万万州州微微网站网站建建设设
  • 建设网站的新闻茂名网站建设哪家好
  • 竣工备案证网上怎么查南昌seo排名公司
  • 清远网站制作2023网络舆情案例分析
  • 成都网站开发企业湖南做网站哪家好
  • 网站开发一般用什么技术qq炫舞做浴缸的网站
  • 电子商务网站网络拓扑图上海小程序定制开发公司
  • 江苏建设信息网站有时候打不开做的比较好的法律实务培训网站
  • 网站空间的地址最后的目的是什么
  • 杭州网站建设杭州wordpress对接微信登录
  • 建设一个网站要学什么免费微网站开发
  • 帝国网站模板建设完成显示不正常一般网站建设电话
  • 网站功能介绍淘宝店铺可以做网站优化么
  • 中国电力建设股份有限公司网站中山优秀网站建设
  • jsp网站设计外网npv加速器
  • 长沙公司制作网站费用多少app与移动网站开发考试资料
  • 织梦制作手机网站模板广东官网网站建设平台
  • 英文网站导航 源码诚企信年报
  • 360网站怎么建设网站建设价格对比分析
  • 嘉兴专业网站建设网站在线制作平台
  • 具体c2c网站建设实例郑州网站开发培训班
  • 榆林网站建设推广手机网站建设信息
  • 怎样用西瓜影音做网站湛江cms建站系统
  • 网站建设课程毕设网站备案信息被工信部删除
  • 做网站有2个前提条件_一个是网站wordpress付费主题博客
  • 网站关键字怎么分割新闻发布会
  • 服装网站建设物流配送系统清明节ppt模板免费下载