首页 文章 精选 留言 我的

精选列表

搜索[智能问数],共10000篇文章
优秀的个人博客,低调大师

Windows 11 月活跃设备数超过 4 亿台

根据 Windows Central 的报道,微软内部数据显示,目前运行 Windows 11 的月活跃设备已超过 4 亿台,并且正在稳步增长,预计到 2024 年初达到 5 亿台。 从这份数据来看,Windows 11普及率明显要比上一代 Windows 10 更慢。Windows 11 于 2021 年 10 月发布,这意味着它花了大约两年的时间才达到这一里程碑,相比 Windows 10 要慢得多,后者在一年多的时间里就达到了同样的水平。 Windows Central 称,采用率的差异可归因于两个操作系统不同的发布策略。Windows 10 最初作为 Windows 7 和 Windows 8 的限时免费升级而推出,微软一直在敦促用户在免费升级期结束前尽快升级。 相比之下,Windows 11 的发布较为平静,而且由于 TPM 的要求,支持的 PC 数量较少,因此采用率较低。 虽然 Windows 11 采用率到达里程碑的速度没有 Windows 10 快,但这也已经超出了微软自己对 Windows 11 采用率的预期。 根据流量监测机构 StatCounter 的数据,Windows 10 仍然以 71.62% 的市场份额牢牢控制着桌面 Windows 市场。与此同时,Windows 11 占所有 Windows 桌面安装量的 23.64%。Windows 7 的市场份额下降到 3.33%,而 Windows XP 的市场份额仅为 0.34%。 根据微软的内部指标,Windows 11 的势头很强劲。尽管最初存在争议和兼容性问题,但微软通过频繁的更新和预览选项,让 Windows 11 对新设备和现有设备都充满了吸引力。

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

对比分析数仓中行列存的特性

