操作系统是一们综合各种计算机课程学习的学科,建议放在后面学。
一、什么是操作系统
对上服务应用程序,控制软件和程序,限制不同的应用程序占用的资源。协调不同的程序运行,公平地共享计算机系统资源,提高效率和利用率。——管理者。
硬件之上,应用程序之下(抽象接口,不用考虑底层的硬件)——中间层的系统软件!
软件:系统软件+应用软件。操作系统位于应用软件之下,为其提供服务支撑。
操作系统的两个接口,面向外部的接口称为:Shell(外壳),面向内部的接口称为:kernel(内核),我们主要关注内核
操作系统内部细节:管理硬件资源——CPU、内存、磁盘、(声卡、显卡等)
1)CPU管理:CPU调度、进程线程管理
2)内存:物理内存管理、虚拟内存管理
3)磁盘(disk)管理:(因为比较底层,不方便管理,所以要做文件系统,以文件的形式对应用程序对应用程序提供访问保存等服务)——文件系统管理
4)中断处理与设备驱动:
OS内核四大特征:
1)并发——在计算机中放多个可以同时跑的程序,让操作系统来调度。
并发:在一段时间内,有多个程序可以运行(异步的,交替轮流)。
并行:在一个时间点上,多个程序可同时运行。(要求计算机上有多个CPU)
2)共享:同时访问内存IO,一个时间点对于某一个内存单元,只有一个程序能够访问,但是两个程序可以同时访问两个不同的内存单元。
3)虚拟:硬件虚拟化——CPU虚拟化为进程,磁盘虚拟化为文件,内存虚拟化为地址空间。能够让用户感觉到能够操作一台计算机。
4)异步:一个CPU上面,程序的执行是走走停停的,不是一次执行完,不可预知,但是能够保证执行结果一致。
二、为什么要学习操作系统
已经有了很多操作系统,为什么要学:OS涉及到底层,能力很强的操作,掌握操作系统,对其进行改进扩展,就能够控制整个计算机系统。
1)由于OS是并发的,所以对于编程的挑战性很大。
2)由于OS面对的是复杂的硬件,具有时间依赖行为,硬件故障,为了避免一些非法的操作,操作系统的实现复杂度就提高了。
3)OS必须是高效的:低耗CPU、内存、磁盘。
4)OS必须比用户程序拥有更高的稳定性。
5)操作系统是安全的基础,不能有漏洞。
如何学:多读代码,并实践。
典型操作系统:UNIX(贝尔实验室1972,基于C)——UNIX BSD(伯克利软件发行版)
Linux:自治终端领域,在移动终端中占据份额最大
Windows:最早是DOS,卖给了IBM,90年代变成Windows,其在桌面领域占统治地位;在服务器和终端领域更多的是Linux,桌面领域能够让普通大众能够使用计算机。
红帽操作系统等。
分时调度:1/1000秒产生一次分时,轮流切换执行,时间很短,感觉在同时执行。
如何中断的?外设——时钟,定时产生中断,把控制权交给操作系统,OS会完成切换的过程。
操作系统演变:主型机计算——个人机计算(Linux、Windows等)——网络计算(IOS、Android)——未来操作系统(云计算、大数据等)
可以让计算去云中心完成,让一个人有大量的机器为之服务。
发展趋势:一台计算机给一群人服务——多台计算机为一个人服务。
三、操作系统结构
uCore操作系统:麻雀操作系统
VMM(虚拟机监视器):使一套硬件上可以跑多个OS
发展出VMM的基础是现在计算的硬件资源过剩,CPU有可多个,可以将数据中心虚拟化,将一台计算机给多个人使用。
四、操作系统的基本操作概述
(1)OS的启动
操作系统OS一开始是放在disk上的(而不是内存),
首先由BIOS(基本I/O处理系统)提供支持:
——BIOS是个人电脑启动时加载的第一个软件,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
再由小程序Bootloader来加载OS,就是让OS从硬盘到内存中去,从而可以让CPU执行OS。CPU的控制权就归OS了,从OS的起始地址开始执行。OS会在内存中执行各种工作。
(2)OS与设备和程序交互
应用程序通过系统调用和异常进行运行,外设通过中断和IO进行处理
系统调用:应用程序主动向操作系统发出服务请求;处理时间是异步/同步时间点
异常:非法指令和其他坏的处理状态,处理时间是同步的时间点。
中断:外设的计时器和网络中断。即外设发出请求,需要处理。处理时间是异步的时间点
应用程序为什么不能直接访问硬件?
——OS是可信任的,安全;OS为上层应用提供简单的接口,这样上层应用就不用关注底层的复杂性,使应用程序开发变得更容易。
中断和异常处理机制:
中断:1)保存当前现场;2)中断服务程序处理;3)清除中断标记;4)回复之前保存的处理状态。
异常:得到一个异常编号(ID号)
1)保存现场;2)异常处理(杀死异常程序、重新执行异常指令);3)恢复现场
系统调用:
来源于应用程序的请求,通过系统调用接口,——应用程序接口(API)
Win32 API 用于Windows,POSIX API用于POSIX-based systems(包括UNIX、LINUX、Mac OS X的所有版本),Java API用于JAVA虚拟机(JVM)
其中,Java API特殊,它不属于系统调用,是JVM提供的支持,由一些库来实现,最底层要看JVM运行在什么底层OS上了。
五、计算机体系结构及内存分层体系
操作系统如何管理物理内存?
(1)计算机体系结构
CPU 内存(存放执行时的程序和数据) 设备(IO) =>由总线连接
CPU:寄存器和cache——物理内存/主存(掉电数据消失)——磁盘(虚内存)
—————————————————————————>越来越慢,空间越来越大
如图,P1-P4是四个程序(进程),正在占用CPU的是P1,其它等待。
P4需要等待更久,所以需要OS将P4导入到磁盘上去,以便让其它程序有更多的空间,P1-P3在主存中轮流执行。
(2)地址空间 & 地址生成
(1)定义:
物理地址空间——硬件支持的,如硬盘和内存条。
逻辑地址空间——一个运行的程序所拥有的的内存范围,便于访问,但最终会放置在主存或硬盘中的。
(2)生成:
逻辑地址生成——eg:c程序(.c)的变量地址是逻辑地址,后面会编译(.s)、汇编(.o)、链接(.exe),最后载入到内存中
六、连续内存分配
(1)内存碎片问题
外部碎片:分配单元之间的未使用内存
内部碎片:分配单元中的未使用内存
(2)第一匹配分配
为了分配n字节,使用第一个可用空闲块,块的尺寸比n大;
——eg:分配400bytes,使用了500 bytes的可用空闲块。