• <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內核的同步機制(2)信號量(semaphore)

            Linux內核的同步機制(2)信號量(semaphore)

              信號量在創建時需要設置一個初始值,表示同時可以有幾個任務可以訪問該信號量保護的共享資源,初始值為1就變成互斥鎖(Mutex),即同時只能有一個任務可以訪問信號量保護的共享資源。

              一個任務要想訪問共享資源,首先必須得到信號量,獲取信號量的操作將把信號量的值減1,若當前信號量的值為負數,表明無法獲得信號量,該任務必須掛起在該信號量的等待隊列等待該信號量可用;若當前信號量的值為非負數,表示可以獲得信號量,因而可以立刻訪問被該信號量保護的共享資源。

              當任務訪問完被信號量保護的共享資源后,必須釋放信號量,釋放信號量通過把信號量的值加1實現,如果信號量的值為非正數,表明有任務等待當前信號量,因此它也喚醒所有等待該信號量的任務。

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

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

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

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

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

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

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

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

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

            頭文件:
            #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 天下 閱讀(2305) 評論(0)  編輯 收藏 引用 所屬分類: kernel & Driver

            <2013年5月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            99久久免费只有精品国产| 99久久无码一区人妻a黑| 久久这里只有精品首页| 777午夜精品久久av蜜臀| 久久精品夜色噜噜亚洲A∨| 99久久成人国产精品免费| 久久精品国产亚洲AV无码麻豆| 热99RE久久精品这里都是精品免费| 久久国产综合精品五月天| 国产亚洲美女精品久久久| 国产精品综合久久第一页| 精品久久国产一区二区三区香蕉| 久久99国产精品99久久| 久久精品国产91久久综合麻豆自制 | 久久人妻AV中文字幕| 亚洲国产成人精品91久久久| 久久精品一区二区影院| 久久久WWW成人| 久久久久久久免费视频| 久久久久久久波多野结衣高潮 | 久久久精品波多野结衣| 久久久精品久久久久久 | 影音先锋女人AV鲁色资源网久久| 2021久久精品免费观看| 99精品国产免费久久久久久下载| 欧美日韩精品久久久免费观看| 久久久亚洲AV波多野结衣| 久久精品国产精品亚洲精品 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久狠狠爱亚洲综合影院 | 久久高清一级毛片| 婷婷久久五月天| 伊人久久大香线蕉亚洲五月天| 久久久一本精品99久久精品88| 久久国产精品久久| 久久久久久噜噜精品免费直播 | 麻豆成人久久精品二区三区免费 | 国产精品久久久久久搜索| 国内精品久久久久久不卡影院 | 久久亚洲私人国产精品vA| 嫩草影院久久国产精品|