当前位置: 首页 > news >正文

Linux 之前的 Unix 桌面沉浮启示录

It takes more than open source, it takes open standards and consensus
仅仅开源还不足以实现开放,还需开放标准和建立共识

Steven J. Vaughan-Nichols
Sat 27 Jan 2024 // 12:33 UTC

现在,由于有了安卓和 ChromeOS,Linux 已成为重要的终端用户操作系统。但在 Linux 之前,Unix 桌面起着重要的作用,尽管大多数并未留存至今。

追溯至 1993 年,我在 《PC Magazine》上做了一篇 Unix 桌面的特性评测。是的,在我成为 Linux 桌面用户之前,我是 Unix 的使用者。自从 1979 年 2BSD Unix 出现以来,我就是 Unix 的忠实拥趸。到了 1993 年,Unix 桌面繁多,我成功说服我们的杂志让我试用它们。

我和我的团队评测了来自 Consensys、Dell、Interactive Unix、SCO、Univel、昇阳Sun,和 NeXT 的 Unix 版本。我们也注意到了来自 UHC、Microport 和其它公司的 Unix,但没有进行评测。我相信你们中的大多数人都未曾听说过这些。

那 Linux 呢?那时候,Linux 已经问世,而且我也使用过。但当时最先进的 Linux 发行版是 Softlanding Linux System(SLS),我无法说服编辑们 —— 或者说我自己,认为它是值得评测的。我本可以评测的第一个版本是 Slackware,它至今仍在我们身边,但在那时候,它的发布日期还有数月之遥。

现如今,只有 Dell 仍然存在,不过它之所以至今仍在业界,不完全是因为它的 System V Release 4(SVR4)Unix 发行版。然而,那些早期的 Unix 桌面中,仍有一个仍然活跃健康,且运行在大约 四分之一的桌面 上。

那个操作系统,当然,就是 macOS X,它是 NeXT 的 NeXTSTEP 的直接后裔。你可以说基于多线程、多进程微内核操作系统 Mach、BSD Unix,和开源的 Darwin 的 macOS,是所有 Unix 操作系统中最成功的。

但在当时看来,情况并非如此。并不是因为 Windows 比 Unix 更好。在 1993 年,可以称作 Unix 的竞争对手的只是 Windows 3.1 和 NT 3.1。

特别是 NT,在那时,它只能算是个笑料级别的服务器操作系统。直到 Windows NT 3.5 发布后,NT 才开始变得重要。

Windows 击败 Unix 的原因多种多样。其中最重要的一点就是微软确保所有硬件和软件供应商要么与它对齐,要么就无法 使用 Windows 或微软 Office。

那个时候,这是个极其重要的问题。我们如今看待 Mac,通常将其视为等同于或者超过 Windows PC 的竞争对手。但那个时期的情况并非如此。史蒂夫·乔布斯当时已被解雇,并且在苹果公司 1993 年的年度报告中,该公司报告显示其 净收入已下降了97%。

然而,尽管微软的成功在很大程度上得益于其历史上的 不正当商业行为,但它并非靠不正当手段得以胜出。Unix 公司正在自我毁灭。

尽管有许多为 Unix 创立软件开发标准的尝试,但它们或者过于宽泛而无法做出实质性贡献,例如 POSIX;或者它们在开放系统基金会Open Systems Foundation 和 Unix 国际Unix International 之间的商业联盟争端中陷入僵局,这就是著名的 Unix 战争。

在 Unix 公司忙于内斗的同时,微软正乐得财源滚滚。关键问题在于 Unix 公司无法就软件标准达成一致。独立软件开发商(ISV)需要为每一个 Unix 平台编写应用。而这些应用在桌面市场的份额都微乎其微。对开发者来说,为 SCO OpenDesktop(也被称为 OpenDeathtrap)、NeXTStep,以及 SunOS 分别编写一个版本的应用程序,从商业的角度来看,这完全没有意义。

这种情况听起来似曾相识吗?这种问题如今依旧困扰着 Linux 桌面,这也是我对诸如红帽的 Flatpak 和 Canonical 的 Snap 这样的 Linux 容器化桌面应用如此钟情的原因。

等到双方于 1996 年最终在 The Open Group 合力和解时,已经为时已晚。Unix 在传统桌面上的市场被挤压出局,工作站基本上都变成了 昇阳微系统Sun Microsystems 的天下。

那么,Linux 是如何崭露头角的呢?实际上,相比 Unix 发行版,它有两个主要的优点。首先,它是开源的。在开源的优胜劣汰机制下,好的代码能够生存,差的代码将被淘汰。我认为 Linux 使用 GPL,这点非常关键。

