当前位置: 首页 > news >正文

觉 网站百度问答优化

觉 网站,百度问答优化,天津软件开发培训机构,一级a做爰片不卡的网站目录 前言 信号量 概念与特性 信号量 API 函数 互斥体 概念与特性 互斥体 API 函数 前言 Linux 内核提供的几种并发和竞争的处理方法,我们学习了: 驱动开发篇14——原子操作 驱动开发篇15——linux自旋锁 本讲我们就继续学习:信号…

目录

前言

信号量

概念与特性

信号量 API 函数

互斥体

概念与特性

互斥体 API 函数


前言

Linux 内核提供的几种并发和竞争的处理方法,我们学习了:

驱动开发篇14——原子操作

驱动开发篇15——linux自旋锁

本讲我们就继续学习:信号量和互斥体。

信号量

概念与特性

Linux 内核提供了信号量机制,信号量常常用于控制对共享资源的访问。

信号量是一种​​睡眠锁​​机制,通过计数器控制对共享资源的访问:

  • ​​计数器值​​:表示可用资源数量
  • ​​P操作​​:申请资源(值减1,若为0则阻塞)
  • ​​V操作​​:释放资源(值加1,唤醒等待者)

信号量常见的有4种类型:

这几个信号量的主要区别如下:

总结一下信号量的特点:

  • 信号量可以使等待资源线程进入休眠状态,因此适用于那些占用资源比较久的场合。
  • 信号量不能用于中断中,因为信号量会引起休眠,中断不能休眠。
  • 如果共享资源的持有时间比较短,那就不适合使用信号量了,因为频繁的休眠、切换线程引起的开销要远大于信号量带来的那点优势。

信号量 API 函数

Linux 内核使用 semaphore 结构体表示信号量,结构体内容如下:

struct semaphore {raw_spinlock_t lock;      // 保护信号量结构的自旋锁unsigned int count;       // 可用资源计数器struct list_head wait_list; // 等待进程链表
};

有关信号量的 API 函数如表:

示例代码如下:

#include <linux/module.h>
#include <linux/semaphore.h>
#include <linux/sched.h>// 定义并初始化信号量(方法1)
static DEFINE_SEMAPHORE(my_sem);// 动态信号量(方法2)
static struct semaphore dynamic_sem;static int __init semaphore_demo_init(void)
{printk(KERN_INFO "Semaphore Demo Start\n");// 初始化动态信号量(初始值设为2)sema_init(&dynamic_sem, 2);// 1. 基本获取/释放down(&my_sem);printk("Process %d entered critical section\n", current->pid);up(&my_sem);// 2. 非阻塞尝试if (down_trylock(&dynamic_sem) == 0) {printk("Got semaphore without waiting\n");up(&dynamic_sem);} else {printk("Semaphore busy, continue other work\n");}// 3. 可中断等待if (down_interruptible(&dynamic_sem)) {printk("Interrupted by signal\n");return -ERESTARTSYS;}/* 临界区操作(可安全休眠) */msleep(100);up(&dynamic_sem);return 0;
}static void __exit semaphore_demo_exit(void)
{printk(KERN_INFO "Semaphore Demo End\n");
}module_init(semaphore_demo_init);
module_exit(semaphore_demo_exit);
MODULE_LICENSE("GPL");

互斥体

概念与特性

将信号量的值设置为 1,就可以通过信号量实现互斥,但是 Linux 提供了一个比信号量更专业的机制来进行互斥,它就是互斥体—mutex。

互斥体(Mutual Exclusion)是一种​​睡眠锁​​机制,用于保护临界区资源,具有以下特性:

  • ​​独占访问​​:同一时间仅允许一个线程持有锁
  • ​​睡眠等待​​:获取锁失败时让出CPU(非忙等待)
  • ​​进程上下文​​:只能在可调度上下文中使用

和自旋锁、信号相比,互斥体的优势如下:

Linux (5.15+)内核使用 mutex 结构体表示互斥体,定义如下:

struct mutex {atomic_long_t owner;          // 持有者标识 + 状态标志spinlock_t wait_lock;        // 保护等待队列的自旋锁struct list_head wait_list;   // 等待线程链表
#ifdef CONFIG_DEBUG_MUTEXESconst char *name;             // 调试用名称void *magic;                  // 调试用魔数
#endif
};

