首页 文章 精选 留言 我的

精选列表

搜索[思维链],共10003篇文章
优秀的个人博客,低调大师

物联网创新 要具备五种思维

早在凯鹏华盈投资公司担任普通合伙人期间,特拉·瓦萨洛就对居家物品与网络的联姻,也就是人们通常所说的“物联网”,产生了浓厚兴趣。她投资了好几家成功的物联网概念公司。Dropcam公司可以让人们通过Wi-Fi视频摄像头随时监控家里的孩子和宠物。Nest Labs公司则有望通过由传感器驱动的Wi-Fi联网恒温器来改变世界。 在凯鹏华盈公司工作12年后,瓦萨洛现在已转型为一名独立投资人。上文提到的两家公司已经被谷歌收购,物联网的热度有增无减。瓦萨洛称:“物联网将 是下一个创新前沿。”瓦萨洛曾在IDEO公司担任产品开发员,拥有斯坦福大学商业管理学和机械工程学双硕士学位。她表示:“物联网将是继iPhone、智 能手机和平板电脑生态系统之后的下一个新平台领域。” 在今年5月1日出席了由斯坦福商学院企业家研究中心赞助的一场研讨会后,瓦萨洛进一步探讨了如何在物联网领域进行创新。 改造旧有模式 瓦萨洛表示,自从互联网被发明之日起,人们就开始尝试将互联网与周身环境连接起来。如今,硬件的发展已经有了很大变化。现在的智能手机技术成本大大 降低,传感器技术已经非常先进,智能设备已经可以理解它们的运作环境,并且可以采取一定的行动,使人们的生活变得更好。瓦萨洛指出:“Dropcam就是 一个例子。”该设备可以让人发现入室抢劫者,帮助人们在千里之外看到宝宝第一次蹒跚学步的样子。“它提供了极好的新功能,能轻松融入这种古老的家庭安全范 式,满足人们希望时时刻刻照看家中的心理。” 产品包装注重客户感受 很多联网设备往往很难安装和使用,但这些设备正变得越来越易于使用。比如,Nest恒温器就是由曾设计过苹果iPhone手机的工程师设计的。“关键是要确保你不仅拥有正确的技术,还要用正确的包装方式。必须要让顾客一眼看到它的价值,只有这样,他们才愿意使用。” 去繁就简 “我寻找的是那种能利用传感器理解环境,能替顾客做某些事情,从而使顾客能更快更简单地做出决定,并能通过某种方式使事情得到改善的产品和服务。”瓦萨洛说。 比如,Nest恒温器就是利用智能手机来管理室内温度。它的传感器可以判断主人是否在家,然后房子的暖气或空调系统就会相应做出调整。瓦萨洛表示:“它没有提高复杂性,而是让你的生活变得更简单。” 它省钱吗? 瓦萨洛还投资了一家名叫Enlighted的创业公司。就本质而言,其产品就是一种面向商用建筑的Nest恒温器。“他们为建筑物的每一盏灯放置一 个传感器。”除了改善办公环境,这些传感器还能给企业省下一大笔钱——光是照明成本就能节省50%到70%。“对环境的影响是巨大的。” 找到合适的人才 瓦萨洛指出,企业要想涉足物联网产业,就需要聘用掌握各种专门技术的人才。她表示:“我希望创始人充满激情,善于招徕杰出人才。” 前路漫漫 在硅谷,创新浪潮通常始于硬件的大幅改进,随后将迎来漫长的软件开发期。这些联网设备的基础硬件平台目前仍处于襁褓时期。工程师们仍在努力解决一些基本的通讯标准,使智能家居产品能够更加无缝地与互联网和其它智能家居进行沟通。 瓦萨洛表示:“目前仍然是物联网的早期阶段,我们正处在‘西部拓荒’时期。” 原文发布时间为:2015年11月06日 本文作者:财富中文网 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。e

优秀的个人博客,低调大师

物联网创新应有的五种思维