毕竟,如果成功只需要开源代码,那么我们现在都应该在运行如 FreeBSD、DragonflyBSD 以及 GhostBSD 这类纯 BSD 操作系统。但是实际情况却是,虽然 BSD Unix 系统至今仍然重要,却远远比不上 Linux 的市场份额。

Linux 基金会的开源供应链安全主任 David Wheeler 解释了这个原因:BSD 许可证存在的问题在于每隔几年就会有人说:“嘿,让我们基于这个 BSD 代码 开一家公司!”他们会利用这些 *BSD 代码,某些最优秀的 BSD 开发者,然后开发出一款专有的派生产品。但作为专有厂商,他们的分支成本高昂,维护不易,因此公司最终走向破产……如此反复。

“而与此同时,GPL 通过法律约束将大型商业公司聚集在一起……他们所有人都在作出贡献,并且感到安心,因为他们知道他人也被法律要求必须同样做。这就创造了一个安全的合作区。”

Linux 的另一大优势便是其领导,Linus Torvalds。有了 Torvalds 这唯一领导,Linux 规避了 Unix 陷入的内斗困境。

然而 Torvalds 的积极力量并不只在于他是一位天才开发者。尽管他的头衔可能笑称为“终生仁慈独裁者 Benevolent Dictator for Life”,多年来,Torvalds 已经学会了如何与他人和谐合作。

有些人说,Torvalds 的人缘不够好,的确,他并不宽容对待愚蠢的行为。然而,我多次参加过 Linux Plumbers 会议,他和顶尖的 Linux 内核开发者们的合作过程中,我并未见到他们之间有过什么明显的矛盾。如今的 Linux 已是一个集体的功劳。

如果 Linux 的未来全都寄托在 Torvalds 一人身上,我也会担心 Linux 的未来。Torvalds 无疑是一位杰出的人才,一个伟大的程序员,但如果这就是 Linux 成功的全部,我们就会陷入一个痛苦的问题:一场公交车事故,就会让我们失去整个 Linux。

幸运的是,Linux 的发行者和开发者们从 Unix 的历史中汲取了教训。

他们清楚,拥有一款成功的桌面操作系统,需要的不仅仅是开源,还需要开放的标准和共识。

我们可能永远都无法迎来那个传说中的 “Linux 桌面年”,但通过安卓和 Chrome OS,Linux 已然成为顶级的终端用户操作系统。经过漫长的等待,Unix 终于通过 Linux 成为了一款顶级的终端用户操作系统。


via: The Land Before Linux: The Unix desktops
https://www.theregister.com/2024/01/27/opinion_column

2024-01-29 10:30 原文作者:Steven J. Vaughan-Nichols

译者:ChatGPT 校对:wxy 本文由 LCTT 原创翻译,Linux中国 荣誉推出

相关文章:

Linux 之前的 Unix 桌面沉浮启示录

It takes more than open source, it takes open standards and consensus 仅仅开源还不足以实现开放,还需开放标准和建立共识 Steven J. Vaughan-Nichols Sat 27 Jan 2024 // 12:33 UTC 现在,由于有了安卓和 ChromeOS,Linux 已成为重要的终端…...

面试问题梳理:项目中防止配置中的密码泄露-Jasypt

背景 想起面试的时候,面试官问我现在大家用Spring框架,数据库、ES之类的密码都是配置在配置文件中的,有很大的安全隐患,你有考虑过怎么解决嘛? 当时我回答是可以在项目启动的过程中的命令行追加的方式,感觉…...

engine.addImportPath()用于向 QML 引擎添加新的模块搜索路径

engine.addImportPath() 是 QQmlApplicationEngine 类中的一个方法,用于向 QML 引擎添加新的模块搜索路径。这在需要加载自定义模块或从非标准位置加载 QML 文件时非常有用。通过使用 addImportPath() 方法,可以让 QML 引擎在额外的路径中查找 QML 模块。…...

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…...

项目部署笔记

