首页 文章 精选 留言 我的

精选列表

搜索[低空时代],共10000篇文章
优秀的个人博客,低调大师

5G时代的云游戏发展

云游戏通过网络传输画面来替代本地硬件运行的特性,一方面大大降低了玩家玩游戏的门槛,另一方面为厂商带来新的机遇和挑战。云游戏不仅可以解决电脑本身的硬件问题,还能实现诸如跨平台游戏,无需下载游戏文件等功能。 一、什么是云游戏? 云游戏是以云计算为基础的游戏方式,云游戏技术使图形处理与数据运算能力相对有限的轻端设备也能运行高品质游戏。在云游戏的运行模式下,所有游戏都在云端服务器中运行,并由云端服务器将游戏场景渲染为视频音频流,通过网络传输给玩家游戏终端。玩家游戏终端无需拥有强大的图形运算与数据处理能力,但需具备基本的视频解压软件和可靠稳定的网络。 二、云游戏发展过程和现状 早在2009年,Onlive便成为第一个将云游戏带向市场的公司,彼时其已经可以流畅运行《孤岛危机》等3A大作,不过受限于网络、画质,Onlive最终于2015年被索尼收购。 近年来,全球云游戏布局正随着技术的进步慢慢展开。 海外方面: (1)索尼 2014年发布云游戏平台PlayStation Now。 今年4月,PlayStation Now已正式支持 1080p 流式传输,将陆续为全球玩家推送,首批推送的地区为欧洲、美国、加拿大和日本。 (2)英伟达 2017年建立GeForce Now。 于去年2月份正式推出GeForce Now云游戏服务,据今年4月的报道称,其订阅会员数已近1000万。 (3)谷歌 2018年公布云游戏平台Stadia。 2021年年初,谷歌关闭其第一方开发工作室SG&E(Stadia Games & Entertainment),专心在其Stadia Makers计划,帮助包括育碧、Square Enix等3A工作者在内的独立游戏开发商将游戏项目转移到Google的云游戏平台。 (4)微软 2018年公布云游戏平台Project xCloud。 今年4月19日,宣布其Project xCloud正式结束,全新的 Xbox Cloud Gaming(xCloud)进入测试阶段,并将于今年9月15日正式上线。 国内方面,腾讯研究院与Newzoo在今年4月联合发布的《中国云游戏市场趋势报告(2021)》中预测,2020到2023年间,中国云游戏市场收入将达8.8亿美元,复合年均增长率(CAGR)为135%,远超全球平均水平101%。 自去年以来,国内云游戏布局就迈出了从概念到现实的关键一步,完美世界、三七互娱、盛趣游戏等专注网游的企业布局云游戏,与此同时,以三大运营商、腾讯、华为、网易、百度、字节跳动等为代表的互联网厂商也加速布局云游戏产业。此外,UCloud等头部云厂商也接踵而至。 (1)百度 2013年实现了ARM架构服务器在全球的首次商用。 2020年并购云游戏厂商“红手指”,加入云游戏行业。 (2)华为 2017年发布云游戏解决方案。 今年5月,与中手游达成游戏业务战略合作,共同探索云游戏、VR游戏等应用场景。 (3)腾讯 2019年宣布建立腾讯START、腾讯先游、腾讯即玩。 今年5月底,腾讯先游云游戏家庭游娱套装(“游娱机”机顶盒和定制游娱手柄)开启了预约活动,正式入局客厅娱乐的“江湖”。 (4)网易 网易云游戏在云手机、云电脑双端发力,现已支持Win、MAC、iOS、安卓和TV端。 (5)字节跳动 旗下云游戏平台嗷哩游戏App于今年年初开启内测 技术开发侧,2019年,以三大运营商、金山云、阿里云、盛趣网络等为代表的互联网企业逐渐加入到云游戏的建设中,并从通信技术、云服务、游戏终端、开发平台、应用等全链路布局生态。 (1)中国电信 基于自身云网资源优势,搭建平台、开放能力,中国电信于去年5月发布天翼云游戏能力平台,并在近一年持续推进天翼云游戏的生态合作。 (2)中国移动 咪咕快游云游戏盒子为玩家带来3A游戏体验,其云能力中心于今年年初斩获5G云游戏产业联盟(5GCGA)主办的登云奖——“2020年最佳云游戏基础设施奖”。 5月28日,优刻得与咪咕公司以2.8亿元联合战略投资云游戏技术服务商海马云,进一步与各方深化合作。 (3)中国联通 中国联通的沃畅游包含市场上百余款3A主机/PC大作、手游等精品游戏,配备虚拟手柄,也可连接蓝牙手柄,实现即点即玩。 今年5月,中国联通和腾讯先游联合发布“云玩宝”、“网速卫士”两款产品,为用户提供跨端畅游的云游戏体验。 三、云游戏的核心技术需求 为充分发挥云游戏的潜力,各项核心技术需齐头并进。整体而言,目前云游戏行业专注于优化虚拟化解决方案、提升单显卡容器数量、同时降低数据传输及服务器成本、以及应用弹性拓展来降低计算成本。此外,根据终端设备与网络情况动态调整视频流的能力同样重要。 云游戏是技术和资产密集型产业。既需要全产业链共同发展,也需要音视频编解码、游戏外设、网络性能、安全性等领域技术标准建设的不断推进。 确保流畅云游戏体验的五项核心技术 1. GPU服务器(图形处理器):支持高速和并行计算以及浮点计算,从而改善图像并减少云游戏服务的延迟 行业应用:华为云、腾讯云及阿里云等平台都在其由英伟达或AMD支持的云游戏解决方案中加入了GPU服务器 2. 虚拟化技术:包含虚拟机、容器等隔离技术和GPU虚拟化技术,在提高云游戏效率方面起关键作用 行业应用:英伟达凭借其vGPU软件引领GPU虚拟化技术 3. 音视频编解码加速:可减少由视频编码和解码引发的延迟,在确保视频质量的同时使用更少的网络带宽 4. 5G:5G的高带宽和低时延使其成为云游戏技术真正落地的关键驱动力,为未来游戏“平台不可知”带来更多可能 5. 边缘计算:减少延迟并提高操作和运维管理的效率,是确保能为用户提供流畅云游戏体验的关键因素 行业应用:腾讯、华为、Akamai和SuperCloud等公司正在中国积极构建边缘节点服务器及CDN 结语 整体看,在技术、网络基础设施尚未完善、运营成本居高、体验不佳的当下,云游戏在中国尚未完成可持续商业模式的建立,也未对游戏收入和体验创造增量,因此仍暂时位于产品分发环节,主要基于订阅制按时长收费和提供包月服务,并未真正变革和动摇现有游戏研发、发行、消费生态。原生云游戏引擎与内容尚在路上,对部分游戏内容的侵权使用仍有发生。从纯“推流”“上云”的角度,云游戏技术门槛并不高,但距离兑现云游戏对产业和玩家的承诺,仍需要在新技术、新场景、新内容等方向切实投入,静待变革。

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

