简短描述操作系统的进化史
操作系统的历史
1.第一代计算机,无操作系统,内存无虚拟机制,一段时间一个人。
借由纸卡为输入程序,输入数据,操作结果借由纸卡输出。
2.第二代,改良为批处理,一次性输入数个程序及数据,然后会输出到指定编号的打印机上。(操作系统雏形)
3.第三代,改良为多道程序设计,即批处理遇到io阻塞交出cpu权限。提高cpu利用率(操作系统发展,有切换作业功能)
但因为没有独享内存,并且还是批处理机制(若其中一个发生异常,整体的输出时间会变得很长,并且内存共
享,调试困难)。刚出来的时候,很多人反而怀念第一代。(和第二代一样存在用户与用户不能独享计算机的矛 盾,因为输出,调试程序都会受到其他用户的牵制)
4.第四代,分时操作系统(多个联机终端+共享CPU共享内存)刚出来的时候没有流行开来是因为各个用户内存分不开来,分割内存从软件上无法实现,直到硬件上实行了分割内存后才流行开来。
因为内存不能划分的问题没有解决(所以本质上还是批处理,即其中一个用户的程序有bug,可能会造成整体一起崩掉)。直到后来硬件方面做出了进化,因为内存划分只能靠硬件,软件无能为力
5.后面就是个人计算机时代了
操作系统的角色定位
操作系统位于计算机硬件与应用软件之间,本质也是一个软件。是所有程序的老大,负责管理所有程序。
操作系统由操作系统的内核(运行于内核态,管理硬件资源)
以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口,例如操作着程序对硬件资源的访问)两部分组成,
所以,单纯的说操作系统是运行于内核态的,是不准确的。
那什么是用户态?什么是内核态呢?
用户态是用户定义普通变量那些,内核态用于操纵硬件
用户态和内核态不是像表面一样分割内存(1G内核空间,3G用户空间),而是通过限制CPU的指令集来限制。
借由有一个状态寄存器专门记录是否为用户态和内存态。
当该状态寄存器为0时,为内核态,CPU拥有了所有操作硬件的指令集
当该状态寄存器为1时,为用户态,CPU没有操作硬件,IO等指令集,即没有权限(能力)操作这些操作
例如:缓存IO
一般socket的send,先发到用户态缓存-->用户态缓存拷贝到内核态缓存---->操作系统操纵发送给对方
至于为什么这样搞?因为操作网卡这些硬件的只能是操作系统内核
操作系统的作用
优化操作接口
硬件厂商需要为操作系统提供自己硬件的驱动程序(设备驱动,这也是为何我们要使用声卡,就必须安装声卡驱动。。。),厂商为了节省成本或者兼容旧的硬件,它们的驱动程序是复杂且丑陋的,操作系统就是为了隐藏这些丑陋的信息,并且为不同驱动抽象出同一使用方法,从而为用户提供更好的接口
这样用户使用的shell,Gnome,KDE看到的是不同的界面,但其实都使用了同一套由linux系统提供的抽象接口
管理程序和提供系统调用
1.记录哪个程序使用什么资源
2.对资源请求进行分配
3.为不同的程序和用户调解互相冲突的资源请求。
由于现代计算机或者网络都是多用户的,多个用户不仅共享硬件,而且共享文件,数据库等信息,共享意味着冲突和无序。
我们可将上述操作系统的功能总结为:处理来自多个程序发起的多个(多个即多路)共享(共享即复用)资源的请求,简称多路复用
扩展:多路复用有两种实现方式
1.时间上的复用
当一个资源在时间上复用时,不同的程序或用户轮流使用它,第一个程序获取该资源使用结束后,在轮到第二个。。。第三个。。。
例如:只有一个cpu,多个程序需要在该cpu上运行,操作系统先把cpu分给第一个程序,在这个程序运行的足够长的时间(时间长短由操作系统的算法说了算)
或者遇到了I/O阻塞,操作系统则把cpu分配给下一个程序,以此类推,直到第一个程序重新被分配到了cpu然后再次运行,
由于cpu的切换速度很快,给用户的感觉就是这些程序是同时运行的,或者说是并发的,或者说是伪并行的。
至于资源如何实现时间复用,或者说谁应该是下一个要运行的程序,以及一个任务需要运行多长时间,这些都是操作系统的工作。
2.空间上的复用
每个客户都获取了一个大的资源中的一小部分资源,从而减少了排队等待资源的时间。
例如:多个运行的程序同时进入内存,硬件层面提供保护机制来确保各自的内存是分割开的,且由操作系统控制,这比一个程序独占内存一个一个排队进入内存效率要高的多。
有关空间复用的其他资源还有磁盘,在许多系统中,一个磁盘同时为许多用户保存文件。分配磁盘空间并且记录谁正在使用哪个磁盘块是操作系统资源管理的典型任务。
这两种方式合起来便是多道技术
空间上的复用最大的问题是:程序之间的内存必须分割,这种分割需要在硬件层面实现,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,
首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。
其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃。