范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Linux中信号量源码的分析

  如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量。本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务。
  信号量定义如下: struct semaphore { 	raw_spinlock_t		lock; 	unsigned int		count; 	struct list_head	wait_list; };
  其中 wait_list  链表用于管理因没有成功获取信号量而处于睡眠状态的任务。
  任务通过调用 down()  函数,尝试获取信号量,如果获取信号量失败,调用__down()  函数。__down()  函数内部调用了__down_common  函数。(事实上down()  函数有多个变种,如down_interruptible  ,在获取信号量失败时调用__down_interruptible  ,__down_interruptible  也会调用__down_common  函数。不同的down()  函数最终调用__down_common  时传入不同的参数,以处理不同的获取信号量的情况)。
  同时,整个down()函数使用 sem->lock  保护起来。void down(struct semaphore *sem) { 	unsigned long flags;  	raw_spin_lock_irqsave(&sem->lock, flags); 	if (likely(sem->count > 0)) 		sem->count--; 	else 		__down(sem); 	raw_spin_unlock_irqrestore(&sem->lock, flags); }  static noinline void __sched __down(struct semaphore *sem) { 	__down_common(sem, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); }
  下面是重点: __down_common  函数如何使任务休眠,休眠中的任务如何被唤醒并获得信号量。
  semaphore_waiter  是一个关键的数据结构,代表一个获取信号量失败,正在等待的任务。up  字段标识了该任务是否是被该信号量唤醒,也就是休眠中的任务收到某种信号被唤醒之后,判断是否是被等待中的信号量唤醒的。struct semaphore_waiter { 	struct list_head list; 	struct task_struct *task; 	bool up; };
  __down_common  函数首先初始化了一个semaphore_waiter  。task字段标识当前任务,up设置为false。static inline int __sched __down_common(struct semaphore *sem, long state, 								long timeout) { 	struct semaphore_waiter waiter;  	list_add_tail(&waiter.list, &sem->wait_list); 	waiter.task = current; 	waiter.up = false; ...
  然后休眠当前任务,调用 schedule_timeout()主动让出 CPU。上文提到整个函数都是在 sem->lock  的临界区中,但是在自旋锁的临界区是不可以休眠的,所以这里实际上在休眠之前释放了锁,被唤醒之后再重新获得锁。
  当任务被唤醒后,如果waiter.up  是否为真,则该任务可以获得信号量。waiter.up  是必须要判断的,取决于__set_current_state()  函数传入的参数不同,任务可能处于不同的休眠状态,可能被不同的信号唤醒,而未必是被等待的信号唤醒。	for (;;) { 		if (signal_pending_state(state, current)) 			goto interrupted; 		if (unlikely(timeout <= 0)) 			goto timed_out; 		__set_current_state(state); 		raw_spin_unlock_irq(&sem->lock); 		timeout = schedule_timeout(timeout); 		raw_spin_lock_irq(&sem->lock); 		if (waiter.up) 			return 0; 	}   timed_out: 	list_del(&waiter.list); 	return -ETIME;   interrupted: 	list_del(&waiter.list); 	return -EINTR; }
  当一个任务释放信号量时,如果信号量的等待队列中存在任务,则将队列中的第一个任务的  up  标记为true,并唤醒,同时从等待队列中删除。
  同时,只有在等待队列为空的情况下,才会更新sem->count  ,确保了等待队列中的任务优先于新来的任务获得信号量,保证了严格的先进先出,不会因为新来的任务导致等待队列中的任务饥饿。void up(struct semaphore *sem) { 	unsigned long flags;  	raw_spin_lock_irqsave(&sem->lock, flags); 	if (likely(list_empty(&sem->wait_list))) 		sem->count++; 	else 		__up(sem); 	raw_spin_unlock_irqrestore(&sem->lock, flags); }  static noinline void __sched __up(struct semaphore *sem) { 	struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, 						struct semaphore_waiter, list); 	list_del(&waiter->list); 	waiter->up = true; 	wake_up_process(waiter->task); }
  任务被唤醒之后,检测到 up  为true,返回0,成功获得信号量。