5G时代边缘计算基本形态

云计算以通信和互联网等技术为基础,改变了基础设施、平台及应用等服务的增加、使用和交互模式。从使用者角度来说,云计算能够提供成本更低、效率更高的服务,这大大加速了个人数字化的进程。而行业数字化场景的特点是要适用于各个行业,云计算这种全部集中的模式未必是最优的解决方案,比如以下场景。 前端采集的数据量过大,如果按照传统模式全部上传,则成本高、效率低,典型的代表就是影像数据的采集和处理。 数据需要全部上传到中央节点经处理后再下发,往往传输成本高、时延长,无法满足即时交互的要求,典型的代表就是无人驾驶场景。 对业务连续性要求比较高的业务,如果遇到网络问题或者中央节点故障,即便是短时间的云服务中断都会带来严重影响。 除此之外还有安全信任的问题。有些客户不允许数据脱离自己的控制,数据更不能离开自己的系统,对于这样的场景,集中式的云计算中心就搞不定了。 边缘计算并不只为了解决集中式计算在行业数字化中面临的挑战,实际上边缘计算诞生之初是为了节省通信成本。DARPA(Defense Advanced Research Projects Agency,美国国防高级研究计划局)是最早提出和应用边缘计算的组织。 2003年的伊拉克战争期间,美军试点对士兵进行个人数字化,因为作战需要处理的信息和数据庞大,即使士兵携带专用数字设备,也处理不过来,如上传到作战中心的数据中心进行处理,则将面临两个现实问题。 建立从每个士兵到作战中心的数据中心的高带宽数据通道(无线基站或者卫星),成本极高。 士兵携带的专用数字设备重达数公斤,难以再增加计算能力(需要再增加重量)。 DARPA提出了一个方案:在伴随士兵的悍马作战车上部署一个数十公斤级的就近计算设备,其可以处理1公里范围内的数字化士兵的信息,然后由悍马作战车上的就近计算设备进行处理并与作战中心的数据中心进行交互。 ISO/IECJTC1/SC38边缘计算的定义:边缘计算是一种将主要数据处理和数据存储放在网络边缘节点的分布式计算形式。 边缘计算产业联盟对边缘计算的定义:在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用等核心能力的开放平台,其可就近提供边缘智能服务,满足行业数字化在敏捷连接、实时业务、数据优化、应用智能、安全与隐私保护等方面的关键需求。 行业有影响力的边缘计算开源项目群LF Edge(Linux基金会边缘计算开源项目),发布了LF Edge白皮书,白皮书中根据分布在“端、管、云”的计算点位置的不同,将边缘计算分为以下3类,具体如图1所示。 图 1 按“端、管、云”位置,对业界边缘计算概念的示意 1.Edge Cloud:公有云下沉部署的边缘云 公有云下沉部署的边缘云是云服务商主导的下沉部署边缘计算,其在边缘云形态上实现一个小的边缘云。当遇到更复杂的内容时,其会在云上集中处理。边缘就近计算能够提升客户响应速度、增强用户体验、节省带宽,从而为集中式云生态引流。 2.User Edge:用户侧/端侧的近端计算 用户侧/端侧的近端计算会先在本地及时进行计算处理,只处理本用户或本终端的工作负载,随后连接宏网络,和上一级节点或者周边节点实现互助。主要应用场景如下: 用户侧数据不出园区的边缘服务器; 行业、企业或交通路政组建的网络或自组织网络形态的边缘网关; 终端/CPE 形态、车载形态的边缘计算。 3.Service Provider Edge:电信网络边缘计算 国际标准组织 ETSI对电信网络边缘计算的定义为:在移动网络边缘提供IT服务环境和计算能力,强调靠近移动用户,以减少网络操作和服务交付的时延,提高用户体验。Service Provider Edge应用场景主要有MEC(多接入网络边缘计算)和区域网络边缘计算。 2017年ETSI 将MEC全称改为Multi-access Edge Computing,MEC也走向固移融合和多种接入的方向。随着5G技术的逐步成熟,MEC作为 5G 的一项关键技术成为行业上下游生态合作伙伴共同关注的热点,如下是当下典型的MEC应用场景: 以固定运营商为主的边缘计算—“固定连接+计算服务”; 以移动运营商为主的边缘计算(即MEC)—“移动连接+计算服务”。 针对上述边缘计算的各种部署场景,虽然表述上各有差异,但有一个共同点:在更靠近终端的网络边缘上提供服务,实现就近计算,以节省通信带宽、缩短时延等,从而实现综合效益最优。因此边缘计算整体方案的本质是“连接+计算”。

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

