为什么WindowsiOS *** 作很流畅,而LinuxAndroid却很卡顿呢?

为什么WindowsiOS *** 作很流畅,而LinuxAndroid却很卡顿呢?,第1张

先说是不是,再问为什么。

我就知道有人会这么说,然而那样就成了一篇议论文了,而我只是想写一篇随笔。所以,不管事实是不是那样,反正我就是觉得Windows,MacOS,iOS都很流畅,而Linux,Android却很卡。当然了,这里说的是GUI,如果考量点换成是Web服务的吞吐和时延,那估计结论要反过来了,不过那是客户端程序感觉到的事,作为人,who cares!

我写这篇文章还有一个意思,那就是想牵引一个话题,如果我们想把Linux,Android(当然,Android内核也是Linux)优化到GUI不再卡顿,我们应该怎么做。

大概是去年,一个炎热的午后,吃过午饭我和同事们在公司附近晃悠,就讨论 “为什么苹果手机就不卡,安卓手机不管多贵都很卡。” 记得一位同事说,iOS在GUI方面做了很多的优化,而Android却没有。

这话说对了!不过更为重要的一点是, 不谈具体场景谈优化,都是瞎折腾!

Windows也好,iOS也好,都知道自己的应用场景,因此针对自己的应用场景做了优化之后,妥妥在自己拿手的场景下甩Linux在该场景下的表现几条街了。

下面开始正式的技术层面的分析之前,先声明几点:

1.本文并不是在说Linux系统总体上很卡顿,而只是说Linux系统桌面版的GUI程序相比Winddows很卡顿,如果真觉得本文是在喷Linux,那就当是喷Linux桌面的吧。

2.本文不准备讨论X window和Windows窗口子系统一个在用户态一个在内核之间的差异,这无关紧要。我的想法是,即便是你将X window扔进内核,现有的Linux内核处理GUI,该卡顿还是卡顿。

3.本文仅从调度算法的角度来评价为什么Windows/iOS不卡顿而Linux却卡顿,当然还有别的视角,但并不是本文主题。

4.Windows内核调度的线程而不是进程,但是本文统一采用进程这个术语,没有别的原因,只是因为进程的概念是和现代 *** 作系统概念相始终的,而线程是后来的概念。

先看服务对象

# 仅此就将Windows,MacOS/iOS和Linux的使用场景区分开来:

* Windows/MacOS/iOS系统,主要是被人 *** 作,用来提供写文档,游戏,做报表,画图,上网浏览,视频播放等服务。

* Linux系统,主要提供网络服务,用来支撑各种远程的客户端,为其提供数据处理和查询,数据生成,数据存储等服务。

事实证明,Linux在其专业的领域已经做的足够好,但是问题是,为什么它在GUI处理方面却总是一直很糟糕呢?这就要看具体场景的差异了。

对于网络服务而言,其场景的行为是 可预期的 ,我们可以将这些场景简单归结为:

* 公平快速处理网络并发请求。

* 公平快速处理并发磁盘IO。

* 高吞吐CPU密集型数据处理与计算。

Linux优秀的O(1) O(1)O(1)调度器以及后来的CFS调度器可以非常完美的cover上述三个场景,至于说为什么,不必多说,简单归纳如下:

* 无论是O(1) O(1)O(1)的基于优先级的时间片轮转还是CFS的基于权重的时间配额,均可以既满足优先级的差别服务需求又保证高吞吐率,这些都来自于调度器本身而不是依靠频繁的切换。

* 额外的简单启发式奖惩机制可以让网络IO以及磁盘IO的响应度更高,同时又不影响CPU密集型计算服务的高吞吐。

上面的第二点是一个额外的辅助,照顾IO过程快速获得响应,这是一个非常棒的辅助,但是注意,再棒的启发式算法也总是辅助性的,提高响应度就是个辅助性的锦上添花的功能,以高吞吐为目标才是根本。

IO过程对于一台Linux服务器而言是与外界交互的唯一渠道,通过该渠道可以将处理好的数据送出到网络或者磁盘,同时从网络或者磁盘获取新的数据,换句话说, IO过程类似一道门。 但也仅仅是一道门。

照顾IO过程获得高响应度这件事是为了让门开得更大,通行效率更高!

熟悉Linux内核调度器变迁的都应该知道O(1) O(1)O(1)到CFS过渡的这段历史,即2.6.0内核开始一直到2.6.22为止的这些版本,采用Linux内核划时代的O(1) O(1)O(1)调度器,随后由于两个原因:

1、O(1) O(1)O(1)调度器动态范围太大或者太小。

2、IO补偿机制不到位,时间片分配不公平。

为了解决这些问题,Linux内核切换到了CFS调度器。

切换到了CFS调度器,事实上,人们更多指望的是CFS能够让进程时间片分配更加公平,多个进程运行更加平滑,如此一来,上GUI界面的话,岂不是就不卡顿了。

然而还是卡顿,本质原因是,场景根本就不对路子。

在Linux服务器的场景中,优先级和时间片是正相关的,无论是O(1) O(1)O(1)调度器的静态线性映射的时间片,还是CFS的动态时间配额,都是优先级越高的进程其每次运行的时间也就越久,但是实际上,这两者并不是一回事。

在更复杂的场景中,正确的做法应该是参考 时间管理的四象限法则 来设计进程调度器。其中:

* 优先级表示紧急性。

* 时间片表示重要性。

