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

充电站

  相信接触过C语言的同学对链表这个数据结构都不陌生,链表作为C语言的一种常用数据结构,它的实现原理大家也已了如指掌,但不知大家是否了解内核中链表是如何实现的。没有对Linux内核有过深入接触的同学可能不会了解内核链表,也不会知道它的实现是有多么的巧妙。下面我就给大家一呈其中妙处。
  相比于普通的链表实现方式,Linux内核的实现可以说是独树一帜的。传统的链表要通过数据内部添加一个指向数据的next节点指针,才能串联在链表中。比如,假定一个cat数据结构来描述猫科动物中的一员。structcat{unsigedlongtaillength;尾巴长度unsigedlongweight;重量boolisfantastic;这只猫奇妙吗?}
  存储这个结构到链表里的方法通常是在数据结构中嵌入一个链表指针,比如:structcat{unsigedlongtaillength;尾巴长度unsigedlongweight;重量boolisfantastic;这只猫奇妙吗?structcatnext;指向下一只猫structcatprev;指向上一只猫}
  但显然如果Linux内核若采用这种实现方式,因为内核中各个设备的数据类型都不相同,将导致内核无法统一的管理各种设备,并且这样的实现方式也会极大的增加代码的重复性,这显然与聚内核的理念相违背。
  故而在内核2。1版本官方引入了内核链表实现,用一个既简单又高效的链表来统一其它链表,其数据结构如下:双向循环链表的节点结构structlisthead{structlistheadnext,prev;};
  可以看到链表中每个节点内都没有数据域,也就是说无论数据结构有多复杂,它在链表中只有前后级指针。而当一个数据结构(即是描述设备的设备结构体)想用通用链表管理,只需在结构体内加入包含节点的字段即可。structcat{unsigedlongtaillength;尾巴长度unsigedlongweight;重量boolisfantastic;这只猫奇妙吗?structlistheadlist;所以cat结构体形参链表}
  并且双向链表可以从任意一个节点的前后遍历整个链表,遍历非常方便。使用循环链表使得可以不断地循环遍历管理节点,像进程的调度:操作系统会把就绪的进程放在一个管理进程的就绪队列的通用链表中管理起来,循环不断地,为他们分配时间片,获得cpu进行周而复始的进程调度。
  现在链表已经能用了但显然不够方便。因此内核又提供了一组链表操作例程,如listadd()方法加入一个新节点到链表,而这些方法有个统一的特点:它们只接受listhead结构作为参数。staticinlinevoidlistadd(structlistheadnew,structlistheadprev,structlistheadnext){nextprevnew;newnextnext;newprevprev;prevnextnew;}
  通过实现这种只有节点的链表,便可以统一的管理内核中设备结构体。但是还需要解决的问题便是如何通过链表节点得到设备结构体的首地址,而这才是内核链表实现最巧妙的地方。definecontainerof(ptr,type,member)({consttypeof(((type)0)member)mptr(ptr);(type)((char)mptroffsetof(type,member));})
  内核链表获得设备结构体的首地址是通过containerof这个宏,我们来具体分析一下这个宏的实现,首先是它的三个参数ptr是成员变量的指针,type是结构体的类型,member是成员变量的名字。containerof宏的作用是通过结构体内某个成员变量的地址和该变量名,以及结构体类型。找到该结构体变量的地址。这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在结构中的偏移量,然后根据成员变量的地址反过来得出主结构变量的地址。下面具体分析各个部分:
  Typeof:
  是用于返回一个变量的类型,这是GCC编译器的一个拓展功能,即typeof是编译器相关的,不是c语言中的某个标准。
  (((type)0)member):
  ((type)0)将0地址转换为type类型的结构体指针,也就是让编译器认为这个结构体是开始于程序段起始位置0,开始于0地址的话,我们得到的成员变量地址就直接相当于成员变量的偏移地址了。
  (((type)0)member)引用结构体中member成员consttypeof(((type)0)member)mptr(ptr);
  这里的意思是用typeof()获取结构体内member成员属性的类型,然后定义一个该类型的临时指针变量mptr,将ptr所指向的member地址赋给mptr,作用是防止对ptr和ptr指向的内容造成破坏。
  其中用到的offsetof(type,member)defineoffsetof(TYPE,MEMBER)((sizet)((TYPE)0)MEMBER)
  这个宏的意思就是求出member相对于0地址的偏移量。(type)((char)mptroffsetof(type,member));})
  这句话的意思是,把mptr转换城char类型,因为offsetof得到的偏移量是以字节为单位的。两者相减得到结构体的起始位置,再强转为type类型。自此我们便能得到设备结构体的首地址。
  使用containerof宏,我们定义一个简单的函数便可返回包含listhead的父类型结构体。依靠listentry方法,内核提供了创建,操作以及其他链表管理方法,你甚至不需要知道listhead所嵌入的对象数据结构。
  可以看到Linux内核链表的实现不可谓不巧妙,通过对内存地址的通透理解,来实现通用的链表结构,才能更方便统一的管理内核中繁杂的设备。而内核中还有许多其它的巧妙实现思路,多多阅读并学习大牛的实现思路和巧妙方法,是能够显著提升我们日常开发效率的,同时也是对思维的一种提升。
  阿木实验室致力于为机器人研发提供开源软硬件工具和课程服务,让研发更高效!
  End
  技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。

