todo【⾯经】⽜客⽹Linux和操作系统相关⾯经题⽬
1. 进程和线程的区别
概念
进程:
对运⾏时程序的封装,是系统进⾏资源调度和分配的的基本单位,实现了操作系统的并发;
线程:
进程的⼦任务,是CPU调度和分派的基本单位,实现进程内部的并发;
线程是操作系统可识别的最⼩执⾏和调度单位。
每个线程都独⾃占⽤⼀个虚拟处理器:独⾃的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同⼀地址空间(也就是同样的动态内存,映射⽂件,⽬标代码等等),打开的⽂件队列和其他内核资源。
区别
1. 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问⾪属进程的资源。
2. 调度
线程是独⽴调度的基本单位,在同⼀进程中,线程的切换不会引起进程切换,从⼀个进程中的线程切换到另⼀个进程中的线程时,会引起进程切换。
3. 系统开销
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远⼤于创建或撤销线程时的开销。类似地,在进⾏进程切换时,涉及当前执⾏进程 CPU 环境的保存及新调度进程 CPU 环境的设置,⽽线程切换时只需保存和设置少量寄存器内容,开销很⼩。
4. 通信⽅⾯
线程间可以通过直接读写同⼀进程中的数据进⾏通信,但是进程通信需要借助 IPC。
2. 什么是死锁
产⽣条件
1. 互斥:
每个资源要么已经分配给了⼀个进程,要么就是可⽤的。
2. 占有和等待:
已经得到了某个资源的进程可以再请求新的资源。
3. 不可抢占:
已经分配给⼀个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
4. 环路等待:
有两个或者两个以上的进程组成⼀条环路,该环路中的每个进程都在等待下⼀个进程所占有的资源。
解决策略
1. 鸵鸟策略
当发⽣死锁时不会对⽤户造成多⼤影响,或发⽣死锁的概率很低,直接忽略死锁
2. 死锁预防
通过破坏死锁产⽣的四个必要条件中的⼀个或多个,以避免发⽣死锁。
破坏互斥:
不让资源被⼀个进程独占,可通过假脱机技术允许多个进程同时访问资源;
破坏占有和等待:有两种⽅案
1. 已拥有资源的进程不能再去请求其他资源。⼀种实现⽅法是要求进程在开始执⾏前请求需要的所有资源。
2. 要求进程请求资源时,先暂时释放其当前拥有的所有资源,再尝试⼀次获取所需的全部资源。
破坏不可抢占:
有些资源可以通过虚拟化⽅式实现可抢占;
破坏循环等待:有两种⽅案
1. ⼀种⽅法是保证每个进程在任何时刻只能占⽤⼀个资源,如果要请求另⼀个资源,必须先释放第⼀个资源;
2. 另⼀种⽅法是将所有资源进⾏统⼀编号,进程可以在任何时刻请求资源,但要求进程必须按照顺序请求资
源。
3. 死锁避免
它允许三个必要条件,但通过算法判断资源请求是否可能导致循环等待的形成并相应决策,来避免死锁点的产⽣。因此,其前提是知道当前资源使⽤的整体情况,以及申请资源线程本⾝所占有的资源细节。
线程启动拒绝:如果⼀个线程的请求会引发死锁,则不允许其启动。
资源分配拒绝:如果⼀个线程增加的资源请求会导致死锁,则不允许此申请。
3. 进程调度算法
1. 批处理系统
保证吞吐量和周转时间(从提交到终⽌的时间)
1. 先来先服务 first-come first-serverd(FCFS)
⾮抢占式的调度算法,按照请求的顺序进⾏调度。
有利于长作业,但不利于短作业,因为短作业必须⼀直等待前⾯的长作业执⾏完毕才能执⾏,⽽长作业⼜需要执⾏很长时间,造成了短作业等待时间过长。
2. 短作业优先 shortest job first(SJF)
⾮抢占式的调度算法,按估计运⾏时间最短的顺序进⾏调度。
长作业有可能会饿死,处于⼀直等待短作业执⾏完毕的状态。因为如果⼀直有短作业到来,那么长作业永远得不到调度。
3. 最短剩余时间优先 shortest remaining time next(SRTN)
最短作业优先的抢占式版本,按剩余运⾏时间的顺序进⾏调度。 当⼀个新的作业到达时,其整个运⾏时间与当
前进程的剩余时间作⽐较。如果新的进程需要的时间更少,则挂起当前进程,运⾏新的进程。否则新的进程等
待。
2. 交互式系统
快速地进⾏响应
1. 时间⽚轮转
将所有就绪进程按 FCFS 的原则排成⼀个队列,每次调度时,把 CPU 时间分配给队⾸进程,该进程可以执⾏
⼀个时间⽚。当时间⽚⽤完时,由计时器发出时钟中断,调度程序便停⽌该进程的执⾏,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队⾸的进程。
2. 优先级调度
为每个进程分配⼀个优先级,按优先级进⾏调度。
为了防⽌低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
3. 多级反馈队列
多级队列是为这种需要连续执⾏多个时间⽚的进程考虑,它设置了多个队列,每个队列时间⽚⼤⼩都不同,例如1,2,4,8,..。进程在第⼀个队列没执⾏完,就会被移到下⼀个队列。这种⽅式下,之前的进程只需要交换 7 次。
每个队列优先权也不同,最上⾯的优先权最⾼。因此只有上⼀个队列没有进程在排队,才能调度当前队列上的进程。
4. 时间⽚轮转算法
见第3题
5. 进程间的通信⽅式,进程和线程的通信
1. 管道
2. 消息队列
3. 信号量
4. 信号
5. 共享内存
6. 套接字SOCKET
线程间的同步⽅式(线程锁)
1. 信号量
它只取⾃然数值,并且只⽀持两种操作:
P(SV): 如果信号量SV⼤于0,将它减⼀;如果SV值为0,则挂起该线程。
V(SV): 如果有其他进程因为等待SV⽽挂起,则唤醒,然后将SV+1;否则直接将SV+1。
2. 互斥量
互斥量⼜称互斥锁,主要⽤于线程互斥,不能保证按序访问,可以和条件锁⼀起实现同步。当进⼊临界区 时,需要获
得互斥锁并且加锁;当离开临界区时,需要对互斥锁解锁,以唤醒其他等待该互斥锁的线程。
3. 条件变量
条件变量,⼜称条件锁,⽤于在线程之间同步共享数据的值。条件变量提供⼀种线程间通信机制:当某个共享数据达到某个值时,唤醒等待这个共享数据的⼀个/多个线程。
线程间通信
1. 使⽤全局变量
主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile
2. 使⽤消息实现通信
在Windows程序设计中,每⼀个线程都可以拥有⾃⼰的消息队列(UI线程默认⾃带消息队列和消息循环,⼯作线程需要⼿动实现消息循环),因此可以采⽤消息进⾏线程间通信sendMessage,postMessage。
3. 使⽤事件CEvent类实现线程间通信
Event对象有两种状态:有信号和⽆信号,线程可以监视处于有信号状态的事件,以便在适当的时候执⾏对事件的操作。
6. 弱引⽤和虚引⽤的区别
【todo】
7. 堆和⽅法区的区别
提交更改是内存条吗堆和栈的区别
⼤⼩限制:
栈底的地址和栈的最⼤容量是系统预先规定好的(2M/1M,总之是⼀个编译时就确定的常数),如果申请的空间超过栈的剩余空间, stack overflow。因此,能从栈获得的空间较⼩。堆是⽤链表来存储的不连续内存区域,⼤⼩受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间⽐较灵活,也⽐较⼤。
申请效率:
栈由系统⾃动分配,速度较快。但程序员是⽆法控制的。堆是由new分配的内存,⼀般速度⽐较慢,⽽且容易产⽣内存碎⽚,不过⽤起来最⽅便.
存储内容:
栈存储返回地址,参数,局部变量。堆在这块内存空间中的⾸地址处记录本次分配的⼤⼩,具体内容由程序员安排。
数据访问:
存储在堆中的对象是全局可以被访问的,然⽽栈内存不能被其他线程所访问,且遵循LIFO原则。
⽣命周期:
栈内存的⽣命周期很短,⽽堆内存的⽣命周期从程序的运⾏开始到运⾏结束。
8. 什么时候会发⽣内存溢出
【todo】
9. linux如何查看cpu占⽤率
【todo】top
10. io多路复⽤了解吗
【todo放link】见其他⽂章
11. 深拷贝、浅拷贝
【todo放link】见其他⽂章
12. 锁的粒度,什么时候使⽤
【todo】
13. 共享锁、排它所
【todo】
14. Linux命令,查看打印⽇志;查看某端⼝被占⽤的进程;查看某⽂件夹下包含某个字符的⽂件有哪些;查看磁盘;查看CPU使⽤情况
【todo】
15. linux软连接
【todo】
16. linux修改个⼈权限
【todo】
17. 管道
【todo】
18. 协程
【todo】
19. linux修改⽂件名命令,杀死⼀个名为a的进程
【todo】
20. 内存泄露和内存溢出的区别
内存溢出和内存泄漏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论