Git Product home page Git Product logo

concurrent-programming-intensive-amsterdam's Introduction

Intensive Course on Concurrent Programming

Day 1

Coarse-grained bank

In src/day1/CoarseGrainedBank.kt, make the sequential bank implementation thread-safe. Please follow the coarse-grained locking scheme to make synchronization efficient. For that, you need to use a single lock to protect all bank operations.

To test your solution, please run:

  • ./gradlew test --tests CoarseGrainedBankTest on Linux or MacOS
  • gradlew test --tests CoarseGrainedBankTest on Windows

Fine-grained bank

In src/day1/FineGrainedBank.kt, make the sequential bank implementation thread-safe. Please follow the fine-grained locking scheme to make synchronization efficient. For that, you need to use per-account locks, thus, ensuring natural parallelism when accessing different accounts. The totalAmount() function should acquire all the locks to get a consistent snapshot, while transfer(..) should acquire the corresponding account locks.

To test your solution, please run:

  • ./gradlew test --tests FineGrainedBankTest on Linux or MacOS
  • gradlew test --tests FineGrainedBankTest on Windows

Treiber stack

In src/day1/TreiberStack.kt, implement the classic Treiber stack algorithm.

To test your solution, please run:

  • ./gradlew test --tests TreiberStackTest on Linux or MacOS
  • gradlew test --tests TreiberStackTest on Windows

Treiber stack with elimination

In src/day1/TreiberStackWithElimination.kt, implement the classic Treiber stack algorithm with the elimination technique.

To test your solution, please run:

  • ./gradlew test --tests TreiberStackWithEliminationTest on Linux or MacOS
  • gradlew test --tests TreiberStackWithEliminationTest on Windows

Michael-Scott queue

In src/day1/MSQueue.kt, implement the Michael-Scott queue algorithm. You might also be interested in the original paper.

To test your solution, please run:

  • ./gradlew test --tests MSQueueTest on Linux or MacOS
  • gradlew test --tests MSQueueTest on Windows

Day 2

FAA-based queue: simplified

In src/day2/FAABasedQueueSimplified.kt, implement a concurrent queue that leverages the Fetch-and-Add synchronization primitive. The high-level design of this queue bases on a conceptually infinite array for storing elements and manipulates enqIdx and deqIdx counters, which reference the next working cells in the infinite array for enqueue(..) and dequeue() operations.

In this task, use a big plain array as the infinite array implementation.

To test your solution, please run:

  • ./gradlew test --tests FAABasedQueueSimplifiedTest on Linux or MacOS
  • gradlew test --tests FAABasedQueueSimplifiedTest on Windows

FAA-based queue

In src/day2/FAABasedQueue.kt, implement a concurrent queue that leverages the Fetch-and-Add synchronization primitive. The high-level design of this queue bases on a conceptually infinite array for storing elements and manipulates enqIdx and deqIdx counters, which reference the next working cells in the infinite array for enqueue(..) and dequeue() operations.

The infinite array implementation should be simulated via a linked list of fixed-size segments. The overall algorithm should be obstruction-free or lock-free.

To test your solution, please run:

  • ./gradlew test --tests FAABasedQueueTest on Linux or MacOS
  • gradlew test --tests FAABasedQueueTest on Windows

Logical removals in Michael-Scott queue

In src/day2/MSQueueWithOnlyLogicalRemove.kt, implement a Michael-Scott queue with an additional remove(element) operation. The implementation should remove elements only logically, keeping the corresponding nodes in the linked list physically, but marking them as removed.

To test your solution, please run:

  • ./gradlew test --tests MSQueueWithOnlyLogicalRemoveTest on Linux or MacOS
  • gradlew test --tests MSQueueWithOnlyLogicalRemoveTest on Windows

Linear-time non-parallel removals in Michael-Scott queue

In src/day2/MSQueueWithLinearTimeNonParallelRemove.kt, implement a Michael-Scott queue with an additional remove(element) operation. The implementation should find the first node that contains the specified element in linear time and then remove this node also in linear time.

Note that in this task remove(..) operations are never called in parallel, which simplifies the implementation.

To test your solution, please run:

  • ./gradlew test --tests MSQueueWithLinearTimeNonParallelRemoveTest on Linux or MacOS
  • gradlew test --tests MSQueueWithLinearTimeNonParallelRemoveTest on Windows

Linear-time removals in Michael-Scott queue

In src/day2/MSQueueWithLinearTimeRemove.kt, implement a Michael-Scott queue with an additional remove(element) operation. The implementation should find the first node that contains the specified element in linear time and then remove this node also in linear time.

To test your solution, please run:

  • ./gradlew test --tests MSQueueWithLinearTimeRemoveTest on Linux or MacOS
  • gradlew test --tests MSQueueWithLinearTimeRemoveTest on Windows

Constant-time removals in Michael-Scott queue

In src/day2/MSQueueWithLinearTimeRemove.kt, implement a Michael-Scott queue with an additional remove(element) operation. The implementation should find the first node that contains the specified element in linear time, but remove this node in constant time.

  • ./gradlew test --tests MSQueueWithConstantTimeRemoveTest on Linux or MacOS
  • gradlew test --tests MSQueueWithConstantTimeRemoveTest on Windows

Day 3

CAS2: Single-Writer

In src/day3/AtomicArrayWithCAS2SingleWriter.kt, implement the cas2(..) and get(..) operations. In this data task, CAS2(..) can be called only in one thread, so concurrent CAS2(..) invocations are forbidden.

To test your solution, please run:

  • ./gradlew test --tests AtomicArrayWithCAS2SingleWriterTest on Linux or MacOS
  • gradlew test --tests AtomicArrayWithCAS2SingleWriterTest on Windows

CAS2: Simplified

In src/day3/AtomicArrayWithCAS2Simplified.kt, implement the cas2(..) operation. In this data task, all successful updates install unique values in the array cells.

To test your solution, please run:

  • ./gradlew test --tests AtomicArrayWithCAS2SimplifiedTest on Linux or MacOS
  • gradlew test --tests AtomicArrayWithCAS2SimplifiedTest on Windows

Double-Compare-Single-Set

In src/day3/AtomicArrayWithDCSS.kt, implement the dcss(..) operation. Similarly to CAS2, it requires allocating a descriptor and installing it in the updating memory location. We need the dcss(..) operation for the next task, to resolve the ABA-problem in the CAS2 algorithm.

To test your solution, please run:

  • ./gradlew test --tests AtomicArrayWithDCSSTest on Linux or MacOS
  • gradlew test --tests AtomicArrayWithDCSSTest on Windows

CAS2

In src/day3/AtomicArrayWithCAS2.kt, implement the cas2(..) operation. Unlike in the "CAS2: Simplified" task, updates are no longer unique. This can lead to the ABA problem. To solve it, please use the Double-Compare-Single-Set operation when installing CAS2 descriptors.

To test your solution, please run:

  • ./gradlew test --tests AtomicArrayWithCAS2Test on Linux or MacOS
  • gradlew test --tests AtomicArrayWithCAS2Test on Windows

concurrent-programming-intensive-amsterdam's People

Contributors

ndkoval avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.