自学内容网 自学内容网

操作系统常用知识总结(基本结构+磁盘+进程)

文章收录在网站: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)!