摘要:行存表示了一种数据的存储方式,是最传统的一种存储方式。 本文分享自华为云社区《【玩转PB级数仓GaussDB(DWS)】行列存对比的一些事》,作者:sevenjiang。 行存表示了一种数据的存储方式,是最传统的一种存储方式。对于GaussDB(DWS)来说可以认为其表示存储引擎的基础实现,在其之上逐步构筑了列存和hdfs之类的存储特性。如下简单介绍下行列存使用的一些对比。 集群设置介绍: 参数default_orientation控制建表不指定存储方式的默认行为。 通过如下建表显式设置可以指定行列存储: ORIENTATION 指定表数据的存储方式,即行存方式、列存方式,该参数设置成功后就不再支持修改。 取值范围: • ROW,表示表的数据将以行式存储。 行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 • COLUMN,表示表的数据将以列式存储。 列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少 适用场景: 列储存优势: 列的数据特征比较相似,适合压缩,压缩比很高; 表列的个数比较多,但是访问的列个数比较少, 列存可以大大减少不必要的IO读, 提高性能; 基于列批量数据的运算,CPU的cache命中率比较高,性能比较好; 列存储引擎更适合OLAP大数据统计分析的场景。 列储存劣势: 列存表(delta表但默认并没有启用)不适合小量 insert 及update操作 行存储优势: 点查询(返回记录少,基于索引的简单查询); 增、删、改操作较多的场景; 主要使用整张表的内容,而不是单独某几个列,并且所关注的内容不需要通过任何聚集运算,推荐使用行式存储。 对比现状: 类型支持范围不同; 不支持表达式索引,索引失效; 行存默认btree索引,列存默认psort,主健是813版本支持的,老版本不支持; 老版本列存复制表不支持更新,813版本支持 ; 表级的check约束列存不支持 ; cu锁的问题,并发更新会报错 ; 没有并发更新,但是开启delta表,更新/delete概率出错; 小CU的问题突出,引发空间膨胀,性能问题等 ; exchange要求表的with中option一致; 列存导入实现方式: 列存表推荐使用批量插入(INSERT INTO SELECT/COPY),单行记录插入会造成空间浪费,访问效率下降; 导入数据按列缓存,默认每60000行(通过max_batchrow修改)或者1G的大小生成CU; 生成CU时,根据数据类型,默认low压缩级别(通过compression修改),进行压缩。 先写入CUDesc,再写入CU,同时将CU插入到数据复制队列。最后写入VCU; CU文件是追加写(APPEND ONLY)。 分区表注意: 每一个分区是一个独立的列存表; vector batch的进入,单条数据进入bulkload_row; 下盘、读取的处理; 内存自适应。 存在行列存join情况: 行存列存JOIN 转换的执行计划不符合预期,可以通过 set enable_force_vector_engine = on; 进行下优化: enable_force_vector_engine 参数说明:对于支持向量化的执行器算子,如果其子节点是非向量化的算子,通过设置此参数为on,强制生成向量化的执行计划。 当打开enable_force_vector_engine开关时,无论是行存表、列存表或者是行列混存,如果plantree中不包含不支持向量化的场景,则强制走向量化执行引擎。 参数类型:USERSET 取值范围:布尔型 默认值:off 手工基础行转列操作,如果表有业务执行,需要进行加锁或者事务中执行,视图和索引进行单独处理: create table schema.row_table1 (like schema.table1 including all EXCLUDING RELOPTIONS EXCLUDING INDEXES) WITH (ORIENTATION=column; insert into schema.row_table1 select * from schema.table1; ALTER TABLE schema.row_table1 ADD CONSTRAINT row_table1_pk PRIMARY KEY (xxx_id); alter table rename schema.table1 to col_table1; alter table rename schema.row_table1 to table1; 点击关注,第一时间了解华为云新鲜技术~

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

PDManer[元数建模]公有云版本已正式发布

2023来啦,各位开源中国的同学,新年快乐!期待已久的公有云在线版已于2023年1月1日正式发布,微信扫码即用。 功能特点如下: 1. 拥有客户端版本的全部功能; 2. 免费赠送3个协作席位,实时在线协作; 3. 平台公云版,开源版均能实现文件格式通用; 4. 提供模型广场,发布或者共享他人成果; 5. 将来持续推出更多实用功能; 欢迎使用,体验地址:http://pdmaas.pdmaner.com/

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

数仓中长跳转问题复现及解决方案

摘要:本文将GaussDB(DWS)中长跳转引发的错误抽象为例子,讨论了C语言在长跳转下可能会出现的问题,最后简单给出了解决方法和验证。 本文分享自华为云社区《GaussDB(DWS)中长跳转可能出现的问题》,作者: 雷电与骤雨。 问题描述,在GaussDB(DWS)编码实践中,发现在debug未进行编译器优化的版本未发生问题,但是在release版本,发生了一些变量赋值后失效,仍为旧值的bug,本文将对此在两个角度下进行简单分析。 什么是长跳转? 在C语言中,goto语句常常实现程序执行中的近程跳转(local jump),longjmp()和setjmp()函数实现程序执行中的远程跳转(nonlocaljump,也叫farjump)。 主要相关的为两个函数的签名: int setjmp(jmp_buf env); void longjmp(jmp_buf env, int value); 一般理解为:setjmp 函数把执行这个函数时的各种上下文信息保存起来,储存到jmp_buf中,主要就是当前栈的位置,寄存器状态。longjmp 函数跳转到参数 env 缓冲区中保存的上下文(快照)中去。并且也有人提出会与实现方式 implementation有关。 我觉得下面这句还是比较可信的: The setjmp() function saves the contents of most of the general purpose registers, in the same way as they would be saved on any function entry. It also saves the stack pointer and the return address. All these are placed in the buffer. It then arranges for the function to return zero. 编译器优化问题 问题发生于debug版本和release版本出现了不同的结果,其中的差异主要是编译器在编译构建中的优化过程。一般编译器优化常用的方法有:将内存变量缓存到寄存器。 由于访问寄存器要比访问内存单元快的多,编译器在存取变量时,为提高存取速度,编译器优化有时会先把变量读取到一个寄存器中;以后再取变量值时就直接从寄存器中取值。但在很多情况下会读取到脏数据,严重影响程序的运行效果。 解决方法 C++ Volatile关键字 Volatile,词典上的解释为:易失的;易变的;易挥发的。个人理解就是在每次给该变量赋值后,需要将其放入内存,而非直接使用寄存器,此时可以避免因为jump和函数跳转带来的未写入内存导致赋值未成功(仍为旧值),或者编译器优化,将值直接放于寄存器(此值可能因为多次使用,避免从内存中来回多次读取)。 问题复现 实例未优化,debug未优化版本 #include <stdio.h> #include <stdlib.h> #include <setjmp.h> static jmp_buf env; static void doJump(int nvar, int rvar, int vvar) { printf("Inside doJump(): nvar=%d, rvar=%d, vvar=%d\n" , nvar,rvar, vvar); //死代码块 int nvar0 = nvar; int rvar0 = rvar; int vvar0 = vvar; longjmp(env, 1); } int main(int argc, char** argv) { int nvar; register int rvar; volatile int vvar; nvar = 111; rvar = 222; vvar = 333; if(setjmp(env) == 0) { nvar = 777; rvar = 888; vvar = 999; doJump(nvar, rvar, vvar); } else { int nvar1 = nvar; int rvar1 = rvar; int vvar1 = vvar; printf("After longjmp(): nvar =%d, rvar=%d, vvar=%d\n", nvar, rvar, vvar); } exit(EXIT_SUCCESS); } 程序运行结果 将程序通过gcc编译构建,其中不使用任何优化。将产生的二进制文件运行,可得到如下结果: 从中可以发现,寄存器变量rvar的值未受后面赋值的影响,仍为旧值222,与期望值不同,但是普通int型和volatile型值均正确。说明经过长跳转,寄存器变量在跳转之中重新赋值容易产生丢失的问题。 汇编角度观察 下图发现,在赋值的时候,rvar是直接放到了ESI寄存器中,而未覆盖掉之前内存中保存的222值,也就是888赋值到了寄存器,而内存中应该还为222,其余的777,999均进入内存中。 并且进入下个自定function函数时,三个变量均放入了寄存器中。进行传值。 下图可以看出来,就是jump回来时,rvar的真实值(寄存器中的值888)已经丢失,寄存器的值被jump buffer缓存中值所冲掉,后面在打印变量值时,从内存中读取到旧的值。 内存角度观察 上图是赋值完777,888,999,此时发现,这个888赋值给了寄存器(从汇编中可以看出),这里发现222未被覆盖。 最后通过jump返回,读取值,这时候读取是从内存中读取出来,发现读出了777,222,999,程序发生了意外情况。其中下图展示了内存地址中的值,222在-0x28 + 0x7fffffffe160地址位。 实例优化O2,release版本 程序运行结果 编译中加入O2编译器优化,并运行程序。此时结果发现,nvar和rvar的值均发生了变化,并未存入我们预想中的777和888,而是old值未被改变。 因为存在编译器的优化问题,变量nvar和rvar在跳转中,其改写值放入了寄存器中,jump之后,寄存器的值被冲刷,到致出现此类问题。而变量vvar的值放入了内存中,jump之后,仍可以通过寄存器指针调取。 下面就对程序运行过程进行检查和对结果进行分析。 汇编角度观察 通过objdump -d volatile_og可以查看编译后文件的反汇编代码。我们主要观察main函数,其从10c0开始,上图根据判断env是否等于0为界限,分为了3块,方便理解阅读。 发现汇编中不存在对函数Dojump的调用(callq指令后未出现Dojump),猜测是由于编译器优化为内联函数。同时此函数中变量nvar0,rvar0,vvar0的初始化为死代码块,在优化过程中也进行了移除。 下图可以说明,仅有使用关键字volatile的vvar其值再栈内存中可以找到,其余的变量均不为lvalue。 内存角度观察 可以通过查看jump前后的内存中的值,进行查看到底在jump中发生了什么: 下图一为在jump之前,寄存器中的值,只有333进入到内存中了。亦可以通过图二方式查询,发现rvar和nvar并非可以通过内存地址访问到。 在jump之后,内存e15c中的值改为999。 Jump之后,栈内存的空间如下图所示: 下图中,此时只有vvar可以取地址操作。 附录 参考资料 什么是内存屏障? Why Memory Barriers ? why-do-we-use-volatile-keyword intro.races-13 Linux 汇编语言开发指南 Intel 格式--AT&T 格式 setjmp()与longjmp()详细分析 利用C语言中的Setjmp和Longjmp,来实现异常捕获和协程 Exactly what “program state” does setjmp save? 可能涉及到的具体优化参数 l -fforce-mem:在做算术操作前,强制将内存数据copy到寄存器中以后再执行。这会使所有的内存引用潜在的共同表达式,进而产出更高效的代码,当没有共同的子表达式时,指令合并将排出个别的寄存器载入。这种优化对于只涉及单一指令的变量, 这样也许不会有很大的优化效果. 但是对于再很多指令(必须数学操作)中都涉及到的变量来说, 这会时很显著的优化, 因为和访问内存中的值相比 ,处理器访问寄存器中的值要快的多。 l -fregmove:编译器试图重新分配move指令或者其他类似操作数等简单指令的寄存器数目,以便最大化的捆绑寄存器的数目。这种优化尤其对双操作数指令的机器帮助较大。 l -fschedule-insns:编译器尝试重新排列指令,用以消除由于等待未准备好的数据而产生的延迟。这种优化将对慢浮点运算的机器以及需要load memory的指令的执行有所帮助,因为此时允许其他指令执行,直到load memory的指令完成,或浮点运算的指令再次需要cpu。其允许数据处理时先完成其他的指令。 总结: -fforce-mem有可能导致内存与寄存器之间的数据产生类似脏数据的不一致等。对于某些依赖内存操作顺序而进行的逻辑,需要做严格的处理后才能进行优化。例如,采用volatile关键字限制变量的操作方式,或者利用barrier迫使cpu严格按照指令序执行的。 内存屏障 Memory Barriers Cache 一致性问题的根源是因为存在多个处理器独占的 Cache,而不是多个处理器。它的限制条件比较多:多核,独占 Cache,Cache 写策略。 当其中任一个条件不满足时便不存在cache一致性问题。 针对CPU的多级Cache和存储读写一致性 : CPU中为提高指令执行,增加了两个缓冲区store buffer,invalidate queue。 Store Buffer: 好处:store是为了CPU0和1之间读写,不需要等待从另外一个CPU的Cache中调取数据。(提高速度)。 坏处(问题描述):CPU0修改值,但是其发送的“读使无效”晚于CPU1真正读的时间,导致晚了一步,数据错了。 冲突问题的解决: 硬件上:store forwarding。如果本地Store Buffer有数据,直接先读本队Store Buffer。 软件上:硬件设计者提供了memory barrier指令,让软件来告诉CPU这类关系。 失效队列: store buffer一般很小,所以CPU执行几个store操作就会填满, 这时候CPU必须等待invalidation ACK消息(得到invalidation ACK消息后会将storebuffer中的数据存储到cache中,然后将其从store buffer中移除),来释放store buffer缓冲区空间。 好处:CPU1可能在重负荷下,执行大量失效命令会有更重的复合。提高了速度; 坏处(问题描述):可能本身值已无效,但是队列未执行到。(又是晚了)。 解决:仍然是加屏障可以解决。 点击关注,第一时间了解华为云新鲜技术~

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册