刷脸时代 不能漠视面部信息安全

购物时“刷脸”支付,用手机时“刷脸”解锁,进小区时“刷脸”开门。如今,越来越多的事情可以“刷脸”,用人脸识别技术来解决。近日发布的一份报告显示,有九成以上的受访者都使用过人脸识别,不过有六成受访者认为人脸识别技术有滥用趋势,还有三成受访者表示,已经因为人脸信息泄露、滥用而遭受到隐私或财产损失。经调查发现,在某些网络交易平台上,只要花2元钱就能买到上千张人脸照片,而5000多张人脸照片标价还不到10元。 相对于二维码,人脸识别无疑又是一次技术创新。而且,人脸识别可以广泛地应用到支付、考勤、门禁、解锁等方方面面。但应认识到,人脸识别的大规模应用,势必以确保信息安全为前提,否则,越便捷的技术,越有可能给用户带来麻烦甚至灾难。据业内人士称,目前最简单的人脸识别,只需要采集、提取人脸上的6个或8个特征点就能实现。 那么,一旦人脸信息丢失,或者数据库泄密,人脸识别就可能面临较大风险。当人们使用密码支付和二维码支付时,密码和二维码均可以更改或变换。手机丢失后,可以通过挂失等方式更换密码,还可通过相关操作让丢失手机中的APP无法登陆,进而确保安全。人脸识别则不同,因为面部等生物信息具有唯一性和不可更改性,一旦泄露,则处于不可逆转的状态,很可能出现个人资金被窃取,被他人“刷脸”进入小区甚至房间等极端事件。 虽然一些支付机构设置了安全措施,但未必能让人打消顾虑。有相关安全措施,并不代表能确保所采集的消费者生物信息不泄露,泄露后不被不法者非法使用。特别是,一些小区门禁、“刷脸”打卡等数据系统的维护能力和安全防护能力较弱,极易导致信息泄露,甚至不排除有人刻意出卖相应信息。 人脸识别作为一种创新,具有很大便利性,但不能以牺牲安全为代价。值《个人信息保护法(草案)》公开征求意见之际,理当强化对人脸识别信息的保护力度,非经法定事由不得获取人脸信息,并严惩违规者。

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

在家办公时代网络安全的未来

在许多已成为新常态的事情中,在家工作已经成为一个突出的问题,它扰乱了全球数百万人的企业、中小企业和整体商业生活方式。尽管封闭性正在放松,但家庭仍继续作为成年人的办公空间和孩子们的虚拟教室增加了一倍——这似乎是一种长期存在的常态。 在这种情况下,共享家庭WiFi的重要性和安全性对于组织和个人都变得至关重要。尽管印度在过去几年中仍然是世界上遭受最多网络攻击的第二大国家,但这一流行病和封锁进一步暴露了世界上互联网用户人数最多的国家之一在虚拟空间中的弱点。 在这种情况下,这一流行病已被证明是跨行业数字化转型的巨大加速器,包括商业、教育、医疗保健、生活方式和零售业。现在是进行大规模网络安全变革的时候了,因为公司、经济体和国家都在为在不久的将来很长一段时间内适应新常态做好准备。 与虚拟安全领域相关的一些关键WFH趋势将在不久的将来引领网络安全的彻底革新,这些趋势包括: 移动设备 与传统的安全设备不同,传统的网络安全设置总是针对移动网络,当用户离开受保护的边界时,通常会增加网络威胁的风险。然而,现在,随着越来越多的用户将在移动中访问工作和官方信息,也不再集中于单一地理区域,新的网络安全创新需要创建一个庞大的、无所不包的系统来管理这些信息。由于现在有多名员工分布在全国各地,并从远程位置访问数据,网络安全方面的创新需要解决长期的流动性问题。 对云的依赖性 传统的网络安全专家一直在争论云的安全性,跨国公司坚持要建立庞大的内部服务器或数据中心,以确保外部云域上的数据暴露最少。然而,随着使用通用云基础设施的公共领域应用的使用,以及越来越多地使用个人电子邮件或基于移动的应用程序来方便同事之间的对话,网络安全专家将需要设计出能够为更广泛的用户更安全地使用云技术的策略。 加密云连接 一般来说,在封闭的网络服务器上加密连接是几个大型企业的标准连接。然而,随着带宽需求的指数级增长,企业转向加密云连接,这在为分布广泛的用户管理数据安全和信息访问的同时提供更广泛的处理能力。这一举措对于确保WFH结构的长期安全网络至关重要。 对员工进行教育和持续监控 虽然从CXO/CISO级别开始的数据技术和安全措施的转变将是必要的,但如果员工不积极参与新的程序,所有的努力都可能付之东流。考虑到远程工作的形式,对于如何、何时和在哪里使用该设备,以及是否将其用于非官方目的,几乎没有或几乎没有控制。在这种情况下,需要及时举办关于安全WFH程序的基本应做和不应做的教育研讨会。此外,在怀疑数据泄露的情况下,还需要与员工分享一套快速的提示,以便在发生危机时立即采取行动。 在大流行时期,世界越来越多地学习依靠数字创新,而万维网(WWW)已成为商务和休闲活动的热点,网络安全的作用已成为现代生活中最重要的方面之一。即使是在IT团队准备创建解决方案的时候,网络安全团队现在也该为这些创新创造一个安全、高效的背景基础设施,以使这些创新获得成功,并在后COVID世界创造变革。 【责任编辑: 赵宁宁 TEL:(010)68476606】

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