早在凯鹏华盈投资公司担任普通合伙人期间,特拉·瓦萨洛就对居家物品与网络的联姻,也就是人们通常所说的“物联网”,产生了浓厚兴趣。她投资了好几家成功的物联网概念公司。Dropcam公司可以让人们通过Wi-Fi视频摄像头随时监控家里的孩子和宠物。Nest Labs公司则有望通过由传感器驱动的Wi-Fi联网恒温器来改变世界。 在凯鹏华盈公司工作12年后,瓦萨洛现在已转型为一名独立投资人。上文提到的两家公司已经被谷歌收购,物联网的热度有增无减。瓦萨洛称:“物联网将是下一个创新前沿。”瓦萨洛曾在IDEO公司担任产品开发员,拥有斯坦福大学商业管理学和机械工程学双硕士学位。她表示:“物联网将是继iPhone、智能手机和平板电脑生态系统之后的下一个新平台领域。” 在今年5月1日出席了由斯坦福商学院企业家研究中心赞助的一场研讨会后,瓦萨洛进一步探讨了如何在物联网领域进行创新。 改造旧有模式 瓦萨洛表示,自从互联网被发明之日起,人们就开始尝试将互联网与周身环境连接起来。如今,硬件的发展已经有了很大变化。现在的智能手机技术成本大大降低,传感器技术已经非常先进,智能设备已经可以理解它们的运作环境,并且可以采取一定的行动,使人们的生活变得更好。瓦萨洛指出:“Dropcam就是一个例子。”该设备可以让人发现入室抢劫者,帮助人们在千里之外看到宝宝第一次蹒跚学步的样子。“它提供了极好的新功能,能轻松融入这种古老的家庭安全范式,满足人们希望时时刻刻照看家中的心理。” 产品包装注重客户感受 很多联网设备往往很难安装和使用,但这些设备正变得越来越易于使用。比如,Nest恒温器就是由曾设计过苹果iPhone手机的工程师设计的。“关键是要确保你不仅拥有正确的技术,还要用正确的包装方式。必须要让顾客一眼看到它的价值,只有这样,他们才愿意使用。” 去繁就简 “我寻找的是那种能利用传感器理解环境,能替顾客做某些事情,从而使顾客能更快更简单地做出决定,并能通过某种方式使事情得到改善的产品和服务。”瓦萨洛说。 比如,Nest恒温器就是利用智能手机来管理室内温度。它的传感器可以判断主人是否在家,然后房子的暖气或空调系统就会相应做出调整。瓦萨洛表示:“它没有提高复杂性,而是让你的生活变得更简单。” 它省钱吗? 瓦萨洛还投资了一家名叫Enlighted的创业公司。就本质而言,其产品就是一种面向商用建筑的Nest恒温器。“他们为建筑物的每一盏灯放置一个传感器。”除了改善办公环境,这些传感器还能给企业省下一大笔钱——光是照明成本就能节省50%到70%。“对环境的影响是巨大的。” 找到合适的人才 瓦萨洛指出,企业要想涉足物联网产业,就需要聘用掌握各种专门技术的人才。她表示:“我希望创始人充满激情,善于招徕杰出人才。” 前路漫漫 在硅谷,创新浪潮通常始于硬件的大幅改进,随后将迎来漫长的软件开发期。这些联网设备的基础硬件平台目前仍处于襁褓时期。工程师们仍在努力解决一些基本的通讯标准,使智能家居产品能够更加无缝地与互联网和其它智能家居进行沟通。 瓦萨洛表示:“目前仍然是物联网的早期阶段,我们正处在‘西部拓荒’时期。” 作者:何妍 来源:51CTO

优秀的个人博客,低调大师

每日一博 | 朴素系统优化思维的实践

