操作系统基本概念
命令解释程序:有的操作系统在其内核部分包含命令解释程序。将命令解释程序作为一个特殊的程序,当一个任务开始时或用户首次登录时(分时系统),该程序就会执行。
系统调用:提供了操作系统提供的有效服务界面。这些界面通常用C或C++编写,当然,对底层的任务(如必须访问的硬件),可能以汇编语言指令的形式提供。
API是一系列适用于应用程序员的函数,包括传递给每个函数的参数及其返回的程序员想得到的值。有三种应用程序员常用的API:适用于Windows系统的Win32API,适用于POSIX系统的POSIXAPI(包括几乎所有UNIX,Linux和MacOSX版本),以及用于设计运行于Java虚拟机程序的JavaAPI.
API编程的好处之一在于程序的可移植性,一个采用API设计程序的应用程序员希望他的程序能在任何支持同样API的系统上编译并执行(尽管事实上,体系的不同常使其很困难)。除此之外,对一个应用程序员而言,实际的系统调用比API更注重细节和困难。尽管如何,调用API中的函数和与其相关的内核系统调用之间还是常常存在紧密的联系。
向操作系统传递参数有三种方法:最简单的是通过寄存器来传递参数。不过有时,参数数量会比寄存器多。这时,这些参数通常存在内存的块和表中,并将块的地址通过寄存器来传递。Linux和Solaris就采用的这种方法。
参数也可以通过程序放在或压入堆栈中,并通过操作系统弹出。有的操作系统采用块或堆栈方法,因为这些方法并不限制所传递参数的数量或长度。
微处理器可以提供一个称为单步的CPU模式,这种模式在每个指令运行后能执行一个陷阱。该陷阱通常为调试程序所用。
文件系统:如果用目录结构来组织文件系统内的文件,那么目录也需要同样的操作。另外,不管是文件还是目录,都需要能确定其属性,或设置其属性。文件属性包括文件名,文件类型,保护模式,计账信息等。
设备管理:操作系统控制的不同资源可当做设备看待,这些设备有些是物理设备,而其他可当做抽象或虚拟的设备。如果系统有多个用户,那么用户必须请求设备以确保能肚子使用它。在使用完设备之后,用户需要释放它。
还有一些操作系统允许不受管理的设备访问,这带来的危害是潜在的设备争夺以及可能发生的死锁。
信息维护:许多系统调用只不过用于用户程序与操作系统之间传递信息。另外,操作系统维护所有进程的信息,有些系统调用可访问这些信息。一般来说,也有系统调用用于设置进程信息。
通信:有两种通信模型:消息传递模型和共享内存模型。
消息传递模型:通信进程通过彼此之间交换消息来交换消息。直接或间接地通过一个共同的邮箱,消息可以在进程之间得到交换。
共享内存模型:进程使用sharedmemorycreate和sharedmemoryattach系统调用来获得其他进程所拥有的内存区域的访问权。
重定位:重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程。他是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。
机制:howtowork
策略:whatwillbedone
操作系统结构:
简单结构:较小,简单且功能有限的系统(MS-DOS),并未很好地区分接口和功能层次。
UNIX分层:物理硬件之上和系统调用接口之下的所有部分作为内核。内核通过系统调用以提供文件系统,CPU调度,内存管理和其他操作系统功能。这一层里面组合了大量功能。但这种单一结构使得UNIX难以增强。
系统模块化有许多方法,一种是分层法,即操作系统分成若干层。最底层为硬件,最高层为用户接口。
操作系统层可作为抽象对象来实现,该对象包括数据和操作这些数据的操作。
分层法的主要优点在于构造和调试的简单化。每层只能利用较低层的功能和服务。这种方法简化了调试和系统验证。调试确定哪一层级发生错误。每层为较高层隐藏了一定的数据结构,操作和硬件的存在。
分层主要困难涉及对层的详细定义,这是因为一层只能使用其下的较低层。
最后一个问题时与其他方法相比其效率稍差。
微内核:Mach操作系统,该系统采用微内核技术来模块化内核。这种方法将所有非基本部分从内核中移走,通常微内核包括最小的进程和内存管理以及通信功能。
微内核的主要功能是使客户程序和运行在用户控件的各种服务之间进行通信。
微内核的好处之一在于便于扩充操作系统。所有新服务可以在用户控件增加,因而不需要修改内核。由于内核小,很容易从一种硬件平台设计移植到另一种硬件平台设计。由于绝大多数服务是作为用户而不是作为内核进程来运行的,因此微内核也就提供了更好的安全性和可靠性。
但,微内核必须忍受由于系统功能总开销的增加而导致系统性能的下降。
模块:面向对象编程技术来生成模块化的内核。这样的设计允许内核提供核心服务,也能动态的实现特定的功能。例如,特定硬件设备和总线驱动程序可以加载给内核,而对各种文件系统的支持也可作为可加载的模块加入其中。这种方法类似微内核,核心模块只有核心功能以及其他模块加载和通信的相关信息。但这种方法更为高效,因为模块不需要调用消息传递来通信。
reference《OperatingSystemConcepts》