物联网时代,我们还能有哪些隐私?

当我们走在大街上,或许不难发现众多摄像机对准了每一个街口,它们通过高分辨率,不断记录着从镜头前走过的每一个人。 但对于它们来说,他们不止是记录面部信息,同时还有衣服颜色、面部装饰物等大量数据。 “记录这些有用吗?”很多人都会这么问到。 在某部谍战电影中,主角在人潮拥挤的过道中更换了衣服,并画了一个烟熏妆,成功躲过其他人的追捕。但如果放在中国,她分分钟被抓捕——数据中多出一个“全新”人物数据。 由此可见,视频监控对于社会稳定、国家安全来说起到了绝对的作用。 但除了视频监控,还有一个终端设备,也在无时无刻的捕获你个人信息。 “盒马鲜生”事件后续 随着新冠肺炎在中国得到全面控制后,人们似乎松了一口气——各大景点纷纷开张,除了路口检测人员体温的安保人员外,就是一个个体温监控设备,人们不再对新冠肺炎恐慌,全国各地开始恢复正常的工作和生活。 但随着盒马鲜生工作人员检测成阳性后,深圳开始了新一轮的查询——只要是在某个时间段在周边出现的人群,全面进行核酸检测,哪怕只是路过。 如何追踪到每一个人,成为最大的难题,但这并未难倒工作人员。 众所周知,在数年前运营商已经开始对电话号码进行实名认证,而实名认证的好处就是可以通过电话号码知道该人的具体信息,一旦出现任何问题,都可以直接与对方进行沟通。 而通信基站则能自动分析出每一张正在使用的电话卡号码——当你的手机进入到基站覆盖范围内时,基站会自动记录该号码在这一区域活动。 这一方式的优点就是可以快速定位到个人,缺点则是无法实现更为精确的定位:根据周边环境,误差通常在十米左右。 有什么方法可以实现更为精准的定位? WiFi。 WiFi,手机数据的交互口 在万物互联的今天,如何实现更为精准的定位?WiFi则是最好的选择。 WiFi与蓝牙、ZigBee等通信技术不同,其在空旷地域的连接距离约为10米范围,而采用5G频段时,其距离虽然缩小,但传输速率得到全面提升,同时这一距离,可以快速确定用户位置,并锁定个人。 然而,WiFi是如何连接到我们的手机?他们又会传输哪些资料? 在我们外出时,通常会选择“关闭”WiFi,但实际在应用中,WiFi并不会选择完全关闭——在实际应用中,关闭WiFi是进入“休眠”模式,并非完全关闭。在这一情况下,当WiFi收到接入的信息时,会自动开启,并提示用户是否接入网络。 但在此刻,数据收集已经完成——“对于收集设备而言,他们只是单一的收集手机序列号等基本信息,并不会过多收集数据。”某安防企业市场部总监说道,同时他表示,这一设备通常是放置在监控摄像机或智慧灯杆中。 数据何用? 在平安城市建设过程中,不管是G端用户还是企业,都想打造不一样的环境——全面监控每一个人,并通过大数据、人脸识别等技术,以最快的速度抓捕目标人物。 如何快速实现这一目标?手机或许是最好的切入点。 对于手机而言,其自带摄像头、麦克风等设备,并可以自动锁定人脸,可以说,智能手机在安防产业的布局中,就如同智能摄像机,如果利用得当,将极大推进平安城市发展。 但不可避免的是,由于这一技术涉及到个人隐私,不管是对于B端企业还是G端,都不太好过多说明。“在前几年人脸识别技术上线时,大家并不会过多在意这一技术,但随着人们对隐私要求的提升,这些技术并不能直接宣传。”该名安防市场总监说道。 “在近几年,由于隐私问题,G端公共安全项目逐步缩小。哪些地方需要建设?要怎么建?是否会触摸到用户个人隐私问题?”云事通CEO龙寿金说道。 而对于这些数据,龙寿金坦言,只要不是核心地区,实际并没有太多作用。 但不可否认的是,如果随着相关技术的发展,未来智能手机是否在被操控后,也没有相关提示,正如同好莱坞电影中描绘的“天网”系统,让每一个设备都成为系统的感知设备。 “双刃剑”下的安全问题 对于G端用户来说,他们在乎的数据并不多,但要在人群中快速检索,则需要对每一个人的资料进行掌控,而一旦对每一个人的资料进行记录,除了大量数据之外,就是这类数据是否涉及隐私——不管是对于哪一个国家,私人隐私问题都不好触碰。 为了避免这一问题,在我国安防产业中,明确要求对普通人员的数据仅保存数个月,而在其他产业中,非用户主动要求的数据,通常仅保存三个月,甚至更短。 安全or隐私问题,或需将成为公共安全发展的拦路虎。但随着技术的发展,未来或许将有更多技术来“刺探”我们的个人隐私。 【责任编辑: 赵宁宁 TEL:(010)68476606】

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

云计算时代,容器底层 cgroup 如何使用

