本章详细地分析了操作系统的结构,主要从三个问题入手。
1)为用户提供了什么服务?2)怎么提供的服务?(给应用程序员的接口)3)系统设计人员该怎么设计系统?本节回答了第一个问题,1)为用户提供了什么服务?
用户界面 (命令行界面、批处理界面、图形用户界面)
程序执行 (把程序加载到内存,运行)
IO操作 (不让用户直接操控IO,由系统来统一控制)
文件系统操作
通信 (进程间通信,分为共享内存和消息交换)
错误检测 (不断的检错和更正错误)
资源分配 (为多用户、多作业分配资源)
记账 (记录用户使用资源的类型和数量,便于收费)
保护与安全 (保护)
几乎所有的系统都有用户界面,因为操作系统要和用户进行交互。
命令解释程序 命令解释程序称为外壳(shell):一个任务开始或首次登陆时就会运行。功能就是获取并执行用户输入的命令。有两种实现命令解释程序的方法。 (1)这些命令的实现代码本身就包含在命令解释程序中。这样的话,新增一个命令就需要重新编写命令解释程序,shell所能执行的命令越多,则本身就越大。 (2)另一种就是不必理解命令,只是通过命令确定一个文件,把文件中加载到内存并执行。这样新增命令时无须修改命令解释程序。例如 rm file.txt查找 rm 的文件加载到内存,并用 file.txt 作为参数来执行。
图形用户界面 GUI 鼠标、手势。本节回答了第2个问题,2)怎么提供的服务?(给应用程序员的接口) 系统调用 提供操作系统服务接口 即使进行一些简单的程序,也需要大量的系统调用。
系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。
系统调用是用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现,进入内核后,不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的“服务例程”。比如系统调用getpid实际调用了服务例程为sys_getpid(),或者说系统调用getpid是服务例程sys_getpid()的“封装例程”。
具体步骤:用户进程–>系统调用–>内核–>返回用户空间。
系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”。
系统调用规定用户进程进入内核空间的具体位置。
1.程序运行空间从用户空间进入内核空间。
2.处理完后再返回用户空间。
API是给应用程序开发人员使用的,是程序员在用户空间下可以直接使用的函数接口。是一些预定义的函数,比如常用的read()、malloc()、free()、abs()函数等,这些函数都具有一定功能,说明了如何获得一个给定的服务,跟内核没有必然的联系。提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
为什么应用程序员根据API来编程而不是直接使用系统调用?一个好处就是涉及程序的可移植性。 调用者无需知道如何实现系统调用,只需遵循API,就知道调用系统调用后操作系统做了什么。通过API,操作系统接口的大多数细节可以隐藏起来。
API是用户程序直接可以使用的函数接口,但如果每个操作系统都拥有只属于自己的API,那么应用程序的移植性将会很差。基于POSIX(Portable Operating System Interface)标准的API拥有很好的可移植性,它定义了一套POSIX兼容标准,这使得按这个标准实现的API可以在各种版本的UNIX中使用。现如今,它也可以在除UNIX之外的操作系统中使用,比如Linux,Windows NT等。
系统调用可以分为6大类
进程控制文件管理设备管理信息维护通信保护系统程序,也叫系统工具,为程序开发和执行提供了一个方便的环境。看图就知道系统程序的功能和作用了。 除了系统程序,大多数操作系统还提供了常用的应用程序,如 IE浏览器,截图工具,纸牌游戏……
从本节之后,回答了第3个问题,3)系统设计人员该怎么设计系统?
设计目标机制与策略 策略与机制分离:机制决定如何做,策略决定做什么。实现 最底层采用汇编,高层函数采用C,系统程序采用C/C++,也可用解释性脚本语言PERL或Python.简单结构的两个实例就是MS-DOS和UNIX。 由于空间小,没有很好的区分功能的接口和层次。例如,应用程序可以访问IO设备驱动程序。 最初的UNIX操作系统,内核通过系统调用,可提供文件系统、CPU调度、内存管理和其他功能,都在内核层这一层中。使得难以实现与设计,但是系统调用的接口和内核通信的开销非常小。
操作系统呗分为若干层,最底层是硬件,最高层为用户接口。 优点:简化了设计和实现,每一层只调用它的下一层。 缺点:不好定义各层,(即不知道这个功能该属于哪一层)。还有就是效率低。
微内核只提供:进程管理、内存管理、进程间通信。 而其他文件系统、设备驱动程序……则在用户模式下运行,通信是通过消息传递来提供的。 优点:便于扩展操作系统,添加新服务时在用户空间添加即可,无需修改内核。还有就是便于移植到不同的硬件平台。 缺点:增加系统的开销。
最佳的方法:可加载的内核模块 内核提供核心服务,而其他服务可在内核运行时动态实现。
整体像是分层系统,因为每个内核部分都定义好接口,但比分层系统更灵活,因为可以动态加载模块。 又像是微内核,主模块只有核心功能,但更有效,模块之间调用消息传递来进行通信。 Linux采用可加载内核模块,主要用于加载设备驱动程序和文件系统。
故障分析 性能优化
操作系统的发行通常采用磁盘、CD-ROM、DVD-ROM或ISO镜像。 为了生成系统,可以使用一个特殊程序,这个SYSGEN程序从给定文件读取或询问操作员硬件配置,或直接检测硬件配置。 根据配置从库中选择模块,链接起来,生成操作系统。
上电开机或者重新启动,指令寄存器加载某个预先定义的内存位置,从该位置开始执行。该位置就是初始引导程序所在,一般在ROM中。 引导程序完成诊断机器的各个硬件部分, 整个引导程序加载后,可遍历文件系统以寻找操作系统内核,将其加载到内存中,并开始执行,至此,才可以说操作系统在运行(running).
##至此,前两章已结束,即概论部分结束,从下一章开始就分模块介绍操作系统的各个部分,更加的细致和深入。参考:https://blog.csdn.net/weixin_41055137/article/details/80597159