操作系统相关知识点总结

进程、线程的区别

进程是对运行时程序的封装,是系统进行资源调度和分配的基本单元,实现了操作系统的并发

线程是进程的子任务,是CPU调度和分配的基本单元,用于保证程序的实时性,实现进程内部的并发

一个程序至少拥有一个进程,一个进程至少拥有一个线程,线程依赖于进程而存在

进程在执行过程中拥有独立的内存单元,而多个线程共享进程内存

 

进程间通信的几种方式

管道以及命名管道:管道可以用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能之外,还允许无亲缘关系进程间的通信

信号:是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

消息队列:是消息的链接表,客服了上边两种通信方式中信号量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新信息,对消息队列有读权限的进程则可以从消息队列中读取信息

共享内存:最有用的进程间通信方式,使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新,这种方式需要依靠某种同步操作,例如互斥锁和信号量等

信号量:主要作为进程之间以及同一种进程的不同线程之间的同步和互斥手段

套接字:一种更为一般的进程间通信机制,可以用于网络中不同机器之间的进程间通信,应用十分广泛

 

线程同步与异步

线程同步:是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低   

线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制

一个进程启动的多个不相干的线程,他们互相之间的关系为异步

同步必须执行到底后才能执行其他的操作,而异步可以任意操作

同步的好处:解决了线程安全的问题

同步的弊端:每次都有判断锁,降低了效率

同步的前提:

1. 多个线程执行的时候需要同步,如果是单个线程则不需要同步

2. 多个线程在执行的时候是不是需要同一把锁,如果是,则是同步,如果不是则不是同步

线程异步指的是解决类似执行耗时任务的时候界面控件不能使用的问题,如创建一个次线程去专门执行耗时的任务。这样,两个线程之间通过线程调度器短时间内切换,就能模拟出多个任务同时被执行的效果。

线程异步往往是通过创建多个线程去执行多个任务,多个工作线同时开工,互不干扰。

并发问题:

线程是独立执行的单元,可以访问共享的数据,也就是锁,在拥有多个线程的程序中,每个线程都可以访问同一个共享的数据,那么就会有问题:由于线程调度器会随机地挂起某个宪曾,所以当线程a访问数据D时,如果在完成之前a被挂起,则这时候D是不稳定的数据,这时如果线程b也去访问数据D,那么就会产生非常难以发现的bug,因为是随机发生的,产生的结果不可预测。

为了解决并发问题,引入了线程同步的机制。线程同步可以放置多个线程同时访问某个共享的资源。做法很简单,标记访问某个共享资源的某个代码,当程序运行到有标记的地方的时候,CLR对各个线程进行调整,如果已经有线程在访问了,大家就许哟啊排队。

 

线程同步的方式

互斥量 Synchronized/Lock:采用互斥对象的机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,因此可以保证公共资源不会被多个线程同时访问

信号量Semphare:允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问该资源的最大线程数量

事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

 

死锁

概念:在两个或多个并发进程中,如果每个进程持有某种资源而又等待其他进程释放它或者它们现在保持着的资源,在未改变这种状态之前程序不能继续向前推进,则称这一组进程产生了死锁。通俗地讲,就是两个或多个进程无限期地阻塞,相互等待的一种状态。

死锁产生的四个必要条件:

1. 互斥  至少有一个资源必须属于非共享模式,即一次只能被一个进程调用,如果其他进程申请使用该资源,则必须等待到该资源被释放为止

2. 占有并等待  一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有

3. 非抢占  进程不能被抢占,即资源只能被进程在完成任务后资源被释放

4. 循环等待  若干进程之间形成一种头尾相接的环形等待资源关系

死锁处理的基本策略与常用方法:

解决死锁的基本方法主要有:预防死锁,避免死锁,解除死锁,鸵鸟死锁等

1. 预防死锁

预防死锁的基本思想是,只要确保上述死锁发生的四个必要条件中至少一个不成立,就可以预防死锁的发生,具体方法包括:

a 打破互斥条件:允许进程同时访问某些资源,但是有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此这种办法通常没有实用价值

b 打破占有并等待条件:可以实行资源预先分配策略(进程在运行之前向系统申请它所需要的全部资源,如果所需要的全部资源无法满足,则不分配任何资源,此进程暂时不运行,只有当系统能够满足当前进程所需要的全部资源的时候,才一次性将所申请的全部资源分配给该进程),或者只允许进程子啊没有占用资源的时候才可以申请资源(一个进程可以申请一些资源并且使用它们,但是在当前进程申请更多资源之前,必须释放当前占有的所有资源)。这种策略的缺点是,在很多情况下,无法预知一个进程执行前所需要的全部资源,因为进程是动态执行的,不可预知的,并且会降低资源的利用率,进而导致降低进程的并发性。

c 打破非抢占条件:允许进程强行从占有者那里夺取某些资源进行使用,也就是说,当一个进程占有了一部分资源,在申请新的资源且得不到满足的时候,它必须释放所有占有的资源以便于让其它线程使用。这种方法实现困难,并且降低系统性能。

d 打破循环等待条件:实行资源有序分配策略,对所有的资源排序编号,所有进程对资源的请求必须严格按照资源序号递增的顺序提出,只有先占有了小号资源才可以申请大号资源。

2. 避免死锁

死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。所谓的安全状态指的是,如果系统按照某个顺序为每个进程分配资源,那么系统就是安全的,也就是说如果存在一个安全序列,那么系统就处于安全状态。资源分配图算法和银行家算法是两种经典的死锁避免的算法,可以确保系统始终处于安全状态。

3. 死锁解除