作者:姜亚华(@二如公子),《精通 Linux 内核——智能设备开发核心技术》的作者,一直从事与 Linux 内核和 Linux 编程相关的工作,研究内核代码十多年,对多数模块的细节如数家珍。曾负责华为手机 Touch、Sensor 的驱动和软件优化(包括 Mate、荣耀等系列),以及 Intel 安卓平台 Camera 和 Sensor 的驱动开发(包括 Baytrail、Cherrytrail、Cherrytrail CR、Sofia 等)。现负责 DMA、Interrupt、Semaphore 等模块的优化与验证(包括 Vega、Navi 系列和多款 APU 产品)。 往期回顾:点击查看 一、cgroup 的使用 测试环境版本与之前一致: Ubuntu (lsb_release -a) Distributor ID: Ubuntu Description: Ubuntu 19.10 Release: 19.10 Linux (uname -a) Linux yahua 5.5.5 #1 SMP … x86_64 x86_64 x86_64 GNU/Linux 在前面的文章中,我们探讨了容器底层 cgroup 的数据结构与代码实现,本期是 cgroup 系列的最后一篇文章,我们将继续探讨在mount 成功后,我们如何使用 cgroup 来实现进程限制。 在 mount 成功后,cgroup_root 已经存在了,也就是说 cgroup 层级结构已经搭建好了,接下来我们就可以使用 cgroup 了。 1. cgroup 的 mkdir mkdir 比 mount 的过程稍简单,由 cgroup_mkdir 函数实现,主要逻辑如下: int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, umode_t mode) { struct cgroup *parent, *cgrp; parent = cgroup_kn_lock_live(parent_kn, false); //1 cgrp = cgroup_create(parent, name, mode); //2 ret = cgroup_kn_set_ugid(cgrp->kn); ret = css_populate_dir(&cgrp->self); //3 ret = cgroup_apply_control_enable(cgrp); kernfs_activate(cgrp->kn); ret = 0; return ret; } 第 1 步,获得父目录对应的 cgroup。无论是 cgroup_setup_root 还是接下来要说的cgroup_create,在创建文件的时候都将 cgroup 赋值给了 kernfs_node 的 priv。所以这里其实就是返回 parent_kn->priv 字段,不过要经过参数检查。 第 2 步,调用 cgroup_create:创建 cgroup,调用 kernfs_create_dir 创建目录,建立新cgroup 和父 cgroup 的父子关系。 第 3 步,和 mount 的时候一样,css_populate_dir 和 cgroup_apply_control_enable 会为我们创建 cftype 对应的文件,不过有两点区别: 首先,带 CFTYPE_ONLY_ON_ROOT 标志的 cftype 不会出现在这里,比如cgroup.sane_behavior 和 release_agent。 其次,mount 的时候,新 cgroup_root.cgrp 复用了原 cgroup_root.cgrp 相关的css(rebind_subsystems,第二篇),这里新建了一个 cgroup,cgroup_apply_control_enable 需要为我们创建新的 css(ss->css_alloc(parent_css))并建立 cgroup 和 ss 的多对多关系(init_and_link_css和online_css)。 mount 的时候,cpuset 的 css_alloc 返回的是全局的 top_cpuset.css,这里创建一个新的 cpuset 对象并初始化,如下: struct cgroup_subsys_state * cpuset_css_alloc(struct cgroup_subsys_state *parent_css) { struct cpuset *cs; if (!parent_css) //mount的时候,返回top_cpuset.css return &top_cpuset.css; cs = kzalloc(sizeof(*cs), GFP_KERNEL); alloc_cpumasks(cs, NULL); //#1 set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags); nodes_clear(cs->mems_allowed); nodes_clear(cs->effective_mems); //#2 fmeter_init(&cs->fmeter); cs->relax_domain_level = -1; return &cs->css; } 注意标号 #1 和 #2,新 cs 的 cpus_allowed 和 mems_allowed 都被清零,此时读取cpuset.cpus 和 cpuset.mems 也是没有内容的,也就是说对 cpu 和 memory 的限制并不能从父目录继承,在使用前必须正确设置它们。 2. 限制资源 我们在第一篇的例子中通过 echo 0-2 > cpuset.cpus 和 echo 0 > cpuset.mems 限制 /cpuset0 管理的进程使用的 cpu 和 memory node,以 cpuset.cpus 为例,它的 cftype 如下: { .name = "cpus", .seq_show = cpuset_common_seq_show, .write = cpuset_write_resmask, .max_write_len = (100U + 6 * NR_CPUS), .private = FILE_CPULIST, }, 最终调用的是 cpuset_write_resmask,后者调用 update_cpumask。 update_cpumask 的目的是更新我们在 mkdir 时创建的 cpuset(cpuset_css_alloc),当然了,之前已经配置过的 cpuset 重新配置也可以。我们关心以下几点: 不能更改top_cpuset的设置,这就是第一篇的课堂作业第一题的答案。 目标cpuset的资源必须是父目录cpuset的子集,而且是子目录cpuset的超集(由validate_change函数实现),这是课堂作业第二题的答案。 配置的资源最终更新cpuset的cpus_allowed字段。 可以看到,类似课堂作业中描述的类似限制,是需要 ss 自行实现的,cgroup 本身并不保证这点,尝试开发新的 ss 的时候需要注意这点。 3. 管理进程 我们在例子中将进程号写到 tasks 文件(echo$$ > tasks),以限制进程只能使用 /cpuset0 配置的 cpu 和 memory node。实际上,写 cgroup.procs 文件也是可以的。它们的 cftype 文件定义如下: { .name = "tasks", .seq_start = cgroup_pidlist_start, .seq_next = cgroup_pidlist_next, .seq_stop = cgroup_pidlist_stop, .seq_show = cgroup_pidlist_show, .private = CGROUP_FILE_TASKS, .write = cgroup1_tasks_write, }, { .name = "cgroup.procs", .seq_start = cgroup_pidlist_start, .seq_next = cgroup_pidlist_next, .seq_stop = cgroup_pidlist_stop, .seq_show = cgroup_pidlist_show, .private = CGROUP_FILE_PROCS, .write = cgroup1_procs_write, }, 两个文件的 write 分别是 cgroup1_tasks_write 和 cgroup1_procs_write,它们都是调用__cgroup1_procs_write 实现的,区别仅在于最后一个参数 threadgroup 不同,前者为false,后者为 true。看名字就知道,为 false 的情况下,仅作用于目标进程(线程),为 true 的情况下,作用于线程组。 这里对线程组稍作说明。线程组是属于同一个进程的线程的集合,同一个线程组的线程,它们的 task_struct 都通过 thread_group 字段链接到同一个链表中,链表的头为线程组领导进程的 task_struct 的 thread_group 字段,可以据此来遍历线程组。 __cgroup1_procs_write 可以分成以下 3 步: 第1步,调用 cgroup_kn_lock_live 获得文件所在的目录的 cgroup,实际上就是kernfs_node->parent->priv,kernfs_node->parent 是文件所在目录的 kernfs_node,priv 就是目标 cgroup。 第2步,调用 cgroup_procs_write_start 根据用户空间传递的进程 id 参数获得目标进程的 task_struct,threadgroup 为 true 的情况下,获得的是线程组领导进程的task_struct。 第3步,调用 cgroup_attach_task 将进程 attach 到(依附于或者连接)cgroup。 cgroup 和 ss 之间是对等的关系,使用的是 bind,称之为绑定;进程和 cgroup 之间并不是对等的关系,使用的是 attach,称之为依附。 请注意,我们举例中仅涉及 cpuset,并不意味着某个进程只与 cpuset 有关,进程和cgroup 的关系是通过 css_set 实现的,也就是说是一组 cgroup。我们没有更改其他cgroup 层级结构的配置,这意味着进程关联的是它们的 cgroup_root,并不是没有关联。 先不论进程被创建后,“辗转”了几组cgroup,进程被创建时就已经attach cgroup了。 进程创建的过程在书里已经详细地分析过了,这里仅讨论与cgroup相关的部分。 首先被调用的是cgroup_fork,如下: void cgroup_fork(struct task_struct *child) { RCU_INIT_POINTER(child->cgroups, &init_css_set); INIT_LIST_HEAD(&child->cg_list); } 直接指向了 init_css_set,不过这有可能是暂时的。child->cg_list 是空的,说明新进程还没有 attach 到任何 cgroup。 其次是 cgroup_can_fork,它调用 ss->can_fork,由 ss 判断是否可以创建新进程,如果答案是否,整个 fork 会失败。 最后是 cgroup_post_fork,做最后的调整,主要逻辑如下: void cgroup_post_fork(struct task_struct *child) { struct cgroup_subsys *ss; struct css_set *cset; if (likely(child->pid)) { WARN_ON_ONCE(!list_empty(&child->cg_list)); cset = task_css_set(current); /* current is @child's parent */ get_css_set(cset); cset->nr_tasks++; css_set_move_task(child, NULL, cset, false); } do_each_subsys_mask(ss, i, have_fork_callback) { ss->fork(child); } while_each_subsys_mask(); } 首先,current 是新进程 child 的父进程,先获得父进程的 css,然后调用css_set_move_task 将新进程转移到该 css 上。css_set_move_task 的第二个参数是原css,这里是 NULL 是因为还没有 attach 到任何 cgroup(css_set)上。css_set_move_task 会将 child->cg_list 插入 css->tasks 链表上,child->cg_list 不再为空。 也就是说,新进程在创建时会被 attach 到与父进程同一组 cgroup 上。 其次,如果 ss 定义了 fork,调用 ss->fork,以 cpuset 为例,它会为新进程复制父进程的设置,如下: void cpuset_fork(struct task_struct *task) { if (task_css_is_root(task, cpuset_cgrp_id)) return; set_cpus_allowed_ptr(task, current->cpus_ptr); task->mems_allowed = current->mems_allowed; } 回顾下第一篇的例子,我们在 cpuset 下创建的 cpuset0 目录,配置资源,管理进程。修改下,在 cpuset 下再创建一个 cpuset1 目录,进程先 attach 到 /cpuset0,然后migrate 到 /cpuset1上,以此为例分析 migrate 的过程: love_cc@yahua:/sys/fs/cgroup/cpuset$ sudo mkdir cpuset0 love_cc@yahua:/sys/fs/cgroup/cpuset$ sudo mkdir cpuset1 love_cc@yahua:/sys/fs/cgroup/cpuset$ cd cpuset0/ root@yahua:/sys/fs/cgroup/cpuset/cpuset0# echo 0-2 > cpuset.cpus root@yahua:/sys/fs/cgroup/cpuset/cpuset0# echo 0 > cpuset.mems root@yahua:/sys/fs/cgroup/cpuset/cpuset0# echo $$ > tasks root@yahua:/sys/fs/cgroup/cpuset/cpuset0# cat tasks 2682 2690 root@yahua:/sys/fs/cgroup/cpuset/cpuset0# cd ../cpuset1/ root@yahua:/sys/fs/cgroup/cpuset/cpuset1# echo 0-1 > cpuset.cpus root@yahua:/sys/fs/cgroup/cpuset/cpuset1# echo 0 > cpuset.mems root@yahua:/sys/fs/cgroup/cpuset/cpuset1# echo $$ > tasks root@yahua:/sys/fs/cgroup/cpuset/cpuset1# cat tasks 2682 2713 root@yahua:/sys/fs/cgroup/cpuset/cpuset1# cat ../cpuset0/tasks #没有省略内容,空的 继续讨论之前,先理一下目前的状况,我们在 __cgroup1_procs_write 函数的第 3 步cgroup_attach_task,之前的两步我们已经获得了目标 cgroup(也就是 /cpuset1)和进程的 task_struct。 cgroup_attach_task 的目的是将进程 attach 到目标 cgroup,逻辑上至少包括进程和原groupdetach 和进程和目标 cgroupattach 两部分。三个要素,src、dst 和 migrate,正好对应三个函数 cgroup_migrate_add_src、cgroup_migrate_prepare_dst 和cgroup_migrate。 首先被调用的是 cgroup_migrate_add_src,threadgroup 为 true 的情况下,对线程组的每个线程调用一次,否则调用一次即可,它的主要逻辑如下: void cgroup_migrate_add_src(struct css_set *src_cset, struct cgroup *dst_cgrp, struct cgroup_mgctx *mgctx) { struct cgroup *src_cgrp; src_cgrp = cset_cgroup_from_root(src_cset, dst_cgrp->root); src_cset->mg_src_cgrp = src_cgrp; src_cset->mg_dst_cgrp = dst_cgrp; get_css_set(src_cset); list_add_tail(&src_cset->mg_preload_node, &mgctx->preloaded_src_csets); 第一个参数 src_cset 表示进程原来的 css_set,也就是 task_struct 的 cgroups 字段。 首先要做的就是在目标 cgroup(dst_cgrp,也就是 /cpuset1)所属的 cgroup_root 中找到原 cgroup(src_cgrp,也就是 /cpuset0),它跟目标 cgroup 属于同一个cgroup_root,查找的过程就变成找到 src_cset 对应的某个 cgroup,它的 root 字段与dst_cgrp->root 相等,如下: list_for_each_entry(link, &cset->cgrp_links, cgrp_link) { struct cgroup *c = link->cgrp; if (c->root == root) { res = c; //res就是我们要找的 break; } } 提醒下,任何一个 cgroup 层级结构中,进程只能关联其中一个 cgroup,所以与 /cpuset1 属于同一个 cgroup_root 的只能是 /cpuset0 。 另外,我们分析的只是一种情况,前面说的 Ubuntu mount cpuset 的时候,进程从默认的层级结构迁移到 cpuset 上,原 cgroup 和目标 cgroup 实际上属于不同的cgroup_root,返回的是目标 cgroup_root 的 cgrp。 cgroup_migrate_add_src 的第三个参数 mgctx 是 cgroup_attach_task 的局部变量,函数结束前将 src_cset 插入到 mgctx->preloaded_src_csets 等待后续处理。 cgroup_migrate_prepare_dst 遍历 mgctx->preloaded_src_csets上的 src_cset,根据src_cset 和 src_cset->mg_dst_cgrp 查找当前已经存在的 css_set 是否有某个 css_set与期望一致,没有则创建新的 css_set 并赋以期望值。 期望,一致,两方面。 怎么描述我们的期望呢,进程只是从 /cpuset0 移到 /cpuset1 上,关联的其他 cgroup 层级结构的 cgroup 并没有变化,所以以原 css_set 作为模板,调整 cpuset 层级结构上的css 即可,实际的代码也大致如此,如下: for_each_subsys(ss, i) { if (root->subsys_mask & (1UL << i)) { template[i] = cgroup_e_css_by_mask(cgrp, ss); } else { template[i] = old_cset->subsys[i]; } } root 就是发生变动的层级结构的 cgroup_root,在我们的例子中就是 cpuset,至于cgroup_e_css_by_mask,这里的 e 是 effective,不考虑 cgroup v2 的情况下,也可以理解为 cgroup_css(cgrp, ss),也就是 /cpuset1 和 cpuset ss 对应的 css 。 某个 css_set(简称 cset)与我们的期望一致,需要满足以下两点。 首先,cset->subsys 与 template 一致,其实还是与 v2 有关。 其次,cset 的 css(cgrp_links字段)中,属于当前 cgroup_root 的,关联的 cgroup 是目标值,也就是 /cpuset1;不属于当前 cgroup_root 的,与 old_cset 关联的 cgroup 相等。 css_set 的 subsys 和 cgrp_links 都表示它关联的 css,二者有什么区别?subsys 在css_set 被创建后不会改变,cgrp_links 可以动态调整。比如 cgroup_setup_root 中调用的 link_css_set,修改的只是 cgrp_links。 如果找不到一致的 css_set,创建一个新的,按照要求的两点给它赋值。 接下来就是 cgroup_migrate 了,它的实现代码较多,但逻辑都是直来直去,我们就不直接分析代码了,主要分以下几步: 调用 cgroup_migrate_add_task 将需要迁移的进程放入 mgctx->tset,然后调用cgroup_migrate_execute 函数,实际的 migrate 过程由它完成。 回调有变动的 ss 的 ss->can_attach 函数,判断是否合法。 遍历需要 migrate 的进程,调用 css_set_move_task(task, from_cset, to_cset, true),进程的 css_set 得到更新。 回调有变动的 ss 的 ss->attach,migrate 正式生效。 cpuset 的 attach 由 cpuset_attach 函数实现,核心逻辑如下: cgroup_taskset_for_each(task, css, tset) { WARN_ON_ONCE(set_cpus_allowed_ptr(task, cpus_attach)); cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to); cpuset_update_task_spread_flag(cs, task); } 遍历进程,使 cpu 和 memorynode 的限制生效。 我们分析的限制进程使用 cpu 由 set_cpus_allowed_ptr 调用 __set_cpus_allowed_ptr 实现,主要逻辑如下: int __set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask, bool check) { const struct cpumask *cpu_valid_mask = cpu_active_mask; unsigned int dest_cpu; struct rq_flags rf; struct rq *rq; rq = task_rq_lock(p, &rf); update_rq_clock(rq); if (cpumask_equal(p->cpus_ptr, new_mask)) //1 goto out; dest_cpu = cpumask_any_and(cpu_valid_mask, new_mask); //2 if (dest_cpu >= nr_cpu_ids) { ret = -EINVAL; goto out; } do_set_cpus_allowed(p, new_mask); //3 if (cpumask_test_cpu(task_cpu(p), new_mask)) //4 goto out; if (task_running(rq, p) || p->state == TASK_WAKING) { //5 struct migration_arg arg = { p, dest_cpu }; task_rq_unlock(rq, p, &rf); stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg); return 0; } else if (task_on_rq_queued(p)) { rq = move_queued_task(rq, &rf, p, dest_cpu); } out: task_rq_unlock(rq, p, &rf); return ret; } 满屏都是进程调度章节的内容,在此解释如下: 第1步,如果没有改变,直接退出。 第2步,指定的资源是否合法,如果不合法,返回错误。 第3步,do_set_cpus_allowed 会调用 p->sched_class->set_cpus_allowed 由具体的调度类实现,调度类一般会更新 task_struct 的 cpus_mask 字段。 第4步,进程当前所在的 cpu 是否在限制范围内,如果在,不需要额外处理。 第5步,进程被限制,不能使用当前所在的 cpu,如果正在运行则停止并 migrate,如果正在等待执行,移到其他 cpu 上。 cgroup v1 的讨论差不多了,绝大部分篇幅集中讨论最常用的操作,但实际上还不完整,其余操作大家可以自行继续当前的思路阅读。 往期回顾 容器底层 cgroup 如何实现资源分组? 容器底层 cgroup 的代码实现分析

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

