操作系统常用知识总结(基本结构+磁盘+进程)
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
基本结构
冯诺依曼计算机模型
现代计算机模型是基于冯诺依曼计算机模型。
计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。
接下来,再取出第二条指令,在控制器的指挥下完成规定操作,依此进行下去。直至遇到停止指令。
计算机组成部分:
控制器(Control):
- 功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。
运算器(Datapath):
- 运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。
存储器(Memory):
- 存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。
输入(Input system):
- 输入设备与输出设备合你为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。
- 常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。
输出(Output system):
- 它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。
- 微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等。
磁盘
磁盘调度算法
读写一个磁盘块的时间的影响因素有:
- 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
- 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
- 实际的数据传输时间
其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。
先来先服务
FCFS, First Come First Served,按照磁盘请求的顺序进行调度。
优点是公平和简单,缺点是:因为未对寻道做任何优化,使平均寻道时间可能较长。
最短寻道时间优先
SSTF,优先调度与当前磁头所在磁道距离最近的磁道。
虽然平均寻道时间比较低,但是不够公平。
如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。
具体来说,两端的磁道请求更容易出现饥饿现象。
电梯算法
电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。
因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。
进程
进程和线程
进程:正在执行的应用程序,线程是轻量级的进程, 进程是分配资源的基础单位。
线程:轻量级进程,是程序执行的基本单位。
线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。
每个进程都有独立的代码和数据空间(程序上下文),程序间的切换开销大,每个线程都有自己独立的运行栈和程序计数器(PC),线程间切换开销小。
互斥和同步区别
互斥:是指在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。
同步:是指在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。
孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。
僵尸进程
一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程(这个子进程)称之为僵尸进程。
如何清除僵尸进程?
改写父进程,为子进程收尸:具体做法是接收SIGCHLD信号,子进程死后会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为其(子进程)进行收尸。
就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,默认处理为忽略,我们可以设置一个函数来对其进行处理。
如果把这个子进程(僵尸进程)的父进程杀掉,僵尸进程会变为孤儿进程,由init进程进行管理,init负责进行清理僵尸进程。
守护进程
守护进程就类似于一个后台进程。
进程状态
创建状态:
- 进程由创建而产生。
就绪状态:
- 进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。
运行状态:
- 进程已经获取CPU,其进程处于正在执行的状态。
阻塞状态:
- 正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。
终止状态
进程通信
管道:
写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则。
管道这种通信方式效率低,不适合进程间频繁地交换数据。
消息队列:
消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制。
消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。
共享内存:
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。
这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。
信号量:
用了共享内存通信方式,带来新的问题,那就是如果多个进程同时修改同一个共享内存,很有可能就冲突了。
例如两个进程都同时写一个地址,那先写的那个进程会发现内容被别人覆盖了 。
为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。
正好,信号量就实现了这一保护机制。
信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
信号:
信号是进程间通信机制中唯一的异步通信机制,因为可以在任何时候发送信号给某一进程。
Socket:
要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。
操作系统执行一个程序的过程
操作系统检测类型是否是可执行文件。
创建进程,并且将可执行文件映射到该进程。
为该进程设置CPU上下文环境。
将代码和数据从磁盘读入内存。
运行过程中发生缺页异常则重复4。
死锁
多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放其他资源,在未改变这种状态之前都不能向前推进,多个进程无限期相互等待 的一种状态。
四个必要条件
死锁产生的 4 个条件(有一个条件不成立,则不会产生死锁):
互斥:一个资源一次只能被一个进程使用
请求与保持:一个进程因请求资源而阻塞时,对已获得资源保持不放
非抢占:进程获得的资源,在未完全使用完之前,不能强行抢占
循环等待:若干进程之间形成一种头尾相接的环形等待资源关系
死锁处理方法
死锁的四个处理方法:
鸵鸟策略:忽略掉死锁,视而不见
死锁检测与恢复:允许死锁发生,检测它们是否发生,一旦发生死锁,就采取行动解决问题
死锁避免:仔细对资源进行分配,动态地避免死锁,银行家算法是避免死锁的经典算法
死锁预防:破坏引起死锁的 4 个必要条件
银行家算法
银行家算法的主要思想是避免系统进入不安全状态。
在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,如果有,则先进行分配,并对分配后的新状态进行安全性检查。
如果新状态安全,则正式分配上述资源,否则就拒绝分配上述资源,这样,它保证系统始终处于安全状态,从而避免死锁现象的发生。
安全状态
安全状态与不安全状态的区别是,从安全状态出发,系统能够保证所有的进程都能完成;而从不安全状态出发,没有这样的保证。
活锁
活锁指进程并没有被阻塞,但由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。
进程仍可以在 CPU 上活动,但 CPU 时间片执行完了之后又下了 CPU,进程没有任何进展但也没有阻塞。
饥饿
进程无限等待的情况。饥饿 ≠ 死锁,但是饥饿至少有一个进程的执行被无限期推迟。
产生饥饿的原因:往往是由于资源分配策略的 不公平性 导致的,比如短作业优先。
此时系统虽然没有发生死锁,某些进程也可能会一直得不到 CPU 的使用权而长时间等待。
当 饥饿 到一定程度,进程任务即使完成也不再具有实际意义时称该进程被饿死。
原文地址:https://blog.csdn.net/qq_35508033/article/details/140600172
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!