我想知道操作系统是如何工作的简而言之:
- 它所构建的基本组件
- 这些组件如何协同工作
- 是什么造就了 UNIX UNIX
- 是什么让它与 Windows 等其他操作系统如此不同
答案1
UNIX 系统由几个部分组成,或者我称之为“层”。
为了启动系统,称为引导加载程序的程序位于硬盘分区的第一个扇区。它由系统启动,然后定位操作系统内核并加载它。
分层
内核。这是由引导加载程序启动的中央程序。它为系统进行基本的硬件交互(磁盘、内存、视频、声音),并提供一个可以启动程序的虚拟环境。内核还提供了处理硬件设备之间所有细微差异的所有驱动程序。对于外界(较高层)来说,每一类设备的行为似乎都完全相同——反过来,程序可以在此基础上构建。
后台子系统。只有常规程序,不会妨碍您。它们处理远程登录等事务,提供中央消息总线,并根据硬件/网络事件执行操作。例如,蓝牙发现、wifi管理等。任何网络服务(文件服务器、打印服务器、Web服务器)也都位于这个级别。在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 除外)都受限于自己的资源,只能运行应用程序和文件。网络服务尽快减少他们的特权。有一种明确的方法可以获得更多特权,或者要求某人代表他们执行特权工作。每个其他调用都受到程序的约束和限制。
每个程序都将设置存储在用户主目录的隐藏文件/文件夹中。没有程序会尝试写入全局设置文件。
与秘密机制或特定的一对一机制相比,更倾向于公开描述的通信机制。鼓励其他供应商和软件开发人员遵循相同的规范,以便可以轻松连接、交换事物并保持松散耦合。
答案2
UNIX 是一个强大的操作系统,建立在经过 40 多年(这在计算机科学中几乎是永恒的)历史证明的成功设计之上的。核心技术基于 C 语言和无数小程序:UNIX 命令。麦克罗伊总结了基本理念:
编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。
有关 UNIX 哲学的更多信息可以在 ESRaymond“UNIX 编程的艺术”中找到。
答案3
这里有一些很好的答案。然而,我认为被遗漏的一件事是 *nix 与其他操作系统(尤其是 Microsoft Windows)的不同之处。
上面已经涵盖的基本概念“做一件事,把它做好”对于 *nix 操作系统是如此重要,以至于有时会被忽视。然而正是这种设计理念使得 Linux 如此灵活和强大。
例如,MS Windows 的图形用户界面 (GUI) 与操作系统交织在一起。如果没有 GUI,几乎不可能安装 MS 操作系统。在 Linux 中,您可以轻松启动根本没有图形组件的服务器或嵌入式系统。它可以完全由命令行驱动,并且仍然是一个功能齐全的服务器。
Linux 的模块化设计还允许系统管理员关闭服务、升级服务并恢复服务,而无需重新启动操作系统。事实上,只有当内核本身被修改或升级时,您才必须重新启动 Linux 操作系统。
例如,您可以在 Linux 上安装新的 Windows 管理器(gnome、kde,无论哪种),而当前登录到系统的用户可能永远不会知道。
在 Windows 上,通常对系统最简单的更改都需要重新启动,尽管有时这更多的是安全问题而不是实际的技术要求。我认为这是微软操作系统的基本缺陷之一。在 Linux 上,您可以升级许多驱动程序模块,并且对用户影响很小或没有影响。在 Windows 上,如果您只是安装新应用程序,则可能需要重新启动整个设备。
这种模块化设计也赋予了Linux非凡的灵活性。每个 Linux 系统都可以针对您需要完成的特定任务进行定制,并尽可能减少资源开销。在 Windows 中,您无法关闭 GUI 界面来运行简单的 HTTP 服务器。 Windows 假设有一个内存占用量,这会造成一个障碍,您的硬件将无法低于该内存占用量。这是 Linux 成为许多移动和嵌入式应用程序首选操作系统的主要原因。
我可以继续说下去,但我希望这些例子有助于解释为什么 Linux 变得如此流行,以及它与其他操作系统有何不同。
答案4
我建议阅读Unix 环境中的高级编程 2e了解有关单一 Unix 标准 (SUS) API 和 POSIX 的大量知识,这将使您了解 Unix 的构成以及组件如何工作以及如何协同工作。
然而,这是一本 C 语言很重的书,更多的是一本参考手册。如果您有失眠问题,就带着它一起睡觉吧。除此之外,如果您是 Unix C 程序员,它是必须具备的。