LPWAN异军突起,为物联网时代而生。

近年来,物联网领域全面开花,不同的通信技术凭借其优势“跑马圈地”,NB-IoT各大电信营运商陆续宣布开始运营,并投入公共事业、共享经济、智慧城市等相关服务;LoRa在智慧读表、智慧农业、工业物联网具备优势;Sigfox领先取得台湾地区二类电信执照,并于跨地区大范围的智慧读表、智慧监测等应用持续发展。LPWAN发展汹涌,可以说是“弄潮儿”的角色。LPWAN网络连接的技术基本可以分为两部分:蜂窝技术和非蜂窝技术。蜂窝技术主要是国内三大运营商部署运营的NB-IoT网络。非蜂窝技术主要是部署在免许可申请使用频段的网络,如Sigfox、LoRa、ZETA、Weightless等。LPWAN主要解决了面向物联网应用的广域覆盖大规模的网络连接,弥补了传统蜂窝技术的不足,加速了物联网应用的规模化部署。 目前,作为物联网的一个重要分支,LPWAN已经在许多行业应用中大显身手,为各种新兴行业应用的基础。例如在现代农业领域,面对农业的温室、大田种植、畜禽养殖等场合,需要通过物联网对土壤,温湿度,视频,农作物生长质量等数据进行采集,对农业专用设备数据传输和控制。可以通过LoRa技术大范围采集传感器数据,并与视频监控联动,并用多业务网关接口对接农业设备,将监控、传感器、Wifi等多个网络融合为一,来实现更好的农业管理。而在无线城市领域,通过LPWAN物联网平台,可以帮助用户打造智慧城市应用中心,通过物联网支撑数据采集分析、安全监测预警、智能抄表、公共资产监测、生命体定位、智能路灯停车等各种应用,让城市更加环保宜居、安全便利。 在热门的互联网单车租赁业务的应用尝试。在这种场景下,LPWAN可以解决的是自行车在郊区的物联任务,在低碳环保大行其道的当下,这种应用模式有望得到大规模复制。当下,全球两大主流物联网网络NB-IoT与LoRa在中国迅猛发展,有关部门统计一千多款物联网应用产品已落地中国各省。据悉,70%的企业积极寻求成熟、可靠且快速落地的物联网产品,多数企业向福州市协成智慧科技有限公司采购NB-IoT和LoRa物联网解决方案,采购包括LoRa网关、烟感、水监测、红外探测、定位、排插等数十款物联网产品,另外代开发NB-IoT和LoRa物联网产品,以便快速圈地开展物联网业务,跻身全国各地市物联网龙头。“世界物联网发展看中国”形势正逐渐形成。LPWAN的目标,是真正实现大区域物联网低成本全覆盖。任何一个物联网领域的设备提供商,这都是一个绕不开的关键技术点。

资源下载

更多资源
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文件系统,支持十年生命周期更新。

用户登录
用户注册