IT面试常见基础知识 - 7.进程与线程

531 阅读5分钟

思维导图以及目录见 juejin.cn/post/684490…

此部分主要摘自网络

  • 进程和线程的区别?
  1. 进程是资源分配的最小单位,线程是CPU调度的最小单位
  2. 进程是应用程序的执行实例。比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程。线程是执行进程中的路径。另外,一个过程可以包含多个线程。启动Word时,操作系统创建一个进程并开始执行该进程的主线程。
  3. 由于一个进程可以由多个线程,线程可以被认为是“轻量级”的过程。因此,一个线程和一个进程之间的本质区别在于,每一个用来完成的工作。线程用于小任务,而进程用于更多的'重量级'的任务 - 应用基本执行。
  4. 一个线程和进程之间的另一个区别是,在同一进程中的线程共享相同的地址空间,而不同的进程没有。因此线程可以读写同样的数据结构和变量,便于线程之间的通信。相反,进程间通信(IPC)很困难且消耗更多资源。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  1. 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高。
  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

举个例子

  1. 线程在进程下行进(单纯的车厢无法运行)
  2. 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  3. 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  4. 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  5. 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  6. 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响
  7. 另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
  8. 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
  9. 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
  10. 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
  • 什么是线程安全?

    如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。 五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。

  • 六大进程间通信方式 管道,消息队列,共享内存,信号量,socket,信号,文件锁

  1. 管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,一般用于两个不同进程之间的通信。有名管道也是一种半双工的通信方式,但它允许无亲缘关系进程间的通信。
  2. 信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。
  3. 信号是一种比较复杂的通信方式,用于通知接收进程某个时间已经发生。
  4. 消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。
  5. 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。他往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
  6. 套接字可用于不同及其间的进程通信。