Chapter 5. Concurrency and Race Conditions

这篇具有很好参考价值的文章主要介绍了Chapter 5. Concurrency and Race Conditions。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Chapter 5. Concurrency and Race Conditions

Thus far, we have paid little attention to the problem of concurrency—i.e., what happens when the system tries to do more than one thing at once. The management of concurrency is, however, one of the core problems in operating systems programming. Concurrency-related bugs are some of the easiest to create and some of the hardest to find. Even expert Linux kernel programmers end up creating concurrency-related bugs on occasion. 到目前为止,我们很少关注并发问题--即当系统试图同时做一件以上的事情时会发生什么。然而,并发性的管理是操作系统编程的核心问题之一。并发相关的错误是一些最容易产生的,也是一些最难发现的。即使是专业的Linux内核程序员,有时也会产生与并发有关的错误。

In early Linux kernels, there were relatively few sources of concurrency. Symmetric multiprocessing (SMP) systems were not supported by the kernel, and the only cause of concurrent execution was the servicing of hardware interrupts. That approach offers simplicity, but it no longer works in a world that prizes performance on systems with more and more processors, and that insists that the system respond to events quickly. In response to the demands of modern hardware and applications, the Linux kernel has evolved to a point where many more things are going on simultaneously. This evolution has resulted in far greater performance and scalability. It has also, however, significantly complicated the task of kernel programming. Device driver programmers must now factor concurrency into their designs from the beginning, and they must have a strong understanding of the facilities provided by the kernel for concurrency management. 在早期的Linux内核中,并发性的来源相对较少。内核不支持对称多处理(SMP)系统,并发执行的唯一原因是对硬件中断的服务。这种方法提供了简单性,但是在一个对处理器越来越多的系统的性能非常看重的世界里,它不再起作用了,它坚持要求系统对事件做出快速反应。为了响应现代硬件和应用程序的需求,Linux内核已经发展到了一个同时进行更多事情的地步。这种进化带来了更大的性能和可扩展性。然而,它也使内核编程的任务变得非常复杂。设备驱动程序员现在必须从一开始就将并发性纳入他们的设计中,而且他们必须对内核提供的并发性管理设施有深刻的理解。

The purpose of this chapter is to begin the process of creating that understanding. To that end, we introduce facilities that are immediately applied to the scull driver from Chapter 3. Other facilities presented here are not put to use for some time yet. But first, we take a look at what could go wrong with our simple scull driver and how to avoid these potential problems. 本章的目的是开始建立这种理解的过程。为此,我们介绍了可立即应用于第三章中的Scull驱动的设施。这里介绍的其他设施在一段时间内还不会投入使用。但首先,我们看一下我们的简单的scull驱动可能会出什么问题,以及如何避免这些潜在的问题。

Pitfalls in scull

Let us take a quick look at a fragment of the scull memory management code. Deep down inside the write logic, scull must decide whether the memory it requires has been allocated yet or not. One piece of the code that handles this task is: 让我们快速看一下Scull的内存管理代码的一个片段。在写逻辑的深处,scull必须决定它所需要的内存是否已经被分配。处理这一任务的代码的一个片段是。

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

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

        if (!dptr->data[s_pos])

            goto out;

    }