在使用 mutex 之前要先定义一个 mutex 变量。

在使用 mutex 的时候要注意如下几点:

  • mutex 可以导致休眠,因此不能在中断中使用 mutex,中断中只能使用自旋锁。
  • 和信号量一样, mutex 保护的临界区可以调用引起阻塞的 API 函数。
  • 因为一次只有一个线程可以持有 mutex,因此,必须由 mutex 的持有者释放 mutex。并且 mutex 不能递归上锁和解锁。

互斥体 API 函数

有关互斥体的 API 函数如表:

示例代码如下:

#include <linux/module.h>
#include <linux/mutex.h>static DEFINE_MUTEX(global_mutex);  // 静态定义并初始化全局互斥体
static struct mutex dynamic_mutex;  // 动态互斥体
static int shared_data = 0;         // 共享数据static int __init mutex_demo_init(void)
{printk(KERN_INFO "Mutex Demo Start\n");// 1. 初始化动态互斥体mutex_init(&dynamic_mutex);// 2. 检查锁状态printk("Global mutex is %slocked\n", mutex_is_locked(&global_mutex) ? "" : "not ");// 3. 基本加锁/解锁mutex_lock(&global_mutex);shared_data = 100;mutex_unlock(&global_mutex);// 4. 尝试获取锁(非阻塞)if (mutex_trylock(&dynamic_mutex)) {printk("Got dynamic mutex immediately\n");mutex_unlock(&dynamic_mutex);} else {printk("Dynamic mutex is busy\n");}// 5. 可中断锁(推荐用法)if (mutex_lock_interruptible(&global_mutex)) {printk("Interrupted by signal while waiting\n");return -ERESTARTSYS;}/* 临界区操作(可安全休眠) */shared_data += 50;msleep(10);  // 模拟耗时操作mutex_unlock(&global_mutex);return 0;
}static void __exit mutex_demo_exit(void)
{// 确保所有锁已释放if (!mutex_is_locked(&dynamic_mutex)) {mutex_lock(&dynamic_mutex);shared_data = 0;mutex_unlock(&dynamic_mutex);}printk(KERN_INFO "Final shared_data: %d\n", shared_data);printk(KERN_INFO "Mutex Demo End\n");
}module_init(mutex_demo_init);
module_exit(mutex_demo_exit);
MODULE_LICENSE("GPL");
http://www.dtcms.com/a/396685.html

相关文章:

  • 网站的不同类数字火币交易网站开发
  • 做淘客一定要建网站吗公司seo是什么级别
  • 专业网站制作哪家专业悦阁网站建设
  • 网站制作方案包含哪些内容全网营销型网站新闻
  • 怎么做淘宝客优惠券网站丹阳论坛
  • 中小企业网站建设咨询wordpress开启xmlrppc
  • 做期货浏览哪些网站建设网站找哪个公司
  • 手机微网站银行网站建设中
  • 学校网站建设的申请福清市城乡建设局网站
  • 网站建设怎么用长尾做标题制作人韩剧
  • 网站建设最难的是什么wordpress网站制作app
  • 外贸网站建站那家公司好怎么做劳务公司网站
  • 怎么超链接公众号西安seo工作室
  • 营销型网站建设案例宝坻区建设路小学网站
  • 潍坊优化网站百联网上购物商城
  • 温州 建网站常州建设公司网站
  • 网站分页设计石家庄seo顾问
  • 高端网站制作公司公司注册与注销
  • 昆山做网站的网站管理规定
  • 寺庙网站模板雍鑫建设集团网站
  • 做微网站的第三方帮传销组织做网站
  • 侧边栏jquery网站后台网站开发如何赚钱
  • 深圳网站建设新闻wordpress 后台去版权
  • 电脑上如何做网站长春网站快速优化排名
  • 模板网站建设+百度.tel域名不可以做网站域名吗?
  • 东莞大岭山镇网站建设开通招聘网站如何做分录
  • 杭州自助建站模板可以发布商品的免费平台
  • 凡科建站怎么导出网页可不可以自己做网站
  • 免费制作企业网站平台怎样做 云知梦 网站
  • 计算机网站建设招聘阿里巴巴网站的搜索引擎优化案例