• <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>

            天下

            記錄修行的印記

            Linux內(nèi)核的同步機(jī)制(2)信號(hào)量(semaphore)

            Linux內(nèi)核的同步機(jī)制(2)信號(hào)量(semaphore)

              信號(hào)量在創(chuàng)建時(shí)需要設(shè)置一個(gè)初始值,表示同時(shí)可以有幾個(gè)任務(wù)可以訪(fǎng)問(wèn)該信號(hào)量保護(hù)的共享資源,初始值為1就變成互斥鎖(Mutex),即同時(shí)只能有一個(gè)任務(wù)可以訪(fǎng)問(wèn)信號(hào)量保護(hù)的共享資源。

              一個(gè)任務(wù)要想訪(fǎng)問(wèn)共享資源,首先必須得到信號(hào)量,獲取信號(hào)量的操作將把信號(hào)量的值減1,若當(dāng)前信號(hào)量的值為負(fù)數(shù),表明無(wú)法獲得信號(hào)量,該任務(wù)必須掛起在該信號(hào)量的等待隊(duì)列等待該信號(hào)量可用;若當(dāng)前信號(hào)量的值為非負(fù)數(shù),表示可以獲得信號(hào)量,因而可以立刻訪(fǎng)問(wèn)被該信號(hào)量保護(hù)的共享資源。

              當(dāng)任務(wù)訪(fǎng)問(wèn)完被信號(hào)量保護(hù)的共享資源后,必須釋放信號(hào)量,釋放信號(hào)量通過(guò)把信號(hào)量的值加1實(shí)現(xiàn),如果信號(hào)量的值為非正數(shù),表明有任務(wù)等待當(dāng)前信號(hào)量,因此它也喚醒所有等待該信號(hào)量的任務(wù)。

            信號(hào)量的API有:
            DECLARE_MUTEX(name)
            該宏聲明一個(gè)信號(hào)量name并初始化它的值為1,即聲明一個(gè)互斥鎖。

            //在Linux2.6.26中沒(méi)找到該宏
            DECLARE_MUTEX_LOCKED(name)
            該宏聲明一個(gè)互斥鎖name,但把它的初始值設(shè)置為0,即鎖在創(chuàng)建時(shí)就處在已鎖狀態(tài)。因此對(duì)于這種鎖,一般是先釋放后獲得。

            void sema_init (struct semaphore *sem, int val);
            該函用于數(shù)初始化設(shè)置信號(hào)量的初值,它設(shè)置信號(hào)量sem的值為val。

            void init_MUTEX (struct semaphore *sem);
            該函數(shù)用于初始化一個(gè)互斥鎖,即它把信號(hào)量sem的值設(shè)置為1。

            void init_MUTEX_LOCKED (struct semaphore *sem);
            該函數(shù)也用于初始化一個(gè)互斥鎖,但它把信號(hào)量sem的值設(shè)置為0,即一開(kāi)始就處在已鎖狀態(tài)。

            void down(struct semaphore * sem);
            該函數(shù)用于獲得信號(hào)量sem,它會(huì)導(dǎo)致睡眠,因此不能在中斷上下文(包括IRQ上下文和softirq上下文)使用該函數(shù)。該函數(shù)將把sem的值減1,如果信號(hào)量sem的值非負(fù),就直接返回,否則調(diào)用者將被掛起,直到別的任務(wù)釋放該信號(hào)量才能繼續(xù)運(yùn)行。

            int down_interruptible(struct semaphore * sem);
            該函數(shù)功能與down類(lèi)似,不同之處為,down不會(huì)被信號(hào)(signal)打斷,但down_interruptible能被信號(hào)打斷,因此該函數(shù)有返回值來(lái)區(qū)分是正常返回還是被信號(hào)中斷,如果返回0,表示獲得信號(hào)量正常返回,如果被信號(hào)打斷,返回-EINTR。

            int down_trylock(struct semaphore * sem);
            該函數(shù)試著獲得信號(hào)量sem,如果能夠立刻獲得,它就獲得該信號(hào)量并返回0,否則,表示不能獲得信號(hào)量sem,返回值為非0值。因此,它不會(huì)導(dǎo)致調(diào)用者睡眠,可以在中斷上下文使用。

            void up(struct semaphore * sem);
            該函數(shù)釋放信號(hào)量sem,即把sem的值加1,如果sem的值為非正數(shù),表明有任務(wù)等待該信號(hào)量,因此喚醒這些等待者。 

            頭文件:
            #include <linux/semaphore.h>
            /*
             * Copyright (c) 2008 Intel Corporation
             * Author: Matthew Wilcox <willy@linux.intel.com>
             *
             * Distributed under the terms of the GNU GPL, version 2
             *
             * Please see kernel/semaphore.c for documentation of these functions
             
            */
            #ifndef __LINUX_SEMAPHORE_H
            #define __LINUX_SEMAPHORE_H

            #include <linux/list.h>
            #include <linux/spinlock.h>

            /* Please don't access any members of this structure directly */
            struct semaphore {
                spinlock_t        lock;
                unsigned int        count;
                struct list_head    wait_list;
            };

            #define __SEMAPHORE_INITIALIZER(name, n)                \
            {                                    \
                .lock        = __SPIN_LOCK_UNLOCKED((name).lock),        \
                .count        = n,                        \
                .wait_list    = LIST_HEAD_INIT((name).wait_list),        \
            }

            #define __DECLARE_SEMAPHORE_GENERIC(name, count) \
                struct semaphore name = __SEMAPHORE_INITIALIZER(name, count)

            #define DECLARE_MUTEX(name)    __DECLARE_SEMAPHORE_GENERIC(name, 1)

            static inline void sema_init(struct semaphore *sem, int val)
            {
                static struct lock_class_key __key;
                *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
                lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
            }

            #define init_MUTEX(sem)        sema_init(sem, 1)
            #define init_MUTEX_LOCKED(sem)    sema_init(sem, 0)

            extern void down(struct semaphore *sem);
            extern int __must_check down_interruptible(struct semaphore *sem);
            extern int __must_check down_killable(struct semaphore *sem);
            extern int __must_check down_trylock(struct semaphore *sem);
            extern int __must_check down_timeout(struct semaphore *sem, long jiffies);
            extern void up(struct semaphore *sem);

            #endif /* __LINUX_SEMAPHORE_H */

            posted on 2013-04-12 18:22 天下 閱讀(2312) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): kernel & Driver

            <2012年8月>
            2930311234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(lèi)(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評(píng)論

            久久婷婷五月综合色奶水99啪| 欧美日韩精品久久久久| 久久精品成人国产午夜| 久久不射电影网| 思思久久99热免费精品6| 思思久久精品在热线热| 久久亚洲春色中文字幕久久久| 久久精品一区二区| 欧美精品福利视频一区二区三区久久久精品 | 久久精品a亚洲国产v高清不卡| 久久精品国产精品亚洲精品| 久久久久一本毛久久久| 成人综合伊人五月婷久久| 久久精品中文字幕第23页| 人妻精品久久久久中文字幕69 | 伊人久久一区二区三区无码| 亚洲精品白浆高清久久久久久| 国产精品欧美久久久久无广告| 久久亚洲中文字幕精品一区| 91精品观看91久久久久久| 色偷偷偷久久伊人大杳蕉| 青青热久久国产久精品| 久久国产精品久久国产精品| 精品伊人久久久| 久久久久九九精品影院| 久久精品国产69国产精品亚洲 | 国产呻吟久久久久久久92| 久久午夜无码鲁丝片秋霞| 久久久WWW成人| 成人精品一区二区久久久| 久久国产亚洲精品无码| 亚洲色大成网站WWW久久九九| 精品国产日韩久久亚洲| 精品国产91久久久久久久a| 亚洲精品国产成人99久久| 国产精品久久自在自线观看| 成人综合伊人五月婷久久| 久久久久亚洲av无码专区导航| 亚洲国产精品无码久久久秋霞2| 亚洲午夜久久久久久久久久 | 精品久久久久久国产免费了|