From b3cd30f4c9bf42374394f025056b9c06e1166d15 Mon Sep 17 00:00:00 2001 From: Wei-Hsin Yeh Date: Fri, 28 Jun 2024 14:04:28 +0800 Subject: [PATCH] Add new section "Shared Resources" and "Lock-Free" Expand the shared resources from the programmer's view in "Read Modify Write" to the cache-line perspective in section "Shared Resources". Move the original "Cache effects and false sharing" to "Shared Resources". Add an explanation of how the scalability of locks will be limited by cache coherence. Change the title of Section "Atomic operations as building blocks" to "Concurrency tools and synchronization mechanisms". Introduce a blocking mechanism with its issues, including waiting times, deadlock, and scalability. Give an example of how synchronization without using a lock can also lead to a livelock. Introduce the three types of progress, which are wait-free, lock-free, and obstruction-free. - Add a figure containing three tables showing the progress of every thread and the progress of the overall system. Give a SPMC problem to explain how to achieve fully lock-free by using algorithms and data structure designs with appropriate synchronization mechanisms and concurrency tools. - Add two flowcharts: one for "lock-based" solution 1 and another for "lock-based and lock-free" solution 2 and a diagram illustrating different data structures to show different data structures. --- concurrency-primer.tex | 359 ++++++++++++++++++++++++++++++-------- images/false-sharing.pdf | Bin 0 -> 9280 bytes images/progress-type.pdf | Bin 0 -> 10242 bytes images/spinlock.pdf | Bin 0 -> 9908 bytes images/spmc-solution1.pdf | Bin 0 -> 11675 bytes images/spmc-solution2.pdf | Bin 0 -> 9623 bytes images/spmc-solution3.pdf | Bin 0 -> 9657 bytes 7 files changed, 290 insertions(+), 69 deletions(-) create mode 100644 images/false-sharing.pdf create mode 100644 images/progress-type.pdf create mode 100644 images/spinlock.pdf create mode 100644 images/spmc-solution1.pdf create mode 100644 images/spmc-solution2.pdf create mode 100644 images/spmc-solution3.pdf diff --git a/concurrency-primer.tex b/concurrency-primer.tex index d531e32..292a72c 100644 --- a/concurrency-primer.tex +++ b/concurrency-primer.tex @@ -221,7 +221,7 @@ \section{Background} A stall, or suspension of forward progress, occurs when an instruction awaits the outcome of a preceding one in the pipeline until the necessary result becomes available.} or to optimize data locality.\punckern\footnote{% \textsc{RAM} accesses data not byte by byte, but in larger units known as \introduce{cache lines}. Grouping frequently used variables on the same cache line means they are processed together, -significantly boosting performance. However, as discussed in \secref{false-sharing}, +significantly boosting performance. However, as discussed in \secref{shared-resources}, this strategy can lead to complications when cache lines are shared across cores.} Variables may be allocated to the same memory location if their usage does not overlap. @@ -506,7 +506,6 @@ \subsection{Compare and swap} It uses atomic \textsc{CAS} to ensure that Modify is atomic, coupled with a while loop to ensure that the entire \textsc{RMW} can behave atomically. -~\\ However, atomic \textsc{RMW} operations here are merely a programming tool for programmers to achieve program logic correctness. Its actual execution as atomic operations depends on the how compiler translate it into actual atomic instructions based on differenct hardware instruction set. \introduce{Exchange}, \introduce{Fetch-and-Add}, \introduce{Test-and-set} and \textsc{CAS} in instruction level are different style of atomic \textsc{RMW} instructions. @@ -582,14 +581,78 @@ \subsection{Further improvements} Without specifying, atomic operations in \clang{}11 atomic library use \monobox{memory\_order\_seq\_cst} as default memory order. Operations post-fix with \monobox{\_explicit} accept an additional argument to specify which memory order to use. How to leverage memory orders to optimize performance will be covered later in \secref{lock-example}. -\section{Atomic operations as building blocks} +\section{Shared Resources} +\label{shared-resources} +From \secref{rmw}, we have understood that there are two types of shared resources that need to be considered. +The first type is shared resources that concurrent threads will access in order to collaborate to achieve a goal. +The second type is shared resources that serve as a communication channel for concurrent threads, +ensuring correct access to shared resources. +However, all of these considerations stem from a programming perspective, +where we only distinguish between shared resources and private resources. + +Given all the complexities to consider, modern hardware adds another layer to the puzzle, +as depicted in \fig{fig:dunnington}. +Remember, memory moves between the main \textsc{RAM} and the \textsc{CPU} in segments known as cache lines. +These cache lines also represent the smallest unit of data transferred between cores and caches. +When one core writes a value and another reads it, +the entire cache line containing that value must be transferred from the first core's cache(s) to the second core's cache(s), +ensuring a coherent ``view'' of memory across cores. This dynamic can significantly affect performance. + +This slowdown is even more insidious when it occurs between unrelated variables that happen to be placed on the same shared resource, +which is the cache line, as shown in \fig{fig:false-sharing}. +When designing concurrent data structures or algorithms, +this \introduce{false sharing} must be taken into account. +One way to avoid it is to pad atomic variables with a cache line of private data, +but this is obviously a large space-time trade-off. + +\includegraphics[keepaspectratio, width=0.6\linewidth]{images/false-sharing} +\captionof{figure}{Processor 1 and Processor 2 operate independently on variables A and B. +Simultaneously, they read the cache line containing these two variables. +In the next time step, each processor modifies A and B in their private L1 cache separately. +Subsequently, both processors write their modified cache line to the shared L2 cache. +At this moment, the expansion of the scope of shared resources to encompass cache lines highlights the importance of considering cache coherence issues.} +\label{fig:false-sharing} + +Not only shared resources, +but we also need to consider shared resources that serve as a communication channel, e.g. spinlock (see \secref{spinlock}). +Processors using locks as a communication channel also need to transfer the cache line. +When a processor broadcasts the release of a lock, +multiple processors on different chips attempt to acquire the lock simultaneously. +To ensure a consistent state of the lock across all private L1 cache lines, +which is a part of cache coherence, +the cache line containing the lock will be continually transferred among the caches of those cores. +Unless the critical sections are considerably lengthy, +the time spent managing this cache line movement could exceed the time spent within the critical sections themselves,\punckern\footnote{% +This situation underlines how some systems may experience a cache miss that is substantially more costly than an atomic \textsc{RMW} operation, +as discussed in Paul~E.\ McKenney's +\href{https://www.youtube.com/watch?v=74QjNwYAJ7M}{talk from CppCon~2017} +for a deeper exploration.} +despite the algorithm's non-blocking nature. + +With these high communication costs, there may be only one processor that succeeds in acquiring it again in the case of mutex lock or spinlock, as shown in \fig{fig:spinlock}. +Then the other processors that have not successfully acquired the lock will continue to wait, +resulting in little practical benefit (only one processor gains the lock) and significant communication overhead. +This disparity severely limits the scalability of the spin lock. + +\includegraphics[keepaspectratio, width=0.9\linewidth]{images/spinlock} +\captionof{figure}{Three processors use lock as a communication channel to insure the access operations to the shared L2 cache will be correct. +Processors 2 and 3 are trying to acquire a lock that is held by processor 1. +Therefore, when processor 1 unlocks, +the state of lock needs to be updated on other processors' private L1 cache.} +\label{fig:spinlock} +\section{Concurrency tools and synchronization mechanisms} +\label{concurrency-tool} Atomic loads, stores, and \textsc{RMW} operations are the building blocks for every single concurrency tool. It is useful to split those tools into two camps: \introduce{blocking} and \introduce{lockless}. -Blocking synchronization methods are generally easier to understand, -but they can cause threads to pause for unpredictable durations. +As mentioned in \secref{rmw}, multiple threads can use these blocking tools to communicate with others. +Furthermore, these blocking tools can even assist in synchronization between threads. +The blocking mechanism is quite simple, +because all threads need to do is block others in order to make their own progress. +However, this simplicity can also cause threads to pause for unpredictable durations and then influence the progress of the overall system. + Take a mutex as an example: it requires threads to access shared data sequentially. If a thread locks the mutex and another attempts to lock it too, @@ -598,30 +661,227 @@ \section{Atomic operations as building blocks} Additionally, blocking mechanisms are prone to \introduce{deadlock} and \introduce{livelock}, issues that lead to the system becoming immobilized as threads perpetually wait on each other. -In contrast, lockless synchronization methods ensure that the program is always making forward progress. -These are \introduce{non-blocking} since no thread can cause another to wait indefinitely. -Consider a program that streams audio, -or an embedded system where a sensor triggers an interrupt service routine (\textsc{ISR}) when new data arrives. -We want lock-free algorithms and data structures in these situations, -since blocking could break them. -(In the first case, the user's audio will begin to stutter if sound data is not provided at the bitrate it is consumed. -In the second, subsequent sensor inputs could be missed if the \textsc{isr} does not complete as quickly as possible.) - -% FIXME: remove this hack -% LaTeX provides 9 symbols when using symbol option, therefore it produces an error if we count higher. -\setcounter{footnote}{0} -Lockless algorithms are not inherently superior or quicker than blocking ones; -they serve different purposes with their own design philosophies. -Additionally, the mere use of atomic operations does not render algorithms lock-free. -For example, basic spinlock is still considered a blocking algorithm even though it eschews \textsc{OS}-specific syscalls for making the blocked thread sleep. -Putting a blocked thread to sleep is often an optimization, -allowing the operating system's scheduler to allocate \textsc{CPU} resources to active threads until the blocked one is revived. -Some concurrency libraries even introduce hybrid locks that combine brief spinning with sleeping to balance \textsc{CPU} usage and context-switching overheads. - -Both blocking and lockless approaches have their place in software development. -When performance is a key consideration, it is crucial to profile your application. -The performance impact varies with numerous factors, such as thread count and \textsc{CPU} architecture specifics. -Balancing complexity and performance is essential in concurrency, a domain fraught with challenges. +If the first thread acquires a mutex first, +then the second thread locks another mutex and subsequently attempts to lock the mutex held by the first thread. +At the same time, the first thread also tries to lock the mutex held by the second thread. +Then the deadlock occurs. +Therefore, we can see that deadlock occurs when different threads acquire locks in incompatible orders, +leading to system immobilization as threads perpetually wait on each other. + +Additionally, in \secref{shared-resources}, +we can see another problem with the lock: its scalability is limited. + +After understanding the issue that blocking mechanisms are prone to, +we try to achieve synchronization between threads without lock. +Consider the program below: if there is only a single thread, execute these operations as follows: + +\begin{cppcode} +while (x == 0) + x = 1 - x; +\end{cppcode} + +When executed by a single thread, these operations complete within a finite time. +However, with two threads executing concurrently, +if one thread executes \cpp|x = 1 - x| and the other thread executes \cpp|x = 1 - x| subsequently, +then the value of x will always be 0, which will lead to a livelock. +Therefore, even without any locks in concurrent threads, +we still cannot guarantee that the overall system can make progress toward achieving the programmer's goals. + +Consequently, we should not focus on comparing which communication tools or synchronization mechanisms are better, +but rather on exploring how to effectively use these tools in a given scenario to facilitate smooth communication between threads and achieve the programmer's goals. + +\section{Lock free} +In \secref{concurrency-tool}, we explored different mechanisms based on the characteristics of concurrency tools, +as described in \secref{atomicity} and \secref{rmw}. +In this section, we need to explore which strategies can help programmers to design a concurrency program +that allows concurrent threads to collectively ensure progress in the overall system while also improving scalability, +which is the initial goal of designing a concurrency program. +First of all, we must figure out the scope of our problem. +Understanding the relationship between the progress of each thread and the progress of the entire system is necessary. + +\subsection{Type of progress} +When we consider the scenario where many concurrent threads collaborate and each thread is divided into many operations, + +\textbf{Wait-Free} Every operation in every thread will be completed within a limited time. +This also implies that each operation contributes to the overall progress of the system. + +\textbf{Lock-Free} At any given moment, among all operations in every thread, +at least one operation contributes to the overall progress of the system. +However, it does not guarantee that starvation will not occur. + +\textbf{Obstruction-Free} At any given time, if there is only a single thread operating without interference from other threads, +its instructions can be completed within a finite time. However, when threads are working concurrently, +it does not guarantee progress. + +Therefore, we can understand their three relationships as follows: +obstruction-free includes lock-free and lock-free includes wait-free. +Achieving wait-free is the most optimal approach, +allowing each thread to make progress without being blocked by other threads. + +\includegraphics[keepaspectratio, width=1 \linewidth]{images/progress-type} +\captionof{figure}{In a wait-free system, each thread is guaranteed to make progress at every moment because no thread can block others. +This ensures that the overall system can always make progress. +In a lock-free system, at Time 1, Thread 1 may cause other threads to wait while it performs its operation. +However, even if Thread 1 suspends at Time 2, it does not subsequently block other threads. +This allows Thread 2 to make progress at Time 3, ensuring that the overall system continues to make progress even if one thread is suspended. +In an obstruction-free system, when Thread 1 is suspended at Time 2, +it causes other threads to be blocked as a result. This means that by Time 3, +Thread 2 and Thread 3 are still waiting, preventing the system from making progress thereafter. +Therefore, obstruction-free systems may halt progress if one thread is suspended, +leading to the potential blocking of other threads and even stalling the system.} +\label{fig:progress-type} + +The main goal is that the whole system, +which contains all concurrent threads, +is always making forward progress. +To achieve this goal, we rely on concurrency tools, +including atomic operation and the operations that perform atomically, as described in \secref{rmw}. +Additionally, we carefully select synchronization mechanism, as described in \secref{concurrency-tool}, +which may involve utilizing shared resources for communication (e.g., spinlock), as described in \secref{shared-resources}. +Furthermore, we design our program with appropriate data structures and algorithms. +Therefore, lock-free doesn't mean we cannot use any lock; +we just need to ensure that the blocking mechanism will not limit the scalability and that the system can avoid the problems described in \secref{concurrency-tool} (e.g., long time of waiting, deadlock). + +Next, we take the single producer and multiple consumers problem as an example to demonstrate how to achieve fully lock-free programming by improving some implementations step by step.\punckern\footnote{% +The first three solutions, which are \secref{spmc-solution1}, \secref{spmc-solution2}, and \secref{spmc-solution3}, are referenced in the Herb Sutter's +\href{https://youtu.be/c1gO9aB9nbs?si=7qJs-0qZAVqLHr1P}{talk from CppCon~2014.}} +This problem is that one producer generates tasks and adds them to a job queue, +and multiple consumers take tasks from the job queue and execute them. +\subsection{SPMC solution - lock-based} +\label{spmc-solution1} +Firstly, introduce the scenario of lock-based algorithms. +At any time, there is only one consumer that can get the lock to access the job queue. +This is because in this scenario, the lock is mutex lock, also known as a mutual exclusive lock. +Not until the consumer releases the lock are the other consumers blocked when attempting to access the job queue. + +The following text explains the meaning of each state in the \fig{fig:spmc-solution1}. + +\textbf{state 1} : The producer is adding tasks to the job queue while multiple consumers wait for tasks to become available and is ready to take on any job that appears in the job queue. + +\textbf{state 2} \to \textbf{state 3} : After the producer adds a task to the job queue, +the producer releases the mutex lock, and then wake the consumers up. +Those consumers tried to acquire the lock of the job queue for the job before. + +\textbf{state 3} \to \textbf{state 4} : Consumer 1 acquires the mutex lock for the job queue, +retrieves a task from it, and then releases the mutex lock. + +\textbf{state 5} : Next, other consumers attempt to acquire the mutex lock for the job queue. +However, after they acquire the lock, they find no tasks in the queue. +This is because the producer has not added more tasks to the job queue. + +\textbf{state 6} : Consequently, the consumers wait on a condition variable. +During this time, the consumers are not busy waiting but rather waiting for the producer to wake it up. +This is because the mechanism is an advanced form of mutex lock. + +\includegraphics[keepaspectratio, width=0.6\linewidth]{images/spmc-solution1} +\captionof{figure}{The interaction between the producer and consumer in SPMC Solution 1, +including their state transitions.} +\label{fig:spmc-solution1} + +The reason why this implementation is not lock-free is: +First, if a producer suspends, +it causes consumers to have no job available, +leading them to block and thus halting progress in the entire system, +which is obstruction-free, as shown in the \fig{fig:progress-type}. +Secondly, consumers concurrently need to access shared resources, which is the job. +Then, one consumer acquires the lock of the job queue but suddenly gets suspended before completing without unlocking, +causing other consumers to be blocked. +Meanwhile, the producer still keeps adding jobs, but the system fails to make any progress, +which is obstruction-free, as shown in the \fig{fig:progress-type}. +Therefore, neither the former nor the latter implementation approach is lock-free. + +\subsection{SPMC solution - lock-based and lock-free} +\label{spmc-solution2} +As described in \secref{spmc-solution1}, there is a problem when the producer suspends; +the whole system cannot make any progress. +Additionally, consumers contend for the lock of the job queue to access the job; +however, after they acquire the lock, they may still need to wait when the queue is empty. +To solve this issue, the introduction of lock-based and lock-free algorithm is presented in this section. + +The following text explains the meaning of each state in the \fig{fig:spmc-solution2}. + +\textbf{state 0} : The producer prepares all the jobs in advance. + +\textbf{state 1} : Consumer 1 acquires the lock on the job queue, takes a job, and releases the lock. + +\textbf{state 2} : After consumer 2 acquires the lock, it definitely can find that there are still jobs in the queue. + +Through this approach, once a consumer obtains the lock on the job queue, +there is guaranteed job available unless all jobs have been taken by other consumers. +Thus, there is no need to wait due to a lack of jobs; +the only wait is for acquiring the lock to access the job queue. + +\includegraphics[keepaspectratio, width=0.7\linewidth]{images/spmc-solution2} +\captionof{figure}{The interaction between the producer and consumer in Solution 2, +including their state transitions.} +\label{fig:spmc-solution2} + +This implementation is referred to as both locked-based and lock-free. +The algorithm is designed such that the producer adds all jobs to the job queue before multiple consumers begin taking them. +This design ensures that if the producer suspends or adds the job slowly, +consumers will not be blocked due to the lack of a job. +Consumers just thought they have done all the jobs that the producer added. +Therefore, this implementation qualifies as lock-free, as shown in \fig{fig:progress-type}. +The reason that implementation of getting a job is locked-based, not lock-free, +is the same as the second reason described in \secref{spmc-solution1}. + +\subsection{SPMC solution - fully lock-free} +\label{spmc-solution3} +As described in \secref{shared-resources}, +we can understand that communications between processors across a chip are through cache lines, +which incurs high costs. Additionally, using locks further decreases overall performance and limits scalability. +However, when locks are necessary for concurrent threads to communicate, +reducing the sharing resource and the granularity of the sharing resource to communicate (e.g., spinlock, mutex lock) is crucial. +Therefore, to achieve fully lock-free programming, we change the data structure to reduce the granularity of locks. + +\includegraphics[keepaspectratio, width=1\linewidth]{images/spmc-solution3} +\captionof{figure}{The left side shows that the lock protects the entire job queue to ensure exclusive access to its head for multiple threads. +The right side illustrates that each thread has its own slot for accessing jobs, +not only achieving exclusivity through data structure but also eliminating the need for shared resources for communication.} +\label{fig:spmc-solution3} + +Providing each consumer with their own unique slot to access jobs addresses the problem at its root, +directly avoiding competition. +By doing so, consumers no longer rely on a shared resource for communication. +Consequently, other consumers will not be blocked by a suspended consumer holding a lock. +This approach ensures that the system maintains its progress, +as each consumer operates independently within their own slot, +which is lock-free, as shown in \fig{fig:progress-type}. + +\subsection{SPMC solution - fully lock-free with CAS} +\label{SPMC-solution4} +In addition to reducing granularity, +there is another way to avoid that if one consumer acquires the lock on the job queue but suddenly gets suspended, +causing other consumers to be blocked as described in \secref{spmc-solution2}. +As described in \secref{cas}, we can use \textsc{CAS} with a loop to ensure that the write operation achieves semantic atomicity. + +Unlike \secref{spmc-solution2}, +which uses a shared resource (e.g., advanced form of mutex lock) for blocking synchronization, +the first thread holding the lock causes the other threads to wait until the first thread releases the lock. +As described in \secref{cas}, \textsc{CAS} allows threads that initially failed to acquire the lock to continue to execute Read and Modify. +Therefore, we can conclude that if one thread is blocked, +it indicates that there is another thread is making progress, +which is lock-free, as shown in \fig{fig:progress-type}. + +As described in \secref{spmc-solution2}, a blocking mechanism uses mutex lock; +we can see that only one thread is active when it accesses the job queue. +Although \textsc{CAS} will continue to execute Read and Modify, +it doesn't result in an increase in overall progress. +This is because the operations will be useless when atomic \textsc{CAS} fails. +Therefore, we can understand that lock-free algorithms are not faster than blocking ones. +The reason for using lock-free is to ensure that if one thread is blocked, +it doesn't cause other threads to be blocked, +thereby ensuring that the overall system must make progress over a long period of time. + +\subsection{Conclusion about lock-free} +In conclusion about lockfree, +we can see that both blocking and lockless approaches have their place in software development. +They serve different purposes with their own design philosophies. +When performance is a key consideration, it is crucial to profile your application, +take advantage of every concurrency tool or mechanism, and accompany them with appropriate data structures and algorithms. +The performance impact varies with numerous factors, such as thread count and CPU architecture specifics. +Balancing complexity and performance is essential in concurrency, +a domain fraught with challenges. \section{Sequential consistency on weakly-ordered hardware} @@ -885,7 +1145,7 @@ \subsection{Acquire and release} On \textsc{Arm} and other weakly-ordered architectures, this enables us to eliminate one of the memory barriers in each operation, such that - \begin{cppcode} +\begin{cppcode} int acquireFoo() { return foo.load(memory_order_acquire); @@ -1124,45 +1384,6 @@ \section{Hardware convergence} \textsc{Arm}v8 processors offer dedicated load-acquire and store-release instructions: \keyword{lda} and \keyword{stl}. Hopefully, future \textsc{CPU} architectures will follow suit. -\section{Cache effects and false sharing} -\label{false-sharing} - -Given all the complexities to consider, modern hardware adds another layer to the puzzle. -Remember, memory moves between main \textsc{RAM} and the \textsc{CPU} in segments known as cache lines. -These lines also represent the smallest unit of data transferred between cores and their caches. -When one core writes a value and another reads it, -the entire cache line containing that value must be transferred from the first core's cache(s) to the second, -ensuring a coherent ``view'' of memory across cores. - -This dynamic can significantly affect performance. -Take a readers-writer lock, for example, -which prevents data races by allowing either a single writer or multiple readers access to shared data but not simultaneously. -At its most basic, this concept can be summarized as follows: -\begin{cppcode} -struct RWLock { - int readers; - bool hasWriter; // Zero or one writers -}; -\end{cppcode} -Writers must wait until the \cc|readers| count drops to zero, -while readers can acquire the lock through an atomic \textsc{RMW} operation if \cc|hasWriter| is \cpp|false|. - -At first glance, this approach might seem significantly more efficient than exclusive locking mechanisms (e.g., mutexes or spinlocks) in scenarios where shared data is read more frequently than written. -However, this perspective overlooks the impact of cache coherence. -If multiple readers on different cores attempt to acquire the lock simultaneously, -the cache line containing the lock will constantly be transferred among the caches of those cores. -Unless the critical sections are considerably lengthy, -the time spent managing this cache line movement could exceed the time spent within the critical sections themselves,\punckern\footnote{% -This situation underlines how some systems may experience a cache miss that is substantially more costly than an atomic \textsc{RMW} operation, -as discussed in Paul~E.\ McKenney's -\href{https://www.youtube.com/watch?v=74QjNwYAJ7M}{talk from CppCon~2017} -for a deeper exploration.} -despite the algorithm's non-blocking nature. - -This slowdown is even more insidious when it occurs between unrelated variables that happen to be placed on the same cache line. -When designing concurrent data structures or algorithms, -this \introduce{false sharing} must be taken into account. -One way to avoid it is to pad atomic variables with a cache line of unshared data, but this is obviously a large space-time tradeoff. \section{If concurrency is the question, \texttt{volatile} is not the answer.} % Todo: Add ongoing work from JF's CppCon 2019 talk? diff --git a/images/false-sharing.pdf b/images/false-sharing.pdf new file mode 100644 index 0000000000000000000000000000000000000000..467ab278685dbab87cc98848fd2f0ceb935ca0c4 GIT binary patch literal 9280 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 Ab^rhX literal 0 HcmV?d00001 diff --git a/images/progress-type.pdf b/images/progress-type.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7f2d1a8d050c5cb149fc50e075fcd956a5210739 GIT binary patch literal 10242 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 literal 0 HcmV?d00001 diff --git a/images/spinlock.pdf b/images/spinlock.pdf new file mode 100644 index 0000000000000000000000000000000000000000..79e30585db9d043643ccd51f73d71c9720a717fc GIT binary patch literal 9908 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 o=tciks&Lhovoc1n?e)I+Rc-)7* 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