游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

OS内核的信号机制所有的异步都可以是同步的

  今天条友xiamenuser给我提了一个关于操作系统的问题:怎么把定时器线程里的回调函数,(在定时器触发之后)挪到工作线程里运行?
  这个需求要做的事,跟Linux内核的信号机制是一样的。
  OS内核的信号机制,在1970年的Unix时代就有了,是一个上古话题。
  在unix里,可以使用kill9pid命令杀掉进程(pid为进程号),在Linux里也可以。
  1,OS内核的信号,
  有个专有的宏定义defineSIGKILL9,然后信号9就成了一个特别牛的信号,大概除了0号idle进程和1号init进程之外,其他进程都可以杀死。
  0号进程和1号进程是不能杀死的,否则系统就崩溃了!
  intsyskill(intsig,intpid)
  {
  if(sig0pid0)
  returnEINVAL;
  if(0pid1pid){
  if(SIGKILLsig)return1;
  }
  tasks〔pid〕sigmap1sig;
  return0;
  }
  OS内核里对应着kill命令的syskill()系统调用,大概是上面这样:
  在进程的task结构体的sigmap成员变量上,设置1个标志位,进程就可以收到信号了。
  每个进程,在OS内核里都被一个task结构体表示,这个结构体的其中一个成员变量就是记录信号的:我们给他起名叫sigmap,Linux的不一定要叫这个名字,但肯定有这一项。
  这个信号在什么时候处理呢?
  等到收信号的进程下一次被调度运行的时候。
  当前运行的进程,肯定是发信号的进程,否则它没法主动发起kill()系统调用。
  发信号的进程做的事,只是把信号设置到接收进程的信号图上,这时信号实际上已经发到了:但是接收进程并不会马上因为SIGKILL信号而被杀死。
  SIGKILL信号的杀进程,实际上进程是自杀的!
  当收到信号的进程再次被调度运行的时候,操作系统会让它先执行信号的处理函数,而SIGKILL的处理函数,就是exit()系统调用:进程退出。
  这个过程可以是异步的,等到接收进程下一次被调度时再处理,至于什么时候轮到它:等吧。
  也可以让它马上同步处理,只需要在syskill()函数的末尾加一行代码就行:
  sheduletask(tasks〔pid〕);
  直接选择接收进程是下一个要调度的进程,并且马上调度它运行:接下来它就完事了。
  不需要等OS内核统计时间片,确定调度的优先级了,既然用户想让它挂掉,OS当然要马上让它挂掉。
  毕竟Linux系统也惹不起用户啊,用户是可以重装windows的〔捂脸〕
  接下来,说说sheduletask()之后的细节。
  2,信号是怎么处理的,
  每个信号都有一个处理函数,叫信号处理函数。
  信号处理函数,是在用户态的代码里运行的。
  所以,程序员可以自己给部分信号编写处理函数,用signal()系统调用注册到OS内核,就可以(在收到信号时)运行这个自己编写的函数了。
  如果信号处理函数是在内核状态运行的,那显然用户编写的函数是没法运行的,因为用户函数的内存地址在用户空间(它在进程的代码段里)。
  OS内核在信号处理时要做的是,把进程从内核返回后要运行的代码地址,改成信号处理函数的地址。
  修改过程如下:
  系统内核的信号处理过程
  1)进程从内核返回时的状态,如上图。
  内核栈上的寄存器排布顺序不一定是对的,这要查intel的手册,但是这些项肯定都有。
  在进程使用iret指令(中断返回)从内核返回的那一刻,内核栈上的这些数据都要弹出到对应的寄存器。
  然后,进程就会运行EIP指向的用户代码,同时用户态的栈顶就是ESP。
  EIP和ESP指向的内容到底是什么,内核不需要管:这是由程序员写代码时确定的。
  进程从内核返回之后的错误,错的是程序员,不是系统内核。
  但要是返不回来,或者不能处理信号,错的就是系统内核了。
  2)OS内核要做的是,修改内核栈上、保存的、用户态的、EIP和ESP(注意这3个定语):
  A,让EIP指向信号处理函数,
  B,让ESP指向信号处理函数的参数,
  C,在信号处理函数的下方,放上真正的返回地址,
  D,在信号处理函数运行完之后,丢掉(信号处理函数的)参数,弹出真正的返回地址:让程序恢复正常的状态,继续运行。
  如上图中的绿字部分。
  如果一次要处理多个信号的话,就顺着用户栈继续叠加就行。
  siska内核demo里的信号处理代码,如下的3张图:
  因为信号处理函数有参数,而参数要压在用户态的栈上,所以信号处理函数运行完之后还要清理它。
  所以,与一般的C函数不同,信号处理函数是被调函数清理堆栈的:即它是pascal调用,而不是C调用!
  C调用,都是主调函数清理堆栈的。
  所以,信号处理函数的总入口是一段汇编代码,用来在C语言里完成这个pascal调用。
  这么看来,pascal这种老语言,也不是想象的那么差〔捂脸〕
  这个信号处理方式,是我给出来的解决方案〔呲牙〕
  至于Linux是不是也这么做的,我就不知道了。
  但是,这么做是可行的。
  siska信号处理,pascal调用的汇编
  上图95行的call(eax),就是调用信号处理的函数指针。
  它前后的汇编代码,都是准备参数和清理堆栈。
  3,回到开头的问题,
  怎么让定时器线程在触发之后,让回调函数在工作线程里运行?
  回调函数一般有一个参数,表示回调上下文,但没有返回值。
  因为定时器的添加和处理在2个线程里,回调函数的返回值没有意义。
  如果回调函数的处理出错了,就在上下文里设置错误码作为提示。
  所以,它的函数声明是这样的:voidcallback(voidctx);
  要让它正常运行,必须把回调上下文的指针添加到工作线程的用户栈上,同时让工作线程的内核栈上保存的EIP指向回调函数。
  这个处理方式,与OS内核的信号处理方式是一样的。
  信号处理函数的声明:voidsighandler(intsig);也是一个参数、无返回值。
  在定时器触发之后,定时器线程可以发起一个系统调用,把这些信息给到内核,然后内核修改工作线程的数据,让定时器的回调处理像个信号一样就可以了〔呲牙〕
  这个系统调用如果Linux没有提供的话,就只能自己修改Linux内核代码,或者给Linus大牛提个需求了(他有可能看不过来你的邮件)。
  PS:
  工作线程和定时器线程在同一个进程里,所以它们的用户态内存的代码段、数据段、堆都是共享的,只是内核栈和用户栈不一样。
  内核栈:在内核看来,每个线程也是一个可调度的进程,它必须有自己的内核栈和页表。
  同一个进程的不同线程之间共享内存,靠的是页表的映射:把它们映射到同一个物理内存页上。
  用户栈:不同的线程可以并发运行,它们的用户栈肯定是不同的,否则局部变量就互相覆盖了:这肯定是不可能的。
  siska里信号处理的代码,如下:
  siska信号处理,1
  siska信号处理,2