于是,如果不是因为Linux服务器场景过于单一简单,CPU的时间管理要复杂得多,比如调度器应该按照四象限法则设计成下面的样子:

1、处理重要且紧急事件的进程,需要赋予高优先级分配长时间片去抢占当前进程。

2、处理重要但是不紧急事件的进程,保持固有优先级分配长时间片就绪等待。

3、处理不重要但紧急事件的进程,提升优先级但不分配长时间片,处理完毕立即返回固有优先级。

4、既不重要也不紧急的后台进程,低优先级短时间片,系统闲了再调度。

后面我们会看到,Windows的调度器就是这般设计的。

我们先总体看看GUI系统的场景。

它的服务对象是人,和Linux的服务场景的行为可预期相反,人的 *** 作是 不可预期 的!

Windows,MacOS/iOS这种Desktop系统的GUI进程,很多时候都是在等待人的进一步 *** 作而睡眠,要么在等鼠标,要么在等键盘,要么在等声卡,显卡的输出,或者就是在将用户输入的信息往磁盘里写而等待IO完成,Desktop系统更多关注的是要对以上这些事件提供高效率的响应服务,而不是系统的数据吞吐。

Desktop在乎的是时延,而不是总吞吐,同时,这个时延还是区分对待的,有些时延的可容忍区间很大,比如网卡(网卡IO之所以优先级提升并不是很多,是因为首先网卡是有队列缓存的,而大多数的报文都是burst而来的,队列缓存可以平滑掉首包延迟,其次,由于光速极限,相比于网络延迟,主机调度延迟真的可以忽略不计。),有些却很小,比如键盘鼠标。所以说,Windows之类的Desktop系统 必须能够区分一个进程当前的紧急性和重要性。

# Linux内核能做到这种区分吗?

Linux可以通过计算一个进程的平均睡眠时间判定它是不是一个交互式IO进程,从而决定要不是给它一定的优先级提升,但是也仅能做到这个地步,因为Linux内核无法得到更进一步的信息。

Linux内核不知道一个进程到底是不是IO进程还是说仅仅在一个时间段内有IO行为的CPU密集型进程,Linux内核也不知道一个进程被唤醒是因为键盘的数据到了,还是无关紧要的信号到了,所以这一切,Linux内核只能 启发式预测。

Linux内核仅仅跟踪一个睡眠时间而且还是平均的睡眠时间,是区别不出进程当前的紧急性和重要性的。没有外界的信息输入,仅靠启发预测,当前的AI算法貌似还没有到这个境界吧。换句话说,启发算法是不准确的。你看看Linux内核O(1) O(1)O(1)调度器的sleep_avg是如何计算并如何参与动态优先级调整的,就会明白我上面说的意思。

既然Windows系统的GUI *** 作比Linux流畅,那么想必Windows肯定是做到了进程当前的紧急性和重要性的区分咯?那是当然。它是如何做到的呢?

虽然Windows的调度器也是基于优先级的,也是抢占式的,也是同优先级轮转的,这看起来和Linux并没有什么区别,甚至从4.3BSD开始,几乎所有的 *** 作系统的调度器基本都是按这个思路设计出来的,仅仅从 如何选出下一个投入运行的进程 这个算法上看,几乎所有的 *** 作系统调度器都是一样的。Windows与众不同的原因在于 其对优先级的不同处理方式。

自4.3BSD以来,所有的基于优先级的抢占式调度器的优先级计算都包括两部分因子,即固有优先级和动态优先级:

一直以来,

只是起到了 微调 的作用,而

才更具有参考意义,其比重更大。

Windows与众不同,其弱化了进程(其实应该是线程,但是我就统一写成进程吧,为了照顾不懂Windows内核原理的读者)的初始基优先级

,而强化了动态优先级

,更重要的是,动态优先级的值并非来自预测,而是来自于 事件 ,事件本身的紧急性反馈到了动态优先级的值,而事件本身的重要性则反馈到了时间片:

可以看出,Windows对于不同的事件定义了不同的优先级提升的具体数值, 将动态优先级的值和具体的事件做了精确的关联。

这些数值的定义上,甚至精细而贴心,详细的数值参见ntddk.h:

//

// Priority increment definitions.  The comment for each definition gives

// the names of the system services that use the definition when satisfying

// a wait.

//

//

// Priority increment used when satisfying a wait on an executive event

// (NtPulseEvent and NtSetEvent)

//

#define EVENT_INCREMENT                1

//

// Priority increment when no I/O has been done.  This is used by device

// and file system drivers when completing an IRP (IoCompleteRequest).

//

#define IO_NO_INCREMENT                0

//

// Priority increment for completing CD-ROM I/O.  This is used by CD-ROM device

// and file system drivers when completing an IRP (IoCompleteRequest)

//

#define IO_CD_ROM_INCREMENT            1

//

// Priority increment for completing disk I/O.  This is used by disk device

// and file system drivers when completing an IRP (IoCompleteRequest)

//

#define IO_DISK_INCREMENT              1

//

// Priority increment for completing keyboard I/O.  This is used by keyboard

// device drivers when completing an IRP (IoCompleteRequest)

//

#define IO_KEYBOARD_INCREMENT          6

//

// Priority increment for completing mailslot I/O.  This is used by the mail-

// slot file system driver when completing an IRP (IoCompleteRequest).

//

#define IO_MAILSLOT_INCREMENT          2

//

// Priority increment for completing mouse I/O.  This is used by mouse device