1、安全组需开放(如果不开放配置nginx也访问不到) 2、域名解析配置IP(子域名也需配置IP,IP地址可以不同) 3、如果出现图片获其他的文件找不到的情况请仔细检查一下路径是否正确 4、服务器nginx配置SSL证书后启动报错: nginx: […...

PyCharm\VsCode——Python第三方库下载换源

为什么要换源? Python第三方库下载默认镜像源在国外,因为特殊的原因在国内的你我利用这个镜像源往往速度会非常地慢,因此为了提速将这个默认镜像源换成国内的镜像源是非常有必要的。 镜像源的种类有哪些? 国外镜像源——官方 http…...

图片上传裁剪react-cropper

效果图 安装插件 npm i react-cropper 或者 yarn add react-cropper 主要代码 import React, { useRef, useState } from react; import Cropper from react-cropper; import cropperjs/dist/cropper.css; import ./index.less; import { UploadOutlined } from ant-d…...

跨越空间的编码:在PyCharm中高效使用远程解释器

跨越空间的编码:在PyCharm中高效使用远程解释器 PyCharm的强大功能之一是支持远程解释器,这使得开发者能够在远程服务器或虚拟机上运行、调试代码,享受本地开发环境的便利。本文将详细介绍如何在PyCharm中配置和使用远程解释器,包…...

Vue3单文件jsx输出多组件示例遇到的坑

感谢博主减肥吧Evan提供的SFC实现多组件的思路和实现&#xff0c;小卷在大佬的基础上再完善下实现。 我们从tsx的API使用上得到启发&#xff0c;可以在vue的单文件组件&#xff08;sfc&#xff09;中使用defineComponent来定义和导出多个独立的小组件。此时sfc中的<templat…...

OpenCV中的轮廓检测cv2.findContours()

文章目录 前言一、查找轮廓二、绘制轮廓轮廓面积轮廓周长 前言 轮廓提取的前提&#xff0c;将背景置为黑色&#xff0c;目标为白色&#xff08;利用二值化或Canny&#xff09; 边缘检测&#xff0c;例如Canny等&#xff0c;利用梯度变化&#xff0c;记录图像中的边缘像素点&a…...

JFlash读取和烧录加密stm32程序

JFlash读取和烧录加密stm32程序 安装后JFlash所在的目录&#xff1a;C:\Program Files\SEGGER\JLink 一、烧写加密程序 1、打开C:\Program Files\SEGGER\JLink目录&#xff0c;找到JFlash.exe,双击它&#xff0c;就可以打开该执行程序。见下图&#xff1a; 2、选择“Create …...

【总结】实际业务场景中锁、事务、异常如何考虑使用?

文章目录 锁处理目的&#xff1a;考虑锁控制思路&#xff1a;生命周期接口并发控制解决方案&#xff1a;测试锁是否生效&#xff1a;模拟多线程并发场景的2种方式&#xff1a; 事务处理目的&#xff1a;考虑事务控制思路&#xff1a;解决方案&#xff1a; 总结 锁处理 目的&am…...

Pytorch使用Dataset加载数据

1、前言&#xff1a; 在阅读之前&#xff0c;需要配置好对应pytorch版本。 对于一般学习&#xff0c;使用cpu版本的即可。参考教程点我 导入pytorch包&#xff0c;使用如下命令即可。 import torch # 注意虽然叫pytorch&#xff0c;但是在引用时是引用torch2、神经网络获取…...

【nginx】nginx的优点

目录 一、高性能1.1 高并发处理1.2 低内存消耗1.3 快速响应 二、高扩展性2.1 模块化设计2.2 动态模块扩展 三、高可靠性3.1 核心框架稳定3.2 进程管理3.3 负载均衡与健康检查3.4 热部署 四、功能丰富4.1 反向代理4.2 HTTP缓存4.3 安全功能 五、易于配置和管理5.1 配置文件简单5…...

K8S ingress 初体验 - ingress-ngnix 的安装与使用

准备环境 先把 google 的vm 跑起来… gatemanMoreFine-S500:~/projects/coding/k8s-s/service-case/cloud-user$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 124d v1.23.6 k8s-no…...

qt 获取父控件

在 Qt 中&#xff0c;你可以通过调用 QWidget 的 parentWidget() 方法来获取一个控件的父控件。这个方法会返回一个指向父控件的指针&#xff0c;如果该控件没有父控件&#xff0c;则返回 nullptr。 以下是一个简单的示例&#xff0c;展示了如何获取一个按钮的父控件&#xff…...

flask基础配置详情

前言 一个简单的应用 app Flask(__name__) app.route("/") def hello_world():return "<p>Hello,World!"运行Flask应用 #flask命令运行flask --app hello run#使用Python命令进行运行python -m flask # 作为一个捷径&#xff0c;如果文件名为 app…...

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…...

用GPT 4o提高效率

**GPT-4o可以通过提高编程效率、优化工作流程、增强文档管理和知识分享等多方面帮助用户提升工作效率**。具体如下&#xff1a; 1. **代码生成与优化** - **快速原型开发**&#xff1a;程序员可以通过向GPT-4o描述需求或功能来生成初步的代码框架或关键函数&#xff0c;从而节省…...

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息&#xff0c;处理业务逻辑&#xff0c;持久化订单和菜品数据&#xff0c;然后将其显示在菜品管理客户端上。 最初我们的用户基数很小&#xff0c;上线后的一段时间内&#xff0c;MQ消息通信还算顺利。 随着用户…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...