我想知道操作系统是如何工作的,简而言之:
- 它所基于的基本组件
- 这些组件如何协同工作
- 是什么使UNIX UNIX
- 是什么让它与Windows等其他操作系统如此不同
我想知道操作系统是如何工作的,简而言之:
Answers:
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用户除外)仅限于自己的资源,仅运行应用程序和文件。网络服务会尽快降低其特权。有一种明确的方法来获取更多特权,或要求某人代表他们执行特权作业。其他每个调用都受到程序的限制和限制。
每个程序都将设置存储在用户主目录的隐藏文件/文件夹中。任何程序都不会尝试写入全局设置文件。
与秘密机制或特定的一对一机制相比,倾向于公开描述的通信机制。鼓励其他供应商和软件开发人员遵循相同的规范,以便可以轻松连接,交换并保持松散耦合。
UNIX是一个强大的操作系统,建立在经过40多年成功证明(在计算机科学中几乎是永恒的)的可靠设计的基础上。核心技术基于C语言和众多小型程序:UNIX命令。麦克罗伊(McIlroy)总结了基本哲学:
编写可以做一件事并且做得很好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。
有关UNIX哲学的更多信息,请参见ESRaymond“ UNIX编程的艺术”。
这里有一些很好的答案。但是,我认为遗漏的一件事是* nix与其他操作系统(尤其是Microsoft Windows)有何不同。
上面已经介绍过的“做一件事情,做好事”的基本概念对于* nix操作系统至关重要,因此有时可能会被忽略。正是这种设计理念使Linux如此灵活和强大。
例如,MS Windows的图形用户界面(GUI)与OS交织在一起。如果没有GUI,则几乎不可能安装MS操作系统。在Linux中,您可以轻松启动根本没有图形组件的服务器或嵌入式系统。它可以完全由命令行驱动,并且仍然是功能齐全的服务器。
Linux的模块化设计还允许系统管理员关闭服务,对其进行升级并重新启动该服务,而无需重新启动操作系统。实际上,只有在内核本身被修改或升级时,您才必须重新引导Linux操作系统。
例如,您可以在Linux上安装新的Windows管理器(gnome,kde,以任何一种方式),并且当前登录到系统的用户可能永远不会意识到。
在Windows上,通常最简单的系统更改需要重新启动,尽管有时这是安全问题,而不是实际的技术要求。我认为这是MS操作系统的基本缺陷之一。在Linux上,您可以升级许多驱动程序模块,而对用户的影响很小或没有。在Windows上,如果您仅安装新应用程序,则可能需要重新引导整个设备。
这种模块化设计还为Linux提供了非凡的灵活性。每个Linux系统都可以针对您需要完成的特定任务进行量身定制,并尽可能减少资源开销。在Windows中,您无法关闭GUI界面来运行简单的HTTP服务器。Windows假定存在一个内存占用量,它会创建一个障碍,您的硬件无法进入该障碍。这是Linux成为许多移动和嵌入式应用程序首选操作系统的主要原因。
我可以继续讲下去,但是我希望这些例子能帮助解释为什么Linux如此流行,以及它与其他OS的真正区别。
《 UNIX操作系统设计》将是一本好书。
我建议阅读Unix环境2e中的Advanced Programming,以学习有关Single Unix Standard(SUS)API和POSIX的很多知识,这将使您了解什么使Unix Unix以及组件如何工作以及如何协同工作。
但是,这是一本非常C的书,更多的是参考手册。如果您有失眠的问题,那就随便睡觉吧。除此之外,如果您是Unix C程序员,则必须拥有它。