// drivers when completing an IRP (IoCompleteRequest)

//

#define IO_MOUSE_INCREMENT              6

//

// Priority increment for completing named pipe I/O.  This is used by the

// named pipe file system driver when completing an IRP (IoCompleteRequest).

//

#define IO_NAMED_PIPE_INCREMENT        2

//

// Priority increment for completing network I/O.  This is used by network

// device and network file system drivers when completing an IRP

// (IoCompleteRequest).

//

// 网卡IO之所以优先级提升并不是很多,是因为首先网卡是有队列缓存的,而大多数的报文都是burst而来的,队列缓存可以平滑掉首包延迟,其次,由于光速极限,相比于网络延迟,主机调度延迟真的可以忽略不计。

#define IO_NETWORK_INCREMENT            2

//

// Priority increment for completing parallel I/O.  This is used by parallel

// device drivers when completing an IRP (IoCompleteRequest)

//

#define IO_PARALLEL_INCREMENT          1

//

// Priority increment for completing serial I/O.  This is used by serial device

// drivers when completing an IRP (IoCompleteRequest)

//

#define IO_SERIAL_INCREMENT            2

//

// Priority increment for completing sound I/O.  This is used by sound device

// drivers when completing an IRP (IoCompleteRequest)

//

#define IO_SOUND_INCREMENT              8

//

// Priority increment for completing video I/O.  This is used by video device

// drivers when completing an IRP (IoCompleteRequest)

//

#define IO_VIDEO_INCREMENT              1

//

// Priority increment used when satisfying a wait on an executive semaphore

// (NtReleaseSemaphore)

//

#define SEMAPHORE_INCREMENT            1

---------------------

仔细看,你会注意到对于声卡而言,其IO完成时,优先级提升会很大,而磁盘,显卡这种却并不是很多,这充分体现了设计者的贴心。这充分考虑到了人耳的灵敏度和人眼的分辨率之间的对比,声音是作为流顺序输出的,耳朵很容易分辨出声音的卡顿,而对于图像而言,完全可以慢慢双缓冲刷层,人眼相比之下没有那么高的分辨率识别到,因此声卡事件必须优先处理。

同时,对于磁盘,网卡之类的,人就更是感觉不到了。除了声卡之外,键盘鼠标 *** 作的IO完成对于优先级提升的数值也很可观,因为键盘鼠标如果卡顿,人的输入会明显感觉到延迟,鼠标则显拖沓,这都是很容易识别的卡顿事件,所以Windows给予了进程更高的动态优先级来尽快处理这些事件。

对于窗口子系统而言,当一个窗口获得焦点时,对应的处理进程的优先级也会得到提升,这会给人一种 你 *** 作的界面总是很流畅 的感觉,毕竟你 *** 作的界面就是前台窗口,至于说此时后台窗口的处理进程,即便是僵死了你也不会有感觉,因为你并不 *** 作它们呀,当你 *** 作它们时,对应的处理进程的优先级就会提升。

所有的优先级提升都伴随着时间片的重新计算,但是和Linux不同的是,Windows并没有直接将进程优先级和时间片按照正相关关联起来,时间片是独立计算的,大多数时候,Windows对于所有的进程,不管优先级是多少,均采用同一个时间片。

如此看来,Windows虽然也是优先级调度的系统,但是其优先级却是 *** 作行为驱动的 ,这便是其与众不同之处。

Linux内核调度系统会精细区分磁盘事件的wakeup和键盘鼠标声卡事件的wakeup吗?不会。

说完了Windows为什么 *** 作GUI会很流畅,该说点不好的了,

# Windows经常会死机,为什么呢?

这很大程度上也和上面描述的调度器有关。

仔细看这个 *** 作行为驱动的动态优先级调度器,很大的一个问题就是容易饿死低优先级的进程,特别是Pbase P_{base}P base 很低的进程。

Windows的解决方案是采用一个后台进程(学名叫做平衡集管理线程)轮询的方式,将超过秒级都没有被调度的进程的优先级拉升到很高的位置参与抢占。

这个机制有啥问题呢?问题在于Windows需要第三方线程来缓解饥饿,而不是靠调度器自身,这便增加了调解失败的可能:

* 第三方线程本身的问题没有按照预期工作。

* 饥饿进程过多。

* 饥饿进程优先级提升后又被抢占。

* …

除了死机问题之外,Windows系统对于服务器版本的调度器调整做的也不够优雅,Windows仅仅是调整了服务器版本的系统参数,而几乎没有对调度的算法做任何修改。对于服务器版本,Windows只是将时间片延长了而已,同时几乎不再动态计算时间片,而是选择始终使用相同的一个足够长的值,以减少进程切换提高吞吐率。显然这种方式并不妥当,因为动态优先级根据事件的提升,还是会造成进程间不断抢占,从而影响吞吐。

不过,毕竟Windows是一个Desktop系统,本身就不是为高吞吐而生的,这种针对服务器版本的策略调整便是无可厚非了。正如Linux服务器虽然可以很完美应对高吞吐场景,其Desktop版本比如Ubuntu,Suse不也是心有余而力不足吗?虽然Linux内核也有动态优先级提升这一说。

# 该简单总结一下了。

在人机关联上,Windows更加靠近人这一端,适应了人的 *** 作行为,为 *** 作该机器的人提供了良好的短时延体验,Linux相反,它靠近机器一端,让CPU可以尽可能开足马力跑task而不是频繁切换,从而为客户端提供最大的数据吞吐。

