文章目录
一、简介
操作系统是管理计算机硬件的软件。硬件必须提供适当机制,以确保计算机系统正确运行并且防止用户程序干扰系统的正常运行。
二、功能与组成
1、中间件:为应用程序开发人员提供其他功能的软件框架
2、CPU与设备控制器可以并发执行,并且竞争访问内存。
三、计算机系统的运行
1、开机的时候都发生了什么
当计算机电源打开或者重启以便开始运行时,它需要一个初始程序。该初始程序或引导程序通常很简单,一般位于计算机固件,如制度内存ROM,或电可擦可编程只读内存EEPROM。它初始化系统各个组件,从CPU寄存器,设备控制器到内存内容。引导程序必须知道如何加载操作系统并且开始执行系统。为了完成这个目标,一道程序必须定位操作系统内核并且加载内存
2、系统进程
系统程序在启动时加到内存而成为系统进程或系统后台程序,其生命周期和内核一样,对于linux和unix是首个系统进程init
3、软硬中断
硬件可以随时通过系统总线发送信号到CPU,以触发中断。软件可以通过执行系统调用触发中断
四、存储机构
1、cpu只能从内存中加载指令,因此执行程序必须位于内存
原因:
因为cpu运行所需的数据带宽非常大,而大的数据带宽只有CPU内部的L1,L2,L3(缓存)和主板上的内存才能满足,所以程序必须事先从外存加载到内存再由CPU调用。
2、存储设备层次
易失:寄存器,高速缓存,内存
不易失:固态硬盘,硬盘,光盘,磁带
注:当两个存储组件的访问时间或传输速率具有明显差异时,可以通过高速缓存来改善性能
五、CPU运行原理
1、①提取②解码③执行④写回
在冯诺依曼体系结构上运行时,一个典型的指令执行周期是,首先从内存中获取指令,并存到指令寄存器。接着,该指令被解码,也可能会从内存中获取操作数据并且存到内部寄存器。在指令完成对操作数据的执行后,结果也可存到内存。
冯诺依曼:
存储程序计算机在体系结构上主要特点有
①以运算单元为中心
②采用存储程序原理
③存储器是按地址访问、线性编址的空间
④控制流由指令流产生
⑤指令由操作码和地址码组成
⑥数据以二进制编码)
详细见:一条指令在cpu中的执行流程(理解CPU组成)https://blog.csdn.net/aigoogle/article/details/23750257
2、CPU通过中断得知内存操作何时结束
六、计算机系统体系结构
1、单处理器系统
只有一个通用CPU
2、多处理器系统(并行系统)
优点:
①增加吞吐量:多个CPU同时协作完成一个任务
②规模效益:价格便宜
③增加可靠性:单个处理器失灵不会使得整个系统停止,而只会使使它变慢
3、多处理器系统分类
①非对称处理系统:即每个处理器都有各自特定的任务。一个主处理器控制系统,其他处理器或者向主处理器要任务或者预先规定任务,即只有一个处理器做主,产生主从关系
②对称多处理SMp
每个处理器都能参与完成操作系统的所有任务
4、多核设计的好处
集成多个计算核到单个芯片。单片通信比多个芯片通信更快,多核芯片的电源消耗比单核芯片低得多
5、集群系统
非对称集群:一台处于热备份模式,另外一台运行应用程序。热备份主机只监视活动服务器。如果活动服务器失效,那么热备份主机变为活动服务器。
每个集群由通过网络连接的多个计算机系统组成,提供高性能计算。将一个程序分成多个部分,而每个部分可以并行运行在计算机或集群计算机的各个核上,最后将所有结果合并在一起来解决问题。
七、操作系统的结构
1、多道程序系统
提供环境以便充分使用各种系统资源,操作系统在内存中同时保存多个任务,由于主存太小不能容纳所有作业,因此这些作业首先保存在磁盘的作业池上。该作业池包括磁盘上的,等待分配内存的所有进程,但是没有提供用户与计算机系统的交互
2、分时系统
是多道程序系统延伸,CPU仍然通过切换作业(上下文切换)来执行多个作业,但是由于借还频率很高,用户可以在程序运行时与其交互
八、操作系统的运行
定时器
在指定周期后中断计算机,定时器每秒产生一次中断,计数器响应递减1。只要计数器的值为正,控制器就返回到用户程序。当计数器值为负值时,操作系统就会中止程序执行,因为它超过了设置的时间限制。
九、进程管理
进程是系统的工作单元,通过在单CPU上采用多路复用来实现系统进程和用户进程的并发执行
I/O多路复用: 创建一组文件描述符,告诉内核通过每个文件描述符做什么,使用一个线程来阻塞函数调用直到至少一个文件描述符的请求和操作相同
举个栗子:
如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事。如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了,而类似与select或epoll这样的多路I/O复用机制就好比是摄像头的功能,它们能够把多个I/O端口的状况反馈到同一处,比如某个特定的文件描述符上,这样应用程序只需利用对应的select()或epoll_wait()系统调用阻塞关注这一处即可。
linux下常见的I/O多路复用
1、select
①单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;(在linux内核头文件中,有这样的定义:#define __FD_SETSIZE 1024)
②内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销;
③select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。
2、poll
① poll使用链表保存文件描述符,因此没有了监视文件数量的限制
②不要求用户计算编号最高的文件描述符加1,对于大值文件描述符更有效,不用像select按每个值一位去找,只需在数组中找
③拷贝和遍历仍然存在缺陷
3、epoll
①epoll通过在Linux内核中申请一个简易的文件系统(文件系统一般用B+树实现)。
②可在等待时添加或删除文件描述符,返回具有准备文件描述符的对象,只是把要传递的fd通过mmap来传递,避免fd拷贝。
③红黑树是用来存储这些描述符的,因为红黑树的特性,就是良好的插入,查找,删除性能O(lgN)
④ 当内核创建了红黑树之后,同时也会建立一个双向链表rdlist,用于存储准备就绪的描述符,当调用epoll_wait的时候在timeout时间内,只是简单的去管理这个rdlist中是否有数据,如果没有则睡眠至超时,如果有数据则立即返回并将链表中的数据赋值到events数组中。
⑤对与rdlist的维护:当执行epoll_ctl时除了把socket描述符放入到红黑树中之外,还会给内核中断处理程序注册一个回调函数,告诉内核,当这个描述符上有事件到达(或者说中断了)的时候就调用这个回调函数。这个回调函数的作用就是将描述符放入到rdlist中,所以当一个socket上的数据到达的时候内核就会把网卡上的数据复制到内核,然后把socket描述符插入就绪链表rdlist中。
水平触发:文件描述符非阻塞的执行I/O,允许任意时刻重复检测
边缘触发:上次改变后,有新的I/O来会触发通知,即信号驱动I/O,没有完成,下一次才能获取fd
详见:
(引用的参考资料比较详细)https://www.cnblogs.com/creazylinux/p/7364685.html
(epoll内部实现关于红黑树)https://www.cnblogs.com/charlesblc/p/6242479.html
(下面讲了ET和LT区别)https://zhuanlan.zhihu.com/p/20315482
(epoll源码解析) ① https://www.cnblogs.com/apprentice89/p/3234677.html
② https://watter1985.iteye.com/blog/1614039
(红黑树和B+树详解)https://blog.csdn.net/xiaqunfeng123/article/details/52534468
十、内存管理
内存一般是CPU所能直接寻址和访问的、唯一的、大容量的存储器。如果CPU需要处理磁盘数据,那么这些数据必须首先通过CPU产生I/O调用传到内存。同样,如果CPU需要执行指令,那么这些指令必须在内存中。为改进CPU的利用率和用户的计算机响应速度,通用计算机应在内存中保留多个程序,这就需要内存管理
十一、同一数据可靠那个出现在储存系统的不同层次上
磁盘->内存->告诉缓存->硬件寄存器
只有在A的新值从内部寄存器写到磁盘时,A的值才会在不同存储系统中一样
在多处理器环境下,A值拷贝可能出现在多个缓存上,由于多个CPU并行执行,应确保位于一个高速缓存的A值跟新,应马上反映到所有其值A所在的告诉缓存。