让我们快速看一段 scull 内存管理代码. 在写逻辑的深处, scull 必须决定它请求的内 存是否已经分配. 处理这个任务的代码是:

if (!dptr->data[s_pos]) {

dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL); if (!dptr->data[s_pos])

goto out;

}

假设有 2 个进程( 我们会称它们为"A"和"B" ) 独立地试图写入同一个 schull 设备的相 同偏移. 每个进程同时到达上面片段的第一行的 if 测试. 如果被测试的指针是 NULL, 每个进程都会决定分配内存, 并且每个都会复制结果指针给 dptr->datat[s_pos]. 因为 2 个进程都在赋值给同一个位置, 显然只有一个赋值可以成功.

当然, 发生的是第 2 个完成赋值的进程将"胜出". 如果进程 A 先赋值, 它的赋值将被进 程 B 覆盖. 在此, scull 将完全忘记 A 分配的内存; 它只有指向 B 的内存的指针. A 所分配的指针, 因此, 将被丢掉并且不再返回给系统.

事情的这个顺序是一个竞争情况的演示. 竞争情况是对共享数据的无控制存取的结果. 当 错误的存取模式发生了, 产生了不希望的东西. 对于这里讨论的竞争情况, 结果是内存泄 漏. 这已经足够坏了, 但是竞争情况常常导致系统崩溃和数据损坏. 程序员可能被诱惑而 忽视竞争情况为相当低可能性的事件. 但是, 在计算机世界, 百万分之一的事件会每隔几 秒发生, 并且后果会是严重的.

很快我们将去掉 scull 的竞争情况, 但是首先我们需要对并发做一个更普遍的回顾.

最新文章

  1. matlab 采样函数
  2. Python for Informatics 第11章 正则表达式五(译)
  3. log4php的配置
  4. jnlp jws
  5. Jenkins简单使用介绍
  6. eclipse 调试时出现 Error: [Errno 10013]
  7. 第六周 E题 期望.....
  8. javascript 命名空间的实例应用
  9. 获取WMI硬件清单
  10. java多线程 join方法以及优先级方法
  11. Custom ASP.NET Application into SharePoint --整合ASP.NET应用程序到SharePoint
  12. Performing a full database disaster recovery with RMAN
  13. 生成唯一32位ID编码代码Java(GUID)
  14. 关于QTP
  15. 计算CPU的MIPS
  16. 北大开源全新中文分词工具包:准确率远超THULAC、结巴分词
  17. lombok @Getter @Setter 使用注意事项
  18. Linux 系统管理
  19. Mongodb中经常出现的错误(汇总)child process failed, exited with error number
  20. Go语言之高级篇beego框架之view

热门文章

  1. HTML-DOM实例——实现带样式的表单验证
  2. org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.trs.om.bean.User.retryCount
  3. 【JZOJ4809】【NOIP2016提高A组五校联考1】挖金矿
  4. python os 模块介绍
  5. Nginx教程(一) Nginx入门教程 (转)
  6. oracle-Immediate
  7. zabbix程序架构
  8. BZOJ 1500 洛谷2042维护序列题解
  9. 【NS2】有线和无线混合场景 (转载)
  10. C#中的字段,常量,属性与方法