Windows的设计甚是精妙,考虑到了人的行为的每一个细节(除了对于死机的耐受力),除了动态优先级和具体时间精确关联之外,对于待机恢复时间deadline在7秒内也是很值得拍案,这个7秒的阈值考虑到了人的短期记忆的极限,如果有人突然想到了一个点子,需要打开电脑将其记录下来,那么打开电脑的时间如果超过了7秒,那么可能这个点子就溜走了,所以待机恢复时间必须限制在7秒以内,哇塞不哇塞。

对于MacOS/iOS没有过多的研究,但是可以想见应该也如Windows这般了。因为它们都处在人机关联的人的这一端。随便看了下MacOS的开发手册,找到了下面的段落:

当我找和GUI和调度相关的东西时,就在上面这段的下面,有这个定义:

嗯,看来内核也是能看到所谓的前台窗口的。

不管怎么说,Windows,MacOS/iOS这些系统,共同的特点就是 大多数情况下,同时只有一个焦点窗口在前端接受输入输出。 毕竟把窗口缩小排满一屏幕的很少见。然后呢?然后这就是一个典型的场景啊!

你看看Win10,不就可以设置为平板模式吗?

倾其机器和 *** 作系统内核所有资源和机制照顾这少数的,几乎是唯一的前台焦点窗口的处理进程,这几乎就是单进程处理啊! 然后处理好用户的窗口切换即可,比如Windows的Ctrl-Tab。

Linux如若按照这个思路,单独再写一个调度器,替换掉CFS,而不是增加一个调度类,如此一来将系统中所有的进程统一按照 优先级和事件相关联 的方式对待,我想问题应该能优化不少。

已经快凌晨了,说点别的但是相关的吧。

Linux内核O(1) O(1)O(1)调度器的历史其实很短暂,2.6初始到2.6.22,但是非常经典的Linux内核方面的书,都是在描述这期间的Linux内核版本,这在当时就给了人们一个假象,O(1) O(1)O(1)调度器是无敌的,是划时代的,于是,当有了新的CFS调度器的时候,人们哇塞一声,O(1) O(1)O(1)只是银河系级别的,而CFS是宇宙级别的。

但其实,O(1) O(1)O(1)的意义只是优化了 如何快速找到下一个要运行的进程 ,虽然它也涉及了动态优先级的计算,但是这并不是它的重点。说实话,你若看看Windows的调度器,4.4BSD,SystemV4的调度器,基本上都是位图加优先级队列的形式,思路几乎是同一个,这么说来都是O(1) O(1)O(1)咯,而且人家这些调度器早在Linux还是O(n) O(n)O(n)调度器的时候就已经存在好几年了,却无人问津。

Windows内核的调度算法不为人知的原因除了其闭源之外,还有一个原因就是Windows内核方面的技术总体上推广的人太少,国内除了潘爱民一直在致力于这方面的推广之外,在没有别人了。估计是因为大家觉得Windows内核方面,Debug之外的东西,学了也没啥用吧。

你说Linux开源没错,BSD不也开源吗?怎么就没有人注意BSD的调度器实现呢?哈哈,开不开源无所谓,关键得能造势搞事情,而且获取方便,让大家用起来你的东西才真真的啊。Linux2.4版本说实话及其垃圾,但关键是很多人用起来了,这就是全部了。Solaris虽然设计完美优雅,可是有壁垒,没人用,最终也还是凉凉。同样的事情参考以太网。

通篇都在比较Windows和Linux的调度器如何影响人们的 *** 作体验。最后说说iOS和Android吧,题外话,不涉及技术。

Android就是卡,不接受反驳。

再贵的Android机器也卡,三星的,华为的照卡不误,只是相比别的稍微好一点点而已。这意味着它们成不了街机。因为手机是买来用的,不是买来debug的,除了程序员没人在乎Android机慢的原因,即便是程序员也很少有折腾明白的,只是因为这份职业让他不用Android就不正确。不过现在互联网公司的程序员用iPhone的也多了,因为好用啊。再者说了,互联网公司程序员大概率以做业务逻辑为主,底层技术欠缺,无力debug,当然是什么好用用什么,iPhone贵,但是互联网程序员收入高啊。

最终,Android机的唯一优势就是价格,你让Android卖的和iPhone一样贵试试,分分钟被绞杀。要说还有唯一点五的,就是品牌,XX也不是吃素的,就算XX做的再烂,就凭它这牌子,也不缺市场,比如我就是XX用户,我并不是觉得XX的Android比小米的Android好,而是我喜欢XX这个公司,这个品牌,仅此而已

