博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试——操作系统
阅读量:4303 次
发布时间:2019-05-27

本文共 3180 字,大约阅读时间需要 10 分钟。

进程与线程

进程

是对程序的封装,是个进程有独立的空间,是系统进行资源调度和分配的基本单位。

线程是进程的子任务,是CPU调度和分派的基本单位。用于保证程序的实时性,实现进程内部的并发。每个线程拥有**独自的虚拟处理器,独立的寄存器组,指令计数器,和处理器状态,栈段,每个线程完成自己的任务,**但是共用地址空间。

区别:

  • 一个线程只能属于一个进程,但一个进程允许有多个线程

  • 一个进程可以分配的线程数量取决于进程分配虚拟空间的大小和线程栈段的大小。

  • 进程在运行时拥有自己独立的内存单元,线程共享进程的内存。

  • 进程编程调试可靠性高,但是创建销毁的开销很大,线程编程相反,开销小但是编程调试较为复杂。

通信方式

进程的通信方式

  1. 管道(pipe)

    允许一个进程和另一个与它有共同祖先的进程之间进行通信
    命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建

  2. 消息队列(MQ):消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能成该无格式字节流以及缓冲区大小受限等缺点;

  3. 共享内存(shared memory):它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥

    信号量(semaphore):信号量主要作为进程间以及同进程不同线程之间的同步手段;

  4. 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身

  5. Socket:它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信

线程的通信方式

信号:类似进程间的信号处理

锁机制:互斥锁、读写锁和自旋锁

条件变量:使用通知的方式解锁,与互斥锁配合使用

信号量:包括无名线程信号量和命名线程信号量

进程调度算法

先来先服务算法

只考虑就绪的先后,按就绪队列给进程分配资源

短作业优先算法

对预计处理时间短的作业优先分配资源

轮转法

让每个进程在就绪队列中等待的时间与享受服务时间成正比例

多级反馈队列算法,

设置多个就绪队列分别赋予优先级,较高的优先级队列分配较少的时间片

优先级调度

为每个进程分配一个优先级,按优先级进行调度。

磁盘调度算法

为什么有磁盘调度算法?

  • 在多道程序设计的计算机系统中,各个进程随时都可能提出对磁盘进行读写的请求。因为进程请求速度远高于磁盘读写速度,所以我们会为磁盘设备建立一个等待队列,然后按照调度算法,来调度磁盘执行读写操作。

先来先服务FIFO

按照磁盘请求的顺序进行调度。

优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

最短寻道时间优先SSTF

优先调度与当前磁头所在磁道距离最近的磁道。

虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两端的磁道请求更容易出现饥饿现象。

电梯扫描算法

电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。

电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。

因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

页面置换算法

OPT:最佳替换算法(optional replacement)

替换下次访问距当前时间最长的页。opt算法需要知道操作系统将来的事件,显然不可能实现,只作为一种衡量其他算法的标准。

最近最少使用(Least Recently Used).

替换上次使用距离当前最远的页。根据局部性原理:替换最近最不可能 访问到的页。性能最接近OPT,但难以实现。可以维护一个关于访问页的栈或者给每个页添加最后访问的时间标签,但开销都很大。

(哈希和双向链表)

FIFO:先进先出(First In First Out)

将页面看做一个循环缓冲区,按循环方式替换。这是实现最为简单的算法,隐含的逻辑是替换驻留在内存时间最长的页。但由于一部分程序或数据在整个程序的生命周期中使用频率很高,所以会导致反复的换入换出。

Clock:时钟替换算法(Clock)

给每个页帧关联一个使用位。当该页第一次装入内存或者被重新访问到时,将使用位置为1。每次需要替换时,查找使用位被置为0的第一个帧进行替换。在扫描过程中,如果碰到使用位为1的帧,将使用位置为0,在继续扫描。如果所谓帧的使用位都为0,则替换第一个帧。

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。如下图所示,P1拥有S1资源,P2拥有S2资源,这时候P1、P2又互相请求对方的资源,可是资源被占用着,若没有外力介入就会造成一直互相等待的僵局

产生条件

互斥条件:

进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

不可剥夺条件:

进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

请求与保持条件:

进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:

存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。

解决策略

  1. 鸵鸟策略

    可以忽视这个问题,认为死锁不可能在系统内发生。

  2. 死锁检测与死锁恢复

    可以允许系统进入死锁状态,然后检测它,并加以恢复。
    抢占资源
    回滚恢复
    杀死进程

  3. 死锁预防

    破坏互斥条件
    破坏占有等待条件
    破坏不可抢占条件
    破坏环路等待条件 给资源统一编号,进程只能按编号顺序来请求资源。

  4. 死锁避免 - 银行家算法

协程

协程是用户态的一种轻量级线程,协程拥有自己的上下文和栈,协程调度时可以把上下文和栈保存在其他地方,协程能保留上一次调用时的状态,再次运行时能直接进入上次的状态。

协程的好处:

无需线程上下文切换的开销

无需原子操作锁定及同步的开销
方便切换控制流,简化编程模型

分段分页存储

页式管理

基本原理是将各进程的虚拟空间划分为若干个长度相等的页。把内存空间按页的大小划分为片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表,并用相应的硬件地址转换机构来解决离散地址变换问题

页是信息的物理单位

段式管理的基本思想是把程序按内容或过程函数关系分成段,每段有自己的名字。

段是信息的逻辑单位
它含有一组其意义相对完整的信息 一个用户作业或者进程所包含的段对应一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。

分页是出于系统管理的需要,分段是出于用户应用的需要

页大小是系统固定的,而段大小则通常不固定。

分页是一维的,程序员只需用一个记忆符,即可表示一个地址;而分段是二维的,程序员在标识一个地址时,既要给出段名,又需给出段内地址。

通常段比页大,因而段表比页表短,可以缩短查找时间,提高访问速度

页和段都有存储保护机制。但存取权限不同:段有读、写和执行三种权限;而页只有读和写两种权限

转载地址:http://egqws.baihongyu.com/

你可能感兴趣的文章
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
X 分钟速成 Python
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>