Operating System Concepts ——chapter 2—— Operating System Structures

We can view an operating system from several vantage points. One view focuses on the services that the system provides; another, on the interface that it makes available to users and programmers; a third, on its components and
their interconnections.

2.1 Operating-System Services

Operating System Concepts ——chapter 2—— Operating System Structures_第1张图片

对用户有用的服务:

user interface
命令行——以文本作为输入
批处理——命令被写入文件
GUI——图形界面
program execution
能够加载程序并运行
I/O operations
程序经常需要操作IO接口
file system manipulation
文件和文件夹的增删改查以及权限控制
communciaton
shared memory 或者通过网络
Error detection
检查出错误并进行修正

提高操作系统本身效率的服务

资源分配的策略或者算法
统计
用来计费或者研究用户以重新配置系统以提高计算服务能力
保护和安全

2.2 user and operating-system interface

不是很理解这个标题。。。

command interpreter

有些系统将command interpreter当做操作系统的一部分,有的系统将command interpreter当做一个特殊的应用程序(windows,unix)。
command interpreter可以以两种方式来实现,一种是自己实现参数校验,并调用相关的操作系统函数。另一种仅仅是加载对应的命令文件,并将参数传递过去,由命令文件完成对命令的执行。这种方式实现的command interpreter较小,并且新增命令不用修改command interpreter。

graphical user interface

采用鼠标与系统交互,对普通用户相对来说更友好。

choose which one

一般来说,系统管理员和深入掌握操作操作系统知识的人用command interpreter。而普通用户更愿意用图形界面。
command interpreter能够更快的完成某些操作,也更容易完成重复的工作。如shell scripts。
而图形界面也符合人类的直觉,初期学习成本更低。

2.3 system calls

system calls是操作系统向外提供服务的接口,一般是c或c++实现。某些低级别的任务,比如说必须直接操作硬件,可能是由汇编语言实现。
即使是像拷贝文件这样的简单任务,都需要调用非常多的system calls来实现。一般的程序员不会了解到system calls的实现细节,而是通过操作系统所提供的api来编写应用程序。api定义提供的功能,以及对应的输出及输入。

一般来说,api并不是实际的system calls,而是会调用实际的system calls。这样做的目的是希望同样的api能够适应各种不同的系统,由api去调用不同的system calls。

1)每个系统调用都对应一个唯一的编号
2)在系统调用表中查找对应的系统调用函数
3)调用对应的函数并返回结果

程序状态字:

程序状态字PSW(Program Status Word)包括的状态位有进位标志位(CF)、结果为零标志位(ZF)、符号标志位(SF)、溢出标志位(OF)、陷阱标志位(TF)、中断使能(中断屏蔽)标志位(IF)、虚拟中断标志位(VIF)、虚拟中断待决标志位(VIP)、I0特权级别(IOPL)。
其中貌似是I0特权级别决定了是否可以执行特权指令。(搜了一下没搜到)

system call parameter passing

1)直接通过寄存器传入
2)pass address of block
3)by stack

2.4 type of system calls

可以粗略的分为6类:

2.4.1 process control

一个正在运行的程序需要能够正常或非正常的结束运行。如果程序被非正常结束,一般会将内存快照存储在磁盘中,以便调试程序分析错误原因。程序运行结束后,操作系统要能够重新唤醒command interpreter。在交互式系统中,command interpreter简单的开始执行下一条命令,因为它假设用户会对错误做出正确的响应。在gui系统,会弹出错误提示界面。在批处理系统中,一般会结束整个job,然后开始下一个job。程序运行结束后,会返回一个错误级别,后面的程序根据这个错误级别判断下一个动作。

一个运行的程序可能想加载并执行其他程序。一个问题是当新加载的程序执行完后应该将控制权交给谁。如果需要将控制权交给原有的程序,那么就需要将原有的程序内存镜像存储起来。

创建了新的进程,原来的进程应该有权控制新进程的属性和结束。

需要等待新进程的结束。

需要竞争相同的资源,所以需要锁机制。

这些功能都有对应的系统调用。

2.4.2file managment

create()——delete()
open()——close()
read()——write()
get_flie_attributes()——set_flie_attributes()
copy()
move()

2.4.3 device management

被操作系统管理的各种资源都可以看做设备——物理设备和虚拟设备。
request()
release()
open()
close()
read()
write()

2.4.4 information maintenance

很多system calls只是用来在用户程序和操作系统之间传递信息。如:date(), time()等等。
还有一些system calls用来帮助debug,如dump()。
还有监视程序运程过程中各个部分的耗时。

2.4.5 communciation

有消息传递和内存共享两种方式。
消息传递一般是通过网络来实现,非常熟悉,不做介绍。
内存共享是通过共享同一块内存来实现信息传递。默认一个进程是不能去读取另一个进程的内存空间的,所以要实现内存共享要去除这一限制。进程之间要约定好信息格式并通过同步机制确保不会同时进行写操作。

内存共享速度更高,但是实现起来更复杂。所以消息传递适用于小规模的信息传递而内存共享适用于大规模的信息传递。

2.4.6 protection

protectiong提供对资源访问权限的控制。
一般包括 set_permission() get_permission() allow_user() deny_user()

2.5 sytem programs

System Programs为程序的开发和执行提供方便的环境。
可以被分为以下几类:
file management
status information
file modification
program-language supporting
program loading and execution
communication
background services

2.6 opeateing-system design and implemention

对于设计操作 系统,没有完全的解决方案,但是有一些方法被认为是成功的。

2.6.1 design goals

设计操作系统要做的第一件事就是确定目标和特性。从最高层级来说,需要决定选用什么样的硬件以及设计哪种操作系统:分时,批处理,单用户,多用户。
低层一些的,分为两个部分:用户目标,系统目标。

