Windows的兼容性为什么这么强大?

server/2024/10/9 3:33:54/

Windows最厉害的地方就在于,不管你在啥硬件上安装Win95,都能够正常运行,然后系统会自动更新驱动。相反,Linux在不同的电脑上运行,就会出现各种问题。

为什么Windows兼容性会如此强大?

我们先来看看Windows是如何做到兼容你的程序,当Windows通过控制启动时,Windows会链接到动态库上,给你的应用程序造成一种假象,感觉自己还在旧版本Windows上运行,这背后的技术原理叫做WinSxS(Windows Side By Side)。

在WinSxS目录下,有很多同名的DLL文件,这里需要说明的是,同名的DLL不是备份文件。在这个目录中,我们能够找到所有不同版本的DLL文件,这些DLL实际上是以前Windows或VS使用的某个函数所依赖的DLL。

譬如,Win7中包含的Vista;RDP(远程桌面)使用的组件ActiveX,ActiveX本身就是不在被推荐使用的组件了,但是至今仍被许多软件使用,如虚拟机监视器、各种远程桌面客户端、WSLg窗口等。同理,在Office 2024中还存在上个世纪出现的VB6。

WinSxS之所以存在,一方面是为了解决Windows中DLL版本不匹配导致DLL HELL的问题,多个DLL版本共存,不会出现系统升级造成一堆软件崩掉;另一方面就是兼容性问题,WinSxS通过Windows启动器的控制,来确保Windows程序启动时能够正确获取到老版本Windows的内存布局和相关DLL的依赖。

Windows能把兼容性做得这么好,还离不开另一个功臣:COM。在Windows整个系统中,各组件之间的交互都是通过COM实现,通过COM暴露接口,实现完全解耦。COM既能够做到扩展,又能够做到不破坏原有的接口;如果你想让你的旧程序使用新的COM接口,你都不需要重新编译,直接调用新的COM即可,前提是新的COM是从旧版COM继承而来。而Linux就不一样了,Linux是通过字符串建立,一旦字符串被修改或者格式被修改,就会造成难以预料的错误。

我之前在老的Win32上调用新的组件XAML、以及停止维护的IE6,再接上Chromium的V8引擎,旧组件和新组建在同一个应用程序中竟能相互调用。

为什么微软会允许这种技术存在?是因为现在很多成功运行在Windows上的程序都会对Windows特定版本的Bug有一些的依赖。如果不能将旧版本Windows的行为完全模仿出来,一旦这些程序在新版Windows上运行就会崩溃。再加上微软对Windows兼容性要求很高,所以通过这样的基础发展出这样的技术也就不足为怪。

譬如,以前有非法访问内存、二次释放内存无报错且不终止进程的Bug,如果将这些Bug修复,就可能会导致一些有Bug但恰好以前没问题的程序在新版Windows上无法运行。

如果涉及到系统架构的变化,将在系统层面完成对原来架构的转化。比如,X86 32位系统中带有16位的转换层,之前16位的DOS程序就能够在该系统上运行;64位的带有WoW64,能够对所有32位的应用程序进行兼容;Arm64的Windows包含两套转换层,分别是X86系统的32位和64位,兼容所有之前的应用程序。

当然这样的技术有好有坏,好处就是Windows系统百分之百向下兼容,这也是Windows成功的主要原因之一,也是Windows的强大之处。坏处就是Windows系统变得越来越臃肿,越来越庞大,老程序的Bug也得不到修复,增加了Windows程序崩溃的风险。


http://www.ppmy.cn/server/129071.html

相关文章

设计模式-模版方法模式

模版方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些定义步骤。 需要注意的是,一般的模板方法需要用 final 修饰,防止子类重写模板方法。…

GCC保姆级教程

一、Linux 静态库和动态库 不管是Linux还是Windows中的库文件其本质和工作模式都是相同的, 只不过在不同的平台上库对应的文件格式和文件后缀不同。程序中调用的库有两种 静态库和动态库,不管是哪种库文件本质是还是源文件,只不过是二进制格式只有计算机…

代码随想录 103. 水流问题

103. 水流问题 #include<bits/stdc.h> using namespace std;void dfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){if (visit[y][x] 1) return;visit[y][x] 1;if (y > 0){if (mp[y][x] < mp[y - 1][x…

Go语言实现长连接并发框架 - 路由分组

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;我们上篇博客实现了任务执行流的路由模块&#xff0c;接下来我们实现一下对任务执行流进行任务 接口 trait/router_group.go type RouterGroup interface {RouterGroup(flow ..…

Windows安全加固详解

一、补丁管理 使用适当的命令或工具&#xff0c;检查系统中是否有未安装的更新补丁。 Systeminfo 尝试手动安装一个系统更新补丁。 • 下载适当的补丁文件。 • 打开命令提示符或PowerShell&#xff0c;并运行 wusa.exe <patch_file_name>.msu。 二、账号管…

AMD发布首个AI小语言模型:6900亿token、推测解码提速3.88倍

AMD发布了自己的首个小语言模型(SLM)&#xff0c;名为“AMD-135M”。相比于越来越庞大的大语言模型(LLM)&#xff0c;它体积小巧&#xff0c;更加灵活&#xff0c;更有针对性&#xff0c;非常适合私密性、专业性很强的企业部署。 AMD-135小模型隶属于Llama家族&#xff0c;有两…

CSS圆角

在制作网页的过程中&#xff0c;有时我们可能需要实现圆角的效果&#xff0c;以前的做法是通过切图&#xff08;将设计稿切成便于制作成页面的图片&#xff09;&#xff0c;使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了&#xff0c;CSS3 中提供了一系列属性…

2-116 基于matlab的主成分分析(PCA)及累积总和(CUSUM)算法故障监测

基于matlab的主成分分析&#xff08;PCA&#xff09;及累积总和&#xff08;CUSUM&#xff09;算法故障监测&#xff0c;针对传统的多元统计分析方法对生产过程中微小故障检测不灵敏的问题&#xff0c;使用基于主元分析的累积和的微小故障检测方法进行故障监测&#xff0c;通过…