• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            Critical section

            From Wikipedia, the free encyclopedia

            Jump to: navigation, search

            In concurrent programming a critical section is a piece of code that accesses a shared resource (data structure or device) that must not be concurrently accessed by more than one thread of execution. A critical section will usually terminate in fixed time, and a thread, task or process will only have to wait a fixed time to enter it (i.e. bounded waiting). Some synchronization mechanism is required at the entry and exit of the critical section to ensure exclusive use, for example a semaphore.

            By carefully controlling which variables are modified inside and outside the critical section (usually, by accessing important state only from within), concurrent access to that state is prevented. A critical section is typically used when a multithreaded program must update multiple related variables without a separate thread making conflicting changes to that data. In a related situation, a critical section may be used to ensure a shared resource, for example a printer, can only be accessed by one process at a time.

            How critical sections are implemented varies among operating systems.

            The simplest method is to prevent any change of processor control inside the critical section. On uni-processor systems, this can be done by disabling interrupts on entry into the critical section, avoiding system calls that can cause a context switch while inside the section and restoring interrupts to their previous state on exit. Any thread of execution entering any critical section anywhere in the system will, with this implementation, prevent any other thread, including an interrupt, from getting the CPU and therefore from entering any other critical section or, indeed, any code whatsoever, until the original thread leaves its critical section.

            This brute-force approach can be improved upon by using semaphores. To enter a critical section, a thread must obtain a semaphore, which it releases on leaving the section. Other threads are prevented from entering the critical section at the same time as the original thread, but are free to gain control of the CPU and execute other code, including other critical sections that are protected by different semaphores.

            Some confusion exists in the literature about the relationship between different critical sections in the same program.[citation needed] In general, a resource that must be protected from concurrent access may be accessed by several pieces of code. Each piece must be guarded by a common semaphore. Is each piece now a critical section or are all the pieces guarded by the same semaphore in aggregate a single critical section? This confusion is evident in definitions of a critical section such as "... a piece of code that can only be executed by one process or thread at a time". This only works if all access to a protected resource is contained in one "piece of code", which requires either the definition of a piece of code or the code itself to be somewhat contrived.

            Contents

            [hide]

            [edit] Application Level Critical Sections

            Application-level critical sections reside in the memory range of the process and are usually modifiable by the process itself. This is called a user-space object because the program run by the user (as opposed to the kernel) can modify and interact with the object. However the functions called may jump to kernel-space code to register the user-space object with the kernel.

            Example Code For Critical Sections with POSIX pthread library

            /* Sample C/C++, Unix/Linux */
            #include <pthread.h>

            /* This is the critical section object (statically allocated). */
            static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;

            void f()
            {
            /* Enter the critical section -- other threads are locked out */
            pthread_mutex_lock( &cs_mutex );

            /* Do some thread-safe processing! */

            /*Leave the critical section -- other threads can now pthread_mutex_lock() */
            pthread_mutex_unlock( &cs_mutex );
            }

            Example Code For Critical Sections with Win32 API

            /* Sample C/C++, Windows, link to kernel32.dll */
            #include <windows.h>

            static CRITICAL_SECTION cs; /* This is the critical section object -- once initialized,
            it cannot be moved in memory */

            /* If you program in OOP, declare this in your class */

            /* Initialize the critical section before entering multi-threaded context. */
            InitializeCriticalSection(&cs);

            void f()
            {
            /* Enter the critical section -- other threads are locked out */
            EnterCriticalSection(&cs);

            /* Do some thread-safe processing! */

            /* Leave the critical section -- other threads can now EnterCriticalSection() */
            LeaveCriticalSection(&cs);
            }

            /* Release system object when all finished -- usually at the end of the cleanup code */
            DeleteCriticalSection(&cs);

            Note that on Windows NT (not 9x/ME), the function TryEnterCriticalSection() can be used to attempt to enter the critical section. This function returns immediately so that the thread can do other things if it fails to enter the critical section (usually due to another thread having locked it). With the pthreads library, the equivalent function is pthread_mutex_trylock(). Note that the use of a CriticalSection is not the same as a Win32 Mutex, which is an object used for inter-process synchronization. A Win32 CriticalSection is for intra-process synchronization (and is much faster as far as lock times), however it cannot be shared across processes.

            [edit] Kernel Level Critical Sections

            Typically, critical sections prevent process and thread migration between processors and the preemption of processes and threads by interrupts and other processes and threads.

            Critical sections often allow nesting. Nesting allows multiple critical sections to be entered and exited at little cost.

            If the scheduler interrupts the current process or thread in a critical section, the scheduler will either allow the process or thread to run to completion of the critical section, or it will schedule the process or thread for another complete quantum. The scheduler will not migrate the process or thread to another processor, and it will not schedule another process or thread to run while the current process or thread is in a critical section.

            Similarly, if an interrupt occurs in a critical section, the interrupt's information is recorded for future processing, and execution is returned to the process or thread in the critical section. Once the critical section is exited, and in some cases the scheduled quantum completes, the pending interrupt will be executed.

            Since critical sections may execute only on the processor on which they are entered, synchronization is only required within the executing processor. This allows critical sections to be entered and exited at almost zero cost. No interprocessor synchronization is required, only instruction stream synchronization. Most processors provide the required amount of synchronization by the simple act of interrupting the current execution state. This allows critical sections in most cases to be nothing more than a per processor count of critical sections entered.

            Performance enhancements include executing pending interrupts at the exit of all critical sections and allowing the scheduler to run at the exit of all critical sections. Furthermore, pending interrupts may be transferred to other processors for execution.

            Critical sections should not be used as a long-lived locking primitive. They should be short enough that the critical section will be entered, executed, and exited without any interrupts occurring, from neither hardware much less the scheduler.

            Kernel Level Critical Sections are the base of the software lockout issue.

            [edit] See also

            [edit] External links

            Critical Section documentation on the MSDN Library homepage: http://msdn2.microsoft.com/en-us/library/ms682530.aspx

            posted on 2009-05-11 11:48 chatler 閱讀(1256) 評論(0)  編輯 收藏 引用 所屬分類: OS
            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久综合中文字幕| 国产精品久久久久影院嫩草| 久久精品成人欧美大片| 香蕉久久夜色精品国产尤物| 亚洲精品美女久久久久99| 国产欧美久久久精品| 污污内射久久一区二区欧美日韩| 久久午夜夜伦鲁鲁片免费无码影视| 人妻精品久久久久中文字幕69| 66精品综合久久久久久久| 77777亚洲午夜久久多人| 麻豆精品久久精品色综合| 亚洲精品国产第一综合99久久| 国产精品久久久久久福利69堂| 国产精品美女久久福利网站| 亚洲国产精品久久久久| 久久国产精品无码一区二区三区| 久久综合鬼色88久久精品综合自在自线噜噜| 亚洲va久久久噜噜噜久久| 亚洲?V乱码久久精品蜜桃 | 精品久久久久久国产| 国产精品久久久久a影院| 精品人妻伦九区久久AAA片69| 久久香蕉国产线看观看精品yw| 久久久久婷婷| 久久久精品久久久久特色影视| 99久久精品毛片免费播放| 人妻精品久久久久中文字幕一冢本 | 热综合一本伊人久久精品 | 久久这里只精品99re66| 91精品国产91久久久久久蜜臀| AV色综合久久天堂AV色综合在| 色婷婷综合久久久久中文| 日日噜噜夜夜狠狠久久丁香五月| 精品无码久久久久国产动漫3d| 亚洲欧美国产日韩综合久久| 日批日出水久久亚洲精品tv| 青青草原综合久久大伊人导航 | 久久www免费人成看国产片| 国产午夜福利精品久久| 国产AV影片久久久久久|