mirror of
https://github.com/apache/nuttx.git
synced 2026-05-21 21:34:07 +08:00
Documentation: Add documentation for seqcount.
This commit added ducumentation for seqcount. Signed-off-by: ouyangxiangzhen <ouyangxiangzhen@xiaomi.com>
This commit is contained in:
committed by
Alan C. Assis
parent
e5f46cb92b
commit
b5eae7d774
@@ -0,0 +1,17 @@
|
||||
===============
|
||||
Concurrency
|
||||
===============
|
||||
|
||||
This page discusses the concurrency support for NuttX.
|
||||
|
||||
Related Subdirectories
|
||||
======================
|
||||
|
||||
* ``seqcount`` - Contains the sequential count based read-write lock
|
||||
implementation.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Contents:
|
||||
|
||||
seqcount/index.rst
|
||||
@@ -0,0 +1,120 @@
|
||||
===============
|
||||
Seqcount
|
||||
===============
|
||||
|
||||
Summary
|
||||
=======
|
||||
|
||||
This an efficient ``Seqlock`` (sequential lock) mechanism suitable for
|
||||
concurrent scenarios with frequent reads and rare writes.
|
||||
``Seqlock`` enables lock-free reading while ensuring data consistency
|
||||
through sequence counting.
|
||||
|
||||
Core Features
|
||||
-------------
|
||||
|
||||
1. Lock-Free Reading
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Readers access shared data without acquiring locks, eliminating lock
|
||||
contention
|
||||
- Sequence number tracking detects data modifications during read operations
|
||||
- Retry mechanism guarantees read consistency
|
||||
|
||||
2. Write Protection
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Writers utilize atomic operations and interrupt protection for exclusive
|
||||
access
|
||||
- Sequence number parity indicates write state (even: readable, odd: writing)
|
||||
- SMP environments employ memory barriers for operation ordering
|
||||
|
||||
Main Interfaces
|
||||
---------------
|
||||
|
||||
Initialization
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
void seqlock_init(seqcount_t *s);
|
||||
|
||||
Read Operations
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
uint32_t read_seqbegin(const seqcount_t *s);
|
||||
uint32_t read_seqretry(const seqcount_t *s, uint32_t start);
|
||||
|
||||
Reader usage pattern:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
uint32_t seq;
|
||||
do {
|
||||
seq = read_seqbegin(&seqlock);
|
||||
// Read shared data
|
||||
} while (read_seqretry(&seqlock, seq));
|
||||
|
||||
Write Operations
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
irqstate_t write_seqlock_irqsave(seqcount_t *s);
|
||||
void write_sequnlock_irqrestore(seqcount_t *s, irqstate_t flags);
|
||||
|
||||
Writer usage pattern:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
irqstate_t flags = write_seqlock_irqsave(&seqlock);
|
||||
// Modify shared data
|
||||
write_sequnlock_irqrestore(&seqlock, flags);
|
||||
|
||||
Technical Details
|
||||
-----------------
|
||||
|
||||
1. Sequence Number Mechanism
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Sequence counter initializes to 0 (even)
|
||||
- Write start increments by 1 (becomes odd)
|
||||
- Write completion increments by 1 (returns to even)
|
||||
|
||||
2. Memory Barriers
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- SMP systems utilize appropriate read/write memory barriers
|
||||
- ``SMP_WMB()``: Write memory barrier
|
||||
- ``SMP_RMB()``: Read memory barrier
|
||||
- Ensures operation ordering and memory visibility
|
||||
|
||||
3. Atomic Operations
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- SMP environments employ atomic read/write and CAS operations
|
||||
- Prevents data races and maintains consistency
|
||||
|
||||
4. Interrupt Protection
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Write operations disable interrupts
|
||||
- Prevents interrupt handlers from interfering with critical sections
|
||||
|
||||
Applicable Scenarios
|
||||
--------------------
|
||||
|
||||
- Read operations significantly outnumber write operations
|
||||
- Readers can tolerate temporary data inconsistency
|
||||
- High-performance read operations are required
|
||||
|
||||
Performance Advantages
|
||||
----------------------
|
||||
|
||||
- Read operations completely lock-free with minimal overhead
|
||||
- Significant performance improvement for read-intensive applications
|
||||
|
||||
This implementation accounts for differences between SMP and uniprocessor
|
||||
environments, ensuring correct operation across various configurations.
|
||||
@@ -12,6 +12,7 @@ case, you can head to the :doc:`reference <../reference/index>`.
|
||||
:caption: Contents:
|
||||
|
||||
binfmt.rst
|
||||
concurrency/index.rst
|
||||
drivers/index.rst
|
||||
nxflat.rst
|
||||
nxgraphics/index.rst
|
||||
|
||||
Reference in New Issue
Block a user