作者:京东物流 严孝男 一、问题 去年年中时候,我有个好朋友(可以叫他华哥)顶着当时还很严重的疫情形式激情创业,斥巨资承包了他原公司食堂的几个摊位,摇身一变成了老板。当了老板的华哥没有丝毫懈怠,不但做了充足的市场调研,还结合他自己以前就餐时的痛点做了创新,比如以前食堂除了最常规的面,饺子,米线一类的之外就是一份份的卖炒菜,差不多一份荤菜十几块,一份素菜近十块的样子,这就导致一个问题,一般男生花了几十块钱也就只能吃到2-3个菜,不但营养不够丰富,万一踩坑遇到了原本抱有很高期待但发现实际菜并不好吃的情况,体验就更差了。 所以华哥借鉴了市面上麻辣烫自选称重模式的特点推出了自助选菜称重的模式,餐台上会摆放很多种做好的菜(荤素凉都有),大家根据自己的喜好自己打菜,主食的米饭和馒头免费,粥和汤也免费,然后还提供一些收费的主食比如红薯,玉米一类的,打菜的流程就是大家从台子两边按顺序开始自选打菜,然后选择主食,然后选择汤粥,然后结账刷卡,如下图所示: 华哥不愧是前互联网大厂的金牌产品经理,其敏锐的抓住了用户的痛点,并很好的给出了相应的解决方案,自助称重模式自从推出后就受到了同事们的热烈欢迎,每次都排了长长的队伍,甚至中午11点半开餐,不到11点20就有很多同事在排队等着,写到这里我想举个排长队的例子给大家一个直观的印象,我最开始想到的例子是五道口那个枣糕店门口排的长队,后来一想现在京东2号楼B座4楼餐厅里排瓦罐的队伍好像更贴切。 华哥开始的时候非常开心,但一个月后做了营收盘点发现有点不对,虽然看上去队伍排得很长很火爆的样子,但实际上营收并不如预期。华哥分析了一下排除了客单价低的因素,自选模式下好多菜大家看到后都想来一点,一来二去就会打好大一盘,基本都是20元起步的客单价;然后就剩下单量低这个可能性了,实际分析一下就可以发现,因为菜的可选品种很多,所以选菜环节每个人需要花很长的时间选菜,再加上需要打汤和打饭,一个人实际完成整个取餐的过程耗时是很长的,虽然后面的同事可以跟在前面同事后面串行打菜,但因为每个人的喜好不一样,所以每个人在不同菜前的停留时间不一样,这就导致当前面的同事在某个菜盘前耗时稍长的时候,后面的同事是处于等待状态的。 而且有的时候还会遇到一些极端的情况,比如有些同事会在某些他爱吃的菜前停留很久挑挑拣拣,还有些同事会在打免费汤时拿着大勺顺逆时针交替着疯狂搅动,以此企图捞起汤里那些零散的沉底的菜叶和鸡蛋白,华哥就亲眼目睹了他以前汇报的经理在辣子鸡丁菜盆里翻来覆去的寻找隐匿在辣椒深处的那一点点鸡肉,每发现一块鸡肉时经理的脸上还会露出那种心满意足充满成就感的笑容,话说回来其实在经理挑鸡肉时整个队伍实际是处于完全停滞状态的,所以综合来看整个队伍的执行就餐过程是非常缓慢的,也就导致实际打完餐付费的人数并不如想象中多。 二、方案 后来在一次好友聚会时,华哥和我聊起了这个事情,他问我:你们搞技术的不都各种吹嘘什么系统优化,降本增效一类的吗,你帮我想想办法。听完华哥这略带挑衅意味的要求,我突然觉得自己身上有了很重的责任感,觉得自己要守住技术人的尊严。于是自己好好想了想,然后觉得这个商业问题实际上也可以看成一个技术问题,这个餐台可以看成一个系统,打餐的流程可以认为是系统的一次交互流程,每个打菜的同事可以看成是一次调用,因为每次调用执行起来的性能太差,导致系统整体的吞吐量太低,影响了整体系统的效能,因此整个系统的效能很低,虽然当时已经是酒过三巡,脑子不太清醒了,但是自己还是尽力给华哥想了好几个办法。 2.1 系统扩容 第一个想到的办法就是扩容,在工程技术领域当遇到系统性能不达标时,第一个想到的解决方案也一般都是扩容,工程领域里的扩容一般可以分垂直扩容和水平扩容两种方式:垂直扩容是通过提升单体实例的硬件能力来提升单体处理能力,水平扩容则是通过增加实例节点的方式来增加整个系统的处理能力。 套用这两个理论,看看怎么提升餐台的吞吐,好像垂直扩容这块能做的不多,总不能把打饭的勺子升级一下变成德国原装进口高温武火蹴练镀金勺吧;不过虽然垂直扩容没什么好办法, 但是水平扩容好像能做的事情很多了,只要多增加几套打菜餐台,这样并行执行的2条打饭队伍就可以变成4条,甚至8条,直接实现了多线程并发,这样系统整体的吞吐能力可以立马获得翻倍式提升,效果不但见效块,效果也可谓是立竿见影,于是我给画了一个水平扩容示意图,如下图所示: 不过水平扩容的方案很快就被华哥否了,虽然在工程技术领域,随着云原生技术的成熟,应用级别的扩容缩容都是很成熟的提升系统处理能力的解决方案了,但是在华哥这里,想再搭一个餐台是不可能的,且不说华哥承包的摊位没有这么大的地方去搞第二个餐台,就算有,从新施工装修,水电改造一系列的成本也几乎是不可能实现的。 虽然这个世界上能用钱解决的问题都不叫问题,但现在的问题是华哥没钱了。 2.2 单次执行优化 提升系统并发能力的路走不通后,那么提升系统的吞吐量的办法就是缩短单条请求的处理执行时间,这样单位时间内系统处理的请求条数就会有提升,从而提升系统吞吐量,那回到餐台这里,就变成了需要缩短单人打餐的时间,尤其是遇到华哥前经理那种在单个菜盘前会耗费大量时间的情况该如何优化呢? 我们拆分一下每次调用,把在每个菜盘前打菜的过程可以模拟理解为执行一段逻辑,这样全部的打菜过程可以被拆解成一个个小的代码块,总的调用时间是由这些代码块的执行时间之和决定的,从工程技术视角的话就是保证每段逻辑都在一个可预期的时间内完成,所以每段逻辑都可以通过一个超时判断逻辑来控制每段代码的执行时间,这里举一个百度搜索的例子,百度为了增强返回结果的多样性,推出了阿拉丁架构,每个query经过星图模型解析后会分发给不同的垂类,每个垂类会加工生产属于自己业务领域的卡片,然后阿拉丁的root应用聚合垂类返回的各个结果并返回给用户,那某些垂类场景执行会比较慢,比如当遇到用户搜一款药的场景时,健康垂类的应用会根据搜索人的经纬度筛选附近的o2o的药店,并计算该药品在该门店的促销折扣价,这种计算往往会耗时很久,所以root应用会增加一个380ms的超时判断,对所有的垂类应用都是一样,当你返回的内容超过这个时间后结果会被丢弃,举这个例子让大家可以明白通过增加对每个环节的超时设置,这样可以保证整体的流程在一个可控的时间范围内得到执行,从而保证用户体验的一致性。 程序里的超时好加,因为程序没有喜怒哀乐,但打餐的场景不一样,总不能在每个菜后面安排一个服务员在背后数123计时,超过5s往前推他一把,总不能这样吧,究其原因就是打菜是主观能动的,他想在一个菜前停多久就停多久,想到这个问题后,我有了主意,把用户自主停留的权利给剥夺,创造统一的停留时间,所以我给华哥设计了一套超时装置,那就是在餐台的两边各增加一套自动传送装置,类似于飞机场里安检后赶去航站楼的传送带一样,这样人们在两边打菜时不需要自己走动了,而且每个人在每个菜盘前停留时间是一样的,就不会出现一个人在某个菜前停留时间过久的问题,也避免了餐台因前面某个人的长时间停留而出现整体停滞的问题,提升了餐台的吞吐量,而且传送带的增加还有个好处就是人不多时可以开得很慢甚至停掉,在高峰期时可以适当增加传送带的速度,从而控制每一个人打菜的时间,保障整个餐台的吞吐率。 华哥听到我这个有点天才的想法后愣了很久,盘算了一下可能性后他觉得这个办法还真的可行,只是需要等到十一或者五一长假期间动工在两边增加传送带,终于听到一个可行方案的华哥有点兴奋,两腮也泛出了点点的红晕。 2.3 非核心流程剔除 看到华哥接纳了我的这个方案,我顿时感受到了很大的鼓励,于是又继续思考这块流程还能怎么优化,在工程技术领域,一个流程在承受很大流量时还可以做的一个事情就是流程简化,只保留核心的流程环节,也就是大家常说的黄金流程,而将非核心的业务节点从主流程中剔除,这样精简后的主流程可以一定程度上缩短执行时间,而且主流程执行的逻辑少了,出错的概率也同时就降低了,举一个京东零售的下单计算流程为例,零售侧结算时需要做以下的事情: 实际上结算这块还有很多的非主要节点要处理,比如删除购物车中相关已结算商品,预占自提柜等等,但是这些属于非核心的流程,可以从主流程中剔掉。 回到餐台这里,什么流程是黄金流程,没错,就是那些和营收直接相关的流程,而那些不产生收益的项目,比如米饭馒头,汤粥的环节就可以认为是非主要流程,可以从主流程中剔掉,这样不断简化了大家取餐的主流程,而且还节省了餐厅的空间,剩余的空间可以用来做几件事,一个是可以多放一些收费的主食或者增加一些菜品,以此可以增加收入,第二个可以增加一些自助收银设备,之前2个收银台在之前打餐比较慢时可以满足需求,但现在整个流程简化了,整体每个人的打餐速度提升了,这样2个收银台就会变成新的瓶颈,尤其是遇到有扫码直付的同学就会瓶颈的更明显,这样通过增加收银台的数量,从而提升了收银环节的并发处理能力,保证了整个取餐流程的流畅,避免新的性能瓶颈的出现,完美! 华哥听完这个建议很满意,他正嫌餐台太小摆放的菜系不够多呢,这样空间被更合理的利用到能带来收益的食品上了,正合华哥之意,华哥很开心的敬了我一个。 2.4 分布式缓存 除此之外,互联网增加系统吞吐能力,缩短单次执行时间的一个很主要的法宝利器就是利用分布式缓存技术,分布式缓存技术可以让很多存在系统瓶颈的调用通过缩短数据获取时间从而极大缩短处理时间,在这里分布式缓存技术是不是也可以利用到餐台这里呢。 我想了一下,前面从主流程中拿掉的免费主食部分和汤粥部分可以利用缓存的原理,尤其是CDN缓存的原理,把主食和汤粥分布式的放在离同事们就餐的餐桌附近,这样可以让就餐的同事们最近范围就可以盛到主食和汤粥,表面上看对营收没提升,但实际上一是大家打饭近了,就餐体验好了,二是大家打饭加饭方便了,就餐的时间就会降低,从而提升餐桌的利用率。保证下一个打到饭的同事能快速找到座位,体验同样也会提升。这里我就不画图了,相信大家都能明白。 三、后记 华哥整体听完我的优化方案后低头陷入了沉思,许久之后他抬起头看着我,眼神有些许迷离,我顿时有点紧张,以为他要系统点评一下我的方案,没想到华哥开口问我的是,现在几点了,我才意识到华哥刚才是喝多了低头睡着了。

