ScholarQuill logoScholarQuillUniversity Notes
  • Notes
  • Past Papers
  • Blogs
  • Todo
Login
ScholarQuill logoScholarQuillUniversity Notes
Login
NotesPast PapersBlogsTodo
More
SubjectsDiscussionCGPA CalculatorGPA CalculatorStudent PortalCourse Outline
About
About usPrivacy PolicyReportContact
Notes
Past Papers
Blogs
Todo
Analytics
    Current Subject
    🧩
    Parallel & Distributed Computing
    COMP3139
    Progress0 / 33 topics
    Topics
    1. Introduction to Parallel and Distributed Systems2. Why Use Parallel and Distributed Systems?3. Speedup and Amdahl's Law4. Hardware Architectures: Multi Processors (Shared Memory)5. Hardware Architectures: Networks of Workstations (Distributed Memory)6. Hardware Architectures: Clusters (Latest Variation)7. Software Architectures: Threads and Shared Memory8. Software Architectures: Processes and Message Passing9. Software Architectures: Distributed Shared Memory (DSM)10. Software Architectures: Distributed Shared Data (DSD)11. Parallel Algorithms12. Concurrency and Synchronization13. Data and Work Partitioning14. Common Parallelization Strategies15. Granularity16. Load Balancing17. Examples of Parallel Algorithms: Parallel Search18. Examples of Parallel Algorithms: Parallel Sorting19. Shared-Memory Programming20. Threads in Shared-Memory Programming21. P Threads22. Locks and Semaphores23. Distributed-Memory Programming24. Message Passing25. Map Reduce26. Distributed-Memory Programming with PI27. Google's Map Reduce28. Hadoop29. Other Parallel Programming Systems30. Tread Marks31. Distributed Shared Memory32. Aurora: Scoped Behavior and Abstract Data Types33. S Enterprise: Process Templates
    COMP3139›Concurrency and Synchronization
    Parallel & Distributed ComputingTopic 12 of 33

    Concurrency and Synchronization

    9 minread
    1,482words
    Intermediatelevel

    Concurrency and Synchronization

    Concurrency and synchronization are fundamental concepts in computer science, particularly in the realm of parallel and distributed computing. These concepts are crucial for managing multiple tasks or processes that run simultaneously, ensuring that resources are accessed safely, and avoiding issues like race conditions or deadlocks.

    1. Concurrency

    Concurrency refers to the ability of a system to handle multiple tasks or processes at the same time, but not necessarily simultaneously. It allows a system to manage multiple tasks by organizing them in such a way that the execution of those tasks overlaps. Concurrency enables systems to run multiple processes, threads, or tasks in parallel or in a time-shared manner, thus improving system throughput, responsiveness, and resource utilization.

    Key Aspects of Concurrency:

    • Interleaving: In a single-core system, true parallelism may not be possible, but the CPU can switch between different tasks, giving the illusion of simultaneity. This is known as time slicing.
    • Parallelism vs. Concurrency:
      • Parallelism refers to literally executing multiple tasks at the same time, typically on different processors or cores.
      • Concurrency, however, involves structuring tasks such that they can progress independently, whether they execute simultaneously or not. It doesn’t require parallel hardware, only the ability to manage multiple tasks efficiently.
    • Non-blocking: Concurrency allows one task to run while another task is waiting for an event or resource, improving the overall responsiveness of a system.

    2. Why Concurrency is Important

    • Performance: Concurrency can improve performance by making better use of available hardware resources, especially in multi-core systems.
    • Responsiveness: In interactive applications (e.g., web servers, GUI applications), concurrency allows the system to continue responding to user input while background tasks (like network requests or database queries) are processed.
    • Resource Utilization: With concurrency, tasks can be executed when other tasks are waiting (e.g., for I/O operations), leading to more efficient resource usage.

    3. Synchronization

    Synchronization refers to the mechanisms that ensure that multiple concurrent tasks or threads can safely access shared resources (like memory, files, or network resources) without causing inconsistent or unexpected results. Synchronization is essential in concurrent systems to prevent problems like race conditions, deadlocks, and data corruption.

    In concurrent programming, synchronization involves coordinating the execution of processes to ensure that the shared data is consistent and that tasks proceed in the correct order.

    Common Problems in Concurrency:

    1. Race Conditions:

      • A race condition occurs when multiple threads or processes access shared data concurrently, and the outcome depends on the order in which the data is accessed. This can lead to unpredictable behavior.
      • Example: If two threads increment a shared counter variable simultaneously, the final result might not be the correct sum because both threads could read the counter's value at the same time before updating it.
    2. Deadlocks:

      • A deadlock occurs when two or more processes or threads are blocked forever, each waiting on the other to release a resource. This can result in a system freeze where no progress is made.
      • Example: Two threads each hold one lock and try to acquire the lock held by the other, leading to a circular waiting situation.
    3. Starvation:

      • Starvation happens when a thread is perpetually denied access to the resources it needs because other threads are constantly given priority. This can happen when the scheduling algorithm is unfair.
    4. Data Inconsistency:

      • In a concurrent system, multiple threads might simultaneously modify the same data. Without proper synchronization, this can lead to inconsistent data states or corrupted data.

    4. Synchronization Mechanisms

    To manage concurrency effectively, synchronization mechanisms are used to control access to shared resources and prevent issues like race conditions and deadlocks. Common synchronization mechanisms include:

    1. Locks:

    • Locks are used to ensure that only one thread or process can access a resource at a time. When a thread acquires a lock, other threads must wait until the lock is released.
    • Types of locks:
      • Mutex (Mutual Exclusion): A mutex is a lock that ensures only one thread can access a critical section of code at a time.
      • Spinlock: A spinlock is a lock where a thread repeatedly checks if the lock is available, “spinning” until it can acquire the lock. This can be inefficient if the lock is held for a long time.
      • Reentrant Lock: This allows a thread that already holds the lock to acquire it again without causing a deadlock.

    2. Semaphores:

    • A semaphore is a synchronization tool that controls access to a shared resource by maintaining a counter. It allows multiple threads to access a limited number of resources concurrently.
    • Binary Semaphore: A semaphore with a counter of 1, effectively functioning as a mutex.
    • Counting Semaphore: A semaphore with a counter greater than 1, useful when there are multiple identical resources available.
    • Example: In a printer pool with 3 printers, a counting semaphore would ensure that no more than three threads can print at the same time.

    3. Condition Variables:

    • Condition variables are used for signaling between threads. A thread can wait for a condition to become true, and another thread can signal (notify) it when that condition is met.
    • Commonly used with locks to implement more complex synchronization patterns.
    • Example: A producer-consumer problem, where the producer waits for space in a buffer, and the consumer waits for data in the buffer.

    4. Barriers:

    • A barrier is used to synchronize a group of threads, ensuring that all threads in the group reach a certain point (the barrier) before any of them continue execution. Barriers are often used in parallel algorithms to synchronize tasks after they complete one phase of execution before moving to the next.
    • Example: In a parallel matrix multiplication algorithm, all threads that are working on different parts of the matrix must synchronize after calculating their respective results.

    5. Read-Write Locks:

    • Read-write locks allow multiple threads to read shared data simultaneously, but only one thread can write to the data at a time. These locks provide better performance than regular mutexes when read operations are more frequent than write operations.
    • Example: A database where multiple users can read data concurrently but only one user can update the database at any given time.

    6. Transactional Memory:

    • Transactional memory is a high-level synchronization technique that allows threads to execute in parallel, with automatic rollback and retry mechanisms in case of conflicts (similar to database transactions).
    • This model provides an alternative to explicit locks, aiming to simplify programming while avoiding the complexity of managing locks manually.

    5. Concurrency Control Models

    There are several models for controlling concurrency, depending on the system and the nature of the tasks involved:

    1. Lock-based Synchronization:

    • In this model, tasks request locks to access shared resources. Once they finish using the resource, they release the lock.
    • Common problems include deadlock, priority inversion, and lock contention.

    2. Optimistic Concurrency:

    • In optimistic concurrency control, tasks proceed without locking shared resources, assuming that no conflicts will occur. If a conflict is detected when attempting to commit the changes (e.g., a data modification), the task may be rolled back and retried.
    • This approach is often used in systems where conflicts are rare but costly when they do occur.

    3. Event-driven Programming:

    • Event-driven systems use events and handlers rather than traditional thread-based concurrency. When an event occurs, an event handler is triggered, and the system reacts accordingly. This model is widely used in GUI applications and web servers.

    4. Message Passing:

    • In distributed systems, message-passing is a common concurrency model where processes communicate by sending and receiving messages. This avoids the need for shared memory and provides an explicit mechanism for synchronization.
    • Example: MPI (Message Passing Interface) used in high-performance computing.

    6. Challenges of Concurrency and Synchronization

    • Deadlock Prevention: Designing systems to avoid circular wait conditions where processes are indefinitely blocked. Deadlock detection, prevention, and recovery mechanisms need to be implemented.
    • Race Conditions: Ensuring that threads or processes do not interfere with each other when accessing shared resources, which could lead to incorrect results or data corruption.
    • Starvation: Implementing fair scheduling policies to ensure all threads get a chance to execute and avoid indefinite waiting.
    • Scalability: As the number of threads or processes increases, ensuring that synchronization mechanisms do not become bottlenecks.
    • Correctness: Designing synchronization mechanisms that guarantee correctness under all possible concurrent execution scenarios.

    7. Best Practices for Concurrency and Synchronization

    • Minimize Lock Contention: Use finer-grained locking (i.e., locking smaller sections of code or data) to reduce the chances that multiple threads will need to access the same resource simultaneously.
    • Avoid Deadlocks: Use lock hierarchies or try-locks to prevent deadlocks. Ensure that locks are acquired in a consistent order across threads.
    • Use Non-blocking Algorithms: When possible, implement non-blocking or lock-free algorithms, which allow multiple threads to progress without needing to acquire locks.
    Previous topic 11
    Parallel Algorithms
    Next topic 13
    Data and Work Partitioning

    Past Papers

    Open this section to load past papers

    Click on Show Past Papers to see past papers.
    On This Page
      Reading Stats
      Est. reading time9 min
      Word count1,482
      Code examples0
      DifficultyIntermediate