测开八股之操作系统

一进程、线程
1)进程和线程的区别
进程:运行程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发
线程:进程的子任务,是CPU进行调度和分配的基本单位,保证了程序的实时性,实现了进程内部的并发
一个程序至少有一个进程,一个进程至少有一个线程,线程依赖进程而存在
进程在执行的过程中拥有独立的内存单元,多个线程共享进程的内存;
调度和切换:线程的上下文切换比进程快的多

进程的特征
结构性:进程包括程序、数据、进程控制块组成
独立性:进程是系统进行资源调度和分配的基本单位
动态性:进程是程序一次执行的过程
并发性:多个进程可以并发的执行

2)进程之间的通信方式
不同的进程之间传播或者交换信息
管道、系统IPC(信号量、消息对列、共享存储)、Socket
2.1)管道:普通管道、流管道和命名管道
普通管道:半双工的,只能单向传输;并且只能在父子进程间进行通信
流管道:以双向传输
命名管道:可以在不相关的进程之间进行通信
2.2)
信号:通知接收进程某种事件已经发生
信号量:计数器,控制多个进程对共享资源的访问;防止一个进程访问共享资源时,另一个进程对共享资源的访问。是在不同的进程之间,或者同一进程不同的线程之间的锁机制
消息对列:消息的链表,存放在内核中,并有****消息对列标识符标识。具有写权限的进程可以根据规则向对列中添加信息,具有读权限的进程可以按照规则向消息队列中读取信息
共享内存:允许多个进程对同一内存空间的访问。其他进程可以看到另个进程在共享内存中数据的更新;依赖同步机制,互斥锁,信号量等等
2.3)Socket
网络中不同机器之间的通信

线程间的通信(了解)
1.锁机制:互斥锁、条件变量、读写锁
 互斥锁提供了以排他方式防止数据结构被并发修改的方法。
 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
 条件变量可以以原子的方式进行阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
2.信号量机制:包括无名信号量和命名线程信号量
3.信号机制:类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制

3)同步方式
3.1)线程之间的同步方式
临界区**(有争议,面试可以不说)**
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。互斥对象只有一个,保证公共资源不会被多个线程同时访问
信号量:允许同一时刻多个线程对同一资源的访问,但是要控制同一时刻访问此资源的最大线程数。
事件:以 通知操作的方式控制多线程的同步,还可以实现多线程的优先级的比较。

3.2)进程之间的同步方式(了解即可)
原子操作、信号量机制、会合、分布式系统

4)状态
4.1)进程之间的状态
运行:进程已占用CPU,并在CPU上运行
就绪:进程已具备运行条件,等待CPU 的分配
阻塞态:进程因等待某种事件的发生而暂时不能被运行

状态之间的转换
就绪->运行:运行进程的时间片用完,调度转到就绪队列中选择合适的进程进行CPU 的分配
运行-》就绪:1)进程占用CPU 的时间过长,但是分配给该进程的时间片有限
2)在抢占式优先级调度算法中,当更高优先级的进程到来,该进程被迫让出CPU,进入就绪状态
运行-》阻塞:正在运行的程序因需要等待某种事情的发生,而暂时不能被运行
阻塞-》就绪:正在等待的事情已经发生
不能转换的状态
阻塞-》运行:阻塞中的对列的进程即使具备了运行条件,也不能运行运行。因为运行的进程是从就绪对列中选取
就绪-》阻塞:就绪对列中的进程都没有运行,因此不能阻塞

4.2) 线程之间的状态
新建 运行 就绪 阻塞 等待 结束

5)进程的调度策略有几种
先来先服务(FCFS):按照作业到达后备作业队列的先后次序选择作业(进程进入就绪队列的先后次序选择进程)
优先级:按照进程的优先权大小来调度。高优先权进程得到优先处理的调度策略
基于时间片轮转:当某个进程执行的时间片用完时,调度程序便终止该进程的执行,并将它送到就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证队列中的所有进程,在已给定的时间内,均能获得一时间片处理机执行时间。
多级反馈:根据作业的性质和类型的不同,将就绪队列再分为若干个队列,所有的作业按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。
短作业优先:主要用于作业调度,它从作业后备序列中 挑选 所需运行时间最短的作业进入主存运行。

二 死锁
1)死锁产生的原因
两个或多个并发进程中,每个进程持有着某种资源,但是又等待着其他进程释放它或者他们保持着的资源,在未改变这种状态之前都不能向前推进。也就是,两个或多个进程处于无限期阻塞相互等待的一种状态。

2)死锁产生的四个必要条件
互斥:一个资源一次只能被一个进程使用
请求与保持:进程因请求资源而阻塞时,不释放他所保持着的资源
不可剥夺条件:进程获得的资源,再未完全使用完之前,不能被其他进程强行剥夺
循环等待条件:若干进程之间形成了头尾相接的环形等待资源关系

3)解决死锁的基本算法
预防死锁、死锁避免、检测死锁、解除死锁

