简而言之,我想知道操作系统是如何工作的:
vdb*_*oor 75
一个 UNIX 系统由几个部分组成,或者我想称之为层。
要启动系统,一个名为引导加载程序的程序位于硬盘分区的第一个扇区。它由系统启动,依次定位操作系统内核并加载它。
分层
内核。这是由引导加载程序启动的中央程序。它为系统(磁盘、内存、视频、声音)执行基本的硬件交互,并提供一个可以启动程序的虚拟环境。内核还提供了处理硬件设备之间所有微小差异的所有驱动程序。对于外部世界(更高层),每一类设备似乎都以完全相同的一致方式运行——反过来,程序可以在此基础上进行构建。
后台子系统。只是有一些常规的程序,它们不会妨碍您的工作。他们处理诸如远程登录之类的事情,提供中央消息总线,并根据硬件/网络事件执行操作。例如蓝牙发现、wifi管理等。任何网络服务(文件服务器、打印服务器、网络服务器)也都生活在这个层面。在 UNIX 系统中,这些都只是普通程序。
命令行工具。这些都是可以启动的小程序,可以进行文本编辑、下载文件或管理系统等操作。此时,UNIX 系统完全可供系统管理员使用。在 Windows 中,这一层实际上不再存在。
图形用户界面。这些也只是程序,唯一的区别是它们在屏幕上绘制窗口而不是编写文本。这使得系统更易于普通用户使用。
任何服务或事件都会从下到上。
图书馆——公共平台
程序会做很多常见的事情,比如显示窗口、在屏幕上绘制东西或下载文件。这些东西对于多个程序是相同的,因此代码被放在单独的“库”文件中(.so文件 - 意思是共享对象)。该库可以在所有程序之间共享。
对于每件可以想象的事情,都有一个图书馆。有一个用于读取/写入 PNG 文件。有一个用于 JPEG 文件、用于读取 XML、用于加密、用于视频播放等。
在 Linux 上,应用程序开发人员的常用库是 Qt 和 Gtk。这些库在内部使用较低级别的库来满足其特定需求,同时以一致且简洁的方式公开其功能,以便应用程序开发人员更快地创建应用程序。
库提供应用程序平台,程序员可以在该平台上为操作系统构建最终用户应用程序。系统提供的高质量库越多,程序员编写漂亮程序所需的代码就越少。
有些库可以跨不同的操作系统使用(例如,Qt),有些库实际上是专门绑定到一个操作系统中的。这将限制您的程序只能在该平台上运行。
进程间通信
操作系统的第三个角落是程序相互通信的方式。这些是进程间通信 (IPC) 机制。它们以多种形式存在,例如一块共享内存,或者在两个程序之间建立一个小通道来交换数据。还有一个中央消息总线,每个程序都可以在该总线上发布消息并接收响应。这用于全局通信,其中不知道哪个程序可以响应。
从库到操作系统
有了库、IPC 和内核,程序员就可以为系统服务、用户管理、配置、管理、办公、娱乐等构建各种应用程序。这就形成了新手用户认为是“操作系统”的完整套件”。
在 UNIX/Linux 系统中,所有服务都只是程序。所有系统管理工具都只是程序。他们都做他们的工作,他们可以链接在一起。我在http://codingdomain.com/linux/sysadmin/总结了很多主要程序
与 Windows 的可区分部件
UNIX 主要是一个由程序、文件和受限权限组成的系统。避免了许多复杂性,使其成为一个强大的系统,同时它看起来很容易做到这一点。
详细地说,这些是可以在 UNIX/Linux 系统中找到的原则:
有统一的方式来访问信息。(“一切都只是一个文件”)。您可以将文件、网络套接字、IPC 通道、内核参数和块设备作为文件打开。因此,虚拟文件系统出现在 /dev、/sys 和 /proc 中。您唯一需要的 API 是open,read和close。
底层系统是透明的。每个程序都在相同的规则下运行。与 Windows 不同,“控制台程序”、“GUI 程序”或“后台服务”之间没有人为的区别。它们都只是程序,碰巧做不同的事情。它们也都可以以相同的方式进行观察、分析和调试。
设置是可读的、可编辑的,并且可以用注释进行注释。它们通常具有 INI 样式的格式,但可能会使用自定义格式以满足该应用程序的需要。因为它们只是文件,所以可以将它们复制到其他系统、存档或使用标准工具进行备份。
没有大型的“一次性完成”应用程序。口头禅是“做一件事,把它做好”。命令行工具可以链接在一起并且功能强大。单独的服务(例如 SMTP、IMAP 和 POP 以及登录)是单独的子程序,避免了复杂的交织在一起的代码和安全问题。复杂的桌面环境将繁重的工作委托给单个程序。
fork(). 新程序由克隆自身的现有程序启动。克隆设置所有内容(例如文件句柄),并可选择使用新程序代码替换自身。这使得将相同的安全设置和限制应用于新程序、共享内存或设置 IPC 机制变得非常容易。启动一个过程的成本也非常低。
文件系统是一棵树,可以挂载其他磁盘分区和网络共享。还有一种通用的数据访问方式。公共系统位置(例如,/usr可以轻松安装为网络共享。
该系统是为低用户权限而构建的。登录后,每个用户(root 除外)都被限制在自己的资源中,只能运行应用程序和文件。网络服务尽快降低其权限。有一种明确的方法可以获得更多特权,或者要求某人代表他们执行特权作业。每个其他调用都受到程序的限制和限制。
每个程序都将设置存储在用户主目录的隐藏文件/文件夹中。没有程序会尝试编写全局设置文件。
倾向于公开描述的通信机制而不是秘密机制或特定的一对一机制。鼓励其他供应商和软件开发人员遵循相同的规范,因此可以轻松连接、交换并保持松散耦合。
Did*_*set 11
UNIX 是一个强大的操作系统,建立在 40 多年(这在计算机科学中几乎是永恒的)已被证明是成功的设计之上。核心技术基于 C 语言和无数小程序:UNIX 命令。麦克罗伊总结了基本理念:
编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。
更多关于 UNIX 哲学的信息可以在 ESRaymond“UNIX 编程艺术”中找到。
Old*_*mer 10
这里有一些很好的答案。然而,我认为被遗漏的一件事是 *nix 与其他操作系统的不同之处,尤其是 Microsoft Windows。
上面已经涵盖的基本概念“做一件事,把它做好”对于 *nix 操作系统非常重要,有时会被忽视。然而,正是这种设计理念使 Linux 如此灵活和强大。
例如,MS Windows 的图形用户界面 (GUI) 与操作系统交织在一起。没有 GUI 几乎不可能安装 MS 操作系统。在 Linux 中,您可以轻松启动完全没有图形组件的服务器或嵌入式系统。它可以完全由命令行驱动,并且仍然是一个功能齐全的服务器。
Linux 的模块化设计还允许系统管理员关闭、升级和恢复服务,而无需重新启动操作系统。事实上,您必须重新启动 Linux 操作系统的唯一时间是内核本身被修改或升级时。
例如,您可以在 Linux 上安装一个新的 Windows 管理器(gnome、kde,以哪个为准),而当前登录到系统的用户可能永远不会知道。
在 Windows 上,对系统的最简单更改通常需要重新启动,尽管有时这更像是一个安全问题,而不是实际的技术要求。我认为这是 MS 操作系统的基本缺陷之一。在 Linux 上,您可以升级许多驱动程序模块,并且对用户影响很小或没有影响。在 Windows 上,如果您只是安装一个新应用程序,则可能需要重新启动整个机器。
这种模块化设计还赋予了 Linux 非凡的灵活性。每个 Linux 系统都可以针对您需要完成的特定任务进行量身定制,并尽可能减少资源开销。对于 Windows,您无法关闭 GUI 界面来运行简单的 HTTP 服务器。Windows 假定存在内存占用,这会创建一个障碍,您的硬件无法进入该障碍。这是 Linux 成为许多移动和嵌入式应用程序首选操作系统的主要原因。
我可以继续说下去,但我希望这些例子有助于解释为什么 Linux 变得如此流行,以及它与其他操作系统的真正不同之处。