听力下降,耳鸣严重,戴助听器能改善么?你好,助听器不能单纯的采购,而是要到专业的助听器验配中心,进行咨询检查测听试听等整个流程后,才可以确定是否需要配戴助听器。配助听器要注意几个问题1听力检查,医院和配助听器的地方都可听力下降到什么程度需要配助听器?听力下降到什么程度需要配助听器?你好,对于这个问题,我需要给你好好科普一下。首先是题主需要知道听力损失的程度划分?一般是有6个程度划分正常听力025dBHL这属于正常的听力范围,无打造绿色节能大数据中心湖南移动5G低碳运营助力双碳绿色行动华声在线8月12日讯(记者张鼎峰通讯员何欣)在湖南移动的数据中心,一张巨大的屏幕上,各类设备用能数据正在实时跳动机房耗电量是降还是升?空调系统运行是否在能耗最优模式?电能利用效率(未来已来联想未来中心展示晨星机器人等智能化转型成果未来的智能化工厂是什么样子?相信不少人心中都有自己的见解。其实亲眼见证未来,也并不是一件难事。近日,联想上海未来中心宣布落户张江高科联想创新科技园。这是继位于联想集团全球总部的北京最激进新能源政策面前,留给中东的是一地鸡毛从全球新能源汽车发展目标来看,欧洲对新能源汽车的问鼎之心昭然若揭。英国爱尔兰丹麦葡萄牙西班牙等更是针对未来新能源的普及程度提出了100的目标,德法意也相继跟上,欧洲的新能源汽车发展无人机应用领域新发展赋能智慧城市建设随着智慧城市的发展,新兴热门技术不断崛起。无人机技术作为其中之一,因为具有操作简单应用灵活等特点,受到了不少人的青睐。无人机通常在城市中起着治安巡检地形测绘航拍取景等作用,但随着信百度发布五福AI助老计划,年底前将落地8座城市并捐赠智能设备8月11日,百度五福AI助老计划发布仪式暨智慧助老全国城市征集活动正式启动。基于五福AI助老计划这一契机,百度预计到年底前将在全国范围内落地8座城市,并为入选城市捐赠一批五福AI助阿里女员工房卡如何到男上司手中?亚朵酒店再发声,三大疑问待解阿里巴巴(09988。HKBABA。US)高管涉嫌联合商家侵犯女下属一案正在持续发酵。涉事女员工称,其上司到酒店前台偷偷办了她的房卡,而且四次进出她的房间。其中,涉事酒店为亚朵轻居互联网时代,圈子文化更容易导致信息茧房互联网社会人们以采集信息为生,恰似祖先以采集食物为生一样,拘泥于旧时代的人,或者在信息时代里守着某一分科垂类一亩三分地的人,就会像地理大发现中求稳而不可得的农耕文明一样,被涉猎广泛手机存储已满,如何删除哪些无关紧要的文件夹内容手机存储空间不足的问题,一直都困扰着使用手机的人们。哪怕现在手机内存都已增加至512GB了,特别是对于还使用64GB128GB的朋友来说,还是觉得不够用的。下面,我们将平时整理的一三星今年在折叠屏手机市场上占据主导地位,原因没有强大的对手据新闻媒体报道,三星手机是罕见的在全世界区域内大规模批量生产售卖折叠屏智能机的生产商,这促使三星手机在折叠屏手机销售市场拥有了首要地位。调查机构CounterpointResear
联发科下一代天玑旗舰处理器最新消息曝光,顶级实力收获OVHM群赞除了热门机型的发布,近日关于年底安卓旗舰芯片的消息也成为数码圈关注的焦点。10月12日,微博数码领域爆料一哥数码闲聊站发布一条关于联发科年底天玑旗舰的最新消息,该条消息称联发科的天只有4MB?如何修复Etcher和Rufus创建LinuxUSB后破坏的USB情况是这样的。你用Etcher或者Rufus工具在Windows或者Linux中创建了一个可启动的LiveLinuxUSB。你用它来安装Linux,USB的目的已经达到了。现在你想装修几个月才能入住如何去除新房甲醛甲醛克星十大品牌说起装修几个月才能入住,如何清除室内甲醛,通风是最简单有效的方法之一,只需要打开门窗,保持室内空气流通,便可以促进室内甲醛的排出,降低室内甲醛含量。通风法对甲醛污染的净化下效率与室小米准备造车?留给小米的时间不多了近几年来新能源汽车强势猛进,雷军作为创业大军中的领军者能否在新能源汽车领域继续自己的创业创奇。把雷军的名字稍加变换,立马变成了电车二字。仿佛冥冥之中,雷军和电动汽车之间,已然建立了双11战报燃爆开局阿尔法蛋多品类创双平台TOP1随着双11如火如荼的进行着,已经陆续有品牌发布业绩战报,其中阿尔法蛋的战报成绩尤其亮眼,开抢1小时销售额即超去年双11全天,同比增长300,无论是在京东还是天猫,都可以看出来今年双首届松山湖新材料高峰论坛召开,资本与科技共促新材料产业发展11月26日,首期中国松山湖新材料高峰论坛在东莞松山湖召开。本次论坛旨在构建科研产业资本对话平台,实现科研产业资本的高效对接,推动新材料行业前瞻性研究成果共享,提高科技成果转化率,畅享音乐动感节拍飞利浦耳机A4216让你充满运动激情随着人们健康意识的提升,越来越多的人意识到,在这个快节奏的时代,运动音乐才是放松身心的最佳打开方式。忙碌了一整天,下班后吃完饭销事休息,带上耳机去夜跑去撸铁,肆意挥洒汗水,享爱运动坚果J104000块搞定最强家庭影院,双十一购物车必须有双十一购物狂欢节已经是近在眼前了,各位现在一定是疯狂在做直播间和各大品牌促销功课吧?购物车是不是已经快装不下了?其实除了美妆护肤服饰鞋袜等个人日常消费品,趁这这时候添置一台家用电器Windows上好用的软件随着时代的发展,互联网技术日益成熟,现在许多人都会在网上完成自己的工作,这样的话,知道几个好用的软件就显得十分重要,它们可以让你在工作中更加游刃有余,进一步提升你的工作效率。在我平成长最快年轻潮牌!Vidda天猫一小时销额超去年整个双1111月1日消息,昨晚是今年双11的尾款之夜,海信旗下年轻潮牌Vidda宣布了自品牌升级以来的首次双11大捷10月30日晚2000,京东提前开付尾款,仅仅用了59秒,Vidda的销售云小听宠粉营业陪你过国庆国庆的朋友圈摄影大赛冠军非我莫属!带话题国庆假期高质量plog转发此条微博并晒出秋天的第一片落叶,同时云听APP,就有机会获得360天VIP权益云听全套周边任选云听5个付费专辑等多