操作系统是什么?
操作系统(Operating Systems)是一个复杂的软件,因此很难给它下一个精确的、完整的定义。
但是可以从功能和结构上定义。
功能上:(从对上和对下的角度来考虑)
- 对上,也就是在用用户角度上:
操作系统是一个控制软件。
它可以管理应用程序,为应用程序提供各种各样的服务(IO服务,声卡服务)。
杀死应用程序。
- 对下,对操作系统管理的东西来说,它是一个资源分配的分配器。
协调好cpu、内存、磁盘、外设等系统资源的分配,使计算机内部协调有序的工作。
将cpu抽象(虚拟化)成进程、磁盘抽象成文件、内存抽象成地址空间供应用程序使用
操作系统的层次结构
-
硬件之上 应用程序之下 有承上启下的作用。
它是中间层次的软件。 -
在软件的层次上,它是一个系统软件。
-
面向应用程序时,它提供了一个接口,把它称为shell(外壳)。
面向系统内部时,称为kernel(内核)。内核在外壳之下。
Linux(命令行方式)、Windows(GUI)、Android的界面属于外壳,而不是内核。
学习操作系统主要关注的是内核,关注操作系统内部是怎样实现的。
kernel内部主要组件
1.CPU调度器
2.物理内存管理
3.虚拟内存管理
4.文件系统管理(disk)
5.中断处理与设备驱动
kernel的特征
1. 并发
并发是指某一个时间段计算机系统中同时存在多个运行的程序,需要OS管理和调度。
并行是指某一个时间点上,有多个同时运行的程序。并行运行方式必须是计算机里有多个CPU.
2.共享
在访问资源时,存在“同时”访问,和互斥共享。
根据资源的属性来决定,比如内存1和内存2就可以同时访问。
3.虚拟
操作系统面对的是硬件,它会将内存虚拟化成地址空间,硬盘虚拟化成文件系统,cpu虚拟化成进程。
它利用多道技术,让每个用户都觉得有一个计算机专门为它服务。
4.异步
程序的执行并不是一贯到底,而是走走停停,向前推进的速度不可预知。
但只有运行环境相同,输入相应,OS需要保证程序运行的结果也要相同。
为什么要学习OS
综合课程:
程序设计语言、数据结构、算法、计算机体系结构等知识。
操作系统已经很成熟了,为什么还要学习?
操作系统还在不停的发展,工控等领域还有强烈的需求。
操作系统很有用,有挑战。
操作系统领域顶级的会议:SOSP USENIX 都是(每两年开一次)
在学习操作系统时,如果牵扯到代码,只需要了解自己感兴趣的核心内容,不可能完全掌握,因为它的代码量十分庞大,以Windowsxp为例,它有45000行左右。
操作系统是系统安全的基础。
学习操作系统时,要注意,由于操作系统和硬件的的发展,很多功能已经不需要操作系统来操作,而是由硬件本身管理。例如磁盘调度和IO调度等。
在学习操作系统时要站在系统的角度上,而不是关注某一个小点。
操作系统需要==权衡 (系统级)==空间与时间 性能和可预测性 以及公平和性能。
底层,硬件方面,操作系统需要实现良好的硬件管理和合理的资源分配。例如:硬盘速度和cpu、内存相差很多,操作系统需要协调处理。
os的历史
单用户处理阶段(os只起到加载作用)——>批处理阶段(流水线化,cpu等硬件迅速发展)——>内存的容量变大,可把程序放在内存里,cpu可执行多个程序。——>多道程序设计,
cpu切换将资源给谁,它会产生中断。切换调度。——>分时系统(更好的实现用户交互)
分时为千分之一秒,系统在将第一个程序执行完成后(千分之一秒)迅速处理下一个程序。轮流切换执行。((外设)时钟每千分之一秒产生一次中断,使得操作系统切换)——>个人电脑操作系统(重点是用户界面和IO交互)——>分布式操作系统(数据中心和客户端)——>云计算、嵌入式设备等。
os的启动
操作系统是放在硬盘上的 ,按下启动键之后由BIOS(基本IO系统)提供支持,让操作系统检测外设。(BIOS会从一个指定地址来加载)之后操作系统再加载软件,运行程序。
Bootloader: 加载OS,让OS从硬盘加载到内存中区,让CPU执行OS.
启动时包括:
(1)POST(加电自检)
(2)寻找显卡和执行BIOS(初始化检查外设,键盘等,把Bootloader(原来在硬盘的第一个扇区,512个字节)放进内存——>cpu的控制权由Bootloader掌握——>找到os的起始扇区,加载os,cpu的控制权交给os)
操作系统与设备和程序交互
操作系统的interface是什么?
面向外设:中断
面向系统: 系统调用 和 异常
为什么应用程序不能直接访问外设呢?
1.内核是被信任的第三方
2.只要内核才能执行特权指令
3.为了方便应用程序,屏蔽复杂性
中断、异常、系统调用的特点和差异
异步:操作系统不知道事件什么时候产生。
同步:执行到某个指令时一定会产生,如某个除零的指令。
系统调用的异步: 当系统发出某个请求时是同步的(请求点),请求返回的时间是可能是异步的也可能是同步的。
中断和异常的处理机制
1.对不同的中断应该设置不同的编号。标志中断是由哪个服务来服务的 。
key(中断编号) 地址 ,查找中断表。
中断的保存与恢复机制,让系统完成中断之后,恢复,继续运行。
系统调用
java的api不是系统调用,它是为jvm服务的。最终还是通过各个操作系统的API来实现系统调用。
内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。特权。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
为什么要有用户态和内核态?
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 – 用户态和内核态。
当应用程序发出一个系统调用时,会完成用户态到内核态的转化,使得控制权从应用程序到OS.
当执行系统调用时,会有态的转化和堆栈的转化,带来较大的开销(比函数调用)。更安全,可靠。
操作系统跨越边界的代价
操作系统的中断、异常、和系统调用、会跨越操作系统和外设、和应用程序 的边界
操作系统的堆栈和应用程序的堆栈不一样。
这些开销时是值得的,也是必须的。