zoukankan      html  css  js  c++  java
  • Linux内核同步/进程/线程同步

    内核同步:
    主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区保护。主要有一下几种方式:
    1. Mutex(互斥)
    头文件:
    #include <linux/mutex.h>
    初始化方法:
    DEFINE_MUTEX(name);或者
    void mutex_init(struct mutex *lock);
    使用方法:
    void mutex_lock (struct mutex *lock);
    Tries to lock the mutex, sleeps otherwise.
    Caution: can't be interrupted, resulting in processes you cannot kill!

    int mutex_lock_interruptible (struct mutex *lock);
    Same, but can be interrupted. If interrupted, returns a non zero value and doesn't hold the lock. Test the return value!!!

    int mutex_trylock (struct mutex *lock);
    Never waits. Returns a non zero value if the mutex is not available.int mutex_is_locked(struct mutex *lock);Just tells whether the mutex is locked or not.

    void mutex_unlock (struct mutex *lock);
    Releases the lock. Make sure you do it as quickly as possible!

    2. Reader/writer semphopres 读写信号量
    Allow shared access by unlimited readers, or by only 1 writer. Writers get priority.
    允许有限数量的读访问,但是只能有一个写访问。
    void init_rwsem (struct rw_semaphore *sem);
    void down_read (struct rw_semaphore *sem);
    int down_read_trylock (struct rw_semaphore *sem);
    int up_read (struct rw_semaphore *sem);
    void down_write (struct rw_semaphore *sem);
    int down_write_trylock (struct rw_semaphore *sem);
    int up_write (struct rw_semaphore *sem);
    Well suited for rare writes, holding the semaphore briefly. Otherwise, readers get starved, waiting too long for the semaphore to be released.

    线程同步

    1. semophore 信号量
    简单用法:
    #include <semaphore.h>
    sem_t bin_sem; 
    res = sem_init(&bin_sem, 0, 0);
    sem_wait(&bin_sem);
    sem_post(&bin_sem);
    sem_destroy(&bin_sem);

    2. Mutex 互斥
    头文件以及函数
    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
    int pthread_mutex_lock(pthread_mutex_t *mutex));
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    int pthread_mutex_destroy(pthread_mutex_t *mutex);

    3. Spinlocks 自旋锁
    初始化:
    Static
    spinlock_t my_lock = SPIN_LOCK_UNLOCKED;
    Dynamic
    void spin_lock_init (spinlock_t *lock);
    使用:
    void spin_[un]lock (spinlock_t *lock);
    Doesn't disable interrupts. Used for locking in process context (critical sections in which you do not want to sleep).
    void spin_lock_irqsave / spin_unlock_irqrestore (spinlock_t *lock, unsigned long flags);
    Disables / restores IRQs on the local CPU.
    Typically used when the lock can be accessed in both process and interrupt context, to prevent preemption by interrupts


    进程同步/通信

    1. Semaphore 信号量
    简单过程:
    semaphore sv = 1;
    loop forever {
    P(sv);
    critical code section;
    V(sv);
    noncritical code section;
    }
    头文件以及函数:
    #include <sys/sem.h>
    int semctl(int sem_id, int sem_num, int command, ...);
    int semget(key_t key, int num_sems, int sem_flags);
    int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);

    2.Share Memory 共享内存
    头文件以及函数
    #include <sys/shm.h>
    void *shmat(int shm_id, const void *shm_addr, int shmflg);
    int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
    int shmdt(const void *shm_addr);
    int shmget(key_t key, size_t size, int shmflg);

    3.Message Queues 消息队列
    头文件以及函数
    #include <sys/msg.h>
    int msgctl(int msqid, int cmd, struct msqid_ds *buf);
    int msgget(key_t key, int msgflg);
    int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
    int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

     

     原文地址 http://hi.baidu.com/%CD%F8%C2%E7%B0%D9%D1%A7%CC%C3/blog/item/f7df071a3af425eaae513341.html
  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2026409.html
Copyright © 2011-2022 走看看