最近有关 *** 作系统的讨论无论在法庭上还是在网上都是越来越热烈了。这种热烈气氛的出现自然是与 *** 作系统巨头Microsoft脱不了干系的。法律界为是否该裁定并惩罚Microsoft在 *** 作系统上的非法垄断行为而头疼,软件业界为如何抵御Microsoft君临天下的庞大攻势而失眠,而被Microsoft日益苛刻的版权限制惹恼了的个人和公司电脑用户也在思考是否还应该对 Microsoft从一而终。借着这股热潮本人也来就桌面 *** 作系统(DesktopOperatingSystem)领域中的Windows和Linux议论几句。网上对Windows和Linux的讨论不少,从这些讨论中我发现有一些人是明确地属于Linux阵营的,所谓属于Linux阵营,我指的是他们对Linux的支持已经近乎本能,就象宗教信徒笃信上帝一样。另一方面,虽然也有人替Windows说话,但似乎没有一个群体可以归类为Windows阵营,也就是说Windows的使用者虽众,但支持烈度却不如Linux。这也不奇怪,Linux的发展本身就是热忱的Linux支持者们共同努力的结果,所谓“自家的孩子自家爱”。更何况Linux是免费的而Windows不仅价格昂贵,而且近来还发展到了让用户花了钱也买不到所有权的地步。连所有权都没了,主人翁态度自然也就免谈了。尽管缺乏铁杆的Windows支持者说明Microsoft在夺得市场的同时没有能够同步地赢得人心,但是从学术的观点讲,却应该看到在这种情况下替Windows说话的人(Microsoft雇员除外)大都是从纯技术角度出发的,他们的观点往往要比带有感情因素的 Linux支持者更冷静和公正。

无论有多少人厌恶Microsoft,任何客观的评论者都必须承认一个基本的事实,那就是纯以技术而言Windows是目前 *** 作系统家族中具有顶尖水平的成员。Microsoft能够在软件界翻云覆雨一手遮天凭借的就是Windows *** 作系统的实力。市场是无情的,能够装在自己口袋里的银子谁也不会愿意放到Microsoft的保险柜里去。Windows十余年来在市场上的成功,尤其是在四面树敌,人心思变的今天依然雄霸天下而不倒正是其实力的明证。

下面本文就来对Windows和Linux的若干主要方面进行一些评述和比较。

安全性能

安全性能是Windows常常遭受Linux支持者批评嘲笑之处。除了层出不穷的计算机病毒外,号称Windows95以来最重要的版本的WindowsXP问世不过数月就屡屡发现安全漏洞,而且导致联邦调查局向用户发布警告,这无疑加深了Windows不如Linux安全的看法。不过客观的讲,在以下两方面Windows有些冤情可诉:

Windows的每一个漏洞的公开都会引起公众和媒体的广泛注意,这种树大招风的现象大大增加了Windows技术漏洞的可见性(Visibility)。而且Linux作为公开源代码的系统,它的漏洞的发现和修补往往被有意无意地视为是系统开发的一部分,好比是Microsoft在开发Windows期间由内部程序员发现并修补漏洞。由于在很多人眼里Linux永远处于开发状态中,而 Windows有明确的推出日期(不然没法赚钱),因此在这一点上Windows处于非常不利的位置。

人们在比较Windows和Linux的技术漏洞时常常实际上是在对 Windows和Linux内核(Kernel)作比较,这是不公平的。Windows除内核外还包括用户界面(UI)以及大量的应用软件,大多数 Windows技术漏洞其实并不是Windows内核的漏洞。以安全漏洞而言,大多数是属于IIS和IE的,对应于Linux系统中的Apache和Netscape或Konqueror等。较为合理的做法应当是将Windows和LinuxDistribution或者LinuxDistribution中与Windows功能平行的部分进行比较。

尽管有以上这些辩护,尽管Microsoft抱怨说人们对攻击Windows远比对攻击Linux感兴趣(因为更容易成名)才使得Windows频频亮起安全红灯,但我认为现阶段Linux在安全性能上确实要优于Windows。起码以病毒数量和危害性而言,Windows用户所担当的风险就要大得多。只是Windows的安全性也不象有些文章渲染的那样糟糕。

说到了安全性,顺便提一下对于除美国以外的其他国家来说,由于Windows的技术完全被Microsoft所垄断,因此使用Linux还具有国家安全上的优势。这也是近期中国,法国,韩国等国政府在采购 *** 作系统时均作出了有利于Linux的决定的原因之一。

稳定性

稳定性也是Windows常常遭批评的地方,这里必须首先要把Windows的9x 系列(包括95/98/Me)和NT系列(包括NT/2000/XP)区分开来。两者在稳定性上有数量级之别。Windows稳定性差的恶名主要是由9x 系列而来,自WindowsXP开始Microsoft已经终止了这一系列的开发。其次需要分清的是应用软件的稳定性与 *** 作系统的稳定性。如果一个软件的崩溃不影响 *** 作系统和其它软件的运行,那么这笔帐通常就不应该记在 *** 作系统的稳定性上。如果一个软件的崩溃造成整个 *** 作系统的崩溃(即通常所说的“死机”),那 *** 作系统的稳定性就要受到质疑。

至于最新的WindowsXP与Linux究竟谁更稳定,说实在目前还缺乏足够的数据和可比性,因为两者所运行的软件很不相同。网上虽有一些测试结果,不过这些测试的客观性往往是值得怀疑的,这个有时间我将另文叙述。一般说来,由于 Windows上运行的软件通常比较复杂(比如游戏,大型商业软件等),从而有较大的几率暴露 *** 作系统的缺陷。从这点上讲,对WindowsXP和Linux的表观稳定性进行比较并不足以说明两者在运行同等复杂的软件时谁更稳定。另一方面和系统安全性的情行相似,人们说到Linux的稳定性时常常只是指内核的稳定性,而Windows的稳定性却涵盖包括用户界面在内的许多别的部分。出现这样的状况也情有可原,因为Windows和它的用户界面是无法分开的,用户界面死了,对用户来说就相当于 *** 作系统死了,而Linux 则不同,用户界面死了常常还可以用热键退出,并重新启动用户界面。这些差别的存在使得稳定性对Windows来说是一个更为困难的目标。软件支持

