首页 文章 精选 留言 我的

精选列表

搜索[组织重构],共10000篇文章
优秀的个人博客,低调大师

[20120324]IOT索引组织表相关信息的学习(二).txt

上次链接: http://space.itpub.net/?uid-267265-action-viewspace-itemid-717272 IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表。 我仅仅在生产系统中对3个表使用,我偏向使用静态以及"只读"的小表。 如果IOT表存在除主键外的第2索引,如果使用它存在物理猜"physical guess",我以前的理解一直是第2索引记录了主键信息,通过这个信息就可以定位IOT表中对应的数据,一直没有很好的测试与理解。我最近也看了两个链接,介绍了IOT的内容: http://richardfoote.wordpress.com http://mwidlake.wordpress.com 这次对上次的学习做一些补充: 1.测试环境: SQL> select * from v$version ; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production SQL> create table t_iot ( a varchar2(10),b varchar2(10),vc varchar2(1200),d varchar2(1), constraint t_iot_pk PRIMARY KEY(a)) ORGANIZATION INDEX; SQL> create index i_t_iot_b on t_iot(b); insert into t_iot values ('1' ,'a','a','1'); insert into t_iot values ('22' ,'b','a','1'); insert into t_iot values ('333' ,'c','a','1'); insert into t_iot values ('4444' ,'d','a','1'); insert into t_iot values ('55555' ,'e','a','1'); insert into t_iot values ('666666' ,'f','a','0'); insert into t_iot values ('7777777' ,'g','a','0'); insert into t_iot values ('88888888' ,'h','a','0'); insert into t_iot values ('999999999','i','a','0'); commit ; SQL> exec dbms_stats.gather_table_stats(ownname=>USER, tabname=>'T_iot'); 2.建立位图索引: SQL> create bitmap index i_t_iot_d on t_iot(d); create bitmap index i_t_iot_d on t_iot(d) * ERROR at line 1: ORA-28669: bitmap index can not be created on an IOT with no mapping table --可以发现要在IOT表上建立位图索引必须要建立mapping table . SQL> alter table t_iot move mapping table; SQL> SELECT index_name, table_name, blevel, leaf_blocks, status FROM dba_indexes WHERE table_name = 'T_IOT'; INDEX_NAME TABLE_NAME BLEVEL LEAF_BLOCKS STATUS ------------------------------ ------------------------------ ---------- ----------- -------- T_IOT_PK T_IOT 0 1 VALID I_T_IOT_B T_IOT 0 1 VALID --可以发现索引依旧有效,不需要重建. SQl> SELECT object_name, object_id, data_object_id, object_type, status FROM dba_objects WHERE wner = USER AND object_name IN ('T_IOT', 'T_IOT_PK'); OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE STATUS -------------------- ---------- -------------- ------------------- ------- T_IOT 87282 TABLE VALID T_IOT_PK 87283 87286 INDEX VALID T_IOT的object_id=87282,因为我执行了一次alter table t_iot move mapping table; T_IOT_PK的object_id与data_object_id不等. SQL> SELECT object_name, object_id, data_object_id, object_type, status FROM dba_objects WHERE wner = USER AND object_name like '%IOT_MAP%'; OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE STATUS -------------------- ---------- -------------- ------------------- ------- SYS_IOT_MAP_87282 87285 87285 TABLE VALID --可以知道mapping table的命名是SYS_IOT_MAP_,OBJECT_TYPE=TABLE; SQL> desc SYS_IOT_MAP_87282 Name Null? Type ---------- -------- ------- SYS_NC_01 ROWID SQL> column x format a66 SQL> column y format a66 SQL> select dump(rowid,16) y ,dump(sys_nc_01,16) x from SYS_IOT_MAP_87282; Y X ------------------------------------------------------------------ ------------------------------------------------------------------ Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,0 Typ=208 Len=9: 2,4,0,0,0,0,1,31,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,1 Typ=208 Len=10: 2,4,1,0,2,24,2,32,32,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,2 Typ=208 Len=11: 2,4,1,0,2,24,3,33,33,33,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,3 Typ=208 Len=12: 2,4,1,0,2,24,4,34,34,34,34,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,4 Typ=208 Len=13: 2,4,1,0,2,24,5,35,35,35,35,35,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,5 Typ=208 Len=14: 2,4,1,0,2,24,6,36,36,36,36,36,36,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,6 Typ=208 Len=15: 2,4,1,0,2,24,7,37,37,37,37,37,37,37,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,7 Typ=208 Len=16: 2,4,1,0,2,24,8,38,38,38,38,38,38,38,38,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,8 Typ=208 Len=17: 2,4,1,0,2,24,9,39,39,39,39,39,39,39,39,39,fe 9 rows selected. 9 rows selected. SQL> select dump(rowid,16) x,a from t_iot; X A ------------------------------------------------------------------ ---------- Typ=208 Len=9: 2,4,1,0,2,23,1,31,fe 1 Typ=208 Len=10: 2,4,1,0,2,23,2,32,32,fe 22 Typ=208 Len=11: 2,4,1,0,2,23,3,33,33,33,fe 333 Typ=208 Len=12: 2,4,1,0,2,23,4,34,34,34,34,fe 4444 Typ=208 Len=13: 2,4,1,0,2,23,5,35,35,35,35,35,fe 55555 Typ=208 Len=14: 2,4,1,0,2,23,6,36,36,36,36,36,36,fe 666666 Typ=208 Len=15: 2,4,1,0,2,23,7,37,37,37,37,37,37,37,fe 7777777 Typ=208 Len=16: 2,4,1,0,2,23,8,38,38,38,38,38,38,38,38,fe 88888888 Typ=208 Len=17: 2,4,1,0,2,23,9,39,39,39,39,39,39,39,39,39,fe 999999999 9 rows selected. --前面我已经讲过,IOT的rowid是逻辑rowid,其存贮格式如下: --结合dump(rowid),dump(rowid,16)的转出信息.很容易推导出rowid的信息。以下的例子来说明: Typ=208 Len=17: 2,4,1,0,2,23,9,39,39,39,39,39,39,39,39,39,fe 999999999 1.开头的2,4,以及结尾fe实在不好猜测,不过好像是固定不变的。 2.中间的1,0,2,23正好对应的就是IOT的根节点,也就是对应数据IOT的数据块。 3.9,39,39,39,39,39,39,39,39,39中9表示主键长度,39,39,39,39,39,39,39,39,39就是主键的信息。 --不过感到奇怪的是,在没有移动iot表里面数据的时候,SYS_IOT_MAP_87282上记录的urowid(sys_nc_01)与t_iot当时的rowid并不是对应的. --仅仅对应的键值一样.不知道为什么这样? --而且a='1'对应的SYS_IOT_MAP_87282的sys_nc_01的对应的数据块竟然是0,0,0,0. SQL> select header_file,header_block from dba_segments where wner=USER and segment_name='SYS_IOT_MAP_87282'; HEADER_FILE HEADER_BLOCK ----------- ------------ 4 538 3.插入一行看看: SQL> insert into t_iot values ('0000000000','i','j','0'); 1 row created. SQL> commit ; Commit complete. SQL> select dump(rowid,16) y ,dump(sys_nc_01,16) x from SYS_IOT_MAP_87282; Y X ------------------------------------------------------------------ ------------------------------------------------------------------ Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,0 Typ=208 Len=9: 2,4,0,0,0,0,1,31,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,1 Typ=208 Len=10: 2,4,1,0,2,24,2,32,32,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,2 Typ=208 Len=11: 2,4,1,0,2,24,3,33,33,33,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,3 Typ=208 Len=12: 2,4,1,0,2,24,4,34,34,34,34,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,4 Typ=208 Len=13: 2,4,1,0,2,24,5,35,35,35,35,35,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,5 Typ=208 Len=14: 2,4,1,0,2,24,6,36,36,36,36,36,36,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,6 Typ=208 Len=15: 2,4,1,0,2,24,7,37,37,37,37,37,37,37,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,7 Typ=208 Len=16: 2,4,1,0,2,24,8,38,38,38,38,38,38,38,38,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,8 Typ=208 Len=17: 2,4,1,0,2,24,9,39,39,39,39,39,39,39,39,39,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,9 Typ=208 Len=18: 2,4,0,0,0,0,a,30,30,30,30,30,30,30,30,30,30,fe 10 rows selected. SQL> select dump(rowid,16) x,a from t_iot; X A ------------------------------------------------------------------ ---------- Typ=208 Len=18: 2,4,1,0,2,23,a,30,30,30,30,30,30,30,30,30,30,fe 0000000000 Typ=208 Len=9: 2,4,1,0,2,23,1,31,fe 1 Typ=208 Len=10: 2,4,1,0,2,23,2,32,32,fe 22 Typ=208 Len=11: 2,4,1,0,2,23,3,33,33,33,fe 333 Typ=208 Len=12: 2,4,1,0,2,23,4,34,34,34,34,fe 4444 Typ=208 Len=13: 2,4,1,0,2,23,5,35,35,35,35,35,fe 55555 Typ=208 Len=14: 2,4,1,0,2,23,6,36,36,36,36,36,36,fe 666666 Typ=208 Len=15: 2,4,1,0,2,23,7,37,37,37,37,37,37,37,fe 7777777 Typ=208 Len=16: 2,4,1,0,2,23,8,38,38,38,38,38,38,38,38,fe 88888888 Typ=208 Len=17: 2,4,1,0,2,23,9,39,39,39,39,39,39,39,39,39,fe 999999999 10 rows selected. --可以发现插入后SYS_IOT_MAP_87282也添加一行,其对应的sys_nc_01内容如下:2,4,0,0,0,0,a,30,30,30,30,30,30,30,30,30,30,fe.数据块对应的也是0. --这不知道mapping table与iot表对应的块为什么不一致? 4.转储T_IOT_PK SQL> select header_file,header_block from dba_segments where segment_name='T_IOT_PK'; HEADER_FILE HEADER_BLOCK ----------- ------------ 4 546 SQL> select object_id,data_object_id from dba_objects where object_name='T_IOT_PK'; OBJECT_ID DATA_OBJECT_ID ---------- -------------- 87283 87286 SQL> ALTER SESSION SET EVENTS 'immediate trace name treedump level 87283'; ----- begin tree dump leaf: 0x1000223 16777763 (0: nrow: 10 rrow: 10) ----- end tree dump --仅仅占用1个块。HEADER_BLOCK=546,根节点=547.而且IOT root节点块地址=0x1000223.不知道mapping table记录的逻辑rowid不一致,不过键值是一样的. 5.再次建立索引看看. SQL> create bitmap index i_t_iot_d on t_iot(d); Index created. --OK 建立成功. SQL> select header_file,header_block from dba_segments where segment_name='I_T_IOT_D'; HEADER_FILE HEADER_BLOCK ----------- ------------ 4 522 SQL> select object_id,data_object_id from dba_objects where object_name='I_T_IOT_D'; OBJECT_ID DATA_OBJECT_ID ---------- -------------- 87490 87490 SQL> ALTER SESSION SET EVENTS 'immediate trace name treedump level 87490'; *** 2012-03-26 09:28:26.747 ----- begin tree dump leaf: 0x100020b 16777739 (0: nrow: 2 rrow: 2) ----- end tree dump SQL> alter system dump datafile 4 block 523 ; Block header dump: 0x0100020b Object id on Block? Y seg/obj: 0x155c2 csc: 0x00.7acbe4 itc: 2 flg: E typ: 2 - INDEX brn: 0 bdba: 0x1000208 ver: 0x01 opc: 0 inc: 0 exflg: 0 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.007acbe4 Leaf block dump =============== header address 182924354148=0x2a97242264 kdxcolev 0 KDXCOLEV Flags = - - - kdxcolok 0 kdxcoopc 0x80: pcode=0: iot flags=--- is converted=Y kdxconco 4 kdxcosdc 0 kdxconro 2 kdxcofbo 40=0x28 kdxcofeo 7989=0x1f35 kdxcoavs 7949 kdxlespl 0 kdxlende 0 kdxlenxt 0=0x0 kdxleprv 0=0x0 kdxledsz 0 kdxlebksz 8032 row#0[8010] flag: ------, lock: 0, len=22 col 0; len 1; (1): 30 col 1; len 6; (6): 01 00 02 1b 00 00 col 2; len 6; (6): 01 00 02 1b 00 0f col 3; len 3; (3): c9 e0 03 row#1[7989] flag: ------, lock: 0, len=21 col 0; len 1; (1): 31 col 1; len 6; (6): 01 00 02 1b 00 00 col 2; len 6; (6): 01 00 02 1b 00 07 col 3; len 2; (2): c8 1f ----- end of leaf block dump ----- End dump data blocks tsn: 4 file#: 4 minblk 523 maxblk 523 --可以发现第2位图索引中记录的start_rowid,end_rowid与SYS_IOT_MAP_87282表中的相对应. --可以看出:Mapping table的每一行存储了对应的IOT表中记录的logical rowid(仅仅是主键一致). 因此这个mapping table就维护了IOT 表logical rowid --和 mapping table的每一行的physical rowid 的mapping 的关系。为什么要这样做呢?因为bitmap索引条目中保存的rowid要用physical rowid, 而IOT是 --无法提供稳定的physical rowid的,因此就借助于mapping table的physical rowid。 通过bitmap索引来访问表中的数据的执行计划大概就是首先根据 --bitmap index中的physical rowid访问mapping table, 然后通过mapping table中的logical rowid再来访问IOT表。 6.再次修改记录: SQL> update t_iot set vc=lpad('a',1000,'a') ; 10 rows updated. SQL> commit ; Commit complete. --vc长度加大到1000,原来的IOT数据块已经无法存在这些信息,发现IOT表发生了1次索引分裂,生成两个叶子节点. SQL> select dump(rowid,16) y ,dump(sys_nc_01,16) x from SYS_IOT_MAP_87282; Y X ------------------------------------------------------------------ ------------------------------------------------------------------ Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,0 Typ=208 Len=9: 2,4,0,0,0,0,1,31,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,1 Typ=208 Len=10: 2,4,1,0,2,24,2,32,32,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,2 Typ=208 Len=11: 2,4,1,0,2,24,3,33,33,33,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,3 Typ=208 Len=12: 2,4,1,0,2,24,4,34,34,34,34,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,4 Typ=208 Len=13: 2,4,1,0,2,24,5,35,35,35,35,35,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,5 Typ=208 Len=14: 2,4,1,0,2,24,6,36,36,36,36,36,36,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,6 Typ=208 Len=15: 2,4,1,0,2,24,7,37,37,37,37,37,37,37,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,7 Typ=208 Len=16: 2,4,1,0,2,24,8,38,38,38,38,38,38,38,38,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,8 Typ=208 Len=17: 2,4,1,0,2,24,9,39,39,39,39,39,39,39,39,39,fe Typ=69 Len=10: 0,1,54,f5,1,0,2,1b,0,9 Typ=208 Len=18: 2,4,0,0,0,0,a,30,30,30,30,30,30,30,30,30,30,fe 10 rows selected. SQL> select dump(rowid,16) x,a from t_iot; X A ------------------------------------------------------------------ ---------- Typ=208 Len=18: 2,4,1,0,2,25,a,30,30,30,30,30,30,30,30,30,30,fe 0000000000 Typ=208 Len=9: 2,4,1,0,2,25,1,31,fe 1 Typ=208 Len=10: 2,4,1,0,2,25,2,32,32,fe 22 Typ=208 Len=11: 2,4,1,0,2,25,3,33,33,33,fe 333 Typ=208 Len=12: 2,4,1,0,2,25,4,34,34,34,34,fe 4444 Typ=208 Len=13: 2,4,1,0,2,25,5,35,35,35,35,35,fe 55555 Typ=208 Len=14: 2,4,1,0,2,26,6,36,36,36,36,36,36,fe 666666 Typ=208 Len=15: 2,4,1,0,2,26,7,37,37,37,37,37,37,37,fe 7777777 Typ=208 Len=16: 2,4,1,0,2,26,8,38,38,38,38,38,38,38,38,fe 88888888 Typ=208 Len=17: 2,4,1,0,2,26,9,39,39,39,39,39,39,39,39,39,fe 999999999 10 rows selected. --可以发现t_iot表的逻辑rowid发生了变化.这样通过主键查询表中内容的物理猜会失败,要通过主键重新定位信息.即逻辑读会增加. --上次已经讲过可以通过rebuild来重建索引来消除这种情况.如何确定哪些IOT的第2索引需要重建呢?可以通过视图user_indexes字段 --pct_direct_access来确定. SQL> select index_name, index_type, pct_direct_access from user_indexes where index_name='I_T_IOT_B'; INDEX_NAME INDEX_TYPE PCT_DIRECT_ACCESS ------------------------------ --------------------------- ----------------- I_T_IOT_B NORMAL 0 --可以发现PCT_DIRECT_ACCESS已经变成了0.实际上有两者方法消除这个问题. 1.重建第2索引. 2.修改索引块的相关信息.使索引中对应的块信息正确.而且这样工作量小一些. SQL> ALTER INDEX I_T_IOT_B UPDATE BLOCK REFERENCES; SQL> select index_name, index_type, pct_direct_access from user_indexes where index_name = 'I_T_IOT_B'; INDEX_NAME INDEX_TYPE PCT_DIRECT_ACCESS ------------------------------ --------------------------- ----------------- I_T_IOT_B NORMAL 0 --没有变化!分析IOT表看看. SQL> exec dbms_stats.gather_table_stats(ownname=>USER, tabname=>'T_iot'); PL/SQL procedure successfully completed. SQL> select index_name, index_type, pct_direct_access from user_indexes where index_name = 'I_T_IOT_B'; INDEX_NAME INDEX_TYPE PCT_DIRECT_ACCESS ------------------------------ --------------------------- ----------------- I_T_IOT_B NORMAL 100 --可以发现现在PCT_DIRECT_ACCESS=100. 7.取消mapping table: SQL> alter table t_iot move nomapping; alter table t_iot move nomapping * ERROR at line 1: ORA-28670: mapping table cannot be dropped due to an existing bitmap index --要先删除位图索引i_t_iot_d. SQL> drop index i_t_iot_d; Index dropped. SQL> alter table t_iot move nomapping; Table altered. SQL> SELECT object_name, object_id, data_object_id, object_type, status FROM dba_objects WHERE wner = USER AND object_name like '%IOT_MAP%'; no rows selected 总结: 1.mapping table对应逻辑rowid为什么与T_iot的不同,但是毕竟是通过里面的键值来对应.很多东西还是未知??? 2.可以通过视图user_indexes的PCT_DIRECT_ACCESS字段来确定是否要重建第2索引以及修改索引信息的方式来消除物理读失败. 3.可以通过执行ALTER INDEX UPDATE BLOCK REFERENCES; 来消除物理读失败.比重建索引效率也许要高一些.

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