Suppose for a moment that two processes (we'll call them "A" and "B") are independently attempting to write to the same offset within the same scull device. Each process reaches the if test in the first line of the fragment above at the same time. If the pointer in question is NULL, each process will decide to allocate memory, and each will assign the resulting pointer to dptr->data[s_pos]. Since both processes are assigning to the same location, clearly only one of the assignments will prevail. 假设有两个进程(我们称它们为 "A "和 "B")独立地试图写到同一个Scull设备中的同一个偏移。每个进程在同一时间到达上面片段第一行的if测试。如果有问题的指针是NULL,每个进程将决定分配内存,并且每个进程将把得到的指针分配给dptr->data[s_pos]。由于两个进程都在向同一个位置赋值,显然只有其中一个赋值会占优势。

What will happen, of course, is that the process that completes the assignment second will "win." If process A assigns first, its assignment will be overwritten by process B. At that point, scull will forget entirely about the memory that A allocated; it only has a pointer to B's memory. The memory allocated by A, thus, will be dropped and never returned to the system. 当然,将会发生的是,第二个完成赋值的进程将会 "赢"。如果进程A首先分配,它的分配将被进程B覆盖。在这一点上,Scull将完全忘记A分配的内存;它只有一个指向B的内存的指针。因此,由A分配的内存将被丢弃,并且永远不会返回到系统中。

This sequence of events is a demonstration of a race condition. Race conditions are a result of uncontrolled access to shared data. When the wrong access pattern happens, something unexpected results. For the race condition discussed here, the result is a memory leak. That is bad enough, but race conditions can often lead to system crashes, corrupted data, or security problems as well. Programmers can be tempted to disregard race conditions as extremely low probability events. But, in the computing world, one-in-a-million events can happen every few seconds, and the consequences can be grave. 这一连串的事件就是一个竞争条件的表现。竞争条件是对共享数据不受控制的访问的结果。当错误的访问模式发生时,会产生一些意外的结果。对于这里讨论的竞争条件,其结果是内存泄漏。这已经很糟糕了,但竞争条件往往会导致系统崩溃、数据被破坏或安全问题。程序员可能会被诱惑,把竞争条件当作极低的概率事件而不予理会。但是,在计算机世界中,百万分之一的事件可能每几秒钟就发生一次,而且后果可能很严重。

We will eliminate race conditions from scull shortly, but first we need to take a more general view of concurrency. 我们很快就会从Scull中消除竞争条件,但首先我们需要对并发性有一个更普遍的看法。文章来源地址https://www.toymoban.com/news/detail-727804.html

到了这里,关于Chapter 5. Concurrency and Race Conditions的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack

    来源:《斯坦福数据挖掘教程·第三版》对应的公开英文书和PPT Computing cluster means large collections of commodity hardware, including conventional processors (“ compute nodes ”) connected by Ethernet cables or inexpensive switches . The software stack begins with a new form of file system, called a “ distributed file system ,”

    2024年02月04日
    浏览(46)
  • 【ES6】Promise.race的用法

    Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。 上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。 Promise.race()方法的参数与Promise.all()方法一样,如果不是 Pr

    2024年02月10日
    浏览(33)
  • 安全作业-Race竞争型漏洞、原型链污染

      一、第一题js代码 获取flag的条件是 传入的querytoken要和user数组本身的admintoken的MD5值相等,且二者都要存在。 由代码可知,全文没有对user.admintokn 进行赋值,所以理论上这个值时不存在的,但是下面有一句赋值语句: data , row , col ,都是我们post传入的值,都是可控的,所以

    2024年02月13日
    浏览(34)
  • Promise.all和Promise.race的区别和使用

    比如当数组里的P1,P2都执行完成时,页面才显示。 值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1,P2 Promise.all成功返回成功数组, 失败返回失败数据,一但失败就不会继续往下走 如果遇到错误的情况,那么将不会继续执行下去,直

    2023年04月18日
    浏览(37)
  • Promise.all和promise.race的应用场景举例

    Promise.all( ) .then( )适用于处理多个异步任务,且所有的 异步任务都得到结果 时的情况。 打印的结果 Promise.race赛跑机制,只认第一名    效果图  

    2024年02月10日
    浏览(41)
  • RACE IPEMD:构建安全基石的密码学原理与实践

    title: RACE IPEMD:构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD 哈希算法 SHA-1 SHA-2/3 消息摘要 数字签名 安全分析 在当今信息爆炸的时代,数据安全和隐私保护变得尤为重要。密码学作为信息安全领域的重要支柱,扮演着保护数据、通信和

    2024年04月16日
    浏览(31)
  • ES6 - promise.all和race方法的用法详解

    一、前言 谈谈你对Promise的理解? 答 :Promise用来解决异步回调问题,由于js是单线程的,很多异步操作都是依靠回调方法实现的,这种做法在逻辑比较复杂的回调嵌套中会相当复杂;也叫做回调地狱; promise用来将这种繁杂的做法简化,让程序更具备可读性,可维护性;pro

    2024年02月15日
    浏览(32)
  • 【手写promise——基本功能、链式调用、promise.all、promise.race】

    关于动机,无论是在工作还是面试中,都会遇到Promise的相关使用和原理,手写Promise也有助于学习设计模式以及代码设计。 本文主要介绍了如何使用自己的代码去实现Promise的一些功能。 以下是本篇文章正文内容 手写之前,需要知道promise有哪些基本特性: 1、promise有三种状态

    2024年02月11日
    浏览(34)
  • Pod 的 phase 和 conditions 的区别

    目录 前言         PodStatus对象 pod 的 phase 字段 phase 作用 有哪些 phase pod 的 conditions 字段 pod 有了 phase,为什么还要有 conditions pod 的 conditions 的作用 pod 的 conditions 分类 conditions设计原则 condition字段内容         Kubernetes 中, pod 从创建到成功运行会分别处于不同的 阶段

    2024年02月09日
    浏览(21)
  • 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了提升性能,使用 unsafe 代码来重构了凯撒加密的代码。代码如下: 命令行 运行go test 的时候发现,代码中发生了 panic。而我直接在 vscode 中通过快捷键运行又是正常

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包