对软件,尤其是大型商业软件及多媒体软件(包括游戏)的支持一直是Windows的强项,无论是MacOS还是Linux在近期内都很难憾动Windows在这一领域的霸主地位。Windows庞大的应用软件支持是大多数用户即使心怀不满,也不得不继续使用Windows的一个重要原因。Linux所拥有的软件虽然为数也不少,而且有些软件(比如GIMP,StarOffice等) 的开发是以Windows下相应的商业软件为竞争对象的,但是在功能上这些软件要真正达到可以替代Windows软件的程度还有相当一段路要走。免费和公开源代码软件是Linux的灵魂,也是很多人喜爱Linux的原因,但是缺乏足够的高质量商业软件的支持已经成为Linux与Windows竞争桌面 *** 作系统市场时的重大障碍。在这方面Linux面临一个两难局面:一个 *** 作系统要吸引商业软件开发者就得要有足够多的用户(尤其是公司用户)。原因很简单,有用户才有利润。但另一方面,一个 *** 作系统要想吸引足够多的用户(尤其是公司用户),就得要有足够多高质量的软件(包括商业软件)。这是一个典型的先有鸡还是先有蛋的问题。从目前的形势发展来看,打破局面的最可能途径是软件公司愿意做前瞻性的开发,从而产生一个良性的推动。

这里需要做一点补充说明:对于相对小型的软件的支持Linux并不逊色,一个完整安装的LinuxDistribution不仅比Windows带有品种远为齐全的软件,而且各常用类型的软件,诸如email,FTP,IRC,浏览器等均有四五种以上可供选择(有时反而让初用者手足无措)。

硬件支持

五年前Linux的安装对于新手来说还是一件望而生畏的事,这其中很大一个原因就是Linux对硬件支持的欠缺,三年前我在笔记本电脑上安装Redhat6.0还被迫到网上自行搜寻config文件。但近几年来Linux在这方面取得了长足的进展,今天,各主要Distribution对硬件的支持度正在迅速接近甚至超过Windows的水平。尽管硬件生产商对Windows驱动文件(driver)的提供仍比对Linux的要普遍,但高手如云的Linux群体已经做到了能几乎同步地提供所有最新硬件驱动文件的程度。另一方面, WindowsXP在硬件支持的普遍性上却出现了较大的倒退(Microsoft或许把这叫做更新)。此消彼长,Linux在硬件支持上的欠缺已经成为历史。

虽然没有明说,但上面谈论的硬件都是针对x86机器的,脱离了这个框架,Linux在硬件的支持上的广泛程度是包括Windows在内的任何其它 *** 作系统都无法比拟的。

说到硬件支持,还有一个需要考虑的方面就是系统配置。每一代的Windows都对系统配置提出了新的要求,WindowsXP苛刻的系统配置要求更是使得几乎所有两三年以上机龄的机器都必须经过相当程度的硬件改良才能安装。而Linux 虽然也同样在逐步提高对硬件配置的要求,但由于其优越的模块结构,使得用户有极大的自由度根据自己机器的配置调整自己所需安装的模块,从而突破对硬件配置的要求。

规范性

这里所说的 *** 作系统的规范性有两层含义,一层含义是指 *** 作系统对软件界的各项技术规范的遵循程度。在这方面Linux基本上遵循了所有适用的规范,这和Linux的开发模式不无关系。除内核外Linux没有一个中心仲裁者,因此开发人员大都以软件界已有的技术规范为准则进行系统开发。Windows在这方面的名声则毁誉参半,一方面Microsoft本身是软件界许多规范的制定和倡导者,但另一方面,Microsoft又常常按自己的喜好“修改”规范。由于Windows在桌面 *** 作系统领域拥有压倒多数的用户群体,软件界在相当程度上被迫适应Windows的要求,因而使得Windows的许多非规范的东西成为事实上的规范。

规范性的另一层含义是指 *** 作系统本身的规范性,一个简单的衡量标准就是该 *** 作系统的两个用户之间有多少共同语言。由于Windows是由单一公司开发的,因此在这方面不是由松散联系的开发者为主力的Linux可以比拟的。以用户界面而论,Windows自Windows95以来保持了相当的稳定性,用过其中任何一个版本的用户基本上可以不用额外学习就直接使用另一个版本的 Windows界面。而Linux的用户界面不下十种之多,最流行的也有KDE和Gnome两种,明显缺乏规范性。Linux在自身规范性上的欠缺还表现在各主要的Distribution使用不同的目录结构,用不同的格式传播软件,用不同的方式安装软件,等等。凡此种种不仅给新手带来极大的困惑,就是对有经验的用户甚至系统开发人员都是极大的不便。

所幸的是,Linux的不规范性已经引起了越来越多人的重视,一个如同W3C(W3C是制定互联网规范的组织)那样的组织TheFreeStandardsGroup已经成立,它的使命就是制定Linux和其它开放源代码系统的规范。随着这些规范的逐步推广,Linux将会缩小在自身规范性方面与Windows的差距。

这里也需要补充一点:Linux在用户界面方面的不规范性有时候也不失为一个优点。常常听人抱怨说自己花大价钱更新机器的努力很大一部分被 *** 作系统本身所消耗掉了,这其中一个消耗资源的大户就是用户界面。Linux用户在这种情况下就可以使用消耗系统资源较少的用户界面。

总体上讲,在对外部规范的遵循性上,Linux要优于Windows,而在自身的规范性上,Windows要显著优于Linux,而且在近期内这种优势不会丧失。

