面试题整理(6)

每天五道面试题!只记录答案,不标出源码,有什么不对的地方欢迎评论,共同进步。

1. 并行与并发的区别

  1、并行指多个事件在同一个时刻发生;并发指的是在某时刻只有一个事件发生,某个时间段内由于CPU交替执行,可以发生多个事件。

  2、并行没有对CPU资源的抢占;并发执行的线程需要对CPU资源进行抢占。

  3、并行执行的线程之间不存在切换;并发操作系统会根据任务调度系统给线程分配线程CPU执行时间,线程的执行会进行切换。

  并行和并发是取决于操作系统对线程的调度和计算机硬件资源(CPU个数和核数)的,无论是并行还是并发,实际上都是为了尽可能的发挥机器的性能。

2. 进程与线程的区别

  1、本质:进程是操作系统资源分配的基本单位;线程是任务调度和分配的基本单位。

  2、内存分配:系统在运行时会为每个进程分配不同的内存空间,建立数据表来维护代码段、堆栈段和数据段;除了CPU外,系统不会为线程分配内存,线程所使用的资源全部来自于所属进程的资源。

  3、资源拥有:进程之间的资源是独立的,无法共享;同一进程的所有线程共享本进程的资源,如内存,CPU,IO等。

  4、开销:每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行程序计数器和栈,线程之间切换的开销小。

  5、通信:进程之间以IPC(管道,信号量,共享内存,消息队列,文件,套接字等)方式通信;
同一个进程下,线程间可以共享全局变量、静态变量等数据进行通信,做到同步和互斥,以保证数据的一致性。

  6、调度和切换:线程上下文切换比进行上下文切换速度快,代价小。

  7、执行过程:每个进行都有一个程序执行的入口,顺序执行序列;线程不能独立执行,必须依存在应用程序中,由程序的多线程控制机制控制。

  8、健壮性:每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一个进程的线程共享此进程的资源,当一个线程发生崩溃时,此进行也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题,如死锁等。

  9、可维护性:线程的可维护性差,代码比较难调试,bug难排查。

3. 导致并发编程出现问题的根本原因是什么?

  CPU、内存、IO设备的读写速度差异巨大,为了更好的利用机器的性能:

  1、计算机体系结构,给CPU增加了缓存,均衡CPU和内存的速度差异,带来了可见性问题,一个线程不能立刻看到另一个线程对共享变量的修改。

  2、操作系统,增加了进程和线程,分时复用CPU,均衡CPU和IO设备的速度差异,带来了原子性问题,多个线程操作一个共享变量,但是这个操作不是原子性操作,即使知道内存中的数据已经变化,但已经执行到不需要该数据的时候。
  例如i++;就是非原子性操作,①读取i,②执行i+1,③将执行结果赋给i,当一个线程执行到第三步时,即使i是可见的,但我们已经有计算后的值了,不再需要i了。

  3、编译器,增加了指令执行重排序,更好地利用缓存,提高程序的执行速度,带来了重排序问题,例如我在上一篇文章(面试题整理5)提到的双重检查锁为什么需要volatile关键字。

4. 死锁

  线程死锁指的是由于两个或多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法继续进行,如果线程都不主动释放所占有的资源,将产生死锁,此时,无外力作用的话,线程将无法向前推进。

  问题:1、互斥,2、占有且等待,3、不可抢占,4、循环等待

  首先,考虑到加锁的原因就是想让资源互斥来解决多线程带来的问题,所以我们不能解决1,那么我们从剩下的三个方面去解决。

  解决方案

    1、一次性申请所有的资源,破坏“占有且等待”。

    2、占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 “不可抢占” 条件。

    3、按序申请资源,破坏 “循环等待” 条件。

5. 活锁和饥饿

  活锁:任务没有被阻塞,但是由于某些条件没有满足,导致一直重复尝试——失败——尝试——失败的过程,比如一个线程申请到了资源,但是进一步申请别的资源的时候获取不到,主动放弃自己的资源,可能就会造成活锁。活锁可能自己解开,解决方案是下一次尝试获取资源之前随机休眠一小段时间。

  饥饿:一个线程因为CPU时间全部被其他线程抢占而得不到CPU运行时间,导致线程无法执行。产生的原因可能是:1、本线程优先级很低;2、其他线程优于本线程获取锁;3、其他线程总是被优先的唤醒。

  

  本文资料整理自ConstXiong大神的小程序,链接为:https://www.javanav.com/interview/93b0069472fd479393006c0e73043fc4.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值