2022-03-25

操作系统:

通信方式:

1.管道:

内核里面的一串缓存,管道传输的数据是无格式的流且大小受限;对于匿名管道其通信范围是存在父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。对于命名管道(也被称作FIFO),它可以在不相关的进程间相互通信。(管道传输数据是单向的)

关于fork()

2.消息队列:

消息队列是保存在内核中的消息链表,发送数据时,会分成若干个独立的数据单元,且也是固定大小。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。消息队列不适合比较大数据的传输,因为在内核中每个消息体逗游戏一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也有上限。消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销。

3.共享内存:

拿出一块虚拟地址空间来,映射到相同的物理内存中,省去了消息队列拷贝数据的开销。

4.信号量:

共享内存的问题在于若多个进程同时修改同一个共享内存,可能会发生冲突。为了防止多进程竞争共享资源,信号量就实现了这一保护机制。信号量是一个整型计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间的通信。

调度算法

1.FCFS(先来先服务)

对长作业有利,适用于CPU繁忙型作业,而不适用于I/O繁忙型作业;

2.SJF(最短作业优先调度)

造成饥饿现象,长作业一直无法执行

3.高响应比算法

优先权=(等待时间+要求服务时间)/要求服务时间

4.时间片轮转调度算法

如果时间片长度太短,会导致过多的进程上下文切换,降低了CPU效率;

如果设得太长又可能引起短作业进程的响应时间变长;

5.最高优先级调度算法

从就绪队列中选择最高优先级的进程进行运行。

进程的优先级可分为静态优先级或动态优先级:

静态:创建进程时就已确定,后面不会更改;

动态:根据进程动态变化调整优先级,如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级。

处理优先级高的方法,也分为非抢占式和抢占式:

非抢占式:当就绪队列中出现优先级高的进程,运行完当前进程,再选择优先级高的进程;

抢占式:当就绪队列中出出现优先级高的进程,当前进程挂起,调度优先级高的进程运行。

缺点:导致低优先级的进程永远不会运行。


多级反馈队列.jpg

多级反馈队列调度算法:

多级表示有多个队列,每个队列优先级从高到低,同时优先级越高时间片越短;

反馈表示如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列。

优先级越高时间片越短的原因:

如果高优先级的任务在就绪队列1无法完成,那么就会放到就绪队列2,虽然等待时间变长,但运行时间也会更长,所以该算法很好的兼顾了长短作业,同时有较好的响应时间。

内存调度算法

虚拟内存.jpg

注意:当发生缺页中断时,必然是不会发生内存越界,因为在之前就已检测过是否越界,若越界则不会访问页表。

最佳页面置换算法:

置换在未来最长时间不访问的页面

先进先出置换算法:

选择在内存驻留时间很长的页面进行置换

LRU算法,最近最久未使用

时钟置换算法

磁盘调度算法

1.先来先服务

2.最短寻道时间优先

可能产生饥饿,原因是磁头在一小块区域来回移动。

3.扫描算法(SCAN)

磁头在一个方向上移动,访问所有未完成的请求,直到磁头到达该方向上的最后的磁道,才调换方向,这就是扫描(Scan)算法。

4.C-SCAN

只有磁头朝某个特定方向移动时,才处理磁道访问请求,而返回时直接快速移动至最靠边缘的磁道,也就是复位磁头,这个过程是很快的,并且返回中途不处理任何请求,该算法的特点,就是磁道只响应一个方向上的请求。

5.LOOK与C-LOOK

磁头在移动到「最远的请求」位置,然后立即反向移动。

那针对 SCAN 算法的优化则叫 LOOK 算法,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中会响应请求。

而针 C-SCAN 算法的优化则叫 C-LOOK,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中不会响应请求

内存管理

Cache写命中时的处理方式:

直写法:

CPU往Cache写数据的同时也往主存中写数据,一直保存数据一致;

由于CPU往主存中写数据很慢,所以需要一个写缓冲队列。

写回法:

当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。减少了访存次数,但存在数据不一致的隐患。

未命中时:

写分配法:

先将数据从主存调入Cache,然后再对Cache进行写,最后用写回法将Cache中的数据写回主存。

非写分配法:

CPU直接写入主存,不与Cache交互。

参考资料:
小林coding的图解系统

你可能感兴趣的:(2022-03-25)