AsterNOS热重启与控制面重构技术全解读

现代云数据中心与 AI 智算网络对可用性的定义,已经不只是“少出故障”,而是“升级、重启、打补丁也不能明显影响业务”。在这样的诉求下,热重启成为开放式网络操作系统必须回答的命题:它要在交换机控制面软件重载时,让底层数据面持续转发,把传统冷重启带来的邻居震荡、路由重收敛与流量黑洞压缩到可忽略范围。AsterNOS 正是把这种能力落到工程实现中的代表性路径之一。

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

MoonBit LOGO 重构有奖征集令

在一些社媒平台上有关心 MoonBit 的社区用户对 MoonBit LOGO 进行批评和调侃。 (图源:知乎社区,已打码) 在此我们要说:很感谢大家提出建议,我们决定响应大家的声音,举办本次MoonBit LOGO 有奖征集令,和社区用户共建 MoonBit 的未来!当然都不白来,我们准备了丰厚的奖品~ 含义诠释:一只充满科技感的带着 VR 眼镜的紫色垂耳兔,兔子耳朵呈现 M 形状,正在月球上用代码构筑未来世界。 灵感展示 我们的一位同事做了这个兔耳朵形状的设计,希望大家也可以灵感爆棚提出好作品! 投稿链接 https://bxup9uklfcb.feishu.cn/share/base/form/shrcn0GZodPRjHj3A6AcwrJuhpc 没有限制、没有门槛、没有框架就让创意决定未来。MoonBit 的新 Logo,等你来定!

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

