设计目标
系统设计的第一个问题是定义系统的目标与规格。在最高层,系统设计受到硬件选择和系统类型的影响。
需求可以分为两个基本类:用户目标和系统目标
策略和机制
操作系统设计的重要原理是策略(policy)和机制(mechanism)的区别。机制决定如何做,策略决定做什么。策略可能会随着时间或位置而有所改变,每次改变都可能需要底层机制的改变。系统更需要通用机制。这样策略的改变只需要重定义一些系统参数。
操作系统重要功能的改善可能是由于更好的数据结构和算法。
操作系统结构
简单结构
MS-DOS系统是用汇编编写的,只适用于intel 8088的cpu,未能提供双模式和硬件保护。在MS-DOS中,并没有很好的区分接口和功能层次,这种任意性使MS-DOS易受错误(恶意)程序的伤害。
原始的UNIX系统由内核和系统程序两个独立部分组成。内核进一步分为一系列接口和驱动程序。物理硬件之上和系统调用之下的所有部分作为内核,内核通过系统调用以提供文件系统,CPU调度,内存管理和其他操作系统功能,这种单一结构使得UNIX难以增强。
分层方法
采用适当硬件支持,操作系统可以分成比MS-DOS和UNIX所允许的更小和更合适的模块。这样操作系统能提供对计算机和使用计算机的应用程序更多的控制。实现人员更加自由地改变系统内部的工作和创建模块操作系统。
系统模块化有许多方法,一种是分层法,最底层(0层)为硬件,最顶层(N层)为用户接口。操作系统的层可以作为抽象对象来实现。一个典型的操作系统的层(M)由数据结构和一组可为上层所调用的子程序集合所组成。层M能调用底层的操作。
分层法的优点在于构造和调试的简单化,从而简化了系统的设计和实现。每层都能利用较低层所提供的功能来实现。
分层法的问题在于对层的详细定义,层的顺序问题,另一个问题是效率稍差。
微内核
随着UNIX操作系统的扩充,内核变得更大并且更加难以管理。20世界80年代中期,卡内基-梅隆大学开发了一个Mach的操作系统,该系统采用微内核技术模块化内核。这种方法将所有非基本部分从内核移走,并将它们实现为系统或用户程序。从而得到了更小的内核。
微内核的主要功能是使客户程序和运行在用户空间的各种服务之间进行通信。通信以消息传递形式提供。
微内核方法的好处之一是便于扩充操作系统,所有新服务可以在用户空间增加,因此并不需要更改内核。这样操作系统容易移植到其他硬件平台。由于绝大数服务是作为用户可不是内核进程来运行,因此微内核也就提供了更好的安全性和可靠性。
但是,微内核必须忍受由于系统功能总开销的增加而导致系统性能的下降。
模块
面向对象编程来生成模块式的内核。这里,内核只有一组核心部件,以及在启动或运行时对附加任务的动态链接。这种方法使用动态加载模块。在现代的UNIX,Linux ,Mac OS X ,Solaris中很常见。
这样的设计允许内核提供核心服务,也能动态的实现特定功能。例如:特定硬件的设备和总线驱动程序可加载给内核,而对各种文件系统的支持也可作为可加载的模块加入其中,所得的结果就好像一个分层系统,他的每个内核部分都有被定义和保护的接口。但它比分层系统更灵活,他的每一模块均可调用其他任何模块。
进一步讲,这种方法类似于微内核方法,这种方法更为高效,因为模块不用调用信息传递来通讯。
虚拟机
分层方法逻辑可延伸为虚拟机概念,虚拟机的基本思想是单个计算机的硬件抽象为几个不同的执行部件从而使得仿佛每个独立的执行环境都在自己的计算机运行一样。通过cpu调度和虚拟内存技术,操作系统能带来一种幻觉,即进程认为有自己的处理器和自己的(虚拟)内存。
非虚拟机:进程→内核-硬件
虚拟机:进程→内核→虚拟机实现→硬件
创建虚拟机的原因:最根本的是,在并行运行几个不同的执行环境(即不同的操作系统)能共享相同的硬件。
虚拟机方法的主要困难在于磁盘系统。解决方法是提供虚拟磁盘。
实现
虚拟机实现困难,提供与底层机器完全一样的副本需要大量工作。
底层机器有两种模式:用户模式和内核模式。
虚拟机软件可以运行在内核模式,因为它就是操作系统,虚拟机本身只能运行在用户模式,但他必须有虚拟用户模式和虚拟内核模式。这两种模式都运行在物理用户模式。
虚拟模式的转换可按下述方法实现。例如,当以一个虚拟用户模式而在虚拟机上运行的程序执行系统调用时,他会在真正机器上引起一个到虚拟机监控器的转换。当虚拟机监控器获得控制,他能改变虚拟机的寄存器内容和程序计数器以模拟系统调用的效果。接着他能重新启动虚拟机,注意他现在是在虚拟机内核模式下执行。
优点
虚拟机的理念具有很多优点,虚拟机相互独立,因此没有安全问题,但同时也没有直接资源共享。两种方法提供共享:一为共享小磁盘来共享文件,二是通过虚拟通信网络来传递消息。
实例
虚拟机成为一种解决系统兼容性的流行方法
VMware
他是一个流行的商业应用程序,他将intel 80*86硬件抽象为独立的虚拟机,运行于windows 和linux之上。
程序员可以在主操作系统和几个个客户操作系统上测试应用程序。每个客户操作系统都作为一个独立的虚拟机运行。
虚拟层是VMware的核心,因为他将硬件抽象为独立的作为客户操作系统的虚拟机运行。每个虚拟机都有他自己的虚拟cpu、内存、磁盘驱动、网络接口等。
java虚拟机
JVM是一个抽象计算机的规范。它包括类加载器和执行与平台无关的字节码的java解释器。 java对象用类来描述,对于每个java类,java编译器会生成与平台无关的字节码(bytecode)输出文件(.class),他可运行在任何JVM上。
JVM通过执行垃圾手机来自动管理内存,为了提高虚拟机中java程序的性能,许多研究集中在垃圾收集算法上。
JVM可以在主操作系统的上层软件中实现,或作为web浏览器的一部分。另一个选择是JVM可以在特别为JAVA程序设计的芯片硬件上实现。如果在软件上实现JVM,java解释程序一次只能执行一个字节代码。一种更快的软件技术是采用JIT(just-in-time)编译器。
---------------------
作者:MingChaoSun
来源:CSDN
原文:https://blog.csdn.net/sunmc1204953974/article/details/45484011
版权声明:本文为博主原创文章,转载请附上博文链接!
系统调用
系统调用(system call),通常用c或c++编写,对底层任务(如需直接访问硬件)可能以汇编语言指令的形式提供。
一个系统调用的例子:
编写一个从一个文件读取数据并复制到另一个文件的简单程序,则需要以下系统调用序列:
获取输入文件名:
屏幕输入提示
接收输入
获取输出文件名:
屏幕输入提示
接收输入
打开输入文件:
如果文件不存在,放弃
loop:
读取输入文件
写入输出文件
直到读取失败
关闭输出文件
将完成信息输出到屏幕
正常结束
然而, 一般程序开发人员根据应用程序接口(API)设计程序,有三种常用的API:
1.适用于windows系统的win32 API
2.适用于POSIX系统的POSIX API(包括UNIX、Linux 和Mac OS X 版本)
3.设计运行于java虚拟机程序的java API
在后台,组成API的函数通常为应用程序员调用实际的系统调用。
向操作系统传递参数有三种方法
最简单的是通过寄存器来传递参数
不过有时参数数量会比寄存器多。这时,这些参数通常存在内存的块和表中,并将块的地址通过寄存器来传递。linux采用这样的方法。
参数还可压入堆栈中,并通过操作系统弹出。
系统调用类型
系统调用大致可分五类:进程控制、文件管理、、设备管理、信息维护、通信。
进程控制
结束,放弃
装入执行
创建进程,终止进程
取得进程属性,设置进程属性
等待时间
等待事件,唤醒事件
分配与释放内存
文件管理
创建文件,删除文件
打开,关闭
读,写,重定位
取得文件属性,设置文件属性
设备管理
请求设备,释放设备
读,写,重定位
取得设备属性,设置设备属性
逻辑连接或断开设备
信息维护
读取时间和日期,设置时间或日期
读取系统数据,设置系统数据
读取进程,文件或设备属性
设置进程,文件或这杯属性
通信
创建,删除通信系统
发送,接受消息
传递状态消息
链接或者断开远程设备
进程控制
运行程序需要能正常或非正常地中断其执行(end或abort)
如果一个系统调用被用来非正常的中断执行程序,或者程序运行碰到问题引起错误陷阱,那么可能会有内存信息转储并产生一个错误信息。内存信息转储通常写到磁盘上,并被调试器(帮助程序员发现和检查错误的系统程序)检查和确定问题原因。操作系统必须将控制权转交给命令解释器。命令解释器紧接着读取下一个命令。
对于交互系统:
命令解释器简单的读取下一个命令,因为假定用户会采取合适的命令处理错误
对于GUI系统:
一个弹出窗口提醒错误并提个建议
对于批处理系统:
命令解释器终止整个作业并继续下一个作业。出现错误时,有的系统允许控制卡指出一个具体的恢复动作。控制卡是一个批处理概念,他是一个管理进程执行的命令。可定义一个错误级别。更加严重的错误可用更高级的错误参数来表示。命令解释器和下一个程序能利用错误级别自动决定下一个动作。
执行一个程序或作业可能需要装入另一个程序。这一点允许命令解释器来执行一个程序,该命令可通过用户命令,鼠标单机和批处理命令来表示。当装入程序终止时:
如果新程序终止时控制权返回到现有程序,那么必须保存现有程序的内存映像。因此,实际上建立一个机制以便一个程序调用另一个程序。如果两个程序并发继续,那么创建了一个新作业和进程以便多道执行。有的系统调用专门用于这一目的(create process 或 submit job)
如果创建新作业和进程,那么应该能够控制他的执行。这种控制要求能决定和重置进程或作业的属性,包括优先级、最大允许执行时间等。必要时也要能终止它。
另一组系统调用有助于调试程序,许多系统提供转储内存信息的系统调用,这有助于调试程序,程序trace在执行时能列出所用的每条执行的指令,但是只有少数几类系统提供。
许多操作系统提供时间表来表示一个程序在某个位置执行的时间。时间表要求具有跟踪功能或定时 时间中断。每次定时中断,会记录计数器的值。
文件管理
常用的文件管理系统调用:
首先能创建和删除文件。每个系统调用需要文件名,可能还会需要一些文件属性。创建文件滞后,就需要打开并使用,也可能需要读,写,重定位,最后需要关闭文件。
使用目录来组织文件系统中的文件,目录也需要相同的操作。
另外,还至少需要读取文件属性和设置文件属性,有的操作系统提供更多调用,如文件移动和复制。
其余的,一部分可能提供采用代码或系统调用完成这些操作的API,另一部分可能仅提供完成这些任务的系统程序。
如果系统程序被其他程序所调用,则其中每一个军可以被其他系统调用视为一个API
设备管理
程序在执行时需要用到一些资源才能继续运行,否则,程序必须等待可用的足够多的资源。
操作系统控制的不同资源可当做设备看待,这些设备有些是物理设备(磁带),而其他可当做抽象或虚拟的设备(如文件)。如果系统有多个用户,那么用户必须请求设备以确保能独自使用它。在使用完设备之后,用户需要释放它。
一旦请求了设备(并且得到设备之后),就能如同对待文件一样对设备进行读,写,重定位。I/O与文件非常相似,以至于许多操作系统(如UNIX)将这两者合并为文件-设备结构。
信息维护
许多系统调用用来在用户程序和操作系统间传递信息,调用返回的信息可能是系统版本、空闲内存、进程信息等
另外,操作系统维护所有进程的信息,有些操作系统调用可访问这些信息。
通信
有两种模型:
消息传递模型和共享内存模型。
对于消息传递模型,通信进程彼此交换消息来交换信息。
对于共享内存模型,进程使用 shared memory create 和 shared memory attach系统调用来获得其他进程所拥有的内存区域的访问权。
系统程序
计算机的逻辑层次中,最底层是硬件,上面是操作系统,接着是系统程序,最后是应用程序。
系统程序提供了一个方便的环境,以开发程序和执行程序。其中一小部分指示系统调用的简单接口没其他可能是相当复杂的。
它们可分为:
文件管理、状态信息、文件修改、程序语言支持、程序装入和执行、通信。
---------------------
作者:MingChaoSun
来源:CSDN
原文:https://blog.csdn.net/sunmc1204953974/article/details/45363799