原文地址:网络和操作系统面试相关内容~(三)
1、线程同步方式?
-
临界区:当多个线程访问一个独占性共享资源时,可使用临界区对象,拥有临界区的线程可访问被保护起来的资源或代码片段,其它线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止,以此来达到原子方式操作共享资源的目的。
-
事件:允许一个线程在处理完一个任务后,主动去唤醒另外一个线程执行任务。
-
互斥量:互斥对象和临界区很相似,其允许进程间使用,临界区限制同一进程的各线程之间使用,临界区更省资源,更有效率。
-
信号量:当需要一个计数器来限制可以使用某共享资源的线程的数目时,可使用信号量对象。
区别:
-
互斥量与临界区作用很相似,互斥量可被命名,可跨进程使用,但创建消耗资源较多,如只为进程内部使用可考虑临界区,可提速度和减少资源占用。
-
互斥量、信号量、事件都可被跨进程使用来进行数据同步操作。
2、线程分类?
从线程运行空间来说可分为用户级线程(user-level thread,ULT)和内核级线程(kernel-level thread,KLT),介绍如下:
-
内核级线程:依赖于内核,又称为内核支持的线程或轻量级线程,无论是在用户程序中的线程还是系统进程中的线程,内核级线程的创建、撤销和切换都由内核实现,像英特尔i5-8250U是4核8线程,此处线程为内核级线程。
-
用户级线程:仅存在于用户级中,不依赖于操作系统核心,应用进程通过线程库来完成用户级线程的创建和管理,速度较快,操作系统内核无法感知到用户级线程的存在。
3、临界区如何解决冲突?
各进程中访问临界资源的那段程序称为临界区,一次仅允许一个进程使用的资源称为临界资源,冲突解决方案如下:
-
如有若干线程请求进入空闲的临界区,一次允许一个进程进入,如已有进程进入临界区,则其它试图进入临界区的进程就进入等待状态。
-
进入临界区的进程需在有限时间内退出。
-
如进程不能进入自己的临界区,则应让出CPU,避免出现忙等现象。
4、死锁及产生条件?
死锁:在两个或多个并发进程中,如每个进程持有某种资源而又在等待其它进程释放它或它们现在保持着资源,在为改变这种状态之前都不能向前推进,就可称这组线程产生了死锁,通俗来说就是两个或多个进程无限期的阻塞、相互等待的状态。
死锁产生四个必要条件:(缺一不可)
-
互斥条件:一个资源一次只能被一个进程使用。
-
请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
-
不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺。
-
循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系。
5、如何处理死锁问题?
-
忽略该问题:像鸵鸟算法可应用在极少发生死锁的状况,因为鸵鸟看到危险就将头埋在地下,跟掩耳盗铃相似。
-
检测死锁并恢复。
-
仔细的对资源进行动态分配,以免产生死锁。
-
破处死锁产生的必要条件之一来防止产生死锁。
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。