ebook img

Is parallel programming hard, and if so, what can you do about it PDF

588 Pages·2011·3.336 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Is parallel programming hard, and if so, what can you do about it

Is Parallel Programming Hard, And, If So, What Can You Do About It? Editedby: PaulE.McKenney LinuxTechnologyCenter IBMBeaverton [email protected] May30,2011 ii Legal Statement Thisworkrepresentstheviewsoftheauthorsanddoesnotnecessarilyrepresenttheviewoftheir employers. IBM,zSeries,andPowerPCaretrademarksorregisteredtrademarksofInternationalBusiness MachinesCorporationintheUnitedStates,othercountries,orboth. LinuxisaregisteredtrademarkofLinusTorvalds. i386isatrademarksofIntelCorporationoritssubsidiariesintheUnitedStates,othercountries, orboth. Othercompany,product,andservicenamesmaybetrademarksorservicemarksofsuchcompa- nies. Thenon-source-codetextandimagesinthisdocumentareprovidedunderthetermsoftheCre- ativeCommonsAttribution-ShareAlike3.0UnitedStateslicense(http://creativecommons. org/licenses/by-sa/3.0/us/). Inbrief, youmayusethecontentsofthisdocument for any purpose, personal, commercial, or otherwise, so long as attribution to the authors is maintained.Likewise,thedocumentmaybemodified,andderivativeworksandtranslationsmade available,solongassuchmodificationsandderivationsareofferedtothepubliconequalterms asthenon-source-codetextandimagesintheoriginaldocument. SourcecodeiscoveredbyvariousversionsoftheGPL(http://www.gnu.org/licenses/ gpl-2.0.html).SomeofthiscodeisGPLv2-only,asitderivesfromtheLinuxkernel,while othercodeisGPLv2-or-later.SeetheCodeSamplesdirectoryinthegitarchive(git://git. kernel.org/pub/scm/linux/kernel/git/paulmck/perfbook.git)fortheex- actlicenses,whichareincludedincommentheadersineachfile.Ifyouareunsureofthelicense foragivencodefragment,youshouldassumeGPLv2-only. Combinedwork©2005-2011byPaulE.McKenney. Contents 1 Introduction 1 1.1 HistoricParallelProgrammingDifficulties . . . . . . . . . . . . . . . . 1 1.2 ParallelProgrammingGoals . . . . . . . . . . . . . . . . . . . . . . 3 1.2.1 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.2 Productivity . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.3 Generality. . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3 AlternativestoParallelProgramming. . . . . . . . . . . . . . . . . . 8 1.3.1 MultipleInstancesofaSequentialApplication . . . . . . . . 8 1.3.2 MakeUseofExistingParallelSoftware . . . . . . . . . . . . 9 1.3.3 PerformanceOptimization . . . . . . . . . . . . . . . . . . . 9 1.4 WhatMakesParallelProgrammingHard? . . . . . . . . . . . . . . . 10 1.4.1 WorkPartitioning . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.2 ParallelAccessControl . . . . . . . . . . . . . . . . . . . . . . 11 1.4.3 ResourcePartitioningandReplication . . . . . . . . . . . . . 12 1.4.4 InteractingWithHardware . . . . . . . . . . . . . . . . . . . 12 1.4.5 CompositeCapabilities . . . . . . . . . . . . . . . . . . . . . 13 1.4.6 HowDoLanguagesandEnvironmentsAssistWithTheseTasks? 13 1.5 GuidetoThisBook . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.1 QuickQuizzes . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.2 SampleSourceCode . . . . . . . . . . . . . . . . . . . . . . 14 2 HardwareanditsHabits 15 2.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.1 PipelinedCPUs . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.2 MemoryReferences . . . . . . . . . . . . . . . . . . . . . . 16 2.1.3 AtomicOperations . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.4 MemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.5 CacheMisses . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.6 I/OOperations . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2 Overheads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2.1 HardwareSystemArchitecture . . . . . . . . . . . . . . . . . 20 2.2.2 CostsofOperations . . . . . . . . . . . . . . . . . . . . . . . . 21 2.3 HardwareFreeLunch? . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.3.1 3DIntegration . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3.2 NovelMaterialsandProcesses . . . . . . . . . . . . . . . . . 25 2.3.3 Special-PurposeAccelerators . . . . . . . . . . . . . . . . . 26 2.3.4 ExistingParallelSoftware . . . . . . . . . . . . . . . . . . . 26 2.4 SoftwareDesignImplications. . . . . . . . . . . . . . . . . . . . . . . 27 iii iv CONTENTS 3 ToolsoftheTrade 29 3.1 ScriptingLanguages . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2 POSIXMultiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2.1 POSIXProcessCreationandDestruction . . . . . . . . . . . 30 3.2.2 POSIXThreadCreationandDestruction . . . . . . . . . . . 32 3.2.3 POSIXLocking. . . . . . . . . . . . . . . . . . . . . . . . . 33 3.2.4 POSIXReader-WriterLocking. . . . . . . . . . . . . . . . . 36 3.3 AtomicOperations . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.4 Linux-KernelEquivalentstoPOSIXOperations . . . . . . . . . . . . 40 3.5 TheRightToolfortheJob: HowtoChoose? . . . . . . . . . . . . . . 42 4 Counting 43 4.1 WhyIsn’tConcurrentCountingTrivial? . . . . . . . . . . . . . . . . 44 4.2 StatisticalCounters . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.2.1 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.2.2 Array-BasedImplementation . . . . . . . . . . . . . . . . . . 46 4.2.3 EventuallyConsistentImplementation . . . . . . . . . . . . . . 47 4.2.4 Per-Thread-Variable-BasedImplementation . . . . . . . . . . 49 4.2.5 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.3 ApproximateLimitCounters . . . . . . . . . . . . . . . . . . . . . . . 51 4.3.1 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.3.2 SimpleLimitCounterImplementation . . . . . . . . . . . . . 52 4.3.3 SimpleLimitCounterDiscussion . . . . . . . . . . . . . . . . 57 4.3.4 ApproximateLimitCounterImplementation . . . . . . . . . . 57 4.3.5 ApproximateLimitCounterDiscussion . . . . . . . . . . . . 58 4.4 ExactLimitCounters . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.4.1 AtomicLimitCounterImplementation . . . . . . . . . . . . 58 4.4.2 AtomicLimitCounterDiscussion . . . . . . . . . . . . . . . 62 4.4.3 Signal-TheftLimitCounterDesign . . . . . . . . . . . . . . 64 4.4.4 Signal-TheftLimitCounterImplementation . . . . . . . . . . 65 4.4.5 Signal-TheftLimitCounterDiscussion . . . . . . . . . . . . . 67 4.5 ApplyingSpecializedParallelCounters . . . . . . . . . . . . . . . . 70 4.6 ParallelCountingDiscussion . . . . . . . . . . . . . . . . . . . . . . . 71 5 PartitioningandSynchronizationDesign 73 5.1 PartitioningExercises . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.1.1 DiningPhilosophersProblem . . . . . . . . . . . . . . . . . 73 5.1.2 Double-EndedQueue . . . . . . . . . . . . . . . . . . . . . . . 77 5.1.3 PartitioningExampleDiscussion . . . . . . . . . . . . . . . . 85 5.2 DesignCriteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.3 SynchronizationGranularity . . . . . . . . . . . . . . . . . . . . . . . 87 5.3.1 SequentialProgram . . . . . . . . . . . . . . . . . . . . . . . 88 5.3.2 CodeLocking . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.3.3 DataLocking . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.3.4 DataOwnership . . . . . . . . . . . . . . . . . . . . . . . . 93 5.3.5 LockingGranularityandPerformance . . . . . . . . . . . . . 94 5.4 ParallelFastpath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.1 Reader/WriterLocking . . . . . . . . . . . . . . . . . . . . . 98 5.4.2 HierarchicalLocking . . . . . . . . . . . . . . . . . . . . . . 98 5.4.3 ResourceAllocatorCaches . . . . . . . . . . . . . . . . . . . 98 CONTENTS v 5.5 PerformanceSummary . . . . . . . . . . . . . . . . . . . . . . . . . 105 6 Locking 107 6.1 StayingAlive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.1.1 Deadlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.1.2 LivelockandStarvation . . . . . . . . . . . . . . . . . . . . 116 6.1.3 Unfairness . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 6.1.4 Inefficiency . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 6.2 TypesofLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 6.2.1 ExclusiveLocks . . . . . . . . . . . . . . . . . . . . . . . . 119 6.2.2 Reader-WriterLocks . . . . . . . . . . . . . . . . . . . . . . 119 6.2.3 BeyondReader-WriterLocks . . . . . . . . . . . . . . . . . 120 6.3 LockingImplementationIssues . . . . . . . . . . . . . . . . . . . . . . 121 6.3.1 SampleExclusive-LockingImplementationBasedonAtomic Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.3.2 OtherExclusive-LockingImplementations . . . . . . . . . . 122 6.4 Lock-BasedExistenceGuarantees . . . . . . . . . . . . . . . . . . . 123 6.5 Locking: HeroorVillain?. . . . . . . . . . . . . . . . . . . . . . . . 125 7 DataOwnership 127 8 DeferredProcessing 129 8.1 ReferenceCounting . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 8.1.1 ImplementationofReference-CountingCategories . . . . . . 130 8.1.2 LinuxPrimitivesSupportingReferenceCounting . . . . . . . 135 8.1.3 CounterOptimizations . . . . . . . . . . . . . . . . . . . . . 136 8.2 SequenceLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 8.3 Read-CopyUpdate(RCU) . . . . . . . . . . . . . . . . . . . . . . . 139 8.3.1 IntroductiontoRCU . . . . . . . . . . . . . . . . . . . . . . 139 8.3.2 RCUFundamentals . . . . . . . . . . . . . . . . . . . . . . . 143 8.3.3 RCUUsage . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 8.3.4 RCULinux-KernelAPI . . . . . . . . . . . . . . . . . . . . 165 8.3.5 “Toy”RCUImplementations . . . . . . . . . . . . . . . . . . . 171 8.3.6 RCUExercises . . . . . . . . . . . . . . . . . . . . . . . . . 190 9 ApplyingRCU 191 9.1 RCUandPer-Thread-Variable-BasedStatisticalCounters . . . . . . . . 191 9.1.1 Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 9.1.2 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.1.3 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.2 RCUandCountersforRemovableI/ODevices . . . . . . . . . . . . 194 10 Validation: DebuggingandAnalysis 195 10.1 Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 10.2 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 10.3 StaticAnalysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 10.4 ProbabilityandHeisenbugs . . . . . . . . . . . . . . . . . . . . . . . 195 10.5 Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 10.6 DifferentialProfiling . . . . . . . . . . . . . . . . . . . . . . . . . . 195 10.7 PerformanceEstimation. . . . . . . . . . . . . . . . . . . . . . . . . 195 vi CONTENTS 11 DataStructures 197 11.1 Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 11.2 ComputationalComplexityandPerformance . . . . . . . . . . . . . .197 11.3 DesignTradeoffs . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 11.4 Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 11.5 BitsandBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 11.6 HardwareConsiderations . . . . . . . . . . . . . . . . . . . . . . . . .197 12 AdvancedSynchronization 199 12.1 AvoidingLocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 12.2 MemoryBarriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 12.2.1 MemoryOrderingandMemoryBarriers . . . . . . . . . . . . 199 12.2.2 IfBFollowsA,andCFollowsB,WhyDoesn’tCFollowA? . 200 12.2.3 VariablesCanHaveMoreThanOneValue . . . . . . . . . . 202 12.2.4 WhatCanYouTrust? . . . . . . . . . . . . . . . . . . . . . . 203 12.2.5 ReviewofLockingImplementations . . . . . . . . . . . . . . 208 12.2.6 AFewSimpleRules . . . . . . . . . . . . . . . . . . . . . . 209 12.2.7 AbstractMemoryAccessModel . . . . . . . . . . . . . . . . 209 12.2.8 DeviceOperations . . . . . . . . . . . . . . . . . . . . . . . . 211 12.2.9 Guarantees . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 12.2.10WhatAreMemoryBarriers? . . . . . . . . . . . . . . . . . . 212 12.2.11LockingConstraints . . . . . . . . . . . . . . . . . . . . . . 223 12.2.12Memory-BarrierExamples . . . . . . . . . . . . . . . . . . . 224 12.2.13TheEffectsoftheCPUCache . . . . . . . . . . . . . . . . . 225 12.2.14WhereAreMemoryBarriersNeeded? . . . . . . . . . . . . . .227 12.3 Non-BlockingSynchronization . . . . . . . . . . . . . . . . . . . . . 228 12.3.1 SimpleNBS . . . . . . . . . . . . . . . . . . . . . . . . . . 228 12.3.2 HazardPointers . . . . . . . . . . . . . . . . . . . . . . . . . 228 12.3.3 AtomicDataStructures . . . . . . . . . . . . . . . . . . . . . 228 12.3.4 “Macho”NBS . . . . . . . . . . . . . . . . . . . . . . . . . 228 13 EaseofUse 229 13.1 RustyScaleforAPIDesign . . . . . . . . . . . . . . . . . . . . . . . 229 13.2 ShavingtheMandelbrotSet. . . . . . . . . . . . . . . . . . . . . . . 230 14 TimeManagement 233 15 ConflictingVisionsoftheFuture 235 15.1 TheFutureofCPUTechnologyAin’tWhatitUsedtoBe . . . . . . . 235 15.1.1 UniprocessorÜberAlles . . . . . . . . . . . . . . . . . . . . 236 15.1.2 MultithreadedMania . . . . . . . . . . . . . . . . . . . . . . .237 15.1.3 MoreoftheSame . . . . . . . . . . . . . . . . . . . . . . . . 238 15.1.4 CrashDummiesSlammingintotheMemoryWall . . . . . . . 238 15.2 TransactionalMemory . . . . . . . . . . . . . . . . . . . . . . . . . 240 15.2.1 I/OOperations . . . . . . . . . . . . . . . . . . . . . . . . . . 241 15.2.2 RPCOperations . . . . . . . . . . . . . . . . . . . . . . . . 242 15.2.3 Memory-MappingOperations . . . . . . . . . . . . . . . . . 243 15.2.4 MultithreadedTransactions. . . . . . . . . . . . . . . . . . . 244 15.2.5 Extra-TransactionalAccesses . . . . . . . . . . . . . . . . . 245 15.2.6 TimeDelays . . . . . . . . . . . . . . . . . . . . . . . . . . 246 CONTENTS vii 15.2.7 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 15.2.8 Reader-WriterLocking . . . . . . . . . . . . . . . . . . . . . .247 15.2.9 Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 15.2.10DynamicLinkingandLoading . . . . . . . . . . . . . . . . . 249 15.2.11Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 15.2.12Theexec()SystemCall . . . . . . . . . . . . . . . . . . . . . 250 15.2.13RCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 15.2.14Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 15.3 Shared-MemoryParallelFunctionalProgramming . . . . . . . . . . . 254 15.4 Process-BasedParallelFunctionalProgramming. . . . . . . . . . . . 254 A ImportantQuestions 255 A.1 WhatDoes“After”Mean? . . . . . . . . . . . . . . . . . . . . . . . 255 B SynchronizationPrimitives 259 B.1 OrganizationandInitialization . . . . . . . . . . . . . . . . . . . . . 259 B.1.1 smp_init(): . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 B.2 ThreadCreation,Destruction,andControl . . . . . . . . . . . . . . . 260 B.2.1 create_thread() . . . . . . . . . . . . . . . . . . . . . . . . . 260 B.2.2 smp_thread_id() . . . . . . . . . . . . . . . . . . . . . . . . 260 B.2.3 for_each_thread() . . . . . . . . . . . . . . . . . . . . . . . . 260 B.2.4 for_each_running_thread() . . . . . . . . . . . . . . . . . . . . 261 B.2.5 wait_thread() . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 B.2.6 wait_all_threads() . . . . . . . . . . . . . . . . . . . . . . . . 261 B.2.7 ExampleUsage . . . . . . . . . . . . . . . . . . . . . . . . . . 261 B.3 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 B.3.1 spin_lock_init() . . . . . . . . . . . . . . . . . . . . . . . . . 262 B.3.2 spin_lock() . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 B.3.3 spin_trylock() . . . . . . . . . . . . . . . . . . . . . . . . . . 262 B.3.4 spin_unlock() . . . . . . . . . . . . . . . . . . . . . . . . . . 262 B.3.5 ExampleUsage . . . . . . . . . . . . . . . . . . . . . . . . . 263 B.4 Per-ThreadVariables . . . . . . . . . . . . . . . . . . . . . . . . . . 263 B.4.1 DEFINE_PER_THREAD() . . . . . . . . . . . . . . . . . . 263 B.4.2 DECLARE_PER_THREAD() . . . . . . . . . . . . . . . . . 263 B.4.3 per_thread() . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 B.4.4 __get_thread_var() . . . . . . . . . . . . . . . . . . . . . . . 263 B.4.5 init_per_thread() . . . . . . . . . . . . . . . . . . . . . . . . 264 B.4.6 UsageExample . . . . . . . . . . . . . . . . . . . . . . . . . 264 B.5 Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 C WhyMemoryBarriers? 265 C.1 CacheStructure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 C.2 Cache-CoherenceProtocols . . . . . . . . . . . . . . . . . . . . . . . .267 C.2.1 MESIStates . . . . . . . . . . . . . . . . . . . . . . . . . . 268 C.2.2 MESIProtocolMessages . . . . . . . . . . . . . . . . . . . . 268 C.2.3 MESIStateDiagram . . . . . . . . . . . . . . . . . . . . . . 269 C.2.4 MESIProtocolExample . . . . . . . . . . . . . . . . . . . . . 271 C.3 StoresResultinUnnecessaryStalls. . . . . . . . . . . . . . . . . . . . 271 C.3.1 StoreBuffers . . . . . . . . . . . . . . . . . . . . . . . . . . 272 C.3.2 StoreForwarding . . . . . . . . . . . . . . . . . . . . . . . . 273 viii CONTENTS C.3.3 StoreBuffersandMemoryBarriers . . . . . . . . . . . . . . 274 C.4 StoreSequencesResultinUnnecessaryStalls . . . . . . . . . . . . . .277 C.4.1 InvalidateQueues . . . . . . . . . . . . . . . . . . . . . . . . .277 C.4.2 InvalidateQueuesandInvalidateAcknowledge . . . . . . . . 278 C.4.3 InvalidateQueuesandMemoryBarriers . . . . . . . . . . . . 278 C.5 ReadandWriteMemoryBarriers. . . . . . . . . . . . . . . . . . . . . 281 C.6 ExampleMemory-BarrierSequences . . . . . . . . . . . . . . . . . . 282 C.6.1 Ordering-HostileArchitecture . . . . . . . . . . . . . . . . . 282 C.6.2 Example1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 C.6.3 Example2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 C.6.4 Example3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 C.7 Memory-BarrierInstructionsForSpecificCPUs . . . . . . . . . . . . 285 C.7.1 Alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .287 C.7.2 AMD64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 C.7.3 ARMv7-A/R . . . . . . . . . . . . . . . . . . . . . . . . . . 289 C.7.4 IA64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 C.7.5 PA-RISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 C.7.6 POWER/PowerPC . . . . . . . . . . . . . . . . . . . . . . 292 C.7.7 SPARCRMO,PSO,andTSO . . . . . . . . . . . . . . . . . 292 C.7.8 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 C.7.9 zSeries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 C.8 AreMemoryBarriersForever? . . . . . . . . . . . . . . . . . . . . . 295 C.9 AdvicetoHardwareDesigners . . . . . . . . . . . . . . . . . . . . . 295 D Read-CopyUpdateImplementations 297 D.1 SleepableRCUImplementation . . . . . . . . . . . . . . . . . . . . .297 D.1.1 SRCUImplementationStrategy . . . . . . . . . . . . . . . . 298 D.1.2 SRCUAPIandUsage . . . . . . . . . . . . . . . . . . . . . 299 D.1.3 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . 302 D.1.4 SRCUSummary . . . . . . . . . . . . . . . . . . . . . . . . 306 D.2 HierarchicalRCUOverview . . . . . . . . . . . . . . . . . . . . . . 306 D.2.1 ReviewofRCUFundamentals . . . . . . . . . . . . . . . . . .307 D.2.2 BriefOverviewofClassicRCUImplementation . . . . . . . .307 D.2.3 RCUDesiderata . . . . . . . . . . . . . . . . . . . . . . . . 308 D.2.4 TowardsaMoreScalableRCUImplementation . . . . . . . . 309 D.2.5 TowardsaGreenerRCUImplementation . . . . . . . . . . . . 311 D.2.6 StateMachine. . . . . . . . . . . . . . . . . . . . . . . . . . 312 D.2.7 UseCases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 D.2.8 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 D.2.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 D.3 HierarchicalRCUCodeWalkthrough . . . . . . . . . . . . . . . . . 325 D.3.1 DataStructuresandKernelParameters . . . . . . . . . . . . 325 D.3.2 ExternalInterfaces . . . . . . . . . . . . . . . . . . . . . . . 334 D.3.3 Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . 340 D.3.4 CPUHotplug . . . . . . . . . . . . . . . . . . . . . . . . . . 344 D.3.5 MiscellaneousFunctions . . . . . . . . . . . . . . . . . . . . 349 D.3.6 Grace-Period-DetectionFunctions . . . . . . . . . . . . . . . 350 D.3.7 Dyntick-IdleFunctions . . . . . . . . . . . . . . . . . . . . . 359 D.3.8 ForcingQuiescentStates . . . . . . . . . . . . . . . . . . . . 365 D.3.9 CPU-StallDetection . . . . . . . . . . . . . . . . . . . . . . . 371 CONTENTS ix D.3.10 PossibleFlawsandChanges . . . . . . . . . . . . . . . . . . 374 D.4 PreemptibleRCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 D.4.1 ConceptualRCU . . . . . . . . . . . . . . . . . . . . . . . . 375 D.4.2 OverviewofPreemptibleRCUAlgorithm . . . . . . . . . . . 376 D.4.3 ValidationofPreemptibleRCU . . . . . . . . . . . . . . . . . 391 E Read-CopyUpdateinLinux 395 E.1 RCUUsageWithinLinux. . . . . . . . . . . . . . . . . . . . . . . . 395 E.2 RCUEvolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 E.2.1 2.6.27LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 395 E.2.2 2.6.28LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 395 E.2.3 2.6.29LinuxKernel . . . . . . . . . . . . . . . . . . . . . . .397 E.2.4 2.6.31LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 398 E.2.5 2.6.32LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 398 E.2.6 2.6.33LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 398 E.2.7 2.6.34LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 399 E.2.8 2.6.35LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 399 E.2.9 2.6.36LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 399 E.2.10 2.6.37LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 399 E.2.11 2.6.38LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 400 E.2.12 2.6.39LinuxKernel . . . . . . . . . . . . . . . . . . . . . . 400 E.2.13 WhatComesAfter2.6.39? . . . . . . . . . . . . . . . . . . . 400 F FormalVerification 403 F.1 WhatarePromelaandSpin? . . . . . . . . . . . . . . . . . . . . . . 403 F.2 PromelaExample: Non-AtomicIncrement . . . . . . . . . . . . . . . 404 F.3 PromelaExample: AtomicIncrement . . . . . . . . . . . . . . . . . .407 F.3.1 CombinatorialExplosion . . . . . . . . . . . . . . . . . . . . .407 F.4 HowtoUsePromela . . . . . . . . . . . . . . . . . . . . . . . . . . 408 F.4.1 PromelaPeculiarities . . . . . . . . . . . . . . . . . . . . . . 409 F.4.2 PromelaCodingTricks . . . . . . . . . . . . . . . . . . . . . 410 F.5 PromelaExample: Locking . . . . . . . . . . . . . . . . . . . . . . . . 411 F.6 PromelaExample: QRCU . . . . . . . . . . . . . . . . . . . . . . . 413 F.6.1 RunningtheQRCUExample . . . . . . . . . . . . . . . . . .417 F.6.2 HowManyReadersandUpdatersAreReallyNeeded? . . . . 418 F.6.3 AlternativeApproach: ProofofCorrectness . . . . . . . . . . 418 F.6.4 AlternativeApproach: MoreCapableTools . . . . . . . . . . 419 F.6.5 AlternativeApproach: DivideandConquer . . . . . . . . . . 420 F.7 PromelaParable: dynticksandPreemptibleRCU . . . . . . . . . . . 420 F.7.1 IntroductiontoPreemptibleRCUanddynticks . . . . . . . . . 421 F.7.2 ValidatingPreemptibleRCUanddynticks . . . . . . . . . . . 424 F.7.3 Lessons(Re)Learned . . . . . . . . . . . . . . . . . . . . . . 439 F.8 SimplicityAvoidsFormalVerification . . . . . . . . . . . . . . . . . 440 F.8.1 StateVariablesforSimplifiedDynticksInterface . . . . . . . 440 F.8.2 EnteringandLeavingDynticks-IdleMode. . . . . . . . . . . . 441 F.8.3 NMIsFromDynticks-IdleMode . . . . . . . . . . . . . . . . . 441 F.8.4 InterruptsFromDynticks-IdleMode . . . . . . . . . . . . . . 443 F.8.5 CheckingForDynticksQuiescentStates. . . . . . . . . . . . 443 F.8.6 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 F.9 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 x CONTENTS G AnswerstoQuickQuizzes 447 G.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .447 G.2 HardwareanditsHabits. . . . . . . . . . . . . . . . . . . . . . . . . 454 G.3 ToolsoftheTrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . .457 G.4 Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 G.5 PartitioningandSynchronizationDesign . . . . . . . . . . . . . . . . 478 G.6 Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 G.7 DeferredProcessing . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 G.8 ApplyingRCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 G.9 AdvancedSynchronization . . . . . . . . . . . . . . . . . . . . . . . 514 G.10 EaseofUse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 G.11 ConflictingVisionsoftheFuture . . . . . . . . . . . . . . . . . . . . 518 G.12 ImportantQuestions. . . . . . . . . . . . . . . . . . . . . . . . . . . 519 G.13 SynchronizationPrimitives . . . . . . . . . . . . . . . . . . . . . . . 519 G.14 WhyMemoryBarriers? . . . . . . . . . . . . . . . . . . . . . . . . . 520 G.15 Read-CopyUpdateImplementations . . . . . . . . . . . . . . . . . . 524 G.16 FormalVerification . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 H Glossary 549 I Credits 573 I.1 Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573 I.2 Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573 I.3 MachineOwners . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 I.4 OriginalPublications . . . . . . . . . . . . . . . . . . . . . . . . . . 574 I.5 FigureCredits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 I.6 OtherSupport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.