Linux内核同步,进程,线程同步

    技术2022-05-20  72

    包括我自己在内,很多人对内核,进程,线程同步都不是很清楚,下面稍微总结一下:   内核同步: 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区保护。主要有一下几种方式: 1. Mutex(互斥) 头文件: #include <linux/mutex.h> 初始化方法: DEFINE_MUTEX(name); 或者 void mutex_init(struct mutex *lock); 使用方法: void mutex_lock (struct mutex *lock); 尝试得到互斥量,否则进入睡眠,不能被中断,否则会导致进程无法杀死 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.   3. Spinlocks 自旋锁 初始化: Staticspinlock_t my_lock = SPIN_LOCK_UNLOCKED;Dynamicvoid 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);   线程同步 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. 读写锁 头文件以及函数 #include <pthread.h>int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 4. 条件变量 #include <pthread.h>pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int    pthread_cond_init(pthread_cond_t    *cond,    pthread_condattr_t  *cond_attr); int pthread_cond_signal(pthread_cond_t *cond);int pthread_cond_broadcast(pthread_cond_t *cond);int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int   pthread_cond_timedwait(pthread_cond_t   *cond,    pthread_mutex_t  *mutex, const struct timespec *abstime);int pthread_cond_destroy(pthread_cond_t *cond);  

    最新回复(0)