优秀的个人博客,低调大师

思维导图整理Linux进程描述符

[导读] 内核是怎么工作的,首先要理解进程管理,进程调度,本文开始阅读进程管理部分,首先从进程的抽象描述开始。抽象是软件工程的灵魂,而对于Linux操作系统而言,更是将抽象思想体现的淋漓尽致。本文从抽象建模的角度来对Linux进程描述符进行个人解读,同时也参考了内核文档,一些网络信息。 注:代码基于linux-5.4.31,是一个最新的长期支持稳定版本。 整理匆忙,限于水平,文章中错误一定很多,真诚恳请有这方面擅长的朋友帮忙指出,不甚感激! 进程的基本概念 进程 or 线程 or 任务? 进程:进程是一个正在运行的程序实例,由可执行的目标代码组成,通常从某些硬媒介(如磁盘,闪存等)读取并加载到内存中。 但是,从内核的角度来看,涉及很多相关的工作内容。 操作系统存储和管理有关任何当前正在运行的程序的其他信息:地址空间,内存映射,用于读/写操作的打开文件,进程状态,线程等。 进程是正在执行的计算机程序的实例。它包含程序代码及其当前活动。取决于操作系统(OS),进程可能由同时执行指令的多个执行线程组成。基于进程的多任务处理使您可以在使用文本编辑器的同时运行Java编译器。在单个CPU中采用多个进程时,使用了各种内存上下文之间的上下文切换。每个过程都有其自己的变量的完整集合。 但是,在Linux中,如果不讨论线程(有时称为轻量级进程),进程的抽象是不完整的。 根据定义,线程是流程中的执行上下文或执行流; 因此,每个进程至少包含一个线程。 包含多个执行线程的进程被称为多线程进程。 一个进程中有多个线程可以进行当前编程,并且在多处理器系统上可以实现真正的并行性。 线程:则是某一进程中一路单独运行的程序,也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。 线程是CPU利用率的基本单位,由程序计数器,堆栈和一组寄存器组成。执行线程是由计算机程序的分支分解为两个或多个同时运行的任务而产生的。线程和进程的实现因一个操作系统而异,但在大多数情况下,线程包含在进程内部。多个线程可以存在于同一进程中并共享资源(例如内存),而不同进程则不共享这些资源。同一进程中的线程示例是自动拼写检查和写入时自动保存文件。线程基本上是在相同内存上下文中运行的进程。线程在执行时可能共享相同的数据。线程图,即单线程与多线程 任务:是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。与线程非常相似,不同之处在于它们通常不直接与OS交互。 像线程池一样,任务不会创建自己的OS线程。 一个任务内部可能有一个线程,也可能没有。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。在RTOS中,一般会将调度的基本单元称为任务,比如freeRTOS,ucos,embOS等,在RTOS中没有进程的概念。 进程 线程 进程是重量级的操作 线程是轻量级操作 每个进程都有自己的内存空间 线程共享它们所属的进程的内存空间 进程间的通信速度很慢,因为进程具有不同的内存地址 线程间通信可能比进程间通信快,因为同一进程的线程与其所属的进程共享内存 进程之间的上下文切换开销大 在同一进程的线程之间进行上下文切换的开销较低 进程不与其他进程共享内存 线程与同一进程的其他线程共享内存 进程间通讯机制: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数 sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal 函数); 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。 线程间的同步机制:为啥线程间没有讨论通讯机制?因为同一进程内的线程共享进程的资源。那么资源共享,则需要处理资源共享时的同步问题。 互斥锁(mutex):通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。这部分代码常称为临界区。哪些可能是临界区呢?简言之,多个线程可能竞争访问的资源。以下一些函数是互斥锁的API函数。 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); int pthread_mutex_lock(pthread_mutex *mutex); int pthread_mutex_destroy(pthread_mutex *mutex); int pthread_mutex_unlock(pthread_mutex * 全局条件变量(condition variable): 创建一些全局条件变量进行互斥访问控制。以下是其操作的基本接口函数: int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr); int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex); int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); 信号量(semaphore):如同进程一样,线程也可以通过信号量来实现通信,其基本操作接口API: int sem_init (sem_t *sem , int pshared, unsigned int value); int sem_wait(sem_t *sem); int sem_post(sem_t *sem); int sem_destroy(sem_t *sem); 进程在内核中如何描述? Linux中进程描述在./include/linux/sched.h中定义: struct task_struct { #ifdef CONFIG_THREAD_INFO_IN_TASK /* 必须是首个元素 */ struct thread_info thread_info; #endif /* -1 unrunnable, 0 runnable, >0 stopped: */ volatile long state; /* 前面是与调度密切相关的信息添加在这之前 */ randomized_struct_fields_start void *stack; refcount_t usage; /* Per task flags (PF_*), defined further below: */ unsigned int flags; unsigned int ptrace; ......... }; 该结构非常大,集总抽象了进程的所有信息,包括进程ID,状态,父进程,子进程,同级,处理器寄存器,打开的文件,地址空间等。系统使用循环双向链接列表进行存储 所有过程描述符。 像这样的大型结构肯定会占用大量内存空间。 为每个进程提供较小的内核堆栈大小(可以使用编译时选项进行配置,但默认情况下限制为一页,即对于32位体系结构严格为4KB(一个页),对于64位体系结构严格为8KB(两个页) –内核堆栈不具备增长或收缩),以这种浪费的方式使用资源并不是很方便。 因此,决定在堆栈中放置一个更简单的结构,并带有指向实际task_struct的指针,从而引申出thread_info。 抽象建模思想看进程描述符 进程首先是操作系统对底层进行抽象而提供面向应用接口的一种抽象,而进程描述符则将底层资源、进程本身的调度从以下几个大的方面进行高级别的抽象封装: 应用程序信息抽象 操作系统资源抽象 调度接口抽象 内存管理抽象 账户信息抽象 ...... 通过预读进程描述符,个人将进程描述相关信息大致分为以下几个大类抽象: 涉及thread_info、优先级、栈、上下文切换、调度相关链表等关键数据。 CPU相关抽象 涉及SMP多核处理抽象、CPUSET子系统相关、当前CPU等相关数据抽象。 保护机制抽象 内存管理抽象 缓存相关抽象 信号通信抽象 接口相关抽象 调试跟踪抽象 安全机制抽象 资源管理抽象 杂项信息抽象 最后附上些整理搜集到数据域的一些较详细的介绍。 thread_info 该字段保存特定于处理器的状态信息,并且是进程描述符的关键元素。具体定义在./arch/xxx/include/asm/thread_info.h中。 entry.S需要立即访问此结构的低级任务数据应完全适合一个缓存行,此结构共享主管堆栈页面 如果更改此结构的内容,则还必须更改汇编代码。 因为thread_info包含了当前进程的指针,存储在栈底或栈顶,取决于不同体系架构栈的增长方向,利用thread_info可以快速的访问当前进程的信息,而不必依次遍历。 ARM32的定义: struct thread_info { unsigned long flags; /* low level flags */ int preempt_count; /* 0 => preemptable, <0 => bug */ mm_segment_t addr_limit; /* address limit */ struct task_struct *task; /* main task structure */ __u32 cpu; /* cpu */ __u32 cpu_domain; /* cpu domain */ #ifdef CONFIG_STACKPROTECTOR_PER_TASK unsigned long stack_canary; #endif struct cpu_context_save cpu_context; /* cpu context */ __u32 syscall; /* syscall number */ __u8 used_cp[16]; /* thread used copro */ unsigned long tp_value[2]; /* TLS registers */ #ifdef CONFIG_CRUNCH struct crunch_state crunchstate; #endif union fp_state fpstate __attribute__((aligned(8))); union vfp_state vfpstate; #ifdef CONFIG_ARM_THUMBEE unsigned long thumbee_state; /* ThumbEE Handler Base register */ #endif }; 从书上和网上看到都是前面这样描述的,但是对于ARM64的却没有当前进程指针,这是为何呢?没弄明白,有谁知道告诉下我呗。 struct thread_info { unsigned long flags; /* low level flags */ mm_segment_t addr_limit; /* address limit */ #ifdef CONFIG_ARM64_SW_TTBR0_PAN u64 ttbr0; /* saved TTBR0_EL1 */ #endif union { u64 preempt_count; /* 0 => preemptible, <0 => bug */ struct { #ifdef CONFIG_CPU_BIG_ENDIAN u32 need_resched; u32 count; #else u32 count; u32 need_resched; #endif } preempt; }; }; 利用如下的几种方式,可以获取thread_info信息: static inline struct thread_info *current_thread_info(void) define GET_THREAD_INFO(reg) ... SLUB 分配器 thread_info实现了进程存储对描述符的引用以及如何访问它们。 但是,如果task_struct不是在内核堆栈内部,则task_struct到底位于内存中的什么位置? 为此,Linux提供了一种特殊的内存管理机制,称为SLUB层。SLUB动态生成task_struct,并把thread_info存在栈底或栈顶。 volatile long state 进程状态,可取的进程状态: TASK_RUNNING: 可执行态 TASK_INTERRUPTIBLE:可中断 TASK_UNINTERRUPTIBLE:不可中断 __TASK_STOPPED:停止态 __TASK_TRACED:被其他进程跟踪的进程 为何用volatile修饰。 由于内核经常需要从不同位置更改进程的状态,例如,如果在单个CPU硬件上同时将两个进程设置为RUNNABLE。熟悉单片机编程的朋友一定知道,当在中断函数中需要修改以及在中断外部也会被修改的变量,就会使用到volatile修饰变量。 randomized_struct_fields_start 这是gcc的一个插件(插件来自于Grsecurity),其作用就是这之后的变量不会按照声明顺序存储在内存中,而会按照一定的随机顺序存放,这样做是基于安全考虑,比如应用程序的进程描述符被劫持,如果按顺序存放,则容易篡改其内容。 文章出自微信公众号:嵌入式客栈,更多更新内容请关注,版权所有,严禁商用

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册