开源重构汽车:从孤岛到协作的生态演进

智能汽车的软件正迅速成为核心价值载体:其代码规模已达数亿行、成本占比迅速上升,与此同时开源正在成为推动技术品牌、成本控制、效率提升、生态协作的关键手段,而全球及中国的车企正在通过分层架构、自主研发与行业协作融合大模型技术,共同推进“软件定义汽车“时代的到来。 一辆有智能辅助驾驶功能的汽车需要多少行代码? 到今天,如果考虑车上的所有软件,这个答案已趋近于 7 亿行。同时,软件也正在成为整车 BOM 表里单价最高的“零部件”。德勤报告测算,2030 年软件成本占整车 BOM 比重将从目前不到 10% 增长到 50%,包括程序开发、AI 算法、操作系统、控制器和芯片等。 “软件定义汽车”的趋势愈加明晰。而开源作为现代软件世界中提升协同效率、降低基础技术研发成本的大功臣,自然也被引入到汽车软件的场景中,扮演着至关重要的角色。据相关调研数据显示,汽车行业中代码库的开源代码占比近 70%,广泛应用在基础软件、座舱软件等不同的场景中。 从开源协作的角度看,近期海内外的车企、科技企业等都有引人注目的动作:除了我们近两年看到的普华软件、国科础石、睿赛徳、理想汽车等面向基础操作系统的开源,不久前,包括大众集团、宝马集团、梅赛德斯-奔驰等在内的11家欧洲汽车及科技公司决定结盟,计划共同开发并共享先进的汽车软件平台。根据规划,这些公司将在2026年之前交付核心软件栈,基于该平台的首批车辆预计将于2030年开始批量生产。该软件栈的源代码将作为开源项目发布,由 Eclipse 基金会管理,并基于现有的 S - Core 项目进行开发,采用模块化设计:基础层(通信中间件、认证模块)开源共享,而上层信息娱乐、自动驾驶功能允许品牌差异化定制。 这一系统性、行业级别的协作,被业内视为欧洲应对中美智能化领先的关键布局。 就在这个消息发布的前几天,OpenSDV 汽车软件开源联盟也在积极行动,OpenSDV 汽车软件开源联盟技术生态总监滕召智与日本爱信、丰田等企业通话,沟通汽车开源生态建设的相关事项。滕召智表示,整体来看,欧洲的协作深度更深,架构上更容易统一,国内车企在市场上冲突比较直接,技术上仍处于各自为战状态,说明国内的技术认知尚未收敛,也侧面反映为了应对“内卷”而进行的创新还在持续。这种分化格局,其根源并非仅是表面的合作意愿问题,也反映出技术路线、商业逻辑与协作成熟度的差异。 汽车软件架构:分层协作与车企的掌控焦虑 智能汽车的软件体系早已超越简单的代码堆砌,形成供应链协作的复杂生态。想要了解汽车软件的生态发展,首先得清楚一辆车究竟需要哪些软件,成本或者营收更可能发生在什么地方?滕召智介绍,汽车软件通常分为硬件抽象、虚拟化、操作系统、中间件、应用、工具链及外延应用生态等七个层级。 硬件抽象层(BSP/HAL层)​ 功能定义​:作为最底层的软件,直接管理硬件资源,包括芯片级驱动程序和硬件虚拟化接口。其核心是为上层系统提供统一的硬件操作界面,屏蔽不同硬件的差异。 技术形式​:以板级支持包(BSP)或硬件抽象层(HAL)的形式存在,实现硬件资源的标准化调度,如传感器控制、内存分配。 产业实践​:在国内,由地平线、黑芝麻智能等芯片厂商主导开发,确保操作系统和应用能跨硬件平台调用资源。 虚拟化层: 功能定义​:通过Type 1虚拟机将单一 SoC 芯片划分为多个独立域,支持不同操作系统并行运行。 典型场景​:例如在智能座舱中,同时运行 Linux 驱动的仪表盘和 Android 系统的娱乐中控。 代表企业​:中科创达、中瓴智行、国科础石等提供商业化解决方案,已应用于理想、小鹏、东风等车企的部分车型。 操作系统层: 分类与定位​: 座舱系统​:车企主导定制化开发,如鸿蒙 OS、理想 OS,小米澎湃,侧重交互体验; 车控系统​:依赖实时操作系统,如 Linux/Unix 变体,满足高可靠性要求,如制动、转向控制,当前也激发了零部件厂商像智能零部件交付的进化。 开发模式​:车企与操作系统厂商、方案商联合研发,确保功能安全与差异化适配。 中间件层 核心功能​:实现软硬件解耦,提供通信、数据管理和服务调度能力。 技术路线​: 传统框架​:AUTOSAR AP 汽车开放系统架构仍是主流标准; 新兴方向​:ROS 2/DDS 用于感知融合框架,支持自动驾驶多传感器协同处理。 行业趋势​:结合自身的SOA体系建设,成为车企技术投入重点,以降低功能迭代复杂度。形成具有车企供应链管理、软件迭代特性的工具链体系。 应用层 用户导向功能​:直接面向消费者的交互模块,包括语音识别、导航、ADAS 自动紧急制动及座舱娱乐系统。 开发占比​:车企40%以上资源投入此层,因其直接决定品牌体验差异和溢价能力。 工具链层:提供一些关键工具,如 SOA 设计工具​:实现硬件资源服务化定义,如 Vector Davinci; 仿真验证平台​:华为云 KubeEdge 支持数字孪生测试 Sim-to-Real; 台架测试系统​:dSPACE SCALEXIO 硬件在环验证 外延生态层:互联协议​,可以实现将手机应用直接“投影”到车载屏幕上。 国际​:Apple CarPlay; 国内​:ICCOA Carlink,由多家车企、手机厂商联合创建,兼容生态内的所有手机,目前也有很多合资品牌兼容了该协议。 在分层协作的复杂生态中,投入的着力点往往也在决定着生态演进的方向。 当下,车企往往最愿投入用户看得见的部分——智能座舱的应用,应用层功能直接决定品牌溢价。究竟该自研哪些层级才能既保安全可控又赢得差异化?深扎操作系统和中间件的核心层级,投入巨大且周期漫长;完全依赖供应商方案,又恐丧失技术主动权和品牌特色。 此外,比亚迪、小米、华为、理想等头部企业重仓操作系统与中间件,以降低供应链风险;中小车企则聚焦应用层,通过座舱娱乐功能提升溢价能力。 供应链与合作:用开源建立信任 如此清晰的软件架构之下,业界如何协作共建?答案在中、欧之间呈现出截然不同的图景。 今年上半年,国内车企及相关业界机构的开源动作频频,但另一方面项目间关联性不强。理想汽车在中关村论坛宣布开源“理想星环 OS”,成为全球首家开源整车操作系统的车企。吉利汽车与阶跃星辰联合开源两款大模型——300亿参数视频生成模型 Step-Video-T2V 和多场景语音交互模型 Step-Audio。 项目地址:https://gitee.com/haloos/ 此外,东风汽车发布行业最大端到端自动驾驶开源数据集,包含125万组数据、6000多个真实驾驶场景片段,如雨天避障、夜间会车等。除了普华基础软件的 EasyAda、小满 EasyXMen 及天元 OS 等开源平台,企业开源的阵营在不断扩大:比亚迪等车企已实现相关智能 AI 技术平台的开源,华为鸿蒙座舱开放核心能力后已有多家车企接入。在政府引导协同层面,早在2024年年底,国家智能网联汽车创新中心发布了车用操作系统基线版本开源计划。 “车企普遍依赖自研体系,各家企业都认为自己能解决大部分问题,导致技术路线分散”,滕召智指出,这种模式虽能快速响应市场,但难以形成标准化合力。例如 AUTOSEMO 推动的 ASF 标准,因车企不同的技术现实情况不同,执行差异大而落地困难。 另一方面,企业参与开源也面临着一些阻碍。比如传统车企决策层对开源接受度低,且“忙于业务生产无暇顾及共性技术”;新势力虽有技术意愿,但需承担高额成本分摊风险。 而且汽车供应链存在较高的准入壁垒,新兴软件厂商进入车规领域,需攻克功能安全认证(ISO 26262)或寻找资质供应商背书,尤其是在车控安全领域。这一点在 Eclipse Foundation 2023年发布的《汽车行业中的开源软件》中也有提到:开源软件在汽车外部应用中的使用率比汽车内部的高很多。在汽车内的有限使用主要是因为业内有严格的功能安全标准要求和严格的软件开发流程,而许多(但不是所有)开源软件方案往往达不到这样的要求。 面对这些挑战,滕召智以 Linux 发展史类比中国汽车开源生态的破局关键:“Debian、RedHat 等发行版让小白用户能用 Linux,才引爆生态繁荣。我们亟需更多像新环 OS(指理想星环 OS 等)这样的开源发行版,降低开发者参与门槛。” 为此,OpenSDV 选择从工具链和标准入手进行突破,试图为打破孤岛创造条件: 代码安全基础设施​:开发 AI 驱动的代码自动审查工具,可识别功能安全缺陷并自动修复,已被 Linux 基金会 AGL 项目纳入流程,供全球车企使用; 实时性评测标准​:联合40余家车企制定智驾 OS 实时性团体标准,统一主机厂与供应商的测试阈值,打破交付反复认证的僵局; 法务支撑体系​:构建开源合规知识库,解决车企出海时的软件供应链法律风险。 2024 年,OpenSDV 在成员单位中,针对开源在汽车软件供应链的应用、使用、管理等方面,做出了行业调研。样本企业主要来自整车主机厂、汽车软硬件 Tire1 供应商、检测机构、 软件工具厂商等等。 “开源让车企深度参与代码贡献,看清系统如何运作,才能建立技术信任”,滕召智认为,开源的关键作用之一还在于建立信任,基于透明参与和深度理解的技术信任,或许可以打破当前各自为战的局面。 技术演进:大模型技术的融合 开源生态的成熟,最终也会服务于更高阶的智能化应用。 目前国内车企在人工智能技术应用上,主要还是依赖现有的通用大模型算法,在垂直汽车场景的专用优化方面投入有限。应用场景也多是语音交互等浅层功能,缺乏专用数据集训练。这导致了大模型要真正契合汽车行业的复杂需求,如融合感知、仓驾决策上还存在明显短板,无论是行业数据的深度积累,还是底层算法架构的针对性调整,都还需要一个长期的持续投入过程。 谈到新兴的大模型技术如何融入现有的智能驾驶系统时,滕召智用了人与“提线木偶”的对比来形象说明:未来理想的架构中,像特斯拉 Grok 这样的高级大模型更像是那个操纵全局的“大脑”或核心决策者,负责整合车内外的感知信息。例如判断驾驶员状态是否安全,或者结合外部环境复杂情况,并做出整车级的统筹管理策略,比如决定何时需要系统接管控制。甚至是一个很好的副驾或者领航员。 而当下成熟的智驾系统依赖传感器如激光雷达和传统控制算法,则更像是“提线木偶”本身——是大模型决策指令的执行单元,专注于实时、具体的车辆操控,如转向、刹车等。 因此,大模型并非要取代或压缩现有的智驾系统,而是作为一种升级和补充,两者共同协作实现更高级别的智能驾驶能力,最终目标是达到这种“大脑指挥肢体”的集成状态。 至于 OpenSDV 联盟在推进汽车行业大模型技术标准化方面的工作,滕召智坦言目前联盟的角色更偏向于参与者和引导者,而非主导者或实际研发方。 主要原因是联盟内尚未出现足够强大的引领性企业来牵头。因此,OpenSDV 的策略是通过其技术监督委员会,专注于在标准化层面推动一些基础性工作。这具体包括参与到制定通用模型相关标准的讨论中去,重点关注诸如 AI-BOM 方面的内容,规范模型组件的来源、兼容性和安全性​​,以及确保大模型在车载环境下符合功能安全要求的设计规范等领域。通过协同,提炼共性需求,也形成了很多成果,比如在功能安全代码的自动化审核,发起车用智能驾驶操作系统的性能评测规范等。其核心思路是通过凝聚成员单位的共识,依托行业影响力,来间接推动相关标准框架在行业中的建立与发展。

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

RustDesk 远程桌面启动重构 Web 客户端

RustDesk 自两年多前推出 Web 客户端后,一直没有更新,也未能支持 wss,目前我们重新启动 Web 客户端的开发,并将使用 ffmepg wasm 替换ogv.js, 欢迎有兴趣的同学,一起参入交流,https://github.com/rustdesk/rustdesk/pull/7539 同时,RustDesk Nightly 版本开始支持自定义客户端和共享地址簿功能,欢迎 Pro 用户使用反馈。 RustDesk 是一个开源远程桌面软件,开箱即用,无需任何配置。您完全掌控数据,不用担心安全问题。您可以使用我们的注册 / 中继服务器,或者自己设置,亦或者开发您的版本。 主要特性: 自定义画面质量 加密直连,先尝试打洞直连,不行再由服务器转发 内置文件传输和 TCP 隧道功能 RDP 连接 支持自建中心服务器 内网 IP 直连

资源下载

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册