JVM调优工具锦囊JDK自带工具与Arthas线上分析工具对Arthas线上分析诊断调优工具以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令。最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具……九月份高性价比手机推荐,从千元机到旗舰机,你想要的全都有时间慢慢来到八月底,即将到来的九月份还会有多款旗舰将要发布,重头戏当然是iPhone13系列,不过价格嘛肯定会很贵,对于学生党就没必要苦等了,那么在开学季的这个时候,都有哪些产……行走的好声音,浴室里的音乐精灵!Taotronics吸盘式蓝机不离手已成为很多人生活中的真实状态,科技的发展让社交、购物、娱乐等通过手机就可以在弹指间畅享智能与时尚。但有些时候却会因为不方便随身携带手机,而担心漏接掉重要的来电,例如洗浴……高科技芯片14nm芯片跟7nm差距多大?如果用回14nm芯片,对我们有多大影响?笨鸟科技08月07日优质科技领域创作者从去年下半年开始,老美对华为的封锁,就唤起了国内对……有哪些好的手机app推荐?熟悉我们有调的调友都知道,每年过年期间有调君都会推荐一些优秀的App,往年推荐的App都是有调君亲自用过,精心挑选的,但今年玩个不一样的,是我们有调的同事来为大家推荐。当……性能加功耗减?荣耀Magic3Pro与骁龙888手机功耗测试近年来,手机行业发展迅猛,各个厂商都大显神通推出各种黑科技功能,性能与体验也在不断提升,但这些年来各家手机似乎都无法突破电池容量的物理限制,囿于手机的大小与重量,绝大多数手机电……联通用户,最省钱的方式入手100G全国流量!联通联合移动、小米分别推出了大王卡与米粉卡,我们评测下大王卡与米粉卡100G流量需要多少钱?大王卡月租固定19元,使用额外的流量就扣钱,而且当月累积流量达到40g时……携手思必驰,先声教育有AI有未来当1个老师面对100个学生时,这是一个教育问题,但当面对100万个学生时,这就会涉及到兼顾公平、提高效率、降低成本的问题,而我们可以借助人工智能来解决。这是在刚刚过去的京东AI……冬季空气问题并不简单,如何保证室内呼吸健康?来听听专家怎么说气温骤降昼夜温差大加之流感病毒爆发,深秋以及冬季是呼吸道疾病高发的季节,再加上今年新冠疫情反复出现,那么如何才能在即将到来的冬季做好室内空气环境安全,保证呼吸健康,防患于未然呢……OPPOAce2价格跌至冰点,骁龙86565W,符合真香定律今年的热门机型我们都已经发布的差不多了,如小米11、iQOO7、三星S21系列、vivoX60Pro等,全部搭载高通最新的高通888芯片。但是对于许多小伙伴来说,现在入手这些手……大咖齐聚,九牧双11明星强推好物双十一不仅是一场全民购物盛典,更是一个品牌竞技赛场。佟大为、李佳航、秦海璐、薇娅、罗永浩、阿爽等各界大咖,品牌领导林孝发董事长、林友色执行总裁、林晓伟研发总裁以及子品牌小牧优品……如何实现外网监控Linux服务器状态?花生壳内网穿透帮你当一种产品的价值随着用户数量增加而增大时,这款产品就具备了网络效应,也称之为网络外部性。Windows系统之于个人PC电脑、Linux系统之于服务器的关系都具备了典型的网络效应……
雷诺日产三菱联盟2030战略5大电动车平台35款新车来源:盖世汽车谭璇1月27日,雷诺日产三菱联盟为纯电动汽车和智能网联出行制定了共同的2030年发展路线图,并为联盟成员及其客户的利益共享投资。该联盟正在加快步伐,未来五年……宇宙中的黑洞是如何形成的,它到底是个什么样的存在?宇宙中的黑洞是如何形成的?它到底是个什么样的存在?答;宇宙中的天体有能够发光的,有不会发光的,还有一种为现代人们用眼睛根本无法看见的暗物质或者说是神秘的天体,无论是什么物……盒马自主研发智慧价签6月上新看一眼价签就知何时上架近日,盒马的电子价签在社交网络上引发关注。但盒马相关负责人表示,电子价签的一秒变价、打折提醒等功能早已不新鲜。6月起,盒马将在全国门店陆续启用新型的智慧价签,智多项服务功能也将……华为ampampquot废太子ampampquot李一男,一华为科技公司经过几十年的沉淀,如今已经可以代表中国走向世界,虽然近些年来,经历了严峻的考验,导致华为遭受重创,但正所谓瘦死的骆驼比马大,华为依旧位列全球第六,说到华为的成长历史……为追捕差评用户,部分亚马逊卖家使出浑身解数有外媒报道,如今亚马逊在线市场上的大部分商品实际上并非来自亚马逊。据估计,该平台上销售的产品中有56来自第三方卖家。这些卖家有时会直接向亚马逊客户发送电子邮件要求删除差评,这种……我是谁从哪里来要去往哪里我是出生在湖北黄冈一个普通家庭的80后男孩儿。08年十月份,诺基亚超薄金属机身全键盘的新款旗舰E71在武汉开售了。我带着浓厚的兴趣在路过实体店的时候进去看了几眼,被专业知……iPhone13出意外魅族18s来了乐视新机长谷歌Pixel两款魅族新机已入网据报道称,型号为M182Q与M192Q的两款魅族新机现已入网工信部。信息显示,M182Q这款手机拥有灰蓝白三种配色,机身尺寸为152。469。28……美区SurfacePro6促销免费送键盘套手写笔喜欢SurfacePro产品又对海淘不拒绝的用户,下面的这波优惠活动可以考虑下。在微软美国商城和百思买,对部分型号的SurfacePro6以及第五代SurfacePro(……双电机四驱直流快充,内饰全是皮,养车费用低,实拍荣威MARV双电机四驱直流快充,内饰全是皮,养车费用低,实拍荣威MARVELX一说高端纯电动车,好多人张口闭口就是特斯拉,似乎纯电动车领域就是特斯拉和其它,但是其实这几年真正开始崛起……微信更新边写边译支持中文英文日文韩语近日,微信进行了新版本更新,虽然更新详细只提到:解决了一些已知问题。但小编还是发现了一个新功能【边写边译】,该功能可以在对话框输入时实时提供翻译,目前支持的语言:繁体中文、英文……中兴线下门店促销,买手机,送小米?网友下回可以送苹果中兴自2020年发布屏下镜头以来,充分整合线上线下市场渠道,手机及IOT终端业务迎来明显增长,大有卷土重来回归主流之势。根据博主毒舌数码爆料,中兴手机在线下市场开展促销活动,打……陕西新能源带节奏挺车市看大招陕西省统计局统计数据显示,2021年陕西全省限上汽车类商品实现零售额1147。46亿元,占全省限上单位消费品零售总额的23。0。但从全年数据看,2021年1至12月陕西省汽车消……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网