死锁解除的两种基本方式是进程终止和资源抢占,进程终止指的是终止全部死锁进程或者一次只终止一个进程一直到取消死锁循环位置;资源抢占指的是从一个或者多个死锁进程中抢占一个或者多个资源,此时要考虑三个问题:

a  选择一个牺牲品

b  回滚到安全状态

c 饥饿,在代价因素中加上回滚次数,回滚的次数越多越不可能作为牺牲品,避免一个进程总是被回滚

 

进程又哪几种状态

就绪状态:进程已经获得除处理机之外的所需资源,等待分配处理机资源

运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数

阻塞状态:进程等待某种状态,在条件满足之前无法执行

进程的三种状态.jpg-14.1kB

 

线程有哪几种状态

在虚拟机中,线程从最初的创建到最终的消亡,要经历若干种状态,分别是创建,就绪,运行,阻塞,等待,时间等待和消亡,在某一个时刻一个线程只能处于一种状态。

线程的状态.jpg-59.9kB

 

分页和分段的区别

段式存储管理是一种符合用户视角的内存分配管理方案,在段式存储管理中,将程序的地址空间划分为若干段,如代码段,数据段,堆栈段;这样每个进程中有一个二位地址空间,相互独立,互不干扰,段式管理的优点是,不会产生内碎片,因为段的大小是可变的,可以通过改变段的大小来消除内碎片。但是段在换入换出的时候,会产生外碎片。

页式存储管理方案是一种用户视角内存与物理内存相互分离的内存分配管理方案,在页式存储管理中,将程序的逻辑地址划分为固定大小的页,而物理内存划分为同样大小的帧,程序在加载时,可以将任意一页放入内存中的任意一帧,这些帧不需要连续,从而实现了离散分离。页式存储的优点是,没有外碎片(因为页的大小固定),但是会产生内碎片(一个页的内存可能没有完全使用)

两者的不同点:

目的不同:分页是由于系统管理的需要而不是用户的需要,它是信息的物理单位;分段的目的是为了更好地满足用户的需要,是信息的逻辑单位,含有一组其意义相对完整的信息

大小不同:页的大小固定且由系统决定,而段的长度不固定,由其所完成的功能决定

地址空间不同:段向用户提供二维地址空间,页向用户提供一维地址空间

信息共享:段是信息的逻辑单位,便于存储保护和信息共享,而页的保护和共享受到限制

内存碎片:页式存储的优点是没有外碎片,但是又内存片;而段式管理的优点是没有内碎片,但是换入换出的时候会产生内碎片。

 

操作系统中进程调度的策略

FCFS:先请求CPU的进程先分配到CPU,先来先服务,队列实现,非抢占

SJF:最短迆优先调度算法,平均等待时间最短,但难以知道下一个CPU区间长度

优先级调度算法:可以是抢占的,也可以是非抢占的,优先级越高越先分配CPU,相同优先级先到先服务,存在的问题是低优先级进程无穷等待CPU,会导致无穷阻塞或者饥饿,解决办法为:老化

时间片轮转调度算法:可抢占,队列中没有进程分配超过一个时间片的CPU时间,除非是唯一可运行的进程,如果进程的CPU区间超过了一个时间片,那么该进程就被抢占平且放回就绪队列

多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。

多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动:若进程使用过多CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。
 

进程同步中的机制

原子操作,信号量机制,自旋锁管程,会合,分布式系统、

 

什么是虚拟内存

内存的发展历程:

没有内存抽象(单进程,出去操作系统所用的内存之外,全部给用户程序使用)->有内存抽象(多进程,进程独立的地址空间,交换技术(内存大小无法容纳所有兵法的进程))->连续内存分配(固定大小分区,可变分区,碎片)->不连续内存分配(分段,分页,段页式,虚拟内存)

虚拟内存:

虚拟内存允许执行的进程不必完全在内存中,虚拟内存的基本思想是,每个进程有独立的地址空间,这个空间被分为大小相等的多个块,成为页page,每个页都是一段连续的地址,这些页眉映射到物理内存,但是并不是所有的页都必须在物理内存中程序才可以运行。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射,当程序引用到一部分不再物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令,这样对于进程而言,逻辑上好像由很大的内存空间,但是实际上一部分对应于物理内u才能上的一块(成为帧,通常页和帧的大小相等),还有一部分没有加载在内存中的部分对应在硬盘上。

这里写图片描述

页面置换算法:

1. FIFO先进先出算法

2. LRU(Least Recently Use)最近最少使用算法  根据使用时间到现在的时间长短来判断

3. LFU(Least Frequently Use)最少使用次数算法  根据使用次数来判断

4. OPT(Optimal replacement)最右置换算法  理论的最优,理论:保证置换出去的时不再被使用的页,或者时在实际内存中最晚使用的算法

虚拟内存的应用与优点:

虚拟内存适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中,当一个程序等待它的一部分读入内存的时候,可以把CPU交给另一个进程使用

好处:

1. 在内存中可以保留多个进程,提高系统的并发性

2. 解除了用户与内存之间的紧密约束,进程可以比内存的全部空间还大

 

颠簸

颠簸的本质上指的是频繁的页调度行为,具体来说,进程发生缺页中断,这时必须置换某一页,然而其他所有页都在被使用,因此置换了一个页之后又立刻再次需要这个页,就会不断产生缺页中断,整个系统的效率急剧下降

内存颠簸的解决策略:

如果时因为页面替换策略的十五,可以修改替换算法

如果时因为运行程序太多导致无法同时将所有频繁访问的页面调入内存,就要降低程序的数量

还可以终止该进程或增加物理内存容量

参考链接:https://blog.csdn.net/justloveyou_/article/details/78304294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值