源代码

Windows的源代码是保密的,而Linux的源代码是开放的。从字面上讲这当然是意味着原则上任何人都可以改进Linux。但是需要指出的是,原则上可以做的事情并非实际上就一定能够或者应当做。Linux源代码的高度的开放性主要是针对系统开发人员的,源代码的开放性使得Linux系统中的缺陷能够很快地被来自世界各地的高手所发现和弥补,这是十余年来Linux发展的关键。但对于普通用户来说,修改自己赖以工作的Linux机器的源代码却是非常不明智的行为。Linux内核多年来经过无数高手的锤炼,一个普通用户能够改进它的几率是微乎其微的(破坏它的可能性倒是很大的)。因此在肯定源代码开放性对 *** 作系统本身乃至整个软件业发展的深远意义的同时也不应该夸大它对普通用户的直接帮助,源代码的开放性并不增加一个普通用户对系统的掌控程度。

Linux源代码的开发性使得各大学的 *** 作系统课程和教材几乎都是以Linux或其他类似的系统为蓝本,因此使得受过正规计算机专业教育的几乎所有学生以及几乎所有对 *** 作系统感兴趣的人都对Linux有相当程度的了解和喜爱。这对于 Linux未来的发展有着十分正面的影响。

应用程序界面(API)

一个 *** 作系统的API(ApplicationProgramInterface) 是 *** 作系统提供的与应用软件的接口,对于软件开发人员来说十分重要。一般认为Linux的API要比Windows优美。不过由于Windows下有诸如 VisualStudio这样的直接支持WindowsAPI的大型工具软件,从而大大降低了Windows编程对于拥有并熟悉这些工具的人员的困难程度。

系统可调节性

Linux具有比Windows大得多的可调节性。许多早期的Windows骨灰级用户在系统可调节性上有一种怀旧感,觉得在Dos和早期Windows时代他们曾经是机器的主人,随着Windows的演化,后来他们只拥有Windows,不再直接拥有机器了(现在他们连Windows也不拥有了)。而Linux却始终如一地保持着系统的高度可调节性。

Linux的源代码的开放性也可以被视为终极意义上的可调节性,但是,前面说了,对于普通用户来说,这种可调节性实际上是几乎不存在的。

另一方面,在各自可调节的范围内,Windows要比Linux易于调节(这在很大程度上得益于Windows界面的规范性)。在早期,Linux的调节往往需要用户直接修改参数文件,即使对于有一定经验的用户,这也是一件令人头疼的事。近年来Linux在这方面做了很大的改进,开发了许多工具软件,不过和Linux下的许多其它类别的软件类似,Linux的工具软件也呈现一种发散性,即有不止一种软件可以做同一件事。这使得用户在转换机器和LinuxDistribution时往往因为不同环境下工具软件的不同而需要学习新的工具或重新安装旧的工具。

使用方便性

使用的方便性是桌面 *** 作系统竞争中最重要的决胜因素之一。这里所说的使用的方便性是针对普通用户的,这一点常常被Linux的支持者所忽视。现阶段在桌面 *** 作系统的用户群体中,Linux 用户的平均计算机水平要大大高于Windows用户,这种差异使得Linux群体常常低估了一个缺乏计算机系统知识的普通用户适应Linux的难度。 “Windows是傻瓜也能用的”非但不应该被用来嘲笑Windows,反而是Linux在竞争桌面 *** 作系统市场中必须借鉴的经验。计算机二十年来的发展早已超越了专业的界限而成为几乎所有现代人都可能会用到的工具。使用方便性是任何工具所应该追求的品质之一,计算机及其 *** 作系统当然也不例外。试问这世上聪明人的比例能有多少?偏偏把聪明用在计算机上的聪明人比例又能有多少?今天Linux用户群体的平均计算机水平高的一个不可忽视的原因是因为只有水平较高的人才能得心应手地使用Linux,而这一事实,很不幸的却是Linux与Windows竞争时的一大弱点。版权限制和费用

这方面没什么可说的,法庭上的胜负不论,无论对个人还是公司用户来说Windows利用其垄断地位迫使用户接受日益苛刻的版权要求已是不争的事实,可以盖棺定论。使用WindowsXP的用户相信对此尤有切身体会。每张WindowsXP光盘只能安装在一台电脑上,不仅如此,重装 *** 作系统或更换一定数量的硬件都会导致Windows反盗版机制的干预,使得用户必须向Microsoft索要新的序列号(可能还免不了要解释一下自己何以又要给Microsoft“添麻烦”)。花钱买了的软件竟然还要间或地向Microsoft请示汇报,用户心中的不平衡是不言而喻的。至于价格,WindowsXPHome和Pro的价格分别为$199和$299。相比较之下Linux不仅可以免费下载,而且可以安装在任意数目的机器上。对用户具有的亲和力是不言而喻。

可惜的是,对于个人用户来说Linux在价格上的优势在很大程度上被市场上大部分品牌机厂家不提供预装Linux的机器(服务器除外)这一事实所抵销了。由于品牌机厂家在市场上占有很大的份额,因此大部分用户不论用不用Windows,都一样付了Windows的钱。既然钱也付了, *** 作系统也有了,绝大多数人就不会再去费心做调整。顺便说一下,这也是目前Linux用户群体的计算机水平普遍较高的另一个重要原因,因为对计算机或 *** 作系统感兴趣的人有较大的可能性在并不缺乏 *** 作系统的情况下还去安装一个新的 *** 作系统。

