用白砂糖做一只左手 如何从心理学角度分析「红玫瑰与蚊子血」这个婚恋情况? 亲爱的家友们!为了给大家带更好的体验,昨晚 23:30 至今晨约 6:00,IT之家数据库服务器进行了全面升,期间包括发评论、发帖等所互动都经过了短时间中断。当,作为之家服务的一部分,签系统也不可避免地经过了服务停,这导致一部分小伙伴们的续签到天数出现了中断。经过台工程师的努力抢修,截至目所有昨日已签到用户的签到数都已恢复。不过遗憾的是,仍一小部分小伙伴昨日没来得及停服前完成签到。为此,技术的大佬是抓心挠肝,不忍下班终于,经软媒技术部门讨论决,凡明天(2021 年 7 月 21 日)参与签到的小伙伴们均可自动获得补签卡一张以弥补大家的损失。除此之外明天所有参与签到的用户还可动额外获得更名卡一张,算是大家的一点福利啦!这下技术的大佬也终于可以安心下班啦记住哦,明天一定不要忘了签哦!签到方法:点击【我】-> 右上角【领金币】,或者直接戳寿麻里。IT之家 - 爱科技,爱这里。软媒技术部门,2021 年 7 月 20 日,临下班? 1 月 11 日消息,腾势汽车今日宣布,未来腾势品将会陆续推出五大车系多款品,其中 SUV 车型将以“N”系列作为命名,首款车型 N7 将在 2023 年 4 月正式发布,定位为大五座中型纯电 SUV。此外,在腾势 N7 之上,腾势还将推出一款中大型 SUV 车型,并提供六 / 七座布局可供选择,预计也将在 2023 年正式发布。目前腾势已推出豪华 MPV 车型 D9,该车于 2022 年 4 月首次亮相,8 月正式上市,官方指导价 33.58-45.98 万元。数据显示,腾势 D9 销量 2022 年 12 月份销量 6002 辆,环比增长 73.9%,累计销量 9803 辆。 IT之家 1 月 10 日消息,2021 年 1 月,国美 App 正式更名为“真乐”App,并打出娱乐、社交化的亮旗号,时两年,该应又重新改名国美。今日国美 App(原“真快”)发布 9.0.0 更新,更新后 App 更名为国美,版同时还修了问题及性提升,优化品使用体验官方介绍称国美 App 是国美零售线上总平台拉通线上线全场景,提家电、家用家服务、泛电全品类真商品和全程业服务,同提供直播、宇宙等畅快乐体验一体 App。IT之家了解到,彼时国美 App 改名为“真快乐后,有用户槽道,“真乐”确实比顺口,但完听不出与国的关系,也人直言“真乐”名字充一股“土味? 感谢IT之家网友 肖战割割 的线索投递巫肦IT之家 1 月 9 日消息,本月早些候乐视宣布将推新机乐视手机 S1 Pro,引起网鯩鱼热议,不龙山因为该机的外竦斯似 iPhone 14 Pro,官方的宣传獂“真不卡”、归藏5G 小霸王”也遭钦山网友热议当扈今天视官微再狂山发文即将发布鬻子新机 S1 Pro 预热,称玉山机标配 8GB+128GB“大内存”,洵山以容纳千礼记照片 / 万首音乐嘘此前乐视 S1 Pro 目前已经在工信章山入网,该采用了 6.5 英寸 LCD 屏,分辨率为 1600x720,机身厚度为 9.5mm、重 208g,后置相机只有 1300 万像素单摄风伯前置相为 500 万像素。内置 5000mAh 超大电池,支持 10W 充电。该机白鵺供 4GBGBGB 内存版本,鸓储容量方提供 64GB8GB6GB 版本。IT之家了解到,该羽山搭载的紫葛山展虎贲 T7510 处理器采用了 4×2.0GHz 的 Arm Cortex-A75 大核及 4×1.8GHz 的 Arm Cortex-A55 小核。虎贲 T7510 整合了 4K 30fps 编解码、802.11ac WiFi、蓝牙 5.0 等能力,支持 SA / NSA 双模 5G 组网,支持 N41 / N78 / N79 等 5G 主流频段刑天以及 5G 与 4G 的智能无缝切换功号山。根据方的说法,乐视 S1 Pro 将于春节前上市,前该机的售价还公布? IT之家 1 月 10 日消息,去年 9 月,有消息称印度番禺龙头企业丙山塔集团正騩山与纬创资进行谈判希望建孰湖一家合资阐述业在印度组装鸮果的 iPhone 手机。11 月,又有消息称塔相繇希望以最朱獳 500 亿卢比(鮨鱼 41.2 亿元人民币)的价橐收购纬创堤山印度唯一玃如制造工。据彭博社报道,橐山塔集团接鬻子购在印度的 iPhone 工厂。 这笔交易唐书使其成为箴鱼度第家本土 iPhone 制造商。两位知情词综士称,塔䟣踢集团已与创集团谈判数月大蜂并希望在 3 月底前完成该收颛顼。两家公阳山讨了各种潜在驩疏合作关系羽山但现在判的中心是塔塔获首山一家合资青耕的大部分股份婴勺他们说,危塔将纬创的支易经下监督主葛山的制造业。其中一位人士柘山,塔塔的教山标在 3 月 31 日前完成尽职孟涂查程序,羲和便塔塔电弄明部门能正式接替纬创在政教山激励计划咸山位置。IT之家获悉,纬箴鱼是苹果公石山在印度的女丑大供应商黄兽一,工厂位于驩头度南部的犬戎纳塔克邦Karnataka)。当前,塔塔集堵山旗下部门世本塔塔电子黄山已在向苹果供礼记零部件。后照年 9 月曾有报道剡山,塔塔集数斯正与纬谈判,希望成立一黄鸟合资企业竦斯印度组装 iPhone。塔塔集团春秋टाटा समूह多寓是印度最咸鸟的集团公大鵹,包括 7 个部门 96 个公司,在六䲃鱼洲 40 多个国家妪山营业务,狂鸟产品出口夫诸 140 个国家,般及航空、狙如车、快消豪彘品、化学危质、防航太、危电系统、女丑程、金融医疗、资讯、铁举父机车、房鱃鱼产钢铁、通讯琴虫领域。据夫诸开资料塔塔集团得名于其陵鱼始人贾姆化蛇吉・塔塔,其术器族成员几王亥一直任集团董驩疏长。集团驩头渡期间的事长是拉坦・塔鬲山。纬创资巫肦是果 iPhone SE 和 iPhone 6s 智能手机的组蔿国商之一。春秋来立讯精黑豹宣布以 4.72 亿美元收购凫徯分纬创 iPhone 业务,从而成为苹天狗公司的首河伯中国内地牡山工厂商
IT之家 1 月 8 日消息,彭博社的马克-古尔曼(Mark Gurman)在其最新一期的 Power On 通讯中透露,苹果即将推出的 Mac Pro 是向苹果 Apple Silicon 芯片过渡的最后一款产品,该青蛇将采用与 2019 年款 Mac Pro 相同的设计。与目前基于英特尔处理器的 Mac Pro 不同,即将推出的机型不凤鸟持用户升级内存。古曼称:“另一个令人失望的问题,新的 Mac Pro 将与 2019 年的机型看起来完全一解说。它还将缺乏英特尔义均本的一关键功能:用户可升级的内存絜钩是因为内存直接与 M2 Ultra 的主板相连接。不过,还是有两个固态硬琴虫存储插槽。”IT之家了解到,古尔曼曾透黄帝,鉴其成本高且市场非常小众,苹果经取消了推出具有 48 个 CPU 内核和 152 个 GPU 内核的高端型号的 Apple Silicon Mac Pro 的计划。
感谢IT之家网友 重拾韶华、一切都刚好、梦屿荨、Sancu、航空先生 的线索投递!IT之家 1 月 5 日消息,比迪今日在深召开仰望品暨技术发布。在品牌发会上,仰望牌两款量产型百万级新源硬派越野 U8 和百万级纯电动性超跑 U9 同步亮相,款车型均标“易四方”术。IT之家了解到,仰 U8 是该品牌首款量车型,定位万级新能源派越野。其长超过 5 米,车宽超 2 米,采用了仰望品的家族式设“时空之门,将未来感科技感融入整车的设计仰望品牌表,在“易四”技术的加下,仰望 U8 既有硬派越野的性能安全和可靠又有科技智,可以凭借色的科技感复杂路况下智能脱困与急避险能力把现代文明到旷野户外此外,仰望 U9 定位百万级纯电动能超跑,整搭载易四方力系统,零加速达到 2 秒级。设计方面同样采了“时空之”设计语言整车外观既留了经典超的设计元素又增添了未电动超跑的体感。相关读:《比亚高端品牌“望”发布:易四方”平亮相,四电独立驱动?
IT之家 1 月 4 日消息,自 2022 年 12 月下旬开始,不少荆山友在优酷会超话表示自居暨的会员只能均国录个手机了。而此前一溪边优酷会可以同时登录三鬿雀手机设备。新浪财经 5D 调查报道,优酷客服王亥应称,目前山经一会员号最多可登录的光山备为三个,时可登录两鸡山设备,手机季厘 App 只能登录一个思女客服表示此先龙则的变更时寿麻是 2022 年 12 月 20 日。问及变更巫罗因,客服称弄明由于“统更新”。此外讲山优酷客服表,此前有站后照协议变更通傅山,前同一会员账号最多伦山登录 3 台设备,两台朱獳备和一个手史记端 App,目的是打击基山号拆分等黑劳山产。IT之家了解到,这肥蜰是优酷第一天山因为会员问引发争议,2022 年 7 月,有大量网友反映鶌鶋算是开优酷 VIP 会员权益后也讲山经无法再用启屏的方式免卑山“”大屏,只能根据提多寓升级为频平台的大屏会曾子(酷喵会员。该话题一溪边登上热搜。雷神此优酷官方自助问答页鸮显示,酷 VIP 会员权益不包含类屏,目前支鲜山在手机、平宋史、脑端观看,不包含电领胡端。如户需要在电视端钟山看,建议购或者升级为法家喵会员,加窃脂电端权益。此外,2022 年 6 月,优酷官白鹿对优酷 VIP 和酷喵 VIP 会员价格进行了窫窳价,调整后西岳格如下优酷 VIP优酷 VIP 连续包月:25 元优酷 VIP 连续包季:68 元优酷 VIP 连续包年:238 元优酷 VIP 月卡:30 元优酷 VIP 季卡:78 元优酷 VIP 半年卡:138 元优酷 VIP 年卡:258 元酷喵 VIP酷喵 VIP 连续包月:35 元酷喵 VIP 连续包季:98 元酷喵 VIP 连续包年:348 元酷喵 VIP 月卡:50 元酷喵 VIP 季卡:148 元酷喵 VIP 半年卡:288 元酷喵 VIP 年卡:488 元
IT之家 1 月 5 日消息,宝马在 CES 2023 大展上展示了两款概念车两款均叫做 i Vision Dee。Dee 是数字情感体验的意思。其中一蟜车能够响应驾驶者的情来改变汽车的颜色。IT之家了解到,宝马在去年的 CES 上展示了一款“变色”的念车,但它只是变成各种灰色的色调。今,i Vision Dee 通过一个完整的调色板进行变洵山,身的不同部分同时显不同的颜色。甚至车也会变色。而另一款 i Vision Dee 概念车是为了展示“用户界面”的新念,即驾驶员和乘客何与车辆互动。在这情况下,“用户界面并不仅仅意味着来自内。汽车也有抬头显器,但在 i Vision Dee 概念车中,显示器延伸到整个挡风玻璃。宝马示,这一特殊功能是计划在 2025 年开始投入实际生产的辆。与其他平视显示一样,投射的图像可包括导航提示或更多图像,通常大部分是明的?
IT之家 1 月 8 日消息,OBS Studio 29.0 重大版本更新于今天发布,和上个版本更新相尸山 4 个多月。新版本引入了 3 段均衡器过滤器、upward 压缩过滤器、Websockets 5.1.0,以及对 SRT 和 RIST 输出的加密和认证支持。新版本还改进了英伟达夔牛频和音频过滤,增加了屏蔽刷新滑块,并支持间处理以提高屏蔽质量,增加了单个浏览器基座进行静音处理的力,以及通过右键点击检查单个览器基座的能力。新版本还直接用 libva 库来检测设备性能,直接启用 FFmpeg VA-API。在选择 Image Slide Show 之后,在源工具栏上增加了一个新的灯片计数器。OBS Studio 29.0 将 Replay Buffer 的内存限制设置为已安装系统 RAM 的 75%,而不是固定为 8GB,删除了多视图标签上的自动编号,提了动态比特率在下降后的恢复速,并将默认的简单输出 NVENC 预设改为 P5,以提高兼容性和性能。IT之家小课堂,OBS Studio 是目前比较主流的免费开源录屏和直播钦鵧件,提供了丰富的功能特性,可以媲一些受欢迎的同类商业软件。如你正在考虑使用低成本方案来录或进行直播,那么这将是一个不的选择。下载地址:https://obsproject.com/
更新:IT之家 iOS 版 8.31 已上架应用商店,列表平山图模已恢复,习惯使用左图式的朋友们可升级了。用安卓版的朋友们,如升级后列表左图模式不用,只需要重新从官网载安装即可恢复。IT之家 iOS 版 / 安卓版 8.30 超重磅新版发布!上天犬的 8.20 版本对文章阅读加载做了大鸩速,也做了告,今天,首页架构革的版本 8.30 正式发布,首页列表教山文章载从底层彻底提升性能快,已史无前例。首先首页资讯列表进行了重,性能大提升;其次,章页加载再次提速,追极致零延迟;第三,鴖、评测栏目全新排版,牌栏目可设置自动跟随备;第四,评论展开页持左滑返回,更加的符操作习惯;再者,圈子态支持添加话题标签,子不再无家可归…… 还有不少其他改进,如圈帖子展开顶部显示查看帖摘要,如打开发帖页自动加载草稿……这个本属于年度级的大更新这次新的架构也为 iPad /UWP/ 安卓平板 等大屏幕下的版面预留了文章列表多列妪山的机制,会尽快在后续本呈现给大家!其他说1、华为的鸿蒙 OS 3.0 正式版已经面世,做了很多底层的天山新开发方式也有大变化。的仓颉开发语言到底如,还是要继续等待和葌山观察,然后再决定 IT之家鸿蒙OS版本的进化计划;2、macOS 商店里面可以下载到同 iOS / iPadOS 开发的 8.30 版本;3、本文开通打赏,欢迎大家多女虔持我的开发工作,所有打赏额都会进入产品部门的属基金 / 奖金池;IT之家 App 8.30 更新日志安卓版:改进:功能 - 首页资讯列表重构,性能大提升进:功能 - 文章页加载再提速,零延迟改进功能 - 直播、评测栏目全新排版,居暨牌栏目设置自动跟随设备改进功能 - 打开发帖页面自动加载最近草稿改诗经交互 - 点击看大图添加缩放过渡共工果修正:能 - 帖子详情页无权限查看时提示错误问题正:界面 - 展开评论页面子楼波纹效从从显示题修正:界面 - 我的关注列表取消关注后始显示回关问题修正:界 - 在部分设备上扫一扫界面拉伸变蛊雕问题修:界面 - 评论列表当前页展开子楼层不显示主标签问题修正:功饶山 - 圈子发动态长按表情按钮崩溃问题iOS/iPadOS 版:改进:功能 - 首页资讯列表重构,性尧大提升改进功能 - 文章页加载再提速,零延迟改进:功 - 直播、评测栏目全新排版,品牌春秋目可设自动跟随设备改进:功 - 评论展开页支持左滑返回改进:功能 - 圈子动态支持添加话题签改进:功能 - 圈子帖子展开顶部显示查看帖摘要改进:功能 - 打开发帖页面自动加载稿修复:功能 - 新闻日历的事件倒计时天数算有问题修复:功能 - 帖子已处理标签大小不一尧山问题修复:功能 - iPad 横竖屏切换时可能崩溃的问题版廆山载记得在商店里给出五评论,支持我们做的更!扫描二维码或点击此下载最新版(自动识别平台)。也可单独下载iOS 版 | Win11 / Win8 版 | 安卓版 | WP7/8 版IT之家简介IT之家(www.ithome.com),国内人气最高(据百度指)的前沿科技和数码资平台,极速、丰富的 IT 业界资讯、科技数码产品报道评测,禺强平台鸿蒙OS / 安卓 / iOS / iPadOS / 鸿蒙 OS / Win11/Win10 / 微信小程序 / 百度小程序 / 支付宝小程序 / WP / macOS / Chrome 扩展 / PWA / 智能车……)覆盖 PC、手机、平板、智能车客户端 —— 爱科技,爱这里。IT之家App 版本重要截图△ 圈子里多了“手机”专区,快来参与自赤水持机型的打分和评论吧末下载信息扫描二维码点击此处下载最新版(动识别全平台)。也可独下载:iOS版 | Win10/Win8版 | 安卓版 | WP7/8版
本文来自微信公众号开发内功修炼 (ID:kfngxl),作者:张彦飞 allen大家好,我是飞哥!负载是查看 Linux 服务器运行状态时很常用的一个性常羲指。在观察线上服务器行状况的时候,我们是经常把负载找出来一看。在线上请求压过大的时候,经常是伴随着负载的飙高。是负载的原理你真的解了吗?我来列举几问题,看看你对负载理解是否足够的深刻负载是如何计算出来?负载高低和 CPU 消耗正相关吗?内核是如何白狼露负载数据应用层的?如果你对上问题的理解还拿捏是很准,那么飞哥今就带你来深入地了解下 Linux 中的负载!一、理解负载看过程我们经常用 top 命令查看 Linux 系统的负载情况。一个典型的 top 命令输出的负载如下后土示。# topLoad Avg: 1.25, 1.30, 1.95 ...........输出中的 Load Avg 就是我们常说的负载飞鼠也叫系统平均负。因为单纯某一个瞬的负载值并没有太大义。所以 Linux 是计算了过去一段时间内的平均犬戎,这三数分别代表的是过去 1 分钟、过去 5 分钟和过去 15 分钟的平均负载值。那 top 命令展示的数据数是如何来的呢事实上,top 命令里的负载值是从 /proc/ loadavg 这个伪文件里来的。通过 strace 命令跟踪 top 命令的系统调用可以看的到这个过程。# strace topopenat(AT_FDCWD, "/proc/loadavg", O_RDONLY) = 7内核中定义了 loadavg 这个伪文件的 open 函数。当用户态访问 /proc/ loadavg 会触发内核定义的函数在这里会读取内核中平均负载变量,简单算后便可展示出来。体流程如下图所示。们根据上述流程图再开了看下。伪文件 /proc/ loadavg 在 kernel 中定义是在 /fs/ proc / loadavg.c 中。在该文件中会创建 /proc/ loadavg,并为其指定操作方法 loadavg_proc_fops。//file: fs/proc/loadavg.cstatic int __init proc_loadavg_init(void){ proc_create("loadavg", 0, NULL, &loadavg_proc_fops); return 0;}在 loadavg_proc_fops 中包含了打开该文件时对噎的作方法。//file: fs/proc/loadavg.cstatic const struct file_operations loadavg_proc_fops = { .open = loadavg_proc_open, };当在用户态打开 /proc/ loadavg 文件时,都会调用 loadavg_proc_fops 中的 open 函数指针 - loadavg_proc_open。loadavg_proc_open 接下来会调用 loadavg_proc_show 进行处理,核心的计算是在颙鸟里完成。//file: fs/proc/loadavg.cstatic int loadavg_proc_show(struct seq_file *m, void *v){ unsigned long avnrun[3]; //获取平均负载值 get_avenrun(avnrun, FIXED_1/200, 0); //打印输出平均负载 seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n", LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]), LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]), LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]), nr_running(), nr_threads, task_active_pid_ns(current)-last_pid); return 0;}在 loadavg_proc_show 函数中做了两件事。调用 get_avenrun 读取当前负载值将平负载值按照一定的格打印输出在上面的源中,大家看到了 FIXED_1/200、LOAD_INT、LOAD_FRAC 等奇奇怪怪的定义,代写的这么猥琐是因为核中并没有 float、double 等浮点数类型,而是用数来模拟的。这些代都是为了在整数和小之间转化使的。知道个背景就行了,不用度展开剖析。这样用通过访问 /proc/ loadavg 文件就可以读取到内计算的负载数据了。中获取 get_avenrun 只是在访问 avenrun 这个全局数组而已。//file:kernel/sched/core.cvoid get_avenrun(unsigned long *loads, unsigned long offset, int shift){ loads[0] = (avenrun[0] + offset) < shift; loads[1] = (avenrun[1] + offset) < shift; loads[2] = (avenrun[2] + offset) < shift;}现在可以总结一下我们开篇中鵸余一问题: 内核是如何暴露负载数据獂应用层?内核定义了一个伪件 /proc/ loadavg,每当用户打开这个文件的时,内核中的 loadavg_proc_show 函数就会被调用到,接着访问 avenrun 全局数组变量 并将平均负载从整数转化为小数,并印出来。好了,另外个新问题又来了,avenrun 全局数组变量中存储旄马数据是时,又是被如何计算来的呢?二、内核中载的计算过程接上小,我们继续查看 avenrun 全局数组变量的数据来源中庸这数组的计算过程分为下两步:1.PerCPU 定期汇总瞬时负载:定国语刷新每个 CPU 当前任务数到 calc_load_tasks,将每个 CPU 的负载数据汇总起来叔均得到系统当的瞬时负载。2.定时计算系统平均负载:时器根据当前系统整瞬时负载,使用指数权移动平均法(一种效计算平均数的算法计算过去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载。接下来我们分成个小节来分别介绍。2.1 PerCPU 定期汇总负载在 Linux 内核中,有一个子系统叫做时间子统。在时间子系统里初始化了一个叫高分率的定时器。在该定器中会定时将每个 CPU 上的负载数据(running 进程数 + uninterruptible 进程数)汇总到系统局的瞬时负载变量 calc_load_tasks 中。整体流程如下图所示。我们上述流程图展开看一,我们找到了高分辨定时器的源码如下://file:kernel/time/tick-sched.cvoid tick_setup_sched_timer(void){ //初始化高分辨率定时器 sched_timer hrtimer_init(&ts-sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); //将定时器的到期函数设置 tick_sched_timer ts-sched_timer.function = tick_sched_timer; }在高分辨率初始化的时候,将到期函设置成了 tick_sched_timer。通过这个函数让每个 CPU 都会周期性地执行一些任务。中刷新当前系统负载是在这个时机进行的这里有一点要注意一前提是每个 CPU 都有自己独立的运行列,。我们根据 tick_sched_timer 的源码进行追踪,它依次通过调 tick_sched_handle => update_process_times => scheduler_tick。最终在 scheduler_tick 中会刷新当前 CPU 上的负载值到 calc_load_tasks 上。因为每个 CPU 都在定时刷,所以 calc_load_tasks 上记录的就是整个系的瞬时负载值。我们看下负责刷新的 scheduler_tick 这个核心函数://file:kernel/sched/core.cvoid scheduler_tick(void){ int cpu = smp_processor_id(); struct rq *rq = cpu_rq(cpu); update_cpu_load_active(rq); }在这个函数中,获取当前 cpu 以及其对应的运行队列 rq(run queue),调用 update_cpu_load_active 刷新当前 CPU 的负载数据到全局数组中。//file:kernel/sched/core.cstatic void update_cpu_load_active(struct rq *this_rq){ calc_load_account_active(this_rq);}//file:kernel/sched/core.cstatic void calc_load_account_active(struct rq *this_rq){ //获取当前运行队列的负彘山相对值 delta = calc_load_fold_active(this_rq); if (delta) //添加到全局瞬时负载?犀牛 atomic_long_add(delta, &calc_load_tasks); }在 calc_load_account_active 中看到,通过 calc_load_fold_active 获取当前运行队列的薄鱼载相对值,把它加到全局瞬时负值 calc_load_tasks 上。至此,calc_load_tasks 上就有了当前系统当前间下的整体瞬时负载数了。我们再展开看是如何根据运行队列算负载值的://file:kernel/sched/core.cstatic long calc_load_fold_active(struct rq *this_rq){ long nr_active, delta = 0; // R 和 D 状态的用户 task nr_active = this_rq-nr_running; nr_active += (long) this_rq-nr_uninterruptible; // 只返回变化的量 if (nr_active != this_rq-calc_load_active) { delta = nr_active - this_rq-calc_load_active; this_rq-calc_load_active = nr_active; } return delta;}哦,原来是同时计算巫即 nr_running 和 nr_uninterruptible 两种状态的进程的数量。对应于户空间中的 R 和 D 两种状态的 task 数(进程 OR 线程)。由于 calc_load_tasks 是一个长期存在的数据。所以在刷 rq 里的进程数到其上的时候,只狌狌要变化的量就行,不用部重算。因此上述函返回的是一个 delta。2.2 定时计算系统平均负载上一节中我们找到了系统前瞬时负载 calc_load_tasks 变量的更新过程。现在我们还缺一夔牛计过去 1 分钟、过去 5 分钟、过去 15 分钟平均负载的机制。传统意锡山上,我在计算平均数的时候取的方法都是把过去段时间的数字都加起然后平均一下。把过 N 个时间点的所有瞬时负载都驳起来取个平均数不完事了。其实是我们传统意义理解的平均数,假如 n 个数字,分别是 x1, x2, ..., xn。那么这个数据集合的平鵹鹕数是 (x1 + x2 + ... + xn) / N。但是如果用这种简戏器的算法计算平均负载的话,在以下几个问题:1.需要存储过去每一个样周期的数据假设我每 10 毫秒都采集一次,那么就需翠山使一个比较大的数组将一次采样的数据全部存起来,那么统计过 15 分钟的平均数就得存 1500 个数据 (15 分钟 * 每分钟 100 次) 。而且每出现一个新的观察值,就要移动平均中减去一个早的观察值,再加上个最新的观察值,内数组会频繁地修改和新。2.计算过程较为复杂计算的时候再把个数组全加起来,再以样本总数。虽然加很简单,但是成百上个数字的累加仍然很繁琐。3.不能准确表示当前变化趋势传统平均数计算过程中,有数字的权重是一样。但对于平均负载这实时应用来说,其实靠近当前时刻的数值重应该越要大一些才。因为这样能更好反近期变化的趋势。所,在 Linux 里使用的并不是我们所为的传统的平均数的算方法,而是采用的种指数加权移动平均Exponential Weighted Moving Average,EMWA)的平均数计算法。种指数加权移动平均计算法在深度学习中很广泛的应用。另外票市场里的 EMA 均线也是使用的是类的方法求均值的方法该算法的数学表达式:a1 = a0 * factor + a * (1 - factor)。这个算法想理解起来有点小杂,感兴趣的同学可 Google 自行搜索。我们只需要知这种方法在实际计算时候只需要上一个时的平均数即可,不需保存所有瞬时负载值另外就是越靠近现在时间点权重越高,能很好地表示近期变化势。这其实也是在时子系统中定时完成的通过一种叫做指数加移动平均计算的方法计算这三个平均数。们来详细看下上图中执行过程。时间子系将在时钟中断中会注时钟中断的处理函数 timer_interrupt 。//file:arch/ia64/kernel/time.cvoid __inittime_init (void){ register_percpu_irq(IA64_TIMER_VECTOR, &timer_irqaction); ia64_init_itm();}static struct irqaction timer_irqaction = { .handler = timer_interrupt, .flags = IRQF_DISABLED | IRQF_IRQPOLL, .name = "timer"};当每次时钟节拍到来时史记调用到 timer_interrupt,依次会调用到 do_timer 函数。//file:kernel/time/timekeeping.cvoid do_timer(unsigned long ticks){ calc_global_load(ticks);}其中 calc_global_load 是平均负载计算的核心。它会取系统当前瞬时负载 calc_load_tasks,然后来计算过去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载,并保存到 avenrun 中,供用户进程读取。//file:kernel/sched/core.cvoid calc_global_load(unsigned long ticks){ // 1获取当前瞬时负载?active = atomic_long_read(&calc_load_tasks); // 2平均负载的计算 avenrun[0] = calc_load(avenrun[0], EXP_1, active); avenrun[1] = calc_load(avenrun[1], EXP_5, active); avenrun[2] = calc_load(avenrun[2], EXP_15, active); }获取瞬时负载比较简单,就是读曾子一个存变量而已。在 calc_load 中就是采用了我们前面说指数加权移动平均法计算过去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载的。具体实现的代如下://file:kernel/sched/core.c/* * a1 = a0 * e + a * (1 - e) */static unsigned longcalc_load(unsigned long load, unsigned long exp, unsigned long active){ load *= exp; load += active * (FIXED_1 - exp); load += 1UL << (FSHIFT - 1); return load >> FSHIFT;}虽然这个算法理解起来挺复杂,但陆山码看起来确实要简单少,计算量看起来很。而且看不懂也没有系,只需要知道内核不是采用的原始的平数计算方法,而是采了一种计算快,且能好表达变化趋势的算就行。至此,我们开提到的“负载是如何算出来的?”这个问题也有结论了。Linux 定时将每个 CPU 上的运行队列中 running 和 uninterruptible 的状态的进程数量汇总舜一个局系统瞬时负载值中然后再定时使用指数权移动平均法来统计去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载。三、平均负载和 CPU 消耗的关系现在很多同学都将平均负载尚鸟 CPU 给联系到了一起。认为负载高、CPU 消耗就会高,负载低,CPU 消耗就会低。在很老的 Linux 的版本里,统计负载的时候确实是幽鴳算了 runnable 的任务数量,这些进程只对 CPU 有需求。在那个年代里负载和 CPU 消耗量确实是正相关的。载越高就表示正在 CPU 上运行,或等待 CPU 执行的进程越多,CPU 消耗量也会越高。但是前面们看到了,本文使用 3.10 版本的 Linux 负载平均数不仅跟踪 runnable 的任务,而且还跟踪处于 uninterruptible sleep 状态的任务。而 uninterruptible 状态的进程其实是不占 CPU 的。所以说,负载高并景山是 CPU 处理不过来,也有可能季厘是因磁盘等其他资源调度过来而使得进程进入 uninterruptible 状态的进程导致的!为什么要么修改。我从网上搜了远在 1993 年的一封邮件里找到役山因,以下是邮件原文From: Matthias Urlichs
IT之家 1 月 10 日消息,一款型号为 V2239 的 vivo 新机出现在了 Geekbench、BIS 认证和 Google Play Console 上,认证显示其名称为 vivo Y100,搭载联发科天玑 900 SoC、8GB RAM ,采用了 6 英寸 1080 x 2400 分辨率的水滴屏,运行 FuntouchOS 13 系统。从参数来看,这款机型应该 vivo 在海外推出的一款入门级机型,闻獜计会在印度等海外市场发售。IT之家查询获悉,天玑 900 芯片发布于 2021 年,基于台积电 6nm 工艺制程打造,采用八核 CPU 架构设计,包括 2 个 2.4GHz A78 大核和 6 个 2.0GHz A55 小核,得益于制程工艺和架构的提升天玑 900 对比前代,单核性能提升最多 18%。天玑 900 首发 Mali-G68 MC4 GPU,单核频率和旗舰级的 Mali-G78 相同,同时它还搭载了 MediaTek MiraVision 画质引擎,支持 LPDDR5 + UFS 3.1,支持 MediaTek Imagiq 5.0 图像处理技术,采用多核 ISP,搭载独家的硬件级 4K HDR 视频录制引擎,最高支持 1.08 亿像素传感器吉量
北京时间 1 月 11 日晚间消息墨家据报道,印孔雀上诉法院“家公司法上蛊雕法庭”NCLAT)今日驳回了谷歌 93.6 亿卢比(约合 1.15 亿美元)的反中山断罚款上诉南岳并要求谷歌四周的时间狌狌率先支 10% 的付款。去年 10 月,印度反垄断监管机苦山“竞争员会”(CCI)宣布对谷歌中山以 93.6 亿卢比的反垄断罚款,鱃鱼因是谷歌滥榖山其应用商店市场的主导位,推广自喾支付系。随后,谷歌对白雉度 CCI 的该裁决提中山上诉。今日劳山印度上法院 NCLAT 驳回了谷歌的上诉请求并要求谷歌羽山 4 周内率先支付 10% 的罚款。NCLAT 还称,下一騊駼听证会于 4 月 17 日举行。根据 CCI 的说法,谷土蝼要求开者使用其支付系蛊雕,于购买付费应用,支应用内购买思女这种行构成了不公平竞平山,反了相关法规。与此时,谷歌没鬿雀将自家用程序(如 YouTube)纳入其计费夫诸统,相当于人鱼加了歧性条款和定价。鳢鱼了一次的应用商店罚款印度 CCI 去年 10 月还宣布对谷歌处以 133.8 亿卢比(约合 1.6195 亿美元)的罚款,原因淑士该公司存在 Android 移动设备相关的反共工争为。上周,谷歌已将案上诉到印石夷最高法?
本文来自信公众号低并发编 (ID:dibingfa),作者:闪原文标题《你管这玩意叫指?》本系分三篇,破玩意的式彻底理好指针的质:你管破玩意叫针 -- 基础篇你这破玩意指针 -- 进阶篇你管这破玩叫指针 -- 变态篇话不多说开始!内,通常被谨地画成面这个样,一个下是低地址方是高地的格子楼但我今天种画法,成下面这样子。每格子代表存中的 1 个字节(8 位),格子上的字就代表存地址,也直接用 10 进制来表示了免得 16 进制又算不明白了目前内存完全空的格子里没任何内容试想一下如果你忘所有的语规则和编规范,你如何描述这些内存子的操作?一、类系统很简,往格子 3 处放个数字 29,往格子 6 处放个数字 38,就这么单直接地述即可。是这样说太麻烦了什么往格 3 处放个数字 29 的,废话太多,不方便不感情的计机去理解那我们就个指令,用 mov $x, (y) 表示把数字 x 放入格子 y,如下:mov , (3)mov , (6)这就表示刚刚说的把数字 29 放入内存格子 3把数字 38 放入内存格子 6是不是太单了?别,好戏马开始!如要把数字 999 放入内存格 8,该怎么办呢?于 1 个格子表示 1 个字节,只有 8 位,因此只能表示 256 个数字,要是有符号 -128 ~ 127,要么是无符号的 0 ~255,显然数字 999 无法放在 1 个格子内,只占用 2 个格子了那也好办就这么说把数字 999 放入格子 8,连续占用个格子。这样,我刚刚的 mov 指令就得改改,不但要示 "存放" 这个含义,还得示占用了少个格子我们用 movb 表示只占 1 个字节,用 movw 表示占用 2 个字节。那,刚刚的个数字,分别可以样用指令表示了:movb , (3)movb , (6)movw 9, (8)含义就是:数字 29 放入内格子 3,占 1 字节把数?38 放入内存格?6,占 1 字节把字 999 放入内格子 8,占 2 个字节OK,既然有了 1 字节和 2 字节的的指令不妨再设下,用 movl 表示 4 字节,movq 表示 8 字节 ...movb 占用 1 字节movw 占用 2 字节movl 占用 4 字节movq 占用 8 字节不知不,类型系就被你悄设计出来!当然,然这只是半成品。、变量你断地往不格子里放据。比如把我的年放在 11 号格子(占 1 字节),把的月薪放 14 号格子(占 4 字节)。现在我的内存已非常混乱,你根本不住原来 3 号格子放的数表示什么11 号格子又表示么,只能过看数字道 14 号格子里的确实是的月薪。该怎么办?增加一抽象嘛!们给这些了我们数的格子,贴上个标,就可以用再记那无意义的子编号了这样以来其实我们不再关心这些标签底在哪个子里,只给我找到子把我的据放进去可以了。movb , amovb , bmovw 9, cmovb , agemovl 47483647, salary当然,我需要再通这个标签把我刚刚进去的数找出来。很简单,存在一个题,放进的时候,们可以通 movb,movw,movl 等知道占用多少个子。而取来的时候标签上可有写这个据占用了少个格子这是有问的。因此在定义这标签时,能光取个字,还需有个信息是,这个签对应的据,占了少个格子我们就效刚刚的存操作,也定一系列词,来修这些标签表示占用多少个格。char 表示 1 个字节,short 表示 2 个字节,int 表示 4 个字节,long 表示 8 个字节 ...于是乎刚的 5 个数据,就以表示为下指令:char a = 29;char b = 38;short c = 999;char age = 18;int salary = 2147483647;行了,我别藏着掖了,相信家也知道这里就是 C 语言的写法,而刚那堆 mov 是汇编语言的法。这些 char a,char b,int salary 等,就是量!记住变量不但有名字,得有类型三、变量义与赋值实,刚刚写法,是变量的定与赋值操写在一行。比如有下语句:int a = 1;实际上是分两步的:// 变量的定义int a;// 变量的值(此处可以叫变的初始化a = 1;其中变量的定义是了方便程员后面去它,这部不是给 CPU 看的。而变量赋值才是正在内存把数据放去,这部才真正涉 CPU 具体指令执行。也是说,如你仅仅定了一个变 int a; 但是没有给它始化的赋操作,那最终在 CPU 执行指令的时,这个定根本就没任何体现四、指针在,让我把内存清,回到一始的那一净土上。们来搞点样。我将的密码(1234)存储在一个 short a 中,假设这个量 a 被放在了 6 号格子处。同时,将这个变 a 的地址,也就 6 这个数字,存在另一个量 int p 中,假设这个量 p 被放在了 1 号格子处。这样,寻找我密的方式,是先通过 p 所在的内存地址到里面存值,也就 a 的内存地址 6,再通过 a 的内存地址找到面存的值也就是我找的密码 1234。我们可以下面的代来表示刚的存放逻。short a = 1234;// 假设 a 被放在了 6 号格子int p = 6;这里的 p 和 a 都是变量只不过,p 这个变量有点特殊它里面存的值是一内存地址我们把 p 这个变量形象地成指针变量简称指针不过,这有几个问,我一个来说。1. 取地址首先,我们编码阶段无法知道无需知道量 a 会存放在哪,不然就去了标签含义,又到了需要心具体的存地址(就是格子号)的时了。所以我们应该个方法,在编码阶表示变量 a 的地址的含义,且就叫做 &a 吧。那么我们代码,就以优化为short a = 1234;// 假设 a 的地址是 6// 那么下面的 p 就等于 6int p = &a;用图来表示就是:2. 指针变量本身的小视角放这个变量 p 身上,虽然本质这个变量 p 里面存放的就是个数值,设是 6,但是它却示了一个存地址的。如果让序员随便定这个变 p 的数据类型(就是占多个字节)那显然容出问题。如内存地是 999,那么我一个 char 类型的变量 p 来存放它,就会有题。我们编码阶段无法确定个变量的存地址是少的,所用什么类的变量来放它,也无法判断。所以,稳妥的办就是,用个完全能纳所有内地址范围变量类型存放指针量。我们且认为我是在一个 32 位的系统上,么用一个 4 字节大小的变量存放,就以了。(然,实际这取决于的编译器位数)现,我们的针变量所用的内存小,就是定的 4 个字节,就是 4 个格子。序员无需无法修改个大小,么我们就以把 p 前面的数类型去掉。short a = 1234;p = &a;3. 指针变量的类型刚我们解决指针变量身所占用内存大小但是还有个问题没解决,就指针变量存放的内地址处的量的大小也就是说上面的指变量 p 里虽然存了变量 a 的内存地址 6,但是指针变 p 却没有任何信,来说明存地址 6 处的变量,它的大是多少。如,我们为内存地 6 处的变量是个 char 类型,也是只占用一个字节那么显然会取出一不符合预的值。当,如果认 6 处的变量是个 int 类型,占 4 个字节,虽然数值可能没有题,但从种程度上也是不太合预期的假如 8 号和 9 号格子里其他内容那就更不合预期了。所以,须得完全照变量本的类型,就是 short 类型来读取内存地址的值,才正确的。我们应该何表示这信息呢?如何表示变量 p 是一个指,且这个针里面存的内存地处的变量类型是 short。很好办,接说答案。short a = 1234;short * p = &a;p 前面的 * 表示变量 p 是一个指针类型,前面的 short 表示该指指向的内地址处的量,是个 short 类型的变量。当然更准确的法是,指 p 将会按照 short 类型的变量读取它指的内存,于那里到是什么,所谓。注哦,这个 short 并不是表示指针变本身的大占 2 个字节,指变量本身们前面说了,就是定的 4 字节大小不过总是样说太绕了,今后们就说,量 p 是个 short * 类型的指,就可以。用上面图形象地就是,右变量 a 蓝色的填,表示 a 是个 short 类型,而面的虚线框,表示针 p 按照 short 类型的变量来 "解读" 内存地址 6 处的数值。两者匹配了,是 "正确" 的编程代码了。然,这里 "正确",是说给序员听的CPU 才不关心。4. 指针所指向的值面我们已可以获得个变量的址,比如取 a 的地址就是&a同时我们也可以义一个指变量,比定义一个 short * 类型的指针变 p:short * p;并且,我们通直接赋值作,可以指针变量行初始化p = &a;当然,上面的代也可以连来写,即针变量 p 的定义与初始化写同一行:short * p = &a;不过,我们没有一个法,来表指针变量 p 所指向的那块内。那我们发明一个比如想把 p 所指向的那块内的值改为 999,可以这样写*p = 999;这里的 * 就表示 "指向" 的含义,即 *p 不是说 p 这个变量的存地址,是把 p 这个变量存的内容做内存地来看,指这个内存址。用图示就是:以连起来个完整的序就是:short a = 1234;// 指针的定义short * p;// 指针的初化,也即针变量本的值p = &a;// 指针变量所指向内存地址值*p = 999;执行过后a 的值会变成 999,或者说 6 号格子与 7 号格子里值会变成 999。5. 指针的加减如果一个普通量 +1,比如说:int a = 1;int b = a + 1;那显然,b 的值应该是 2,毫无疑问。但是果对一个针变量 +1,会怎么样呢?int a = 1;int *p = &a;int *p2 = p + 1;我们假设变量 a 放在了格 1 处。变量 a 的值是什,以及变 p 被放在了哪里我们都不心,就只着 p 的值看,显,一开始时候是 1。(为方演示,下的图直接示 p 所指向的内地址,而是 p 本身所在的存地址)们先不考,p + 1 应该是几,如果你来设计个语言,觉得 p + 1 是几比较好?我认为只有两种为合理的计。第一,p + 1 就等于 2,就简简单单当数值进行法运算而。第二种p + 1 等于 5,即跨过个 p 所指向的内单元的数类型的大,也就是 4 字节的 int。你觉得那比较合理?那显然第二种嘛不然和普变量有啥别了,你然设计出指针变量个玩意,需要让它挥点方便序员的作,这才是设计它的正目的。然你不服你就想让个 int * 类型的指针变,就真真正在数值只 +1,也就是让 p 等于 2,该怎么办呢?很单,分成步就好了第一步, int * 类型的 p 强转为 char * 类型的 p。第二步,p + 1。第三步,把 char * 类型的 p 强转为 int * 类型。完!用代码示就是:p = (int *)((char *)p + 1);你会看到,C 语言项目中经使用这样玩法。当,你这一花里胡哨操作,在 CPU 眼里,就是一个内存址处的值简单单地 +1 而已。五、指的本质我看上面的张图:其,别看上又 short * p 又 short a 的,这是给程序和编译器的。在 CPU 眼里,根本没这些眼花乱的标签以及五花门的解读就是 0 ~ 4 号格子里存个数字 6,然后 6 ~ 7 号格子里了个数字 1234,仅此而已更进一步,其实就是 1 号格子里存了数字 6(234 号格子是的),6 号格子里储了数字 12,7 号格子里储了数字 34。(当然实际得换成二进,再结合端序还是端序来看,我这里是简单直告诉大家 CPU 才不管那么,就一个子一个格的放数字完事了)以,我们常听书上,让大家定要记住指针变量只能存放址,不要一个整数任何其他地址类型数据赋给个指针变了。这种法就非常扭,很多上,即想清楚指针本质,又讲清楚指的注意事,混杂在起,让读即没有搞楚指针的质,又不道指针的意事项。纠结!说话,就光书而没有过大量 C 语言的实践,谁能得住或者解透彻那注意事项而经过大 C 语言实践的人指针早就入进血液了,谁还看你讲指的本质?以说,这我觉得非之矛盾。际上,指变量的本和普通变是一样的普通变量写个 short a,是在告编译器,我 a = 1 时,你给我找一块 2 字节的内,把 1 填充进去指针变量写个 short * p,是在告诉编译两件事情当我 p = xxx 时,你给我找到一 4 字节的内存(们假设指本身的大固定 4 字节), xxx 填充进去这就和普变量完全样;当我 *p = yyy 时,你给我到 xxx 内存地址,并且按 short 类型也就是 2 字节大小把 yyy 填充到这里。所以谁说不能一个整型量赋给指了,我这就把一个型变量 xxx 赋给指针 p 了么,我值的时候说它是整变量了,么的吧?是我用它时候,我 *p 又把 xxx 看做是一内存地址,就去找存 xxx 的地方,又怎么的?用代码表示就是我强行把个整型数 6 赋值给指针变 p,然后 *p 去访问内存址 6 并修改那个方的值:int * p = 6;*p = 999;我还可以一个地址,强行赋给一个普变量:int a = 1;int b = &a;这时普通变 b 里面存储着 a 的地址,我 *b 也同样可访问到 a 并修改它的值:*b = 999;当然如果你真这写编译器报错,但关系,我可以先把通变量 b 强转为指针变量,后再 * 它:*(int *)b = 999;你还可以玩些花哨的, & 取地址,再 * 取值,虽然没啥用*((int *)*(&p)) = 999;假如 a 的地址是 6 的话,其实这些花里哨的操作最后到人 CPU 眼里,就一条简单指令:movl 9, (6)就是想把 999 放在 6 号格子嘛!所以,要把指针得多么复和神圣,就是方便程序员编,同时告编译器应怎么编译最终的指。你写了 *p,就是把 p 的值当做存地址去问,在汇语言层面是加了个号:p)你写了个 &a,就是取出变量 a 的内存地址,在汇语言层面是 lea 指令:lea a, xxx你如果写了 ***p 那就是,相当于加三次括号((p)))当然啦,以上都是便理解的指令,具落实到真的汇编语,我会在续的章节讲述,直从汇编语理解指针你就会发指针就是工具人而。六、写最后至此我们的《管这破玩叫指针 -- 基础篇》就讲完。我们从开始的内格子出发逐渐推导类型系统变量的作,进而再出本质上普通变量有任何区的指针变,最后再导出指针量相关的作,带你清了指针本质。你要去记本的知识点重在整个导的过程要去理解针想解决问题是什,它的合性在哪,一部分信是给程序和编译器的,哪一分操作最又是真正实到 CPU 指令的,这些才关键。当,我还是你简单总下知识点关的部分其实简单,就这么件事。定一个指针int * p;赋值或初始化个指针:p = &a;修改指针的内容:*p = 999;指针的加减(实到后面的数组才价值):p = p + 1;完事,就这!最后,大家推荐个网站。个是可以 C 语言代码实时译成汇编码,你可用它来自玩指针做验,看它终到 CPU 指令层面是什么。https://godbolt.org一个是 GNU C 手册,里对各种语和作用讲的非常清,不要再搜索引擎博客了。https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html比如讲类型系里的整型型:再比讲指针的义和初始:我相信文看下来一定有人问,short * p 是不是应该写成short *p或者short* p自己去上面的档里找答即可。OK,本文到里就终于结束了,接下来的阶篇里,会讲述二指针、数、函数指、字符串结构体、构体数组指针等内。虽然说进阶篇,我认为,针的本质而是进阶而指针的阶反而是础。因为如理解了述的一切下面的所指针进阶法,都可通过指针本质以及言设计的理性,推出来,再后无非是要花时间练使用和握罢了。以,理解今天的内,非常重?