CINXE.COM

Read-copy-update - Wikipedia

<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Read-copy-update - Wikipedia</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )enwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy", "wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"fe4ea6e7-7f9a-485c-addb-f08840514495","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Read-copy-update","wgTitle":"Read-copy-update","wgCurRevisionId":1241519371,"wgRevisionId":1241519371,"wgArticleId":284371,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["CS1 errors: external links","Articles with short description","Short description is different from Wikidata","Articles containing potentially dated statements from March 2014","All articles containing potentially dated statements","All articles with failed verification","Articles with failed verification from November 2015","Articles needing cleanup from May 2014","All pages needing cleanup","Articles with sections that need to be turned into prose from May 2014", "Operating system technology","Concurrency control"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Read-copy-update","wgRelevantArticleId":284371,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgFlaggedRevsParams":{"tags":{"status":{"levels":1}}},"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":40000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true, "wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q7300340","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","jquery.makeCollapsible.styles":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","ext.pygments.view", "mediawiki.page.media","ext.scribunto.logs","site","mediawiki.page.ready","jquery.makeCollapsible","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.cite.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cjquery.makeCollapsible.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector-2022"> <script async="" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Read-copy-update - Wikipedia"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wikipedia.org/wiki/Read-copy-update"> <link rel="alternate" type="application/x-wiki" title="Edit this page" href="/w/index.php?title=Read-copy-update&amp;action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wikipedia.org/wiki/Read-copy-update"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Read-copy-update rootpage-Read-copy-update skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-contents" class="mw-list-item"><a href="/wiki/Wikipedia:Contents" title="Guides to browsing Wikipedia"><span>Contents</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Portal:Current_events" title="Articles related to current events"><span>Current events</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Visit a randomly selected article [x]" accesskey="x"><span>Random article</span></a></li><li id="n-aboutsite" class="mw-list-item"><a href="/wiki/Wikipedia:About" title="Learn about Wikipedia and how it works"><span>About Wikipedia</span></a></li><li id="n-contactpage" class="mw-list-item"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia"><span>Contact us</span></a></li> </ul> </div> </div> <div id="p-interaction" class="vector-menu mw-portlet mw-portlet-interaction" > <div class="vector-menu-heading"> Contribute </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia"><span>Help</span></a></li><li id="n-introduction" class="mw-list-item"><a href="/wiki/Help:Introduction" title="Learn how to edit Wikipedia"><span>Learn to edit</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Community_portal" title="The hub for editors"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes to Wikipedia [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_upload_wizard" title="Add images or other media for use on Wikipedia"><span>Upload file</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="The Free Encyclopedia" src="/static/images/mobile/copyright/wikipedia-tagline-en.svg" width="117" height="13" style="width: 7.3125em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wikipedia [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wikipedia" aria-label="Search Wikipedia" autocapitalize="sentences" title="Search Wikipedia [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page&#039;s font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&amp;returnto=Read-copy-update" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&amp;returnto=Read-copy-update" title="You&#039;re encouraged to log in; however, it&#039;s not mandatory. [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Log in and more options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wikipedia.org&amp;uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Read-copy-update" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&amp;returnto=Read-copy-update" title="You&#039;re encouraged to log in; however, it&#039;s not mandatory. [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">(Top)</div> </a> </li> <li id="toc-Name_and_overview" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Name_and_overview"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Name and overview</span> </div> </a> <ul id="toc-Name_and_overview-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Detailed_description" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Detailed_description"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Detailed description</span> </div> </a> <ul id="toc-Detailed_description-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Uses" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Uses"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Uses</span> </div> </a> <ul id="toc-Uses-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Advantages_and_disadvantages" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Advantages_and_disadvantages"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Advantages and disadvantages</span> </div> </a> <ul id="toc-Advantages_and_disadvantages-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Patents" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Patents"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Patents</span> </div> </a> <ul id="toc-Patents-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Sample_RCU_interface" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Sample_RCU_interface"> <div class="vector-toc-text"> <span class="vector-toc-numb">6</span> <span>Sample RCU interface</span> </div> </a> <ul id="toc-Sample_RCU_interface-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Simple_implementation" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Simple_implementation"> <div class="vector-toc-text"> <span class="vector-toc-numb">7</span> <span>Simple implementation</span> </div> </a> <ul id="toc-Simple_implementation-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Analogy_with_reader–writer_locking" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Analogy_with_reader–writer_locking"> <div class="vector-toc-text"> <span class="vector-toc-numb">8</span> <span>Analogy with reader–writer locking</span> </div> </a> <ul id="toc-Analogy_with_reader–writer_locking-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-History" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#History"> <div class="vector-toc-text"> <span class="vector-toc-numb">9</span> <span>History</span> </div> </a> <ul id="toc-History-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-See_also" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#See_also"> <div class="vector-toc-text"> <span class="vector-toc-numb">10</span> <span>See also</span> </div> </a> <ul id="toc-See_also-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Notes" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Notes"> <div class="vector-toc-text"> <span class="vector-toc-numb">11</span> <span>Notes</span> </div> </a> <ul id="toc-Notes-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-References" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#References"> <div class="vector-toc-text"> <span class="vector-toc-numb">12</span> <span>References</span> </div> </a> <ul id="toc-References-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-External_links" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#External_links"> <div class="vector-toc-text"> <span class="vector-toc-numb">13</span> <span>External links</span> </div> </a> <ul id="toc-External_links-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Read-copy-update</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Go to an article in another language. Available in 6 languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-6" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">6 languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-cs mw-list-item"><a href="https://cs.wikipedia.org/wiki/Read-copy-update" title="Read-copy-update – Czech" lang="cs" hreflang="cs" data-title="Read-copy-update" data-language-autonym="Čeština" data-language-local-name="Czech" class="interlanguage-link-target"><span>Čeština</span></a></li><li class="interlanguage-link interwiki-de mw-list-item"><a href="https://de.wikipedia.org/wiki/RCU_(Linux)" title="RCU (Linux) – German" lang="de" hreflang="de" data-title="RCU (Linux)" data-language-autonym="Deutsch" data-language-local-name="German" class="interlanguage-link-target"><span>Deutsch</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Read-Copy-Update" title="Read-Copy-Update – Italian" lang="it" hreflang="it" data-title="Read-Copy-Update" data-language-autonym="Italiano" data-language-local-name="Italian" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%89%E3%83%BB%E3%82%B3%E3%83%94%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88" title="リード・コピー・アップデート – Japanese" lang="ja" hreflang="ja" data-title="リード・コピー・アップデート" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/Read-copy-update" title="Read-copy-update – Russian" lang="ru" hreflang="ru" data-title="Read-copy-update" data-language-autonym="Русский" data-language-local-name="Russian" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/Read-copy-update" title="Read-copy-update – Ukrainian" lang="uk" hreflang="uk" data-title="Read-copy-update" data-language-autonym="Українська" data-language-local-name="Ukrainian" class="interlanguage-link-target"><span>Українська</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q7300340#sitelinks-wikipedia" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Read-copy-update" title="View the content page [c]" accesskey="c"><span>Article</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Read-copy-update" rel="discussion" title="Discuss improvements to the content page [t]" accesskey="t"><span>Talk</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Read-copy-update"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Read-copy-update"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Read-copy-update" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Read-copy-update" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;oldid=1241519371" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&amp;page=Read-copy-update&amp;id=1241519371&amp;wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FRead-copy-update"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&amp;url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FRead-copy-update"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&amp;page=Read-copy-update&amp;action=show-download-screen" title="Download this page as a PDF file"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Read-copy-update&amp;printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q7300340" title="Structured data on this page hosted by Wikidata [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Wikipedia, the free encyclopedia</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="shortdescription nomobile noexcerpt noprint searchaux" style="display:none">Synchronization mechanism</div> <p>In <a href="/wiki/Computer_science" title="Computer science">computer science</a>, <b>read-copy-update</b> (<b>RCU</b>) is a <a href="/wiki/Synchronization_(computer_science)" title="Synchronization (computer science)">synchronization</a> mechanism that avoids the use of <a href="/wiki/Lock_(computer_science)" title="Lock (computer science)">lock</a> primitives while multiple <a href="/wiki/Thread_(computing)" title="Thread (computing)">threads</a> concurrently read and update elements that are linked through <a href="/wiki/Pointer_(computer_programming)" title="Pointer (computer programming)">pointers</a> and that belong to shared <a href="/wiki/Data_structure" title="Data structure">data structures</a> (e.g., <a href="/wiki/Linked_lists" class="mw-redirect" title="Linked lists">linked lists</a>, <a href="/wiki/Tree_(data_structure)" class="mw-redirect" title="Tree (data structure)">trees</a>, <a href="/wiki/Hash_table" title="Hash table">hash tables</a>).<sup id="cite_ref-:0_1-0" class="reference"><a href="#cite_note-:0-1"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup> </p><p>Whenever a thread is inserting or deleting elements of data structures in <a href="/wiki/Shared_memory" title="Shared memory">shared memory</a>, all readers are guaranteed to see and traverse either the older or the new structure, therefore avoiding inconsistencies (e.g., dereferencing <a href="/wiki/Null_pointer" title="Null pointer">null pointers</a>).<sup id="cite_ref-:0_1-1" class="reference"><a href="#cite_note-:0-1"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup> </p><p>It is used when performance of reads is crucial and is an example of <a href="/wiki/Space%E2%80%93time_tradeoff" title="Space–time tradeoff">space–time tradeoff</a>, enabling fast operations at the cost of more space. This makes all readers proceed as if there were no <a href="/wiki/Synchronization_(computer_science)" title="Synchronization (computer science)">synchronization</a> involved, hence they will be fast, but also making updates more difficult. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Name_and_overview">Name and overview</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=1" title="Edit section: Name and overview"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The name comes from the way that RCU is used to update a linked structure in place. A thread wishing to do this uses the following steps: </p> <ul><li>create a new structure,</li> <li>copy the data from the old structure into the new one, and save a <a href="/wiki/Pointer_(computer_programming)" title="Pointer (computer programming)">pointer</a> to the old structure,</li> <li>modify the new, copied, structure,</li> <li>update the global pointer to refer to the new structure,</li> <li>sleep until the operating system kernel determines that there are no readers left using the old structure, for example, in the Linux kernel, by using <style data-mw-deduplicate="TemplateStyles:r886049734">.mw-parser-output .monospaced{font-family:monospace,monospace}</style><span class="monospaced">synchronize_rcu()</span>,</li> <li>once awakened by the kernel, deallocate the old structure.</li></ul> <p>So the structure is <i>read</i> concurrently with a thread <i>copying</i> in order to do an <i>update</i>, hence the name "read-copy update". The abbreviation "RCU" was one of many contributions by the Linux community. Other names for similar techniques include <i>passive serialization</i> and <i>MP defer</i> by <a href="/wiki/VM_(Operating_system)" class="mw-redirect" title="VM (Operating system)">VM/XA</a> programmers and <i>generations</i> by <a href="/wiki/K42" title="K42">K42</a> and <a rel="nofollow" class="external text" href="https://web.archive.org/web/20140102191807/http://www.eecg.toronto.edu/~tornado/">Tornado</a> programmers. </p> <div class="mw-heading mw-heading2"><h2 id="Detailed_description">Detailed description</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=2" title="Edit section: Detailed description"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <figure class="mw-default-size" typeof="mw:File/Thumb"><a href="/wiki/File:Read-Copy_Update_Insertion_Procedure.svg" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Read-Copy_Update_Insertion_Procedure.svg/440px-Read-Copy_Update_Insertion_Procedure.svg.png" decoding="async" width="440" height="324" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Read-Copy_Update_Insertion_Procedure.svg/660px-Read-Copy_Update_Insertion_Procedure.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Read-Copy_Update_Insertion_Procedure.svg/880px-Read-Copy_Update_Insertion_Procedure.svg.png 2x" data-file-width="610" data-file-height="449" /></a><figcaption>Read-copy-update insertion procedure. A thread allocates a structure with three fields, then sets the global pointer <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">gptr</span> to point to this structure.</figcaption></figure> <p>A key property of RCU is that readers can access a data structure even when it is in the process of being updated: RCU updaters cannot block readers or force them to retry their accesses. This overview starts by showing how data can be safely inserted into and deleted from linked structures despite concurrent readers. The first diagram on the right depicts a four-state insertion procedure, with time advancing from left to right. </p><p>The first state shows a global pointer named <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">gptr</span> that is initially <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">NULL</span>, colored red to indicate that it might be accessed by a reader at any time, thus requiring updaters to take care. Allocating memory for a new structure transitions to the second state. This structure has indeterminate state (indicated by the question marks) but is inaccessible to readers (indicated by the green color). Because the structure is inaccessible to readers, the updater may carry out any desired operation without fear of disrupting concurrent readers. Initializing this new structure transitions to the third state, which shows the initialized values of the structure's fields. Assigning a reference to this new structure to <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">gptr</span> transitions to the fourth and final state. In this state, the structure is accessible to readers, and is therefore colored red. The <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rcu_assign_pointer</span> primitive is used to carry out this assignment and ensures that the assignment is atomic in the sense that concurrent readers will either see a <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">NULL</span> pointer or a valid pointer to the new structure, but not some mash-up of the two values. Additional properties of <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rcu_assign_pointer</span> are described later in this article. </p> <figure class="mw-default-size" typeof="mw:File/Thumb"><a href="/wiki/File:Read-Copy_Update_Deletion_Procedure.svg" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Read-Copy_Update_Deletion_Procedure.svg/440px-Read-Copy_Update_Deletion_Procedure.svg.png" decoding="async" width="440" height="342" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Read-Copy_Update_Deletion_Procedure.svg/660px-Read-Copy_Update_Deletion_Procedure.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Read-Copy_Update_Deletion_Procedure.svg/880px-Read-Copy_Update_Deletion_Procedure.svg.png 2x" data-file-width="329" data-file-height="256" /></a><figcaption>Read-copy-update deletion procedure</figcaption></figure> <p>This procedure demonstrates how new data may be inserted into a linked data structure even though readers are concurrently traversing the data structure before, during, and after the insertion. The second diagram on the right depicts a four-state deletion procedure, again with time advancing from left to right. </p><p>The first state shows a linked list containing elements <span class="texhtml mvar" style="font-style:italic;">A</span>, <span class="texhtml mvar" style="font-style:italic;">B</span>, and <span class="texhtml mvar" style="font-style:italic;">C</span>. All three elements are colored red to indicate that an RCU reader might reference any of them at any time. Using <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">list_del_rcu</span> to remove element <span class="texhtml mvar" style="font-style:italic;">B</span> from this list transitions to the second state. Note that the link from element B to C is left intact in order to allow readers currently referencing element <span class="texhtml mvar" style="font-style:italic;">B</span> to traverse the remainder of the list. Readers accessing the link from element <span class="texhtml mvar" style="font-style:italic;">A</span> will either obtain a reference to element <span class="texhtml mvar" style="font-style:italic;">B</span> or element <span class="texhtml mvar" style="font-style:italic;">C</span>, but either way, each reader will see a valid and correctly formatted linked list. Element <span class="texhtml mvar" style="font-style:italic;">B</span> is now colored yellow to indicate that while pre-existing readers might still have a reference to element <span class="texhtml mvar" style="font-style:italic;">B</span>, new readers have no way to obtain a reference. A wait-for-readers operation transitions to the third state. Note that this wait-for-readers operation need only wait for pre-existing readers, but not new readers. Element <span class="texhtml mvar" style="font-style:italic;">B</span> is now colored green to indicate that readers can no longer be referencing it. Therefore, it is now safe for the updater to free element <span class="texhtml mvar" style="font-style:italic;">B</span>, thus transitioning to the fourth and final state. </p><p>It is important to reiterate that in the second state different readers can see two different versions of the list, either with or without element <span class="texhtml mvar" style="font-style:italic;">B</span>. In other words, RCU provides coordination in space (different versions of the list) as well as in time (different states in the deletion procedures). This is in stark contrast with more traditional synchronization primitives such as <a href="/wiki/Locking_(computer_science)" class="mw-redirect" title="Locking (computer science)">locking</a> or <a href="/wiki/Atomic_transaction" class="mw-redirect" title="Atomic transaction">transactions</a> that coordinate in time, but not in space. </p><p>This procedure demonstrates how old data may be removed from a linked data structure even though readers are concurrently traversing the data structure before, during, and after the deletion. Given insertion and deletion, a wide variety of data structures can be implemented using RCU. </p><p>RCU's readers execute within <i>read-side critical sections</i>, which are normally delimited by <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rcu_read_lock</span> and <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r886049734"><span class="monospaced">rcu_read_unlock</span>. Any statement that is not within an RCU read-side critical section is said to be in a <i>quiescent state</i>, and such statements are not permitted to hold references to RCU-protected data structures, nor is the wait-for-readers operation required to wait for threads in quiescent states. Any time period during which each thread resides at least once in a quiescent state is called a <i>grace period</i>. By definition, any RCU read-side critical section in existence at the beginning of a given grace period must complete before the end of that grace period, which constitutes the fundamental guarantee provided by RCU. In addition, the wait-for-readers operation must wait for at least one grace period to elapse. It turns out that this guarantee can be provided with extremely small read-side overheads, in fact, in the limiting case that is actually realized by server-class Linux-kernel builds, the read-side overhead is exactly zero.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">&#91;</span>2<span class="cite-bracket">&#93;</span></a></sup> </p><p>RCU's fundamental guarantee may be used by splitting updates into <i>removal</i> and <i>reclamation</i> phases. The removal phase removes references to data items within a data structure (possibly by replacing them with references to new versions of these data items) and can run concurrently with RCU read-side critical sections. The reason that it is safe to run the removal phase concurrently with RCU readers is the semantics of modern CPUs guarantee that readers will see either the old or the new version of the data structure rather than a partially updated reference. Once a grace period has elapsed, there can no longer be any readers referencing the old version, so it is then safe for the reclamation phase to free (<i>reclaim</i>) the data items that made up that old version.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">&#91;</span>3<span class="cite-bracket">&#93;</span></a></sup> </p><p>Splitting an update into removal and reclamation phases allows the updater to perform the removal phase immediately, and to defer the reclamation phase until all readers active during the removal phase have completed, in other words, until a grace period has elapsed.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">&#91;</span>note 1<span class="cite-bracket">&#93;</span></a></sup> </p><p>So, the typical RCU update sequence goes something like the following:<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">&#91;</span>4<span class="cite-bracket">&#93;</span></a></sup> </p> <ol><li>Ensure that all readers accessing RCU-protected data structures carry out their references from within an RCU read-side critical section.</li> <li>Remove pointers to a data structure, so that subsequent readers cannot gain a reference to it.</li> <li>Wait for a grace period to elapse, so that all previous readers (which might still have pointers to the data structure removed in the prior step) will have completed their RCU read-side critical sections.</li> <li>At this point, there cannot be any readers still holding references to the data structure, so it now may safely be reclaimed (e.g., freed).<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">&#91;</span>note 2<span class="cite-bracket">&#93;</span></a></sup></li></ol> <p>In the above procedure (which matches the earlier diagram), the updater is performing both the removal and the reclamation step, but it is often helpful for an entirely different thread to do the reclamation. Reference counting can be used to let the reader perform removal so, even if the same thread performs both the update step (step (2) above) and the reclamation step (step (4) above), it is often helpful to think of them separately. </p><p>RCU is perhaps the most common <a href="/wiki/Non-blocking_algorithm" title="Non-blocking algorithm">non-blocking algorithm</a> for a shared data structure. RCU is completely wait-free for any number of readers. Single-writer implementations RCU are also lock-free for the writer.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">&#91;</span>5<span class="cite-bracket">&#93;</span></a></sup> Some multi-writer implementations of RCU are lock-free.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">&#91;</span>6<span class="cite-bracket">&#93;</span></a></sup> Other multi-writer implementations of RCU serialize writers with a lock.<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">&#91;</span>7<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-heading mw-heading2"><h2 id="Uses">Uses</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=3" title="Edit section: Uses"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>By early 2008, there were almost 2,000 uses of the RCU API within the Linux kernel<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">&#91;</span>8<span class="cite-bracket">&#93;</span></a></sup> including the networking protocol stacks<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">&#91;</span>9<span class="cite-bracket">&#93;</span></a></sup> and the memory-management system.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">&#91;</span>10<span class="cite-bracket">&#93;</span></a></sup> As of March&#160;2014<sup class="plainlinks noexcerpt noprint asof-tag update" style="display:none;"><a class="external text" href="https://en.wikipedia.org/w/index.php?title=Read-copy-update&amp;action=edit">&#91;update&#93;</a></sup>, there were more than 9,000 uses.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">&#91;</span>11<span class="cite-bracket">&#93;</span></a></sup> Since 2006, researchers have applied RCU and similar techniques to a number of problems, including management of metadata used in dynamic analysis,<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">&#91;</span>12<span class="cite-bracket">&#93;</span></a></sup> managing the lifetime of clustered objects,<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">&#91;</span>13<span class="cite-bracket">&#93;</span></a></sup> managing object lifetime in the <a href="/wiki/K42" title="K42">K42</a> research operating system,<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">&#91;</span>14<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">&#91;</span>15<span class="cite-bracket">&#93;</span></a></sup> and optimizing <a href="/wiki/Software_transactional_memory" title="Software transactional memory">software transactional memory</a> implementations.<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">&#91;</span>16<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">&#91;</span>17<span class="cite-bracket">&#93;</span></a></sup> <a href="/wiki/Dragonfly_BSD" class="mw-redirect" title="Dragonfly BSD">Dragonfly BSD</a> uses a technique similar to RCU that most closely resembles Linux's Sleepable RCU (SRCU) implementation. </p> <div class="mw-heading mw-heading2"><h2 id="Advantages_and_disadvantages">Advantages and disadvantages</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=4" title="Edit section: Advantages and disadvantages"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The ability to wait until all readers are done allows RCU readers to use much lighter-weight synchronization&#8212;in some cases, absolutely no synchronization at all. In contrast, in more conventional lock-based schemes, readers must use heavy-weight synchronization in order to prevent an updater from deleting the data structure out from under them. The reason is that lock-based updaters typically update data in place and must therefore exclude readers. In contrast, RCU-based updaters typically take advantage of the fact that writes to single aligned pointers are atomic on modern CPUs, allowing atomic insertion, removal, and replacement of data in a linked structure without disrupting readers. Concurrent RCU readers can then continue accessing the old versions and can dispense with the atomic read-modify-write instructions, memory barriers, and cache misses that are so expensive on modern <a href="/wiki/Symmetric_multiprocessing" title="Symmetric multiprocessing">SMP</a> computer systems, even in absence of lock contention.<sup id="cite_ref-20" class="reference"><a href="#cite_note-20"><span class="cite-bracket">&#91;</span>18<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-21" class="reference"><a href="#cite_note-21"><span class="cite-bracket">&#91;</span>19<span class="cite-bracket">&#93;</span></a></sup> The lightweight nature of RCU's read-side primitives provides additional advantages beyond excellent performance, scalability, and real-time response. For example, they provide immunity to most <a href="/wiki/Deadlock_(computer_science)" title="Deadlock (computer science)">deadlock</a> and <a href="/wiki/Livelock" class="mw-redirect" title="Livelock">livelock</a> conditions.<sup id="cite_ref-22" class="reference"><a href="#cite_note-22"><span class="cite-bracket">&#91;</span>note 3<span class="cite-bracket">&#93;</span></a></sup> </p><p>Of course, RCU also has disadvantages. For example, RCU is a specialized technique that works best in situations with mostly reads and few updates but is often less applicable to update-only workloads. For another example, although the fact that RCU readers and updaters may execute concurrently is what enables the lightweight nature of RCU's read-side primitives, some algorithms may not be amenable to read/update concurrency. </p><p>Despite well over a decade of experience with RCU, the exact extent of its applicability is still a research topic. </p> <div class="mw-heading mw-heading2"><h2 id="Patents">Patents</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=5" title="Edit section: Patents"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The technique is covered by <a href="/wiki/United_States_Patent_and_Trademark_Office" title="United States Patent and Trademark Office">U.S.</a> <a href="/wiki/Software_patent" title="Software patent">software patent</a> <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US5442758">U.S. patent 5,442,758</a></span>, issued August 15, 1995, and assigned to <a href="/wiki/Sequent_Computer_Systems" title="Sequent Computer Systems">Sequent Computer Systems</a>, as well as by <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US5608893">U.S. patent 5,608,893</a></span> (expired 2009-03-30), <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US5727209">U.S. patent 5,727,209</a></span> (expired 2010-04-05), <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US6219690">U.S. patent 6,219,690</a></span> (expired 2009-05-18), and <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US6886162">U.S. patent 6,886,162</a></span> (expired 2009-05-25). The now-expired US Patent <span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US4809168">U.S. patent 4,809,168</a></span> covers a closely related technique. RCU is also the topic of one claim in the <a href="/wiki/SCO_v._IBM#Increased_damages_claims,_and_read-copy-update_claims" class="mw-redirect" title="SCO v. IBM">SCO v. IBM</a> <a href="/wiki/Lawsuit" title="Lawsuit">lawsuit</a>. </p> <div class="mw-heading mw-heading2"><h2 id="Sample_RCU_interface">Sample RCU interface</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=6" title="Edit section: Sample RCU interface"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>RCU is available in a number of operating systems and was added to the <a href="/wiki/Linux_kernel" title="Linux kernel">Linux kernel</a> in October 2002. User-level implementations such as <a rel="nofollow" class="external text" href="http://lttng.org/urcu">liburcu</a> are also available.<sup id="cite_ref-23" class="reference"><a href="#cite_note-23"><span class="cite-bracket">&#91;</span>20<span class="cite-bracket">&#93;</span></a></sup> </p><p>The implementation of RCU in version 2.6 of the Linux kernel is among the better-known RCU implementations and will be used as an inspiration for the RCU API in the remainder of this article. The core API (<a href="/wiki/Application_Programming_Interface" class="mw-redirect" title="Application Programming Interface">Application Programming Interface</a>) is quite small:<sup id="cite_ref-24" class="reference"><a href="#cite_note-24"><span class="cite-bracket">&#91;</span>21<span class="cite-bracket">&#93;</span></a></sup> </p> <ul><li>rcu_read_lock(): Marks an RCU-protected data structure so that it won't be reclaimed for the full duration of that critical section.</li> <li>rcu_read_unlock(): Used by a reader to inform the reclaimer that the reader is exiting an RCU read-side critical section. Note that RCU read-side critical sections may be nested and/or overlapping.</li> <li>synchronize_rcu(): Blocks until all pre-existing RCU read-side critical sections on all CPUs have completed. Note that <code>synchronize_rcu</code> will <i>not</i> necessarily wait for any subsequent RCU read-side critical sections to complete. For example, consider the following sequence of events:</li></ul> <pre> CPU 0 CPU 1 CPU 2 ----------------- ------------------------- --------------- 1. rcu_read_lock() 2. enters synchronize_rcu() 3. rcu_read_lock() 4. rcu_read_unlock() 5. exits synchronize_rcu() 6. rcu_read_unlock() </pre> <dl><dd>Since <code>synchronize_rcu</code> is the API that must figure out when readers are done, its implementation is key to RCU. For RCU to be useful in all but the most read-intensive situations, <code>synchronize_rcu</code>'s overhead must also be quite small.</dd></dl> <dl><dd>Alternatively, instead of blocking, synchronize_rcu may register a callback to be invoked after all ongoing RCU read-side critical sections have completed. This callback variant is called <code>call_rcu</code> in the Linux kernel.</dd></dl> <ul><li>rcu_assign_pointer(): The updater uses this function to assign a new value to an RCU-protected pointer, in order to safely communicate the change in value from the updater to the reader. This function returns the new value, and also executes any <a href="/wiki/Memory_barrier" title="Memory barrier">memory barrier</a> instructions required for a given CPU architecture. Perhaps more importantly, it serves to document which pointers are protected by RCU.</li> <li>rcu_dereference(): The reader uses <code>rcu_dereference</code> to fetch an RCU-protected pointer, which returns a value that may then be safely dereferenced. It also executes any directives required by the compiler or the CPU, for example, a volatile cast for gcc, a memory_order_consume load for C/C++11 or the memory-barrier instruction required by the old DEC Alpha CPU. The value returned by <code>rcu_dereference</code> is valid only within the enclosing RCU read-side critical section. As with <code>rcu_assign_pointer</code>, an important function of <code>rcu_dereference</code> is to document which pointers are protected by RCU.</li></ul> <figure class="mw-default-size" typeof="mw:File/Thumb"><a href="/wiki/File:Rcu_api.jpg" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Rcu_api.jpg/440px-Rcu_api.jpg" decoding="async" width="440" height="181" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Rcu_api.jpg/660px-Rcu_api.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Rcu_api.jpg/880px-Rcu_api.jpg 2x" data-file-width="972" data-file-height="400" /></a><figcaption>RCU API communications between the reader, updater, and reclaimer</figcaption></figure> <p>The diagram on the right shows how each API communicates among the reader, updater, and reclaimer. </p><p>The RCU infrastructure observes the time sequence of <code>rcu_read_lock</code>, <code>rcu_read_unlock</code>, <code>synchronize_rcu</code>, and <code>call_rcu</code> invocations in order to determine when (1) <code>synchronize_rcu</code> invocations may return to their callers and (2) <code>call_rcu</code> callbacks may be invoked. Efficient implementations of the RCU infrastructure make heavy use of batching in order to amortize their overhead over many uses of the corresponding APIs. </p> <div class="mw-heading mw-heading2"><h2 id="Simple_implementation">Simple implementation</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=7" title="Edit section: Simple implementation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>RCU has extremely simple "toy" implementations that can aid understanding of RCU. This section presents one such "toy" implementation that works in a <a href="/wiki/Cooperative_multitasking" title="Cooperative multitasking">non-preemptive environment</a>.<sup id="cite_ref-25" class="reference"><a href="#cite_note-25"><span class="cite-bracket">&#91;</span>22<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">rcu_read_lock</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span> <span class="kt">void</span><span class="w"> </span><span class="nf">rcu_read_unlock</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span> <span class="kt">void</span><span class="w"> </span><span class="nf">call_rcu</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">callback</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">),</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">)</span> <span class="p">{</span> <span class="w"> </span><span class="c1">// add callback/arg pair to a list</span> <span class="p">}</span> <span class="kt">void</span><span class="w"> </span><span class="nf">synchronize_rcu</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">cpu</span><span class="p">,</span><span class="w"> </span><span class="n">ncpus</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">each_cpu</span><span class="p">(</span><span class="n">cpu</span><span class="p">)</span> <span class="w"> </span><span class="n">schedule_current_task_to</span><span class="p">(</span><span class="n">cpu</span><span class="p">);</span> <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">each</span><span class="w"> </span><span class="n">entry</span><span class="w"> </span><span class="n">in</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">call_rcu</span><span class="w"> </span><span class="n">list</span> <span class="w"> </span><span class="n">entry</span><span class="o">-&gt;</span><span class="n">callback</span><span class="w"> </span><span class="p">(</span><span class="n">entry</span><span class="o">-&gt;</span><span class="n">arg</span><span class="p">);</span> <span class="p">}</span> </pre></div> <p>In the code sample, <code>rcu_assign_pointer</code> and <code>rcu_dereference</code> can be ignored without missing much. However, they are needed in order to suppress harmful compiler optimization and to prevent CPUs from reordering accesses. </p> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#define rcu_assign_pointer(p, v) ({ \</span> <span class="cp"> smp_wmb(); </span><span class="cm">/* Order previous writes. */</span><span class="cp"> \</span> <span class="cp"> ACCESS_ONCE(p) = (v); \</span> <span class="cp">})</span> <span class="cp">#define rcu_dereference(p) ({ \</span> <span class="cp"> typeof(p) _value = ACCESS_ONCE(p); \</span> <span class="cp"> smp_read_barrier_depends(); </span><span class="cm">/* nop on most architectures */</span><span class="cp"> \</span> <span class="cp"> (_value); \</span> <span class="cp">})</span> </pre></div> <p>Note that <code>rcu_read_lock</code> and <code>rcu_read_unlock</code> do nothing. This is the great strength of classic RCU in a non-preemptive kernel: read-side overhead is precisely zero, as <code>smp_read_barrier_depends()</code> is an empty macro on all but <a href="/wiki/DEC_Alpha" title="DEC Alpha">DEC Alpha</a> CPUs;<sup id="cite_ref-26" class="reference"><a href="#cite_note-26"><span class="cite-bracket">&#91;</span>23<span class="cite-bracket">&#93;</span></a></sup><sup class="noprint Inline-Template" style="white-space:nowrap;">&#91;<i><a href="/wiki/Wikipedia:Verifiability" title="Wikipedia:Verifiability"><span title="The source does not discuss the Linux smp_read_barrier_depends operation, and certainly doesn&#39;t comment on any other type of CPU. (November 2015)">failed verification</span></a></i>&#93;</sup> such memory barriers are not needed on modern CPUs. The <code>ACCESS_ONCE()</code> macro is a volatile cast that generates no additional code in most cases. And there is no way that <code>rcu_read_lock</code> can participate in a <a href="/wiki/Deadlock_(computer_science)" title="Deadlock (computer science)">deadlock</a> cycle, cause a realtime process to miss its scheduling deadline, precipitate <a href="/wiki/Priority_inversion" title="Priority inversion">priority inversion</a>, or result in high <a href="/wiki/Lock_(computer_science)" title="Lock (computer science)">lock contention</a>. However, in this toy RCU implementation, blocking within an RCU read-side critical section is illegal, just as is blocking while holding a pure spinlock. </p><p>The implementation of <code>synchronize_rcu</code> moves the caller of synchronize_cpu to each CPU, thus blocking until all CPUs have been able to perform the context switch. Recall that this is a non-preemptive environment and that blocking within an RCU read-side critical section is illegal, which imply that there can be no preemption points within an RCU read-side critical section. Therefore, if a given CPU executes a context switch (to schedule another process), we know that this CPU must have completed all preceding RCU read-side critical sections. Once all CPUs have executed a context switch, then all preceding RCU read-side critical sections will have completed. </p> <div class="mw-heading mw-heading2"><h2 id="Analogy_with_reader–writer_locking"><span id="Analogy_with_reader.E2.80.93writer_locking"></span>Analogy with reader–writer locking</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=8" title="Edit section: Analogy with reader–writer locking"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Although RCU can be used in many different ways, a very common use of RCU is analogous to reader–writer locking. The following side-by-side code display shows how closely related reader–writer locking and RCU can be.<sup id="cite_ref-27" class="reference"><a href="#cite_note-27"><span class="cite-bracket">&#91;</span>24<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="cm">/* reader-writer locking */</span><span class="w"> </span><span class="cm">/* RCU */</span> <span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">list_head</span><span class="w"> </span><span class="n">lp</span><span class="p">;</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">list_head</span><span class="w"> </span><span class="n">lp</span><span class="p">;</span> <span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">;</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">;</span> <span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="n">spinlock_t</span><span class="w"> </span><span class="n">mutex</span><span class="p">;</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="n">spinlock_t</span><span class="w"> </span><span class="n">mutex</span><span class="p">;</span> <span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data</span><span class="p">;</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data</span><span class="p">;</span> <span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="cm">/* Other data fields */</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="cm">/* Other data fields */</span> <span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">};</span> <span class="hll"><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">DEFINE_RWLOCK</span><span class="p">(</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">DEFINE_SPINLOCK</span><span class="p">(</span><span class="n">listmutex</span><span class="p">);</span> </span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">LIST_HEAD</span><span class="p">(</span><span class="n">head</span><span class="p">);</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">LIST_HEAD</span><span class="p">(</span><span class="n">head</span><span class="p">);</span> <span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">search</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">result</span><span class="p">)</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">search</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">result</span><span class="p">)</span> <span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span> <span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mi">4</span> <span class="hll"><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">read_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">rcu_read_lock</span><span class="p">();</span> </span><span class="hll"><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="n">list_for_each_entry</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="w"> </span><span class="n">lp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="n">list_for_each_entry_rcu</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="w"> </span><span class="n">lp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> </span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="o">*</span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="o">*</span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span> <span class="hll"><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">read_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">rcu_read_unlock</span><span class="p">();</span> </span><span class="mi">10</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span> <span class="mi">11</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">11</span><span class="w"> </span><span class="p">}</span> <span class="mi">12</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">12</span><span class="w"> </span><span class="p">}</span> <span class="hll"><span class="mi">13</span><span class="w"> </span><span class="n">read_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">13</span><span class="w"> </span><span class="n">rcu_read_unlock</span><span class="p">();</span> </span><span class="mi">14</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="mi">14</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="mi">15</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">delete</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">delete</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">key</span><span class="p">)</span> <span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">el</span><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="p">;</span> <span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="mi">4</span> <span class="hll"><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">write_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">spin_lock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span> </span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="n">list_for_each_entry</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="w"> </span><span class="n">lp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="n">list_for_each_entry</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">head</span><span class="p">,</span><span class="w"> </span><span class="n">lp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="hll"><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">list_del</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">lp</span><span class="p">);</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">list_del_rcu</span><span class="p">(</span><span class="o">&amp;</span><span class="n">p</span><span class="o">-&gt;</span><span class="n">lp</span><span class="p">);</span> </span><span class="hll"><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">write_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="n">spin_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span> </span><span class="hll"><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="n">synchronize_rcu</span><span class="p">();</span> </span><span class="mi">10</span><span class="w"> </span><span class="n">kfree</span><span class="p">(</span><span class="n">p</span><span class="p">);</span><span class="w"> </span><span class="mi">11</span><span class="w"> </span><span class="n">kfree</span><span class="p">(</span><span class="n">p</span><span class="p">);</span> <span class="mi">11</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="mi">12</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span> <span class="mi">12</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">13</span><span class="w"> </span><span class="p">}</span> <span class="mi">13</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">14</span><span class="w"> </span><span class="p">}</span> <span class="hll"><span class="mi">14</span><span class="w"> </span><span class="n">write_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="n">spin_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">listmutex</span><span class="p">);</span> </span><span class="mi">15</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="mi">16</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="mi">16</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="mi">17</span><span class="w"> </span><span class="p">}</span> </pre></div> <p>The differences between the two approaches are quite small. Read-side locking moves to <code>rcu_read_lock</code> and <code>rcu_read_unlock</code>, update-side locking moves from a reader-writer lock to a simple spinlock, and a <code>synchronize_rcu</code> precedes the <code>kfree</code>. </p><p>However, there is one potential catch: the read-side and update-side critical sections can now run concurrently. In many cases, this will not be a problem, but it is necessary to check carefully regardless. For example, if multiple independent list updates must be seen as a single atomic update, converting to RCU will require special care. </p><p>Also, the presence of <code>synchronize_rcu</code> means that the RCU version of <code>delete</code> can now block. If this is a problem, <code>call_rcu</code> could be used like <code>call_rcu (kfree, p)</code> in place of <code>synchronize_rcu</code>. This is especially useful in combination with reference counting. </p> <div class="mw-heading mw-heading2"><h2 id="History">History</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=9" title="Edit section: History"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1251242444">.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}</style><table class="box-Prose plainlinks metadata ambox ambox-style ambox-Prose" role="presentation"><tbody><tr><td class="mbox-image"><div class="mbox-image-div"><span typeof="mw:File"><span><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/f/f2/Edit-clear.svg/40px-Edit-clear.svg.png" decoding="async" width="40" height="40" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/en/thumb/f/f2/Edit-clear.svg/60px-Edit-clear.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/f/f2/Edit-clear.svg/80px-Edit-clear.svg.png 2x" data-file-width="48" data-file-height="48" /></span></span></div></td><td class="mbox-text"><div class="mbox-text-span">This section <b>is in <a href="/wiki/MOS:LIST" class="mw-redirect" title="MOS:LIST">list</a> format but may read better as <a href="/wiki/MOS:PROSE" class="mw-redirect" title="MOS:PROSE">prose</a></b>.<span class="hide-when-compact"> You can help by <a class="external text" href="https://en.wikipedia.org/w/index.php?title=Read-copy-update&amp;action=edit">converting this section</a>, if appropriate. <a href="/wiki/Help:Editing" title="Help:Editing">Editing help</a> is available.</span> <span class="date-container"><i>(<span class="date">May 2014</span>)</i></span></div></td></tr></tbody></table> <p>Techniques and mechanisms resembling RCU have been independently invented multiple times:<sup id="cite_ref-28" class="reference"><a href="#cite_note-28"><span class="cite-bracket">&#91;</span>25<span class="cite-bracket">&#93;</span></a></sup> </p> <ol><li><a href="/wiki/H._T._Kung" title="H. T. Kung">H. T. Kung</a> and Q. Lehman described use of garbage collectors to implement RCU-like access to a binary search tree.<sup id="cite_ref-29" class="reference"><a href="#cite_note-29"><span class="cite-bracket">&#91;</span>26<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/Udi_Manber" title="Udi Manber">Udi Manber</a> and Richard Ladner extended Kung's and Lehman's work to non-garbage-collected environments by deferring reclamation until all threads running at removal time have terminated, which works in environments that do not have long-lived threads.<sup id="cite_ref-30" class="reference"><a href="#cite_note-30"><span class="cite-bracket">&#91;</span>27<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/Richard_Rashid" title="Richard Rashid">Richard Rashid</a> et al. described a lazy <a href="/wiki/Translation_lookaside_buffer" title="Translation lookaside buffer">translation lookaside buffer</a> (TLB) implementation that deferred reclaiming virtual-address space until all CPUs flushed their TLB, which is similar in spirit to some RCU implementations.<sup id="cite_ref-31" class="reference"><a href="#cite_note-31"><span class="cite-bracket">&#91;</span>28<span class="cite-bracket">&#93;</span></a></sup></li> <li>James P. Hennessy, Damian L. Osisek, and Joseph W. Seigh, II were granted US Patent 4,809,168 in 1989 (since lapsed). This patent describes an RCU-like mechanism that was apparently used in <a href="/wiki/VM_(Operating_system)" class="mw-redirect" title="VM (Operating system)">VM/XA</a> on <a href="/wiki/IBM_mainframe" title="IBM mainframe">IBM mainframes</a>.<sup id="cite_ref-32" class="reference"><a href="#cite_note-32"><span class="cite-bracket">&#91;</span>29<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/William_Pugh_(computer_scientist)" title="William Pugh (computer scientist)">William Pugh</a> described an RCU-like mechanism that relied on explicit flag-setting by readers.<sup id="cite_ref-33" class="reference"><a href="#cite_note-33"><span class="cite-bracket">&#91;</span>30<span class="cite-bracket">&#93;</span></a></sup></li> <li>Aju John proposed an RCU-like implementation where updaters simply wait for a fixed period of time, under the assumption that readers would all complete within that fixed time, as might be appropriate in a hard real-time system.<sup id="cite_ref-34" class="reference"><a href="#cite_note-34"><span class="cite-bracket">&#91;</span>31<span class="cite-bracket">&#93;</span></a></sup> <a href="/wiki/Van_Jacobson" title="Van Jacobson">Van Jacobson</a> proposed a similar scheme in 1993 (verbal communication).</li> <li>J. Slingwine and P. E. McKenney received US Patent 5,442,758 in August 1995, which describes RCU as implemented in <a href="/wiki/DYNIX/ptx" class="mw-redirect" title="DYNIX/ptx">DYNIX/ptx</a> and later in the Linux kernel.<sup id="cite_ref-35" class="reference"><a href="#cite_note-35"><span class="cite-bracket">&#91;</span>32<span class="cite-bracket">&#93;</span></a></sup></li> <li>B. Gamsa, O. Krieger, J. Appavoo, and M. Stumm described an RCU-like mechanism used in the <a href="/wiki/University_of_Toronto" title="University of Toronto">University of Toronto</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20061010230626/http://www.eecg.toronto.edu/~tornado/">Tornado research operating system</a> and the closely related <a href="/wiki/IBM_Research" title="IBM Research">IBM Research</a> <a href="/wiki/K42" title="K42">K42</a> research operating systems.<sup id="cite_ref-36" class="reference"><a href="#cite_note-36"><span class="cite-bracket">&#91;</span>33<span class="cite-bracket">&#93;</span></a></sup></li> <li><a href="/wiki/Rusty_Russell" title="Rusty Russell">Rusty Russell</a> and Phil Rumpf described RCU-like techniques for handling unloading of Linux kernel modules.<sup id="cite_ref-37" class="reference"><a href="#cite_note-37"><span class="cite-bracket">&#91;</span>34<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-38" class="reference"><a href="#cite_note-38"><span class="cite-bracket">&#91;</span>35<span class="cite-bracket">&#93;</span></a></sup></li> <li>D. Sarma added RCU to <a rel="nofollow" class="external text" href="https://www.kernel.org/pub/linux/kernel/v2.5/ChangeLog-2.5.43">version 2.5.43 of the Linux kernel</a> in October 2002.</li> <li>Robert Colvin et al. formally verified a lazy concurrent list-based set algorithm that resembles RCU.<sup id="cite_ref-39" class="reference"><a href="#cite_note-39"><span class="cite-bracket">&#91;</span>36<span class="cite-bracket">&#93;</span></a></sup></li> <li>M. Desnoyers et al. published a description of user-space RCU.<sup id="cite_ref-40" class="reference"><a href="#cite_note-40"><span class="cite-bracket">&#91;</span>37<span class="cite-bracket">&#93;</span></a></sup><sup id="cite_ref-41" class="reference"><a href="#cite_note-41"><span class="cite-bracket">&#91;</span>38<span class="cite-bracket">&#93;</span></a></sup></li> <li>A. Gotsman et al. derived formal semantics for RCU based on separation logic.<sup id="cite_ref-42" class="reference"><a href="#cite_note-42"><span class="cite-bracket">&#91;</span>39<span class="cite-bracket">&#93;</span></a></sup></li> <li>Ilan Frenkel, Roman Geller, Yoram Ramberg, and Yoram Snir were granted US Patent 7,099,932 in 2006. This patent describes an RCU-like mechanism for retrieving and storing quality of service policy management information using a directory service in a manner that enforces read/write consistency and enables read/write concurrency.<sup id="cite_ref-patent7099932_43-0" class="reference"><a href="#cite_note-patent7099932-43"><span class="cite-bracket">&#91;</span>40<span class="cite-bracket">&#93;</span></a></sup></li></ol> <div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=10" title="Edit section: See also"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a href="/wiki/Concurrency_control" title="Concurrency control">Concurrency control</a></li> <li><a href="/wiki/Copy-on-write" title="Copy-on-write">Copy-on-write</a></li> <li><a href="/wiki/Lock_(computer_science)" title="Lock (computer science)">Lock (computer science)</a></li> <li><a href="/wiki/Lock-free_and_wait-free_algorithms" class="mw-redirect" title="Lock-free and wait-free algorithms">Lock-free and wait-free algorithms</a></li> <li><a href="/wiki/Multiversion_concurrency_control" title="Multiversion concurrency control">Multiversion concurrency control</a></li> <li><a href="/wiki/Pre-emptive_multitasking" class="mw-redirect" title="Pre-emptive multitasking">Pre-emptive multitasking</a></li> <li><a href="/wiki/Real-time_computing" title="Real-time computing">Real-time computing</a></li> <li><a href="/wiki/Resource_contention" title="Resource contention">Resource contention</a></li> <li><a href="/wiki/Resource_starvation" class="mw-redirect" title="Resource starvation">Resource starvation</a></li> <li><a href="/wiki/Synchronization" title="Synchronization">Synchronization</a></li></ul> <div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=11" title="Edit section: Notes"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1239543626">.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}</style><div class="reflist"> <div class="mw-references-wrap"><ol class="references"> <li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text">Only readers that are active during the removal phase need be considered, because any reader starting after the removal phase will be unable to gain a reference to the removed data items, and therefore cannot be disrupted by the reclamation phase.</span> </li> <li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><a href="/wiki/Garbage_collection_(computer_science)" title="Garbage collection (computer science)">Garbage collectors</a>, where available, may be used to perform this step.</span> </li> <li id="cite_note-22"><span class="mw-cite-backlink"><b><a href="#cite_ref-22">^</a></b></span> <span class="reference-text">RCU-based deadlocks are still possible, for example by executing a statement that blocks until a grace period completes within an RCU read-side critical section.</span> </li> </ol></div></div> <div class="mw-heading mw-heading2"><h2 id="References">References</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=12" title="Edit section: References"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1239543626"><div class="reflist reflist-columns references-column-width" style="column-width: 30em;"> <ol class="references"> <li id="cite_note-:0-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-:0_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-:0_1-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}</style><cite id="CITEREFTanenbaum2015" class="citation book cs1">Tanenbaum, Andrew (2015). <i>Modern Operating Systems</i> (4th&#160;ed.). USA: Pearson. p.&#160;148. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/9781292061429" title="Special:BookSources/9781292061429"><bdi>9781292061429</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Modern+Operating+Systems&amp;rft.place=USA&amp;rft.pages=148&amp;rft.edition=4th&amp;rft.pub=Pearson&amp;rft.date=2015&amp;rft.isbn=9781292061429&amp;rft.aulast=Tanenbaum&amp;rft.aufirst=Andrew&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFGuniguntalaMcKenneyTriplettWalpole2008" class="citation journal cs1">Guniguntala, Dinakar; McKenney, Paul E.; Triplett, Joshua; Walpole, Jonathan (April–June 2008). "The read-copy-update mechanism for supporting real-time applications on shared-memory multiprocessor systems with Linux". <i>IBM Systems Journal</i>. <b>47</b> (2): 221–236. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1147%2Fsj.472.0221">10.1147/sj.472.0221</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=IBM+Systems+Journal&amp;rft.atitle=The+read-copy-update+mechanism+for+supporting+real-time+applications+on+shared-memory+multiprocessor+systems+with+Linux&amp;rft.volume=47&amp;rft.issue=2&amp;rft.pages=221-236&amp;rft.date=2008-04%2F2008-06&amp;rft_id=info%3Adoi%2F10.1147%2Fsj.472.0221&amp;rft.aulast=Guniguntala&amp;rft.aufirst=Dinakar&amp;rft.au=McKenney%2C+Paul+E.&amp;rft.au=Triplett%2C+Joshua&amp;rft.au=Walpole%2C+Jonathan&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenneyWalpole2007" class="citation web cs1">McKenney, Paul E.; Walpole, Jonathan (December 17, 2007). <a rel="nofollow" class="external text" href="https://lwn.net/Articles/262464/">"What is RCU, Fundamentally?"</a>. <a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a><span class="reference-accessdate">. Retrieved <span class="nowrap">September 24,</span> 2010</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=What+is+RCU%2C+Fundamentally%3F&amp;rft.pub=Linux+Weekly+News&amp;rft.date=2007-12-17&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft.au=Walpole%2C+Jonathan&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F262464%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenneySlingwine1998" class="citation conference cs1">McKenney, Paul E.; Slingwine, John D. (October 1998). <a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/rclockpdcsproof.pdf"><i>Read-Copy Update: Using Execution History to Solve Concurrency Problems</i></a> <span class="cs1-format">(PDF)</span>. <i><a rel="nofollow" class="external text" href="http://www.iasted.org/conferences/pastconferences.aspx?year=1998">Parallel and Distributed Computing and Systems</a></i>. pp.&#160;509–518.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=%5Bhttp%3A%2F%2Fwww.iasted.org%2Fconferences%2Fpastconferences.aspx%3Fyear%3D1998+Parallel+and+Distributed+Computing+and+Systems%5D&amp;rft.atitle=Read-Copy+Update%3A+Using+Execution+History+to+Solve+Concurrency+Problems&amp;rft.pages=509-518&amp;rft.date=1998-10&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft.au=Slingwine%2C+John+D.&amp;rft_id=http%3A%2F%2Fwww.rdrop.com%2Fusers%2Fpaulmck%2FRCU%2Frclockpdcsproof.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span> <span class="cs1-visible-error citation-comment"><code class="cs1-code">{{<a href="/wiki/Template:Cite_conference" title="Template:Cite conference">cite conference</a>}}</code>: </span><span class="cs1-visible-error citation-comment">External link in <code class="cs1-code"><code class="cs1-code">&#124;journal=</code></code> (<a href="/wiki/Help:CS1_errors#param_has_ext_link" title="Help:CS1 errors">help</a>)</span></span> </li> <li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"> Naama Ben-David; Guy E. Blelloch; Yihan Sun; Yuanhao Wei. <a rel="nofollow" class="external text" href="https://www.researchgate.net/publication/324005771_Efficient_Single_Writer_Concurrency">"Efficient Single Writer Concurrency"</a>.</span> </li> <li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"> <a rel="nofollow" class="external text" href="https://www.internalpointers.com/post/lock-free-multithreading-atomic-operations">"Lock-free multithreading with atomic operations"</a>.</span> </li> <li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"> Eddie Kohler. <a rel="nofollow" class="external text" href="https://read.seas.harvard.edu/~kohler/class/cs261-f11/rcu.html">"Notes on Read-Copy Update"</a>. quote: "To manage write–write conflicts, most RCU data structures use regular locking."</span> </li> <li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenneyWalpole2008" class="citation journal cs1">McKenney, Paul E.; Walpole, Jonathan (July 2008). "Introducing technology into the Linux kernel: a case study". <i>SIGOPS Oper. Syst. Rev</i>. <b>42</b> (5): 4–17. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1400097.1400099">10.1145/1400097.1400099</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:12748421">12748421</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=SIGOPS+Oper.+Syst.+Rev.&amp;rft.atitle=Introducing+technology+into+the+Linux+kernel%3A+a+case+study&amp;rft.volume=42&amp;rft.issue=5&amp;rft.pages=4-17&amp;rft.date=2008-07&amp;rft_id=info%3Adoi%2F10.1145%2F1400097.1400099&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A12748421%23id-name%3DS2CID&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft.au=Walpole%2C+Jonathan&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFOlssonNilsson2007" class="citation book cs1">Olsson, Robert; Nilsson, Stefan (May 2007). "TRASH a dynamic LC-trie and hash data structure". <i>2007 Workshop on High Performance Switching and Routing</i>. pp.&#160;1–6. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FHPSR.2007.4281239">10.1109/HPSR.2007.4281239</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-4244-1205-1" title="Special:BookSources/978-1-4244-1205-1"><bdi>978-1-4244-1205-1</bdi></a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:17493674">17493674</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.atitle=TRASH+a+dynamic+LC-trie+and+hash+data+structure&amp;rft.btitle=2007+Workshop+on+High+Performance+Switching+and+Routing&amp;rft.pages=1-6&amp;rft.date=2007-05&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A17493674%23id-name%3DS2CID&amp;rft_id=info%3Adoi%2F10.1109%2FHPSR.2007.4281239&amp;rft.isbn=978-1-4244-1205-1&amp;rft.aulast=Olsson&amp;rft.aufirst=Robert&amp;rft.au=Nilsson%2C+Stefan&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFPiggin2006" class="citation conference cs1">Piggin, Nick (July 2006). <a rel="nofollow" class="external text" href="http://www.linuxsymposium.org/2006/view_abstract.php?content_key=184"><i>A Lockless Pagecache in Linux---Introduction, Progress, Performance</i></a>. <i>Ottawa Linux Symposium</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=Ottawa+Linux+Symposium&amp;rft.atitle=A+Lockless+Pagecache+in+Linux---Introduction%2C+Progress%2C+Performance&amp;rft.date=2006-07&amp;rft.aulast=Piggin&amp;rft.aufirst=Nick&amp;rft_id=http%3A%2F%2Fwww.linuxsymposium.org%2F2006%2Fview_abstract.php%3Fcontent_key%3D184&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/linuxusage.html">"Paul E. McKenney: RCU Linux Usage"</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Paul+E.+McKenney%3A+RCU+Linux+Usage&amp;rft_id=http%3A%2F%2Fwww.rdrop.com%2Fusers%2Fpaulmck%2FRCU%2Flinuxusage.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFKannan2009" class="citation book cs1">Kannan, Hari (2009). "Ordering decoupled metadata accesses in multiprocessors". <i>Proceedings of the 42nd Annual IEEE/ACM International Symposium on Microarchitecture - Micro-42</i>. pp.&#160;381–390. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1669112.1669161">10.1145/1669112.1669161</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-60558-798-1" title="Special:BookSources/978-1-60558-798-1"><bdi>978-1-60558-798-1</bdi></a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:2465311">2465311</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.atitle=Ordering+decoupled+metadata+accesses+in+multiprocessors&amp;rft.btitle=Proceedings+of+the+42nd+Annual+IEEE%2FACM+International+Symposium+on+Microarchitecture+-+Micro-42&amp;rft.pages=381-390&amp;rft.date=2009&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A2465311%23id-name%3DS2CID&amp;rft_id=info%3Adoi%2F10.1145%2F1669112.1669161&amp;rft.isbn=978-1-60558-798-1&amp;rft.aulast=Kannan&amp;rft.aufirst=Hari&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMatthewsCoadyAppavoo2009" class="citation conference cs1">Matthews, Chris; Coady, Yvonne; Appavoo, Jonathan (2009). <i>Portability events: a programming model for scalable system infrastructures</i>. <i>PLOS '06: Proceedings of the 3rd Workshop on Programming Languages and Operating Systems</i>. San Jose, CA, USA. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1215995.1216006">10.1145/1215995.1216006</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-59593-577-9" title="Special:BookSources/978-1-59593-577-9"><bdi>978-1-59593-577-9</bdi></a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=PLOS+%2706%3A+Proceedings+of+the+3rd+Workshop+on+Programming+Languages+and+Operating+Systems&amp;rft.atitle=Portability+events%3A+a+programming+model+for+scalable+system+infrastructures&amp;rft.date=2009&amp;rft_id=info%3Adoi%2F10.1145%2F1215995.1216006&amp;rft.isbn=978-1-59593-577-9&amp;rft.aulast=Matthews&amp;rft.aufirst=Chris&amp;rft.au=Coady%2C+Yvonne&amp;rft.au=Appavoo%2C+Jonathan&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFDa_SilvaKriegerWisniewskiWaterland2006" class="citation journal cs1"><a href="/wiki/Dilma_Da_Silva" title="Dilma Da Silva">Da Silva, Dilma</a>; Krieger, Orran; Wisniewski, Robert W.; Waterland, Amos; Tam, David; Baumann, Andrew (April 2006). "K42: an infrastructure for operating system research". <i>SIGOPS Oper. Syst. Rev</i>. <b>40</b> (2): 34–42. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1131322.1131333">10.1145/1131322.1131333</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:669053">669053</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=SIGOPS+Oper.+Syst.+Rev.&amp;rft.atitle=K42%3A+an+infrastructure+for+operating+system+research&amp;rft.volume=40&amp;rft.issue=2&amp;rft.pages=34-42&amp;rft.date=2006-04&amp;rft_id=info%3Adoi%2F10.1145%2F1131322.1131333&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A669053%23id-name%3DS2CID&amp;rft.aulast=Da+Silva&amp;rft.aufirst=Dilma&amp;rft.au=Krieger%2C+Orran&amp;rft.au=Wisniewski%2C+Robert+W.&amp;rft.au=Waterland%2C+Amos&amp;rft.au=Tam%2C+David&amp;rft.au=Baumann%2C+Andrew&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFAppavooDa_SilvaKriegerAuslander2007" class="citation journal cs1">Appavoo, Jonathan; Da Silva, Dilma; Krieger, Orran; Auslander, Mark; Ostrowski, Michal; Rosenburg, Bryan; Waterland, Amos; Wisniewski, Robert W.; Xenidis, Jimi (August 2007). "Experience distributing objects in an SMMP OS". <i>ACM Transactions on Computer Systems</i>. <b>25</b> (3): 6/1–6/52. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1275517.1275518">10.1145/1275517.1275518</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:931202">931202</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=ACM+Transactions+on+Computer+Systems&amp;rft.atitle=Experience+distributing+objects+in+an+SMMP+OS&amp;rft.volume=25&amp;rft.issue=3&amp;rft.pages=6%2F1-6%2F52&amp;rft.date=2007-08&amp;rft_id=info%3Adoi%2F10.1145%2F1275517.1275518&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A931202%23id-name%3DS2CID&amp;rft.aulast=Appavoo&amp;rft.aufirst=Jonathan&amp;rft.au=Da+Silva%2C+Dilma&amp;rft.au=Krieger%2C+Orran&amp;rft.au=Auslander%2C+Mark&amp;rft.au=Ostrowski%2C+Michal&amp;rft.au=Rosenburg%2C+Bryan&amp;rft.au=Waterland%2C+Amos&amp;rft.au=Wisniewski%2C+Robert+W.&amp;rft.au=Xenidis%2C+Jimi&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-18">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFFraserHarris2007" class="citation journal cs1">Fraser, Keir; Harris, Tim (2007). "Concurrent programming without locks". <i>ACM Transactions on Computer Systems</i>. <b>25</b> (2): 34–42. <a href="/wiki/CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a>&#160;<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.532.5050">10.1.1.532.5050</a></span>. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1233307.1233309">10.1145/1233307.1233309</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:3030814">3030814</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=ACM+Transactions+on+Computer+Systems&amp;rft.atitle=Concurrent+programming+without+locks&amp;rft.volume=25&amp;rft.issue=2&amp;rft.pages=34-42&amp;rft.date=2007&amp;rft_id=https%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fsummary%3Fdoi%3D10.1.1.532.5050%23id-name%3DCiteSeerX&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A3030814%23id-name%3DS2CID&amp;rft_id=info%3Adoi%2F10.1145%2F1233307.1233309&amp;rft.aulast=Fraser&amp;rft.aufirst=Keir&amp;rft.au=Harris%2C+Tim&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-19"><span class="mw-cite-backlink"><b><a href="#cite_ref-19">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFPorterHofmannRossbachBenn2009" class="citation book cs1">Porter, Donald E.; Hofmann, Owen S.; Rossbach, Christopher J.; Benn, Alexander; Witchel, Emmett (2009). "Operating systems transactions". <i>Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles - SOSP '09</i>. p.&#160;161. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F1629575.1629591">10.1145/1629575.1629591</a>. <a href="/wiki/Hdl_(identifier)" class="mw-redirect" title="Hdl (identifier)">hdl</a>:<a rel="nofollow" class="external text" href="https://hdl.handle.net/2152%2FETD-UT-2010-12-2488">2152/ETD-UT-2010-12-2488</a>. <a href="/wiki/ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&#160;<a href="/wiki/Special:BookSources/978-1-60558-752-3" title="Special:BookSources/978-1-60558-752-3"><bdi>978-1-60558-752-3</bdi></a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:28504">28504</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=bookitem&amp;rft.atitle=Operating+systems+transactions&amp;rft.btitle=Proceedings+of+the+ACM+SIGOPS+22nd+symposium+on+Operating+systems+principles+-+SOSP+%2709&amp;rft.pages=161&amp;rft.date=2009&amp;rft_id=info%3Ahdl%2F2152%2FETD-UT-2010-12-2488&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A28504%23id-name%3DS2CID&amp;rft_id=info%3Adoi%2F10.1145%2F1629575.1629591&amp;rft.isbn=978-1-60558-752-3&amp;rft.aulast=Porter&amp;rft.aufirst=Donald+E.&amp;rft.au=Hofmann%2C+Owen+S.&amp;rft.au=Rossbach%2C+Christopher+J.&amp;rft.au=Benn%2C+Alexander&amp;rft.au=Witchel%2C+Emmett&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-20"><span class="mw-cite-backlink"><b><a href="#cite_ref-20">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFHartMcKenneyDemke_BrownWalpole2007" class="citation journal cs1">Hart, Thomas E.; McKenney, Paul E.; Demke Brown, Angela; Walpole, Jonathan (December 2007). "Performance of memory reclamation for lockless synchronization". <i>J. Parallel Distrib. Comput</i>. <b>67</b> (12): 1270–1285. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1016%2Fj.jpdc.2007.04.010">10.1016/j.jpdc.2007.04.010</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=J.+Parallel+Distrib.+Comput.&amp;rft.atitle=Performance+of+memory+reclamation+for+lockless+synchronization&amp;rft.volume=67&amp;rft.issue=12&amp;rft.pages=1270-1285&amp;rft.date=2007-12&amp;rft_id=info%3Adoi%2F10.1016%2Fj.jpdc.2007.04.010&amp;rft.aulast=Hart&amp;rft.aufirst=Thomas+E.&amp;rft.au=McKenney%2C+Paul+E.&amp;rft.au=Demke+Brown%2C+Angela&amp;rft.au=Walpole%2C+Jonathan&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-21"><span class="mw-cite-backlink"><b><a href="#cite_ref-21">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenney2008" class="citation web cs1">McKenney, Paul E. (January 4, 2008). <a rel="nofollow" class="external text" href="https://lwn.net/Articles/263130/">"RCU part 2: Usage"</a>. <a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a><span class="reference-accessdate">. Retrieved <span class="nowrap">September 24,</span> 2010</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=RCU+part+2%3A+Usage&amp;rft.pub=Linux+Weekly+News&amp;rft.date=2008-01-04&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F263130%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-23"><span class="mw-cite-backlink"><b><a href="#cite_ref-23">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFDesnoyers2009" class="citation thesis cs1">Desnoyers, Mathieu (December 2009). <a rel="nofollow" class="external text" href="http://www.lttng.org/pub/thesis/desnoyers-dissertation-2009-12.pdf"><i>Low-Impact Operating System Tracing</i></a> <span class="cs1-format">(PDF)</span>. <i>École Polytechnique de Montreal</i> (Thesis).</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adissertation&amp;rft.title=Low-Impact+Operating+System+Tracing&amp;rft.date=2009-12&amp;rft.aulast=Desnoyers&amp;rft.aufirst=Mathieu&amp;rft_id=http%3A%2F%2Fwww.lttng.org%2Fpub%2Fthesis%2Fdesnoyers-dissertation-2009-12.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-24"><span class="mw-cite-backlink"><b><a href="#cite_ref-24">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenney2008" class="citation web cs1">McKenney, Paul E. (January 17, 2008). <a rel="nofollow" class="external text" href="https://lwn.net/Articles/264090/">"RCU part 3: the RCU API"</a>. <a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a><span class="reference-accessdate">. Retrieved <span class="nowrap">September 24,</span> 2010</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=RCU+part+3%3A+the+RCU+API&amp;rft.pub=Linux+Weekly+News&amp;rft.date=2008-01-17&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F264090%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-25"><span class="mw-cite-backlink"><b><a href="#cite_ref-25">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenneyAppavooKleenKrieger2001" class="citation conference cs1">McKenney, Paul E.; Appavoo, Jonathan; Kleen, Andi; Krieger, Orran; Russell, Rusty; Sarma, Dipankar; Soni, Maneesh (July 2001). <a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/rclock_OLS.2001.05.01c.pdf"><i>Read-Copy Update</i></a> <span class="cs1-format">(PDF)</span>. <i>Ottawa Linux Symposium</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=Ottawa+Linux+Symposium&amp;rft.atitle=Read-Copy+Update&amp;rft.date=2001-07&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft.au=Appavoo%2C+Jonathan&amp;rft.au=Kleen%2C+Andi&amp;rft.au=Krieger%2C+Orran&amp;rft.au=Russell%2C+Rusty&amp;rft.au=Sarma%2C+Dipankar&amp;rft.au=Soni%2C+Maneesh&amp;rft_id=http%3A%2F%2Fwww.rdrop.com%2Fusers%2Fpaulmck%2FRCU%2Frclock_OLS.2001.05.01c.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-26"><span class="mw-cite-backlink"><b><a href="#cite_ref-26">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFWizard2001" class="citation web cs1">Wizard, The (August 2001). <a rel="nofollow" class="external text" href="http://www.openvms.compaq.com/wizard/wiz_2637.html">"Shared Memory, Threads, Interprocess Communication"</a>. <a href="/wiki/Hewlett-Packard" title="Hewlett-Packard">Hewlett-Packard</a><span class="reference-accessdate">. Retrieved <span class="nowrap">December 26,</span> 2010</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Shared+Memory%2C+Threads%2C+Interprocess+Communication&amp;rft.pub=Hewlett-Packard&amp;rft.date=2001-08&amp;rft.aulast=Wizard&amp;rft.aufirst=The&amp;rft_id=http%3A%2F%2Fwww.openvms.compaq.com%2Fwizard%2Fwiz_2637.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-27"><span class="mw-cite-backlink"><b><a href="#cite_ref-27">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenney2003" class="citation web cs1">McKenney, Paul E. (October 2003). <a rel="nofollow" class="external text" href="http://www.linuxjournal.com/article/6993">"Using {RCU} in the {Linux} 2.5 Kernel"</a>. <a href="/wiki/Linux_Journal" title="Linux Journal">Linux Journal</a><span class="reference-accessdate">. Retrieved <span class="nowrap">September 24,</span> 2010</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Using+%7BRCU%7D+in+the+%7BLinux%7D+2.5+Kernel&amp;rft.pub=Linux+Journal&amp;rft.date=2003-10&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft_id=http%3A%2F%2Fwww.linuxjournal.com%2Farticle%2F6993&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-28"><span class="mw-cite-backlink"><b><a href="#cite_ref-28">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenney2004" class="citation thesis cs1">McKenney, Paul E. (July 2004). <a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf"><i>Exploiting Deferred Destruction: An Analysis of Read-Copy-Update Techniques</i></a> <span class="cs1-format">(PDF)</span>. <i>OGI School of Science and Engineering at Oregon Health and Sciences University</i> (Thesis).</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adissertation&amp;rft.title=Exploiting+Deferred+Destruction%3A+An+Analysis+of+Read-Copy-Update+Techniques&amp;rft.date=2004-07&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft_id=http%3A%2F%2Fwww.rdrop.com%2Fusers%2Fpaulmck%2FRCU%2FRCUdissertation.2004.07.14e1.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-29"><span class="mw-cite-backlink"><b><a href="#cite_ref-29">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFKungLehman1980" class="citation journal cs1">Kung, H. T.; Lehman, Q. (September 1980). "Concurrent Maintenance of Binary Search Trees". <i>ACM Transactions on Database Systems</i>. <b>5</b> (3): 354. <a href="/wiki/CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a>&#160;<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.639.8357">10.1.1.639.8357</a></span>. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F320613.320619">10.1145/320613.320619</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:13007648">13007648</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=ACM+Transactions+on+Database+Systems&amp;rft.atitle=Concurrent+Maintenance+of+Binary+Search+Trees&amp;rft.volume=5&amp;rft.issue=3&amp;rft.pages=354&amp;rft.date=1980-09&amp;rft_id=https%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fsummary%3Fdoi%3D10.1.1.639.8357%23id-name%3DCiteSeerX&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A13007648%23id-name%3DS2CID&amp;rft_id=info%3Adoi%2F10.1145%2F320613.320619&amp;rft.aulast=Kung&amp;rft.aufirst=H.+T.&amp;rft.au=Lehman%2C+Q.&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-30"><span class="mw-cite-backlink"><b><a href="#cite_ref-30">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFManberLadner1984" class="citation journal cs1">Manber, Udi; Ladner, Richard E. (September 1984). "Concurrency Control in a Dynamic Search Structure". <i>ACM Transactions on Database Systems</i>. <b>9</b> (3).</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=ACM+Transactions+on+Database+Systems&amp;rft.atitle=Concurrency+Control+in+a+Dynamic+Search+Structure&amp;rft.volume=9&amp;rft.issue=3&amp;rft.date=1984-09&amp;rft.aulast=Manber&amp;rft.aufirst=Udi&amp;rft.au=Ladner%2C+Richard+E.&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-31"><span class="mw-cite-backlink"><b><a href="#cite_ref-31">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFRashidTevanianYoungGolub1987" class="citation conference cs1">Rashid, Richard; Tevanian, Avadis; Young, Michael; Golub, David; Baron, Robert; Bolosky, William; Chew, Jonathan (October 1987). <a rel="nofollow" class="external text" href="http://citeseer.csail.mit.edu/cache/papers/cs/6535/http:zSzzSzwww.cs.cornell.eduzSzcs614-sp98zSzberkeley-262zSzmach-vm.pdf/rashid87machineindependent.pdf"><i>Machine-Independent Virtual Memory Management for Paged Uniprocessor and Multiprocessor Architectures</i></a> <span class="cs1-format">(PDF)</span>. <i>Second Symposium on Architectural Support for Programming Languages and Operating Systems</i>. Association for Computing Machinery.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=Second+Symposium+on+Architectural+Support+for+Programming+Languages+and+Operating+Systems&amp;rft.atitle=Machine-Independent+Virtual+Memory+Management+for+Paged+Uniprocessor+and+Multiprocessor+Architectures&amp;rft.date=1987-10&amp;rft.aulast=Rashid&amp;rft.aufirst=Richard&amp;rft.au=Tevanian%2C+Avadis&amp;rft.au=Young%2C+Michael&amp;rft.au=Golub%2C+David&amp;rft.au=Baron%2C+Robert&amp;rft.au=Bolosky%2C+William&amp;rft.au=Chew%2C+Jonathan&amp;rft_id=http%3A%2F%2Fciteseer.csail.mit.edu%2Fcache%2Fpapers%2Fcs%2F6535%2Fhttp%3AzSzzSzwww.cs.cornell.eduzSzcs614-sp98zSzberkeley-262zSzmach-vm.pdf%2Frashid87machineindependent.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-32"><span class="mw-cite-backlink"><b><a href="#cite_ref-32">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1041539562">.mw-parser-output .citation{word-wrap:break-word}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}</style><span class="citation patent" id="CITEREFHennessyOsisekSeigh_II1989"><a rel="nofollow" class="external text" href="https://worldwide.espacenet.com/textdoc?DB=EPODOC&amp;IDX=US4809168">US 4809168</a>,&#32;Hennessy, James P.; Osisek, Damian L.&#32;&amp; Seigh II, Joseph W.,&#32;"Passive Serialization in a Multitasking Environment",&#32;published February 1989</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Apatent&amp;rft.number=4809168&amp;rft.cc=US&amp;rft.title=Passive+Serialization+in+a+Multitasking+Environment&amp;rft.inventor=Hennessy&amp;rft.pubdate=February 1989"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-33"><span class="mw-cite-backlink"><b><a href="#cite_ref-33">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFPugh1990" class="citation techreport cs1">Pugh, William (June 1990). <a rel="nofollow" class="external text" href="http://portal.acm.org/citation.cfm?id=SERIES9310.93717"><i>Concurrent Maintenance of Skip Lists</i></a> (Technical report). Institute of Advanced Computer Science Studies, Department of Computer Science, University of Maryland. CS-TR-2222.1.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=report&amp;rft.btitle=Concurrent+Maintenance+of+Skip+Lists&amp;rft.pub=Institute+of+Advanced+Computer+Science+Studies%2C+Department+of+Computer+Science%2C+University+of+Maryland&amp;rft.date=1990-06&amp;rft.aulast=Pugh&amp;rft.aufirst=William&amp;rft_id=http%3A%2F%2Fportal.acm.org%2Fcitation.cfm%3Fid%3DSERIES9310.93717&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-34"><span class="mw-cite-backlink"><b><a href="#cite_ref-34">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFJohn1995" class="citation conference cs1">John, Aju (January 1995). <a rel="nofollow" class="external text" href="https://www.usenix.org/publications/library/proceedings/neworl/full_papers/john.a"><i>Dynamic vnodes &#8212; design and implementation</i></a>. <i>USENIX Winter 1995</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=USENIX+Winter+1995&amp;rft.atitle=Dynamic+vnodes+%26mdash%3B+design+and+implementation&amp;rft.date=1995-01&amp;rft.aulast=John&amp;rft.aufirst=Aju&amp;rft_id=https%3A%2F%2Fwww.usenix.org%2Fpublications%2Flibrary%2Fproceedings%2Fneworl%2Ffull_papers%2Fjohn.a&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-35"><span class="mw-cite-backlink"><b><a href="#cite_ref-35">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1041539562"><span class="citation patent" id="CITEREFSlingwineMcKenney1995"><a rel="nofollow" class="external text" href="https://worldwide.espacenet.com/textdoc?DB=EPODOC&amp;IDX=US5442758">US 5442758</a>,&#32;Slingwine, John D.&#32;&amp;&#32;McKenney, Paul E.,&#32;"Apparatus and Method for Achieving Reduced Overhead Mutual Exclusion and Maintaining Coherency in a Multiprocessor System",&#32;published August 1995</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Apatent&amp;rft.number=5442758&amp;rft.cc=US&amp;rft.title=Apparatus+and+Method+for+Achieving+Reduced+Overhead+Mutual+Exclusion+and+Maintaining+Coherency+in+a+Multiprocessor+System&amp;rft.inventor=Slingwine&amp;rft.pubdate=August 1995"><span style="display: none;">&#160;</span></span></span> </li> <li id="cite_note-36"><span class="mw-cite-backlink"><b><a href="#cite_ref-36">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFGamsaKriegerAppavooStumm1999" class="citation conference cs1">Gamsa, Ben; Krieger, Orran; Appavoo, Jonathan; Stumm, Michael (February 1999). <a rel="nofollow" class="external text" href="http://www.usenix.org/events/osdi99/full_papers/gamsa/gamsa.pdf"><i>Tornado: Maximizing Locality and Concurrency in a Shared Memory Multiprocessor Operating System</i></a> <span class="cs1-format">(PDF)</span>. <i>Proceedings of the Third Symposium on Operating System Design and Implementation</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=Proceedings+of+the+Third+Symposium+on+Operating+System+Design+and+Implementation&amp;rft.atitle=Tornado%3A+Maximizing+Locality+and+Concurrency+in+a+Shared+Memory+Multiprocessor+Operating+System&amp;rft.date=1999-02&amp;rft.aulast=Gamsa&amp;rft.aufirst=Ben&amp;rft.au=Krieger%2C+Orran&amp;rft.au=Appavoo%2C+Jonathan&amp;rft.au=Stumm%2C+Michael&amp;rft_id=http%3A%2F%2Fwww.usenix.org%2Fevents%2Fosdi99%2Ffull_papers%2Fgamsa%2Fgamsa.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-37"><span class="mw-cite-backlink"><b><a href="#cite_ref-37">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFRussell2000" class="citation web cs1">Russell, Rusty (June 2000). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20120331044313/http://oss.sgi.com/projects/netdev/archive/2000-06/msg00250.html">"Re: modular net drivers"</a>. Archived from <a rel="nofollow" class="external text" href="http://oss.sgi.com/projects/netdev/archive/2000-06/msg00250.html">the original</a> on 2012-03-31<span class="reference-accessdate">. Retrieved <span class="nowrap">2010-10-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Re%3A+modular+net+drivers&amp;rft.date=2000-06&amp;rft.aulast=Russell&amp;rft.aufirst=Rusty&amp;rft_id=http%3A%2F%2Foss.sgi.com%2Fprojects%2Fnetdev%2Farchive%2F2000-06%2Fmsg00250.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-38"><span class="mw-cite-backlink"><b><a href="#cite_ref-38">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFRussell2000" class="citation web cs1">Russell, Rusty (June 2000). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20120331044422/http://oss.sgi.com/projects/netdev/archive/2000-06/msg00254.html">"Re: modular net drivers"</a>. Archived from <a rel="nofollow" class="external text" href="http://oss.sgi.com/projects/netdev/archive/2000-06/msg00254.html">the original</a> on 2012-03-31<span class="reference-accessdate">. Retrieved <span class="nowrap">2010-10-01</span></span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=Re%3A+modular+net+drivers&amp;rft.date=2000-06&amp;rft.aulast=Russell&amp;rft.aufirst=Rusty&amp;rft_id=http%3A%2F%2Foss.sgi.com%2Fprojects%2Fnetdev%2Farchive%2F2000-06%2Fmsg00254.html&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-39"><span class="mw-cite-backlink"><b><a href="#cite_ref-39">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFColvinGrovesLuchangcoMoir2006" class="citation conference cs1">Colvin, Robert; Groves, Lindsay; Luchangco, Victor; Moir, Mark (August 2006). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090717075757/http://research.sun.com/scalable/pubs/CAV2006.pdf"><i>Formal Verification of a Lazy Concurrent List-Based Set Algorithm</i></a> <span class="cs1-format">(PDF)</span>. <i>Computer Aided Verification</i>. Archived from <a rel="nofollow" class="external text" href="http://research.sun.com/scalable/pubs/CAV2006.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2009-07-17.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=Computer+Aided+Verification&amp;rft.atitle=Formal+Verification+of+a+Lazy+Concurrent+List-Based+Set+Algorithm&amp;rft.date=2006-08&amp;rft.aulast=Colvin&amp;rft.aufirst=Robert&amp;rft.au=Groves%2C+Lindsay&amp;rft.au=Luchangco%2C+Victor&amp;rft.au=Moir%2C+Mark&amp;rft_id=http%3A%2F%2Fresearch.sun.com%2Fscalable%2Fpubs%2FCAV2006.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-40"><span class="mw-cite-backlink"><b><a href="#cite_ref-40">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFDesnoyersMcKenneySternDagenais2012" class="citation journal cs1">Desnoyers, Mathieu; McKenney, Paul E.; Stern, Alan; Dagenais, Michel R.; Walpole, Jonathan (February 2012). <a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/urcu-main-accepted.2011.08.30a.pdf">"User-Level Implementations of Read-Copy Update"</a> <span class="cs1-format">(PDF)</span>. <i>IEEE Transactions on Parallel and Distributed Systems</i>. <b>23</b> (2): 375–382. <a href="/wiki/Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FTPDS.2011.159">10.1109/TPDS.2011.159</a>. <a href="/wiki/S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&#160;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:832767">832767</a>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.jtitle=IEEE+Transactions+on+Parallel+and+Distributed+Systems&amp;rft.atitle=User-Level+Implementations+of+Read-Copy+Update&amp;rft.volume=23&amp;rft.issue=2&amp;rft.pages=375-382&amp;rft.date=2012-02&amp;rft_id=info%3Adoi%2F10.1109%2FTPDS.2011.159&amp;rft_id=https%3A%2F%2Fapi.semanticscholar.org%2FCorpusID%3A832767%23id-name%3DS2CID&amp;rft.aulast=Desnoyers&amp;rft.aufirst=Mathieu&amp;rft.au=McKenney%2C+Paul+E.&amp;rft.au=Stern%2C+Alan&amp;rft.au=Dagenais%2C+Michel+R.&amp;rft.au=Walpole%2C+Jonathan&amp;rft_id=http%3A%2F%2Fwww.rdrop.com%2Fusers%2Fpaulmck%2FRCU%2Furcu-main-accepted.2011.08.30a.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-41"><span class="mw-cite-backlink"><b><a href="#cite_ref-41">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFMcKenneyDesnoyersJiangshan2013" class="citation web cs1">McKenney, Paul E.; Desnoyers, Mathieu; Jiangshan, Lai (November 13, 2013). <a rel="nofollow" class="external text" href="https://lwn.net/Articles/573424/">"User-space RCU"</a>. <a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a><span class="reference-accessdate">. Retrieved <span class="nowrap">November 17,</span> 2013</span>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=unknown&amp;rft.btitle=User-space+RCU&amp;rft.pub=Linux+Weekly+News&amp;rft.date=2013-11-13&amp;rft.aulast=McKenney&amp;rft.aufirst=Paul+E.&amp;rft.au=Desnoyers%2C+Mathieu&amp;rft.au=Jiangshan%2C+Lai&amp;rft_id=https%3A%2F%2Flwn.net%2FArticles%2F573424%2F&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-42"><span class="mw-cite-backlink"><b><a href="#cite_ref-42">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite id="CITEREFGotsmanRinetzkyYang2013" class="citation conference cs1">Gotsman, Alexey; Rinetzky, Noam; Yang, Hongseok (March 16–24, 2013). <a rel="nofollow" class="external text" href="http://software.imdea.org/~gotsman/papers/recycling-esop13.pdf"><i>Verifying concurrent memory reclamation algorithms with grace</i></a> <span class="cs1-format">(PDF)</span>. <i>ESOP'13: European Symposium on Programming</i>.</cite><span title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=conference&amp;rft.jtitle=ESOP%2713%3A+European+Symposium+on+Programming&amp;rft.atitle=Verifying+concurrent+memory+reclamation+algorithms+with+grace&amp;rft.date=2013-03-16%2F2013-03-24&amp;rft.aulast=Gotsman&amp;rft.aufirst=Alexey&amp;rft.au=Rinetzky%2C+Noam&amp;rft.au=Yang%2C+Hongseok&amp;rft_id=http%3A%2F%2Fsoftware.imdea.org%2F~gotsman%2Fpapers%2Frecycling-esop13.pdf&amp;rfr_id=info%3Asid%2Fen.wikipedia.org%3ARead-copy-update" class="Z3988"></span></span> </li> <li id="cite_note-patent7099932-43"><span class="mw-cite-backlink"><b><a href="#cite_ref-patent7099932_43-0">^</a></b></span> <span class="reference-text"> <link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1041539562"><span class="citation patent" id="CITEREFFrenkel,_IlanGeller,_RomanRamberg,_YoramSnir,_Yoram2006"><a rel="nofollow" class="external text" href="https://worldwide.espacenet.com/textdoc?DB=EPODOC&amp;IDX=US7099932">US 7099932</a>,&#32;Frenkel, Ilan; Geller, Roman&#32;&amp; Ramberg, Yoram&#32;et al.,&#32;"Method and apparatus for retrieving network quality of service policy information from a directory in a quality of service policy management system",&#32;published 2006-08-29,&#32; assigned to Cisco Tech Inc.</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Apatent&amp;rft.number=7099932&amp;rft.cc=US&amp;rft.title=Method+and+apparatus+for+retrieving+network+quality+of+service+policy+information+from+a+directory+in+a+quality+of+service+policy+management+system&amp;rft.inventor=Frenkel%2C+Ilan&amp;rft.assignee=Cisco+Tech+Inc.&amp;rft.pubdate=2006-08-29"><span style="display: none;">&#160;</span></span></span> </li> </ol></div> <p>Bauer, R.T., (June 2009), "Operational Verification of a Relativistic Program" PSU Tech Report TR-09-04 (<a rel="nofollow" class="external free" href="http://www.pdx.edu/sites/www.pdx.edu.computer-science/files/tr0904.pdf">http://www.pdx.edu/sites/www.pdx.edu.computer-science/files/tr0904.pdf</a>) </p> <div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Read-copy-update&amp;action=edit&amp;section=13" title="Edit section: External links"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a rel="nofollow" class="external text" href="https://lwn.net/Articles/573424/">Paul E. McKenney, Mathieu Desnoyers, and Lai Jiangshan: User-space RCU</a>. <i><a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a>.</i></li> <li><a rel="nofollow" class="external text" href="https://lwn.net/Articles/262464/">Paul E. McKenney and Jonathan Walpole: What is RCU, Fundamentally?</a>, <a rel="nofollow" class="external text" href="https://lwn.net/Articles/263130/">What is RCU? Part 2: Usage</a>, and <a rel="nofollow" class="external text" href="https://lwn.net/Articles/264090/">RCU part 3: the RCU API</a>. <i><a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a>.</i></li> <li><a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU">Paul E. McKenney's RCU web page</a></li> <li>Hart, McKenney, and Demke Brown (2006). <i><a rel="nofollow" class="external text" href="http://www.rdrop.com/users/paulmck/RCU/hart_ipdps06.pdf">Making Lockless Synchronization Fast: Performance Implications of Memory Reclamation</a></i> An <a rel="nofollow" class="external text" href="http://www.ipdps.org/ipdps2006/2006_advance_program.html">IPDPS 2006 Best Paper</a> comparing RCU's performance to that of other lockless synchronization mechanisms. <i><a rel="nofollow" class="external text" href="https://dx.doi.org/10.1016/j.jpdc.2007.04.010">Journal version</a></i> (including Walpole as author).</li> <li><span><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US5442758">U.S. patent 5,442,758</a></span> (1995) "Apparatus and method for achieving reduced overhead mutual exclusion and maintaining coherency in a multiprocessor system utilizing execution history and thread monitoring"</li> <li><a rel="nofollow" class="external text" href="https://lwn.net/Articles/202847/">Paul McKenney: Sleepable RCU</a>. <i><a href="/wiki/Linux_Weekly_News" class="mw-redirect" title="Linux Weekly News">Linux Weekly News</a>.</i></li></ul> <div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}</style><style data-mw-deduplicate="TemplateStyles:r1236075235">.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}</style></div><div role="navigation" class="navbox" aria-labelledby="Linux_kernel" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1129693374"><style data-mw-deduplicate="TemplateStyles:r1239400231">.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}</style><div class="navbar plainlinks hlist navbar-mini"><ul><li class="nv-view"><a href="/wiki/Template:Linux_kernel" title="Template:Linux kernel"><abbr title="View this template">v</abbr></a></li><li class="nv-talk"><a href="/wiki/Template_talk:Linux_kernel" title="Template talk:Linux kernel"><abbr title="Discuss this template">t</abbr></a></li><li class="nv-edit"><a href="/wiki/Special:EditPage/Template:Linux_kernel" title="Special:EditPage/Template:Linux kernel"><abbr title="Edit this template">e</abbr></a></li></ul></div><div id="Linux_kernel" style="font-size:114%;margin:0 4em"><a href="/wiki/Linux_kernel" title="Linux kernel">Linux kernel</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Organization</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th id="Kernel" scope="row" class="navbox-group" style="width:1%">Kernel</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Linux_Foundation" title="Linux Foundation">Linux Foundation</a></li> <li><a href="/wiki/Linux_Mark_Institute" title="Linux Mark Institute">Linux Mark Institute</a></li> <li><a href="/wiki/Linus%27s_law" title="Linus&#39;s law">Linus's law</a></li> <li><a href="/wiki/Tanenbaum%E2%80%93Torvalds_debate" title="Tanenbaum–Torvalds debate">Tanenbaum–Torvalds debate</a></li> <li><a href="/wiki/Tux_(mascot)" title="Tux (mascot)">Tux</a></li> <li><a href="/wiki/SCO%E2%80%93Linux_disputes" title="SCO–Linux disputes">SCO disputes</a></li> <li><a href="/wiki/Linaro" title="Linaro">Linaro</a></li> <li><a href="/wiki/GNU_General_Public_License#Version_2" title="GNU General Public License">GNU GPL v2</a></li> <li><a href="/wiki/Menuconfig" title="Menuconfig">menuconfig</a></li> <li><a href="/wiki/List_of_Linux-supported_computer_architectures" title="List of Linux-supported computer architectures">Supported computer architectures</a></li> <li><a href="/wiki/Linux_kernel_version_history" title="Linux kernel version history">Version history</a></li> <li><a href="/wiki/Criticism_of_Linux" title="Criticism of Linux">Criticism</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Support</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li>Developers <ul><li><i><a href="/wiki/The_Linux_Programming_Interface" title="The Linux Programming Interface">The Linux Programming Interface</a></i></li> <li><a href="/wiki/Kernel.org" title="Kernel.org">kernel.org</a></li> <li><a href="/wiki/Linux_kernel_mailing_list" title="Linux kernel mailing list">LKML</a></li> <li><a href="/wiki/Linux_conference" class="mw-redirect" title="Linux conference">Linux conferences</a></li></ul></li> <li>Users <ul><li><a href="/wiki/Linux_user_group" title="Linux user group">Linux User Group (LUG)</a></li></ul></li></ul> </div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Technical</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%">Debugging</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/CRIU" title="CRIU">CRIU</a></li> <li><a href="/wiki/Ftrace" title="Ftrace">ftrace</a></li> <li><a href="/wiki/Kdump_(Linux)" title="Kdump (Linux)">kdump</a></li> <li><a href="/wiki/Linux_kernel_oops" title="Linux kernel oops">Linux kernel oops</a></li> <li><a href="/wiki/SystemTap" title="SystemTap">SystemTap</a></li> <li><a href="/wiki/Berkeley_Packet_Filter" title="Berkeley Packet Filter">BPF</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Booting_process_of_Linux" title="Booting process of Linux">Startup</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Vmlinux" title="Vmlinux">vmlinux</a></li> <li><a href="/wiki/System.map" title="System.map">System.map</a></li> <li><a href="/wiki/Dracut_(software)" title="Dracut (software)">dracut</a></li> <li><a href="/wiki/Initrd" class="mw-redirect" title="Initrd">initrd</a></li> <li><a href="/wiki/Initramfs" class="mw-redirect" title="Initramfs">initramfs</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_kernel_interfaces" title="Linux kernel interfaces">ABIs</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Linux_Standard_Base" title="Linux Standard Base">Linux Standard Base</a></li> <li><a href="/wiki/X32_ABI" title="X32 ABI">x32 ABI</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_kernel_interfaces" title="Linux kernel interfaces">APIs</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%">Kernel</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_kernel_interfaces#SCI" title="Linux kernel interfaces">System Call<br />Interface</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/POSIX" title="POSIX">POSIX</a> <ul><li><a href="/wiki/Ioctl" title="Ioctl">ioctl</a></li> <li><a href="/wiki/Select_(Unix)" title="Select (Unix)">select</a></li> <li><a href="/wiki/Open_(system_call)" title="Open (system call)">open</a></li> <li><a href="/wiki/Read_(system_call)" title="Read (system call)">read</a></li> <li><a href="/wiki/Close_(system_call)" title="Close (system call)">close</a></li> <li><a href="/wiki/Sync_(Unix)" title="Sync (Unix)">sync</a></li> <li>…</li></ul></li> <li><a href="/wiki/Linux_kernel_interfaces#Additions_to_POSIX" title="Linux kernel interfaces">Linux-only</a> <ul><li><a href="/wiki/Futex" title="Futex">futex</a></li> <li><a href="/wiki/Epoll" title="Epoll">epoll</a></li> <li><a href="/wiki/Splice_(system_call)" title="Splice (system call)">splice</a></li> <li><a href="/wiki/Dnotify" title="Dnotify">dnotify</a></li> <li><a href="/wiki/Inotify" title="Inotify">inotify</a></li> <li><a href="/wiki/Readahead" title="Readahead">readahead</a></li> <li>…</li></ul></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_kernel_interfaces#In–kernel_APIs" title="Linux kernel interfaces">In-kernel</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Advanced_Linux_Sound_Architecture" title="Advanced Linux Sound Architecture">ALSA</a></li> <li><a href="/wiki/Crypto_API_(Linux)" title="Crypto API (Linux)">Crypto API</a></li> <li><a href="/wiki/Io_uring" title="Io uring">io uring</a></li> <li><a href="/wiki/Direct_Rendering_Manager" title="Direct Rendering Manager">DRM</a></li> <li><a href="/wiki/Kernfs_(Linux)" title="Kernfs (Linux)">kernfs</a></li> <li><a href="/wiki/Memory_barrier" title="Memory barrier">Memory barrier</a></li> <li><a href="/wiki/New_API" title="New API">New API</a></li> <li><a class="mw-selflink selflink">RCU</a></li> <li><a href="/wiki/Video4Linux" title="Video4Linux">Video4Linux</a></li> <li><a href="/wiki/IIO_Framework" title="IIO Framework">IIO</a></li></ul> </div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/User_space_and_kernel_space" title="User space and kernel space">Userspace</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Daemon_(computing)" title="Daemon (computing)">Daemons</a>,<br /><a href="/wiki/Virtual_file_system" title="Virtual file system">File systems</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li>bpffs</li> <li><a href="/wiki/Configfs" title="Configfs">configfs</a></li> <li><a href="/wiki/Devfs" class="mw-redirect" title="Devfs">devfs</a></li> <li><a href="/wiki/Devpts" title="Devpts">devpts</a></li> <li><a href="/wiki/Debugfs" title="Debugfs">debugfs</a></li> <li><a href="/wiki/Filesystem_in_Userspace" title="Filesystem in Userspace">FUSE</a></li> <li>hugetlbfs</li> <li>pipefs</li> <li><a href="/wiki/Procfs" title="Procfs">procfs</a></li> <li>securityfs</li> <li>sockfs</li> <li><a href="/wiki/Sysfs" title="Sysfs">sysfs</a></li> <li><a href="/wiki/Tmpfs" title="Tmpfs">tmpfs</a></li> <li><a href="/wiki/Systemd" title="Systemd">systemd</a> <ul><li><a href="/wiki/Udev" title="Udev">udev</a></li></ul></li> <li><a href="/wiki/Kmscon" title="Kmscon">Kmscon</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Wrapper_library" title="Wrapper library">Wrapper<br />libraries</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/C_standard_library" title="C standard library">C standard library</a> <ul><li><a href="/wiki/Glibc" title="Glibc">glibc</a></li> <li><a href="/wiki/UClibc" title="UClibc">uClibc</a></li> <li><a href="/wiki/Bionic_(software)" title="Bionic (software)">Bionic</a> <ul><li><a href="/wiki/Libhybris" title="Libhybris">libhybris</a></li></ul></li> <li><a href="/wiki/Dietlibc" title="Dietlibc">dietlibc</a></li> <li><a href="/wiki/Embedded_GLIBC" class="mw-redirect" title="Embedded GLIBC">EGLIBC</a></li> <li><a href="/wiki/Klibc" title="Klibc">klibc</a></li> <li><a href="/wiki/Musl" title="Musl">musl</a></li> <li><a href="/wiki/Newlib" title="Newlib">Newlib</a></li></ul></li> <li><a href="/wiki/Cgroups" title="Cgroups">libcgroup</a></li> <li><a href="/wiki/Direct_Rendering_Manager" title="Direct Rendering Manager">libdrm</a></li> <li><a href="/wiki/Advanced_Linux_Sound_Architecture" title="Advanced Linux Sound Architecture">libalsa</a></li> <li><a href="/wiki/Evdev" title="Evdev">libevdev</a></li> <li><a href="/wiki/Libusb" title="Libusb">libusb</a></li> <li><a href="/wiki/Io_uring" title="Io uring">liburing</a></li></ul> </div></td></tr></tbody></table><div></div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Components</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Loadable_kernel_module" title="Loadable kernel module">Kernel modules</a></li> <li><a href="/wiki/BlueZ" class="mw-redirect" title="BlueZ">BlueZ</a></li> <li><a href="/wiki/Cgroups" title="Cgroups">cgroups</a></li> <li><a href="/wiki/Linux_console" title="Linux console">Console</a></li> <li><a href="/wiki/Bcache" title="Bcache">bcache</a></li> <li><a href="/wiki/Device_mapper" title="Device mapper">Device mapper</a></li> <li><a href="/wiki/Dm-cache" title="Dm-cache">dm-cache</a></li> <li><a href="/wiki/Dm-crypt" title="Dm-crypt">dm-crypt</a></li> <li><a href="/wiki/Direct_Rendering_Manager" title="Direct Rendering Manager">DRM</a></li> <li><a href="/wiki/EDAC_(Linux)" class="mw-redirect" title="EDAC (Linux)">EDAC</a></li> <li><a href="/wiki/Evdev" title="Evdev">evdev</a></li> <li><a href="/wiki/Kernel_same-page_merging" title="Kernel same-page merging">Kernel same-page merging</a> (KSM)</li> <li><a href="/wiki/LIO_(SCSI_target)" title="LIO (SCSI target)">LIO</a></li> <li><a href="/wiki/Linux_framebuffer" title="Linux framebuffer">Framebuffer</a></li> <li><a href="/wiki/Logical_Volume_Manager_(Linux)" title="Logical Volume Manager (Linux)">LVM</a></li> <li><a href="/wiki/KMS_driver" class="mw-redirect" title="KMS driver">KMS driver</a></li> <li><a href="/wiki/Netfilter" title="Netfilter">Netfilter</a></li> <li><a href="/wiki/Netlink" title="Netlink">Netlink</a></li> <li><a href="/wiki/Nftables" title="Nftables">nftables</a></li> <li><a href="/wiki/Network_scheduler" title="Network scheduler">Network scheduler</a></li> <li><a href="/wiki/Perf_(Linux)" title="Perf (Linux)">perf</a></li> <li><a href="/wiki/SLUB_(software)" title="SLUB (software)">SLUB</a></li> <li><a href="/wiki/Zram" title="Zram">zram</a></li> <li><a href="/wiki/Zswap" title="Zswap">zswap</a></li></ul> <ul><li><a href="/wiki/Scheduling_(computing)#Linux" title="Scheduling (computing)">Process and I/O schedulers</a>:</li> <li><a href="/wiki/Brain_Fuck_Scheduler" title="Brain Fuck Scheduler">Brain Fuck Scheduler</a></li> <li><a href="/wiki/Completely_Fair_Scheduler" title="Completely Fair Scheduler">Completely Fair Scheduler</a> (CFS)</li> <li><a href="/wiki/Earliest_eligible_virtual_deadline_first_scheduling" title="Earliest eligible virtual deadline first scheduling">Earliest eligible virtual deadline first</a> (EEVDF)</li> <li><a href="/wiki/Noop_scheduler" title="Noop scheduler">Noop scheduler</a></li> <li><a href="/wiki/O(n)_scheduler" title="O(n) scheduler">O(n) scheduler</a></li> <li><a href="/wiki/O(1)_scheduler" title="O(1) scheduler">O(1) scheduler</a></li> <li><a href="/wiki/SCHED_DEADLINE" title="SCHED DEADLINE">SCHED_DEADLINE</a></li> <li><a href="/wiki/SCHED_FIFO" class="mw-redirect" title="SCHED FIFO">SCHED_FIFO</a></li> <li><a href="/wiki/SCHED_RR" class="mw-redirect" title="SCHED RR">SCHED_RR</a></li></ul> <ul><li><a href="/wiki/Linux_Security_Modules" title="Linux Security Modules">Security Modules</a>: <a href="/wiki/AppArmor" title="AppArmor">AppArmor</a></li> <li><a href="/wiki/Exec_Shield" title="Exec Shield">Exec Shield</a></li> <li><a href="/wiki/Seccomp" title="Seccomp">seccomp</a></li> <li><a href="/wiki/Security-Enhanced_Linux" title="Security-Enhanced Linux">SELinux</a></li> <li><a href="/wiki/Smack_(software)" title="Smack (software)">Smack</a></li> <li><a href="/wiki/Tomoyo_Linux" title="Tomoyo Linux">Tomoyo Linux</a></li> <li><a href="/wiki/Linux_PAM" title="Linux PAM">Linux PAM</a></li></ul> <ul><li><a href="/wiki/Device_driver" title="Device driver">Device drivers</a> <ul><li><a href="/wiki/Comparison_of_open-source_wireless_drivers" title="Comparison of open-source wireless drivers">802.11</a></li> <li><a href="/wiki/Free_and_open-source_graphics_device_driver" title="Free and open-source graphics device driver">graphics</a></li></ul></li> <li><a href="/wiki/Raw_device" title="Raw device">Raw device</a></li></ul> <ul><li><a href="/wiki/Initramfs" class="mw-redirect" title="Initramfs">initramfs</a></li> <li><a href="/wiki/KernelCare" title="KernelCare">KernelCare</a></li> <li><a href="/wiki/Kexec" title="Kexec">kexec</a></li> <li><a href="/wiki/KGraft" title="KGraft">kGraft</a></li> <li><a href="/wiki/Kpatch" title="Kpatch">kpatch</a></li> <li><a href="/wiki/Ksplice" title="Ksplice">Ksplice</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Variants</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Mainline_Linux" class="mw-redirect" title="Mainline Linux">Mainline</a> <ul><li><a href="/wiki/Linux_kernel" title="Linux kernel">Linux kernel</a></li> <li><a href="/wiki/Linux-libre" title="Linux-libre">Linux-libre</a></li></ul></li> <li><a href="/wiki/High-performance_computing" title="High-performance computing">High-performance computing</a> <ul><li><a href="/wiki/INK_(operating_system)" title="INK (operating system)">INK</a></li> <li><a href="/wiki/Compute_Node_Linux" title="Compute Node Linux">Compute Node Linux</a></li> <li><a href="/wiki/Slurm_Workload_Manager" title="Slurm Workload Manager">SLURM</a></li></ul></li> <li><a href="/wiki/Real-time_computing" title="Real-time computing">Real-time computing</a> <ul><li><a href="/wiki/RTLinux" title="RTLinux">RTLinux</a></li> <li><a href="/wiki/RTAI" title="RTAI">RTAI</a></li> <li><a href="/wiki/Xenomai" title="Xenomai">Xenomai</a></li> <li><a href="/wiki/PREEMPT_RT" title="PREEMPT RT">PREEMPT_RT</a></li></ul></li> <li><a href="/wiki/Memory_management_unit" title="Memory management unit">MMU</a>-less <ul><li><a href="/wiki/%CE%9CClinux" title="ΜClinux">μClinux</a></li> <li><a href="/wiki/PSXLinux" title="PSXLinux">PSXLinux</a></li></ul></li></ul> </div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th id="Virtualization" scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Virtualization" title="Virtualization">Virtualization</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Hypervisor" title="Hypervisor">Hypervisor</a> <ul><li><a href="/wiki/Kernel-based_Virtual_Machine" title="Kernel-based Virtual Machine">KVM</a></li> <li><a href="/wiki/Xen" title="Xen">Xen</a></li></ul></li> <li><a href="/wiki/OS-level_virtualization" title="OS-level virtualization">OS-level virtualization</a> <ul><li><a href="/wiki/Linux-VServer" title="Linux-VServer">Linux-VServer</a></li> <li><a href="/wiki/Lguest" title="Lguest">Lguest</a></li> <li><a href="/wiki/LXC" title="LXC">LXC</a></li> <li><a href="/wiki/OpenVZ" title="OpenVZ">OpenVZ</a></li></ul></li> <li>Other <ul><li><a href="/wiki/L4Linux" title="L4Linux">L4Linux</a></li> <li><a href="/wiki/ELinOS" title="ELinOS">ELinOS</a></li> <li><a href="/wiki/User-mode_Linux" title="User-mode Linux">User-mode Linux</a></li> <li><a href="/wiki/MkLinux" title="MkLinux">MkLinux</a></li> <li><a href="/wiki/Cooperative_Linux" title="Cooperative Linux">coLinux</a></li></ul></li></ul> </div></td></tr></tbody></table><div> </div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_adoption" title="Linux adoption">Adoption</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th id="Rangeof_use" scope="row" class="navbox-group" style="width:1%"><a href="/wiki/Linux_range_of_use" title="Linux range of use">Range<br />of use</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/Linux_desktop_environments" class="mw-redirect" title="Linux desktop environments">Desktop</a></li> <li><a href="/wiki/Linux_on_embedded_systems" title="Linux on embedded systems">Embedded</a></li> <li><a href="/wiki/Video_games_and_Linux" title="Video games and Linux">Gaming</a></li> <li>Thin client: <ul><li><a href="/wiki/Linux_Terminal_Server_Project" title="Linux Terminal Server Project">LTSP</a></li></ul></li> <li>Server: <ul><li><a href="/wiki/LAMP_(software_bundle)" title="LAMP (software bundle)">LAMP</a></li> <li><a href="/wiki/LYME_(software_bundle)" title="LYME (software bundle)">LYME-LYCE</a></li></ul></li> <li><a href="/wiki/Linux-powered_device" title="Linux-powered device">Devices</a></li></ul> </div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Adopters</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"> <ul><li><a href="/wiki/List_of_Linux_adopters" title="List of Linux adopters">List of Linux adopters</a></li></ul> </div></td></tr></tbody></table><div></div></td></tr><tr><td class="navbox-abovebelow" colspan="2"><div> <ul><li><b><span class="nowrap"><span class="noviewer" typeof="mw:File"><a href="/wiki/File:NewTux.svg" class="mw-file-description"><img alt="icon" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/NewTux.svg/13px-NewTux.svg.png" decoding="async" width="13" height="16" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/b/b0/NewTux.svg/20px-NewTux.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/b0/NewTux.svg/27px-NewTux.svg.png 2x" data-file-width="625" data-file-height="750" /></a></span> </span><a href="/wiki/Portal:Linux" title="Portal:Linux">Linux&#32;portal</a></b></li> <li><b><span class="nowrap"><span class="noviewer" typeof="mw:File"><span><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/31/Free_and_open-source_software_logo_%282009%29.svg/16px-Free_and_open-source_software_logo_%282009%29.svg.png" decoding="async" width="16" height="16" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/31/Free_and_open-source_software_logo_%282009%29.svg/24px-Free_and_open-source_software_logo_%282009%29.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/31/Free_and_open-source_software_logo_%282009%29.svg/32px-Free_and_open-source_software_logo_%282009%29.svg.png 2x" data-file-width="512" data-file-height="512" /></span></span> </span><a href="/wiki/Portal:Free_and_open-source_software" title="Portal:Free and open-source software">Free and open-source software&#32;portal</a></b></li> <li><span class="noviewer" typeof="mw:File"><span title="Category"><img alt="" src="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/16px-Symbol_category_class.svg.png" decoding="async" width="16" height="16" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/23px-Symbol_category_class.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/9/96/Symbol_category_class.svg/31px-Symbol_category_class.svg.png 2x" data-file-width="180" data-file-height="185" /></span></span> <b><a href="/wiki/Category:Linux_kernel" title="Category:Linux kernel">Category</a></b></li></ul> </div></td></tr></tbody></table></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐f69cdc8f6‐gqt92 Cached time: 20241122141046 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1, show‐toc] CPU time usage: 0.988 seconds Real time usage: 1.301 seconds Preprocessor visited node count: 5201/1000000 Post‐expand include size: 153346/2097152 bytes Template argument size: 6038/2097152 bytes Highest expansion depth: 23/100 Expensive parser function count: 10/500 Unstrip recursion depth: 1/20 Unstrip post‐expand size: 164147/5000000 bytes Lua time usage: 0.573/10.000 seconds Lua memory usage: 5867126/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 1120.459 1 -total 44.02% 493.198 2 Template:Reflist 16.95% 189.928 8 Template:Navbox 14.56% 163.186 1 Template:Linux_kernel 11.85% 132.749 4 Template:Cite_book 8.78% 98.327 1 Template:Short_description 8.30% 93.026 9 Template:Cite_conference 7.70% 86.299 9 Template:Cite_journal 6.08% 68.155 9 Template:Cite_web 5.73% 64.151 2 Template:Pagetype --> <!-- Saved in parser cache with key enwiki:pcache:idhash:284371-0!canonical and timestamp 20241122141046 and revision id 1241519371. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=Read-copy-update&amp;oldid=1241519371">https://en.wikipedia.org/w/index.php?title=Read-copy-update&amp;oldid=1241519371</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Help:Category" title="Help:Category">Categories</a>: <ul><li><a href="/wiki/Category:Operating_system_technology" title="Category:Operating system technology">Operating system technology</a></li><li><a href="/wiki/Category:Concurrency_control" title="Category:Concurrency control">Concurrency control</a></li></ul></div><div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">Hidden categories: <ul><li><a href="/wiki/Category:CS1_errors:_external_links" title="Category:CS1 errors: external links">CS1 errors: external links</a></li><li><a href="/wiki/Category:Articles_with_short_description" title="Category:Articles with short description">Articles with short description</a></li><li><a href="/wiki/Category:Short_description_is_different_from_Wikidata" title="Category:Short description is different from Wikidata">Short description is different from Wikidata</a></li><li><a href="/wiki/Category:Articles_containing_potentially_dated_statements_from_March_2014" title="Category:Articles containing potentially dated statements from March 2014">Articles containing potentially dated statements from March 2014</a></li><li><a href="/wiki/Category:All_articles_containing_potentially_dated_statements" title="Category:All articles containing potentially dated statements">All articles containing potentially dated statements</a></li><li><a href="/wiki/Category:All_articles_with_failed_verification" title="Category:All articles with failed verification">All articles with failed verification</a></li><li><a href="/wiki/Category:Articles_with_failed_verification_from_November_2015" title="Category:Articles with failed verification from November 2015">Articles with failed verification from November 2015</a></li><li><a href="/wiki/Category:Articles_needing_cleanup_from_May_2014" title="Category:Articles needing cleanup from May 2014">Articles needing cleanup from May 2014</a></li><li><a href="/wiki/Category:All_pages_needing_cleanup" title="Category:All pages needing cleanup">All pages needing cleanup</a></li><li><a href="/wiki/Category:Articles_with_sections_that_need_to_be_turned_into_prose_from_May_2014" title="Category:Articles with sections that need to be turned into prose from May 2014">Articles with sections that need to be turned into prose from May 2014</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 21 August 2024, at 16:49<span class="anonymous-show">&#160;(UTC)</span>.</li> <li id="footer-info-copyright">Text is available under the <a href="/wiki/Wikipedia:Text_of_the_Creative_Commons_Attribution-ShareAlike_4.0_International_License" title="Wikipedia:Text of the Creative Commons Attribution-ShareAlike 4.0 International License">Creative Commons Attribution-ShareAlike 4.0 License</a>; additional terms may apply. By using this site, you agree to the <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use" class="extiw" title="foundation:Special:MyLanguage/Policy:Terms of Use">Terms of Use</a> and <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy" class="extiw" title="foundation:Special:MyLanguage/Policy:Privacy policy">Privacy Policy</a>. Wikipedia® is a registered trademark of the <a rel="nofollow" class="external text" href="https://wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:About">About Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:General_disclaimer">Disclaimers</a></li> <li id="footer-places-contact"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wikipedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wikipedia.org/w/index.php?title=Read-copy-update&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.canary-84779d6bf6-nb2j4","wgBackendResponseTime":119,"wgPageParseReport":{"limitreport":{"cputime":"0.988","walltime":"1.301","ppvisitednodes":{"value":5201,"limit":1000000},"postexpandincludesize":{"value":153346,"limit":2097152},"templateargumentsize":{"value":6038,"limit":2097152},"expansiondepth":{"value":23,"limit":100},"expensivefunctioncount":{"value":10,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":164147,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 1120.459 1 -total"," 44.02% 493.198 2 Template:Reflist"," 16.95% 189.928 8 Template:Navbox"," 14.56% 163.186 1 Template:Linux_kernel"," 11.85% 132.749 4 Template:Cite_book"," 8.78% 98.327 1 Template:Short_description"," 8.30% 93.026 9 Template:Cite_conference"," 7.70% 86.299 9 Template:Cite_journal"," 6.08% 68.155 9 Template:Cite_web"," 5.73% 64.151 2 Template:Pagetype"]},"scribunto":{"limitreport-timeusage":{"value":"0.573","limit":"10.000"},"limitreport-memusage":{"value":5867126,"limit":52428800},"limitreport-logs":"table#1 {\n [\"size\"] = \"tiny\",\n}\ntable#1 {\n [\"size\"] = \"tiny\",\n}\n"},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-gqt92","timestamp":"20241122141046","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Read-copy-update","url":"https:\/\/en.wikipedia.org\/wiki\/Read-copy-update","sameAs":"http:\/\/www.wikidata.org\/entity\/Q7300340","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q7300340","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2003-07-29T17:42:47Z","dateModified":"2024-08-21T16:49:24Z","headline":"synchronization mechanism based on mutual exclusion"}</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10