一、操作系统做什么?
1.操作系统定义
A program that acts as an intermediary between a user
and the comupter hardware.
计算机硬件和用户(人和程序)之间的一个中介
2.操作系统目标
- 使用户方便使用计算机
- 是计算机硬件高效率运行
二、硬件系统组成
- cpu(s) + 设备控制器 通过总线(控制(用来通信的,一些状态)、数据和地址三个内部总线和外部总线)连接在一起,它们共享内存
-
这些cpus和设备并行执行,并且竞争使用内存。
三、4个层次
操作系统把硬件包起来了,所有的对硬件的操作必须经过操作系统。
- 用户
- 应用程序
- 操作系统
- 硬件
四、现代操作系统的特征
1.多程序 Mutiprogramming
这是为了提高CPU的使用效率。
一个简单的例子
如果系统上只能有一个用户。一个用户程序的操作需要CPU执行它的指令,还需要I/O来作它的输入输出。只有CPU指令,没有I/O,这有什么意义hhh,而只有I/O没有CPU更不可能,因为I/O就是CPU控制的。所以有一个很明显的问题就是CPU执行指令时候,I/O就停了,而I/O时候,CPU又停了不执行指令了。
为了解决这种低效问题,一个基本想法就是,可不可以在系统里面装两个程序,当一个在I/O时候,它没有使用CPU,能不能启动另一个程序让它使用CPU?这样不就是让CPU使用率提高了吗?
嗯就是这样,有两个以上程序可以驻留内存,这种状态就叫Mutiprogramming
- 单用户系统有缺陷,无法让CPU和I/O同时处于运转状态
- 多程序思想让多个程序竞争CPU,提高了CPU的使用效率
- 作业调度器每次选择一个作业,交给CPU执行
- 当前作业需要等待时候(例如有I/O操作),CPU转向另一个作业
2.多任务 Multitasking 分时系统 Timesharing
在多程序思想的基础上扩展,Multiprogramming只要求多个程序驻留在内存中,CPU有空时候给程序分配资源就可以,而Multitasking则要求不但是驻留在内存,还要求在程序需要CPU时候,CPU能及时给它!响应用户的交互操作。称为交互式计算。
一个简单的例子
如果不具备这样的及时性,会有什么后果?一台计算机,能播放PPT还能接收邮件,这算是有多程序思想了。此时如果你在这里疯狂读PPT,而永远不去理睬e-mail,接收e-mail的程序永远得不到CPU资源,那么e-mail发过来了不响应就丢失了。邮件是什么,邮件给谁的,这并不重要,但是必须要先及时的响应,把它接收过来,不然就丢失在茫茫网海中了hhh。所以读PPT时候,要让邮件程序有收邮件的机会。而反过来一样,如果在接受一个很大的邮件,需要一定的时间接收,PPT此时得不到CPU,不动了,那还怎么学习,会给用户造成机器死机的感觉。
这就是Multiprogramming的重要性。必须要支持这样的需求!由此引出了操作系统的各种概念。
- 响应时间 Response time 在一秒内
- 每个用户至少有一道作业在内存中执行——进程
- 存在两个以上的进程等待CPU执行——CPU调度
- 内存空间装不下进程——需要换入、换出操作
- 虚拟内存管理技术,是的小内存也能运行大进程
3.CPU提供Dual-mode机制
- 用户态(user mode)和内核态(kernel mode)
这样是为了OS的自我保护。从硬件层解决这个问题,CPU有个Mode bit模式位,可以在内核态(1)和用户态(0)之间切换。- 以Mode bit区分系统在执行用户代码还是内核代码
- CPU带有特权指令,这些指令只能在内核态执行。特权指令一般是可能引起损害的机器指令。
-
用户态下需要操作系统服务,那么系统调用此时就会从用户态切换至内核态,系统调用返回指令自动从内核态切换到用户态。
4.其他特征
- 中断驱动的硬件操作:什么任务到了,引发一个中断,没有中断就休息了。有任务才去搞。
- 软件申请,软件操作错误等,将产生异常或陷入
- 面临
- “无限循环”问题
- 进程干扰其它进程问题
- 进程干扰OS问题
......
五、操作系统的服务类别
一共有两类服务。
1.一类服务直接帮助用户
-
用户界面(UI user interface)
用户通过用户界面向操作系统下达命令。- 命令行CLI(Command-Line)
文本命令,用户直接输入让操作系统执行的命令。如shell。 - 图形用户界面GUI(Graphics User Interface)
提供了视图,有定位设备指挥I/O,从菜单选择,选中部分并用键盘输入文本等等 。这个最常见不过了。 - 批处理(Batch)
这是个啥我也没见过具体例子Hhh,控制命令和命令的指令被输入文件中,通过执行文件来实现。
- 命令行CLI(Command-Line)
-
程序执行
是OS能够装入程序到内存,执行驻留在内存的程序,结束程序的而执行,以及出错时候的异常处理。 -
I/O操作
-
文件系统相关操作
-
进程间通信
- 通过共享内存实现通信
- 通过消息传递实现通信
-
出错检测
要能随时应对系统出错,对各种各样的来自CPU、内存或I/O设备等地方的错误提供调试、查错工具。
2.另一类服务确保系统共享资源的高效运作
就是我们在上面举例中的PPT和e-mail按个实例
-
资源分配
-
记账——跟踪记录那些用户使用了多少资源,使用了哪些资源
-
保护和安全
- 保护——确保对资源的访问是受控的
- 安全——外来访问需要通过身份认证,不允许非法访问
六、操作系统的服务功能
进程管理
内存管理
存储设备管理
大容量存储器管理
I/O子系统管理
七、系统调用 System Calls
用户程序和系统软件与操作系统之间的界面。提供了操作系统的有效服务界面。
一个简单例子
这是进行文件复制时候的一个示例,用到了各种系统调用,文件管理的这些操作的实现都是要通过操作系统的系统调用来帮忙:
1.通常用高级语言C/C++实现
2.程序通常以API(Application Program Interface)使用,而不是直接使用系统调用。
3.三种流行的APIs
- Win32 API for Windows
- POSIX API for POSIX-based systems(UNIX\Linux和Mac OS X版本)
- JAVA API for the JVM
4.为什么要用API,而不是直接系统调用?
因为太菜了hhhh,开个玩笑。
普通用户不懂啊,普通的用户要理解系统调用的概念是有困难的,编程序的人可能不懂这个啊,也要让他去写程序。比如linux系统调用都是使用int 0x80号中断来实现的,普通用户根本不懂这些中断什么的。所以OS提供API,用户可以调用比较容易一点的API来实现系统调用。而不是把系统调用扔给你。
一个简单示例
下面就是调用标准C库里面的printf,用户调用printf,C程序拦截了这个调用来调用必要的操作系统调用(这里是write()),真正实现写字符输出的是系统调用的write(),用户程序只需要调用C库中的API就可以了。这个printf则是专业人士写的,为了用户的方便,他不用去用中断去实现打印,而只需要调用printf,printf帮助它做更底层的东西——引起int 0x80,进入内核态,调用write(),write()完成任务之后,又跳回到用户态,printf的代码中,printf再return到用户程序。
API和System Call和操作系统之间的关联如下所示
八、系统程序 System Programs
系统程序提供了一个方便的环境以开发程序和执行程序,其中一小部分知识系统调用的简单接口,其他可能是相当复杂的。
系统程序分类
- 文件操作
- 状态信息展示
- 文件内容修改
- 编程语言支持
- 程序装入和执行
- 用户间通信
以用户考察OS的视角,OS是以系统程序描述的,而不是系统调用。
九、操作系统结构
简单结构
层次化结构
从低到高:
硬件——硬件设备控制器——内核驱动程序——内核里的管理子系统——内核提供的系统调用——用户程序
微内核 microkernel
基本思想:尽量把内核中的所有非基本部分移出到用户态空间,将它们实现为系统程序或用户程序。剩下的就是微内核(通常包含最小的进程、内存管理以及通信功能)。处于用户态空间的功能模块通过消息传递机制进行通信。
- 有利因素
- 容易升级微内核
- 容易移植OS到不同类型的CPU、体系结构
- 更可靠
- 更安全
-
不利因素
-被移出之后,用户态空间的程序增多,它们之间通信都要借助操作系统帮忙,每次通信都要从用户态转到内核态,不停的切换,那么用户态和内核态空间通信频繁,性能开销大,这是很致命的!
模块 modules
现代操作系统大多实现了内核模块机制。
- 应用面向对象思想方法
- 核心组件相对独立、分离
- 模块之间通过预知的界面对话
- 可动态装入内核
- 可动态卸载
网友评论