不过对公司用户来说,由于Linux不对用户数量设置限制,与Windows的VolumnLicence相比其费用方面的优势是十分明显的。

说到费用,需要提到另外一个方面就是许多在Windows下要付费的软件在 Linux下有功能相近,相同或更好的免费软件。虽然前面说到Windows在对软件的总体支持上优于Linux,但是Windows占优势的那部分软件对大多数普通个人用户来说并不是不可缺少的(也许游戏除外)。不过Linux在这方面的优势也在很大程度上受到一个因素的削弱:那就是许多Linux下优秀的免费软件也有Windows版本。

技术支持

这里所说的技术支持是一个比较含糊的概念,既包括由公司提供的技术服务,也包括用户可以自行找寻的信息。在公司提供的技术服务方面,尽管不时可以听到有人抱怨和Microsoft技术服务人员打交道时的不愉快经历,但这显然是和Windows的用户数量有关的。总体上讲Microsoft对用户(尤其是公司用户)提供的技术服务要优于各Linux公司(当然这种服务不是免费的)。在用户可以自行找寻的信息方面,Microsoft有一个规模庞大的KnowledgeBase,Linux则有 LinuxDocumentationProject,而且Linux在互联网上的BBS,Forum和Newsgroup等网站中常常可以看到顶尖的 Linux开发者的身影,与Windows不同的是,Linux的开放性使得许多Linux高手对Linux的发展具有一种使命感,他们光顾这些网站就是为了了解用户的反映,发现bug并为Linux的发展积累经验。我这么说倒不是暗示Microsoft的人就不会以同样目的光顾Windows网站,不过就我个人的体会来说这方面Linux群体对用户起到的帮助作用要好于Windows群体的相应帮助。

需要说明的是,对公司用户来说,这后一种帮助在公司决策层面上起不到太大的作用。有一句半开玩笑的话很通俗地概括了许多公司(尤其是大公司)在选用软件(包括 *** 作系统)时的态度,那就是“只选择自己可以将之告上法庭的供应商提供的软件”。Linux群体以及许多Linux公司无法在足够长的服务期限内提供规范的,有法律保障的服务是Linux在竞争桌面 *** 作系统的半壁江山-公司用户 -时的一大障碍。

结语

写到这里应该收笔了。通常这类文章都要预测一下Windows和Linux在桌面 *** 作系统市场上的前景。前不久,RedhatLinux公司的总裁发表令人意外的评论说Linux无法在桌面 *** 作系统市场上击败Windows。当然, Linux的热心支持者们并不认同这种看法。两方面的意见在网上争论得非常激烈。讲到预测,插上几句离题的话。小时候听说有外国专家预测在中国本土不会找到很多石油,也有外国专家预测唐山在多少年内将难以重建。这些预测都破产了。那时我就想何以外国专家都如此愚蠢,以至于我们做成的每件事情都可以拉上一两个外国专家做反衬?后来看的预测多了渐渐明白了道理:不是外国专家太愚蠢,而是有太多的“专家”了,什么可能性都让专家“预测”到了。我不是专家,不想也不敢贸然在这里作什么预测。Linux在桌面 *** 作系统市场的前景取决于许多因素:比如各主要商业软件公司会在何时,以何种方式参与Linux软件的开发?比如有多少计算机厂家会提供预装Linux的机器?比如全球性的经济低迷会在多大程度上加速公司和个人为节省开支而使用Linux,比如 Microsoft是否会在法庭上败诉?如果败诉受到的惩罚方案如何?等等。除此之外,还需要看到用户群体的行为习惯具有极大的惯性。无论Linux如何改进,仍然有很多人说Linux不方便。为什么?除了Linux本身的部分原因外还因为Windows巨大的用户群体已经形成,Windows的一切已经成为了事实上的标准,任何对Windows的偏离都必然要改变用户群体的习惯,这是所有Windows的竞争者不得不背负的沉重包袱。

细致而尽可能准确地分析所有这些因素不是一篇短短(尽管现在已经不太短了)的文章所能胜任的。幸好计算机技术这二十年的发展始终没有让人们久等过,看到这场 *** 作系统大战的阶段性结果相信也不会对我们的耐心形成太大的挑战。

本文的一个假设的情况是Linux和Windows争夺桌面 *** 作系统用户,离开了这个前提,离开了这个评论的角度,关于两个 *** 作系统的比较当然就会有不同的结果。至于Linux是否应该和Windows来争夺污浊的桌面 *** 作系统市场,这是一个不同的话题。有朋友提到Linux过分地向桌面发展会有损其稳定性。Linuxkernel2.4在推出后很长一段时间无法达到令人满意的稳定性使得有人一度在kernel-mailing-list上发出“Linusdoesnotscale”这样的感慨和怀疑。不过我认为,kernel2.4的问题不是因为Linux向桌面发展造成的, kernel2.4的发展最主要的受益者是server而不是桌面用户。我个人的想法是Linux由于其模块结构,是有希望在reliable, stable,scalable的内核和一个能被普通用户接受的GUI两方面同时取得成功的(至少在技术上是可以的,在商业社会模式下是否事实上可以当然谁也没法保证,许多GPL软件已经开始偏离GPL了,这在多大程度上代表一种趋势还有待观察)。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8692604.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-20
下一篇2023-04-20

发表评论

登录后才能评论

评论列表(0条)

    保存