明日上午10点!石城万张景区门票消费券开抢!点击上方蓝字关注石城旅游【春遇石城】登高望远,春日一起来爬山吧琴江文学通天寨景区传说故事地藏岩三月花开、风暖,春光醉!是时候告别冬日的慵懒,于春暖花开日,踏青……围观!2023上半年最好的国产机,性能不输iPhone14,如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。今天分享:围观!2023上半年最好的国产机,性能不输iPhone14,上手体验更好第一款:OPP……小S韩国行第四天,身穿韩服美艳俏皮!小S在这次的韩国行可谓是吃得好玩得嗨,穿上了韩服后更是戏瘾上身,搞怪来了一段韩剧经典吵架桥段,直言自己就是韩剧中的中殿娘娘,不得不说,这次的韩服造型跟她很搭,俏皮别致,非常适合……写在夜幕夜幕降临,站在窗前,随手点燃一支烟。看着外面逐渐亮起一家一户,眉头居然一蹙。从小生活在农村,百八十户的小村庄,晚上没有路灯,夜幕来临以后,除了偶尔几声狗叫,是那么的……c制作窗体的淡入淡出效果想制作一个窗体的淡入淡出效果:用WindwosAPI可以解决这个问题:usingSystem;usingSystem。Collections。Generic;usingS……晚报魅族20官方预热欧洲将禁售燃油车嗨!尾巴们,晚上好,今天是2月15日魅族20系列官方预热一加显示器E24海外上市《逆水寒》手游推出游戏版ChatGPT索尼WHCH520720耳机偷跑上……饮酒不过量就没事?医生提醒这4类人最好做到滴酒不沾不管是大型聚会还是在家里,餐桌上必不可少的一道风景那就是酒。生活中许多人都喜欢喝酒,在一些人的认知中,酒与香烟相比,酒对身体的益处那就多了。但是喝酒到底是养生还是伤身,相……中国民宿产业发展大会论坛汪文学把民宿打造成安顺旅游业标志性产近年来,在省委、省政府的坚强领导下、在省文化和旅游厅的大力支持下,我市始终坚持把民宿产业作为旅游业恢复发展和提档升级、推动乡村振兴、促进农民增收致富的重要举措和抓手。3月19日……1300余名户外选手齐聚冷水江锡矿山,畅享奔跑之美3月25日26日,中国体育彩票巅峰湖南六大名山登山赛(冷水江站)暨锡矿山红军行徒步越野活动在冷水江锡矿山开幕,共有1300余名户外选手参加比赛,共同感受自然之美、运动之美、健康……二十五年前的今天,华为基本法颁布学华为头条导读二十五年前的今天,《华为基本法》颁布1994年11月,华为从一个默默无闻的小公司一跃成为热门企业。视察过该公司的上级领导都称赞华为的文化好。干部员工也……媒体挖掘iOS16。4代码发现BeatsStudioBudsIT之家3月22日消息,国外科技媒体9to5Mac通过深入挖掘iOS16。4RC版本系统代码,发现了一款尚未发布的BeatsStudioBuds耳机。该媒体通过挖掘系统代……什么是四维空间?人类进入其中会发生什么?四维空间是一个令人着迷的话题,因为它超越了我们三维世界的认知和理解。然而,进入四维空间可能会带来令人恐惧的体验。首先,我们需要了解四维空间的特点。在四维空间中,时间不再是……
走玩龙山乐享洞天乌龙山大峡谷景区第二届健康跑开跑红网时刻新闻12月25日讯(龙山融媒记者向波)12月25日上午,龙山县举办的走玩龙山乐享洞天乌龙山大峡谷景区第二届健康跑开跑。龙山县政府三级调研员彭绍兴出席并致辞。活动现……多地号召居民加入外卖骑手队伍,有程序员兼职跑单日入500元近期多地因配送人员居家休息而缺少配送运力,不少城市相关部门发文号召居民加入外卖配送队伍。第一财经梳理发现,自12月16日至今,北京、上海、江苏、重庆多地市场监管部门发文鼓励有条……2023年度重庆渝快保即将停售,12月31日前上支付宝仍可投重庆人注意了!12月31日,由重庆市医疗保障局、重庆银保监局指导监督的2023年重庆渝快保就将截止参保!重庆渝快保5天后停售2023年重庆渝快保共有2档产品:普惠款69元……支撑高速增长的三驾马车,都出了问题,越南把目光再次转向中国?咱们很特别的一个邻国越南,因为内外有利条件的相互促进,已经过了将近10年经济高速增长的好日子。从外部环境上看,一方面,百年未有之变局与新冠疫情叠加影响,美国为维护自身霸权,加大……海花岛跨年游玩攻略,花式玩法12小时不停嗨2022年已进入倒数,是时候将遗憾归零,让欢乐无限延续!12月31日,海花岛将举办跨年迎新灯光烟花盛典,新年奇妙夜派对、璀璨烟花盛宴、浪漫花火市集、周年狂欢抽奖、全民祝福灯光秀……如何通过胎心监护图,判断胎心是否正常?判断胎心监护在图形上的正常与否,主要有三个参数:基线率、变异度和周期性变化。1、基线率集贤率是指无胎动、无宫缩时的胎心率持续10分钟以上,这和传统的听诊有不同含义。听诊胎……高性价比真香神机,游戏拍照十分全面,第一款只要1849元近年来,随着科技水平的不断攀升与更迭,各大手机厂商纷纷推陈出新,陆续发布了带有多项新技术的高端旗舰产品,来满足中重度手机用户以及尝鲜者。但实际上,并非人人都是上述两类人群,更多……纯纯不理解了家人们,有这么一台电视,贵就算了居然还断货?前情提要是这样的,很早之前我跟我闺蜜俩人就商量好,如果未来住在一起一定要搬一个电影院回家,没事就窝在那一起追剧看电影吃零食,想想就爽到飞起。而就在近期我俩装修新房的时候,……大屏幕智能手机有多卷?乐视Y1Pro几百元到手接到老妈的电话,要我帮外婆买台手机,要求操作简单,流畅屏幕大就行,我第一反应就是给外婆买台那种带按键的模拟机,上网一搜,最新款的居然要499元,还不是智能手机。我立马转换目标去……同理心强的孩子,往往拥有更好的社交能力图《小孩的神秘生活》文张蔚斐来源成长的可能孩子们之间的友情是怎样的?孩子上幼儿园以后,接触到了新的伙伴,各种各样的问题就接踵而至了。在幼儿园里,孩子的社……西藏一妻多夫的家庭,晚上是怎样分配时间的?答案来了我们都知道,古代的皇帝后宫佳丽三千,美女如云,多得数不胜数。一些王宫贵族,得力的干将大臣也都有三妻四妾,但是,总有一个大房,之后才会有小妾。这是很正常的现象了。可能有些男……国际足联主席期待下届世界杯中国和意大利能同时出线卡塔尔世界杯开幕前夕,国际足联主席詹尼因凡蒂诺接受记者专访时表示,足球不仅仅是一项体育运动,其文化价值和影响力可以让世界团结在一起。因凡蒂诺说,毫无疑问,中国是世界足球发展的重……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网