2.6.2 mechanisms and policies

mechanism defines how to do, policy defines what to do。the separation of mechanism and policy is important for flexbility. a good mechanism is insensitive to the change of policy.

2.6.3 implementation

最早期的操作系统都是由汇编语言写成的。现在的操作系统除了部分还继续使用汇编语言以外,大部分都使用c和c++等高级语言编写。
相比于汇编,高级语言的优势:

  1. 更快的编写速度
  2. 更好的兼容性
  3. 更易于理解和调用
    坏处:
    性能和存储开销。
    但是现在计算机性能大幅提升,存储已经不再是问题
    而且由于编译器的优化,性能方面的优势也已经很小了。

对操作系统性能更大的提升来源于数据结构和算法的合理设计。

2.7 operating system structure

一个现代操作系统非常庞大和复杂,一个有效的做法是将系统分解成不同的组件或者说模块,然后协同在一起,组成系统。

2.7.1 simple structure

很多操作系统都没有良好定义的结构。通常这些系统开始都很小,随后越来越大。
MS-DOS的接口和功能层次就没能很好的分离。如应用程序能够直接访问I/O子程序,然后对磁盘和显示器进行操作。这种自由导致应用程序的崩溃容易引起操作系统的崩溃。
原始的unix也是一种受限的结构。它为分两部分:kernel 和system programs。the kernel provides the file system, CPU scheduling, memory management, and other operating-system functions through system calls. Taken in sum, that is an enormous amount of functionality to be combined into one level. This monolithic structure was difficult to implement and maintain.

2.7.2 分层设计方案

分层设计能够使操作系统更好的控制应用程序。实现有更大的自由空间改变内部结构。最下层是硬件,最上层是用户接口。
一层是由一些数据,以及能操作这些数据的方法组成。分层的主要优势是结构简单化和调试的优势。由于任意一层只依赖于其下的层,所以当下层调试好之后,便可以基于下层调试本层。出了问题能够确定是本层的问题,有利于快速定位。
主要的难题在于如何准确的定义不同的层。使上层仅仅依赖下层。
分层的一个缺点是效率方面不如简单结构。所以,层数不能过多。

#### 2.7.3 微内核
卡内基梅隆大学的研究员发明了叫做Mach的操作系统,采用微内核的设计方式:将一切从本质上来说不属于内核的组件移除,并实现为系统或用户程序。
微内核的一个主要功能是提供各种进程间的通信机制。
微内核的设计增加了系统的扩展性。新的服务只需要添加到用户空间即可,而不需要修改内核。当内核确实需要修改的时候,修改的部分也会比较少,因为内核很小。
不幸的是,随着系统功能的增加,微内核的性能会受较大影响。

2.7.4 模块化设计

可加载的模块化设计可能是当今最好的操作系统设计方法:内核提供核心组件,其他服务通过动态加载。
模块化设计出来的操作系统最终像分层设计的操作系统,因为每个部分都有明确定义的,受保护的接口。但是比分层设计更加灵活,因为模块之间可以任意调用。
也像微内核,因为核心模块仅仅提供了最基础的功能:加载模块,模块之前的通信。但是相对于微内核更加高效,因为在通信的时候不需要调用消息传递来通信。

2.7.5 混合系统

在实践中,很少会有操作系统采用单一的结构。为了解决不同的问题,如性能,安全和易用性,而混合了不同的结构。

mac os x
分层+微内核

IOS
Architecture of Apple’s iOS:
ocoa Touch
Media Services
Core Services
Core OS

Android
Operating System Concepts ——chapter 2—— Operating System Structures_第2张图片

operating system debuggin

一般来说,调试是指找出操作系统的错误,找出系统的瓶颈并进行优化也是。

2.8.1 failure analysis

当操作系统出现错误崩溃的时候,会将内存状态保存成文件,用于分析出错的原因。但是当文件系统出错的时候,很有可能无法将内存状态保存下来。一种解决方法是,磁盘的一部分只用来保存内存状态。

2.8.2 performance tuning

为了寻找系统的性能瓶颈,就必须能够监控状态。多数操作系统通过产生系统行为的跟踪列表来实现。感兴趣的的事件的时间及重要参数都会被记录下来。
另一种方式是使用单一目的,交互式的工具来查询各个组件的状态。

2.8.3 DTrace

DTrace 是一个可以动态的向正在运行的系统添加探针的工具,不论是内核程序还是用户程序。一个优秀的调试工具要有以下特性:
调试系统的任何部分,哪怕代码编写的时候没有刻意考虑调试
不影响系统的稳定性。
使用时对系统的性能影响小,并且是线性的。停止使用后对系统的性能完全无影响。
DTrace 刚好具有以上所有特性。
cpu有断点特性,当代码执行到此处时会停止,允许调试器采集此时系统的状态。
记录指令指针的方法只能统计一个大概。
打印日志的方法会影响性能而且很有可能无法覆盖到出bug的代码。

DTrace is composed of a compiler, a framework, providers of probes written within that framework, and consumers of those probes.

DTrace的实现原理是改写原有函数,从而在调用原函数时会先调用DTrace改写的函数,再调用系统原有的函数。

只有拥有DTrace特权或root用户可以使用DTrace。DTrace植入的代码要是安全的,比如说不能有循环。

DTrace消费者是对某个探针和其结果感兴趣的代码。当某个探针没有DTrace消费者之后,探针就会被移除,DTrace会重写对应的代码,使之恢复添加探针之前的状态。

DTrace是一个极其优秀的工具,更多参考链接:

https://www.jianshu.com/p/b6d04c12be05
https://baike.baidu.com/item/DTrace/7861940?fr=aladdin

你可能感兴趣的:(操作系统)