3.1)死锁预防: 破坏导致死锁必要条件中的任意一个就可以预防死锁。
例如:
(1)破坏占有且等待条件: 一次性申请所有资源,之后不再申请资源,如果不满足资源条件则得不到资源分配。
(2)破坏不可剥夺条件: 当一个进程获得某个不可剥夺的资源时,提出新的资源申请,若不满足,则释放所有资源。
(3)破坏循环等待条件: 对资源进行排号,按照序号递增的顺序对资源进行申请。若获得高序号的资源想要申请低序号的资源,需要先释放高序号的资源。
3.2)死锁避免: 进程在每次申请资源时判断这些操作是否安全。
例如:
使用银行家算法:指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。
3.3)死锁检测: 判断系统是否属于死锁的状态,如果是,则执行死锁解除策略。
3.4)死锁解除: 将某进程所占资源进行强制回收,然后分配给其他进程。

死锁避免:银行家算法
操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源就相当于用户向银行家贷款。
实现方法:
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(即当资源池中剩余的可利用资源 >= 线程还需要的资源时,就可以将可利用资源分配给此线程)
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(线程可以请求分配资源,但是请求的资源总数不能超过资源池中剩余的可利用资源)
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(当线程池中的资源暂时不满足当前的线程所需时,将此线程先暂时搁置,先将资源分配给能够满足的需求的其他线程,等到线程池中的资源足够满足先前搁置的线程时,在将资源分配给搁置的线程)
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
(当线程拿到所需要的所有资源,运行结束后,将自身所有的资源放回资源池中)

三 缓冲区与临界区
1)啥是缓冲区溢出
1.1)计算机向缓冲区填充数据,超出了缓冲区本身的容量,溢出的数据覆盖在合法的数据之上
1.2)危害
程序崩溃,拒绝服务
跳转并执行一段恶意的代码
1.3)原因
程序没有仔细检查用户的输入

2)临界区;什么是临界区,如何解决冲突
2.1)什么是临界区?
每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入。
2.2)解决冲突的方式?
如果有若干个进程要求进入空闲的临界区,一次仅允许一个进程进入。任何时候,处于临界区的进程不可多于一个。
如已有进程进入自己的临界区,则其他试图进入临界区的进程必须等待。
进入临界区的进程要在有限时间内退出,以便其他进程能及时进入自己的临界区。
如果不能进入自己的临界区,就应该让出CPU,避免进程出现忙等等现象。

三 Windows下的内存是如何管理的
1)3种:
1.虚拟内存:
最适合用来管理大型对象或者结构数组
2.内存映射文件:
最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据
3.内存堆栈:
最适合用来管理大量的小对象

物理内存和虚拟内存的区别:
物理内存:真实的硬件设备(内存条)
虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略)

总结:
物理内存是所有进程都可以访问的一块内存区域,物理内存又非常有限,因此liunx为了充分利用物理内存,只有当程序第一次执行到这块代码段时,根据分页表,缺页中断处理将数据拷贝到物理内存。
当不同的进程使用同一段代码时,比如库文件的代码,在物理内存中可以只存储一份这样的代码,不同进程只要将自己的虚拟内存映射过去就好了,这样可以节省物理内存

2)分段和分页的区别?
  页是信息的物理单位,分页是为了实现离散分配方式,以减少内存的外零头,提高内存的利用率。分页仅仅是由于系统管理的需要,而不是用户的需要。
  段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
  页的大小固定且由系统确定,把逻辑地址分为页号和页内地址两部分,由机器硬件实现的。因此一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编写程序在对源代码进行编辑时,根据信息的性质来划分。
  分页的作业地址空间是一维的,即单一的线性空间。
  分段的作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需要给出段内地址。

3)操作系统的页面置换算法
页面置换算法是在请求分页存储时,调页时候会用到的。页面置换算法的目标是,尽可能减少换入换出次数。常见的页面置换算法有:最优页面置换算法、先进先出算法、最近最久未使用算法(LRU)、时钟页面置换算法、二次机会算法和最不常用算法。

最优页面置换算法:替换未来很长时间都不会被访问的页面
先进先出算法:选择在内存中驻留时间最长的页面置换,使用链表实现
最近最久未使用算法(LRU):选择最久未被使用的页面
最不常用算法:选择访问次数最少的页置换
(时钟页面置换算法、二次机会算法)

四 补充题目
1)什么是协程
1.1)什么是协程
协程:实现协作式多任务,可以在程序执行内部中断,转而执行其他协程。
比如我们编写子程序(或者说函数),通常是利用“调用”来实现从 A 跳去 B,B 跳去 C,如果想回来调用方,必须等被调用方执行完才行,整个调用过程是通过栈实现的。而协程是运行子程序的过程中“中断”,转而执行其他子程序,再在适当的时候返回来接着运行。

1.2) 协程与线程的区别
协程相比于线程的优势:
1、协程效率比线程高。线程间切换需要开销,而协程间切换是由程序自身控制的,不需要开销。
2、协程不需要多线程的锁机制。协程是在一个线程内进行切换,所以不存在同时写变量冲突,不需要给共享资源加锁,只需要判断状态。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值