面试_操作系统_(多)进程、(多)线程、协程

88 阅读8分钟

进程和线程的区别

  • 内存分配和资源开销:进程是资源分配的最小单位,每启动一个进程,系统就会为它开辟独立的空间,分配独立的资源。一个进程包含多个线程,同一进程的所有线程共享本进程的地址空间和资源。进程切换和通信的开销也比线程大。

  • 安全性:一个进程死掉并不会对另外一个进程造成影响,因为地址空间独立。而一个线程死掉可能会导致所属进程的其他线程死掉,所属的进程也可能会死掉。原因就是“同一进程内的所有线程共享同一内存空间”,指针数据的错误会导致内存错乱。


存储资源的最小单位?最小的资源管理单元? 进程 进程是系统进行资源分配和调度的独立(最小)单位;

程序的最小单位?最小的执行单元? 线程 线程是CPU调度和分派的基本单位

  • 进程的引入:实现并发,并对并发执行的程序加以描述和控制。(用PCB描述)

  • 线程的引入:减少并发的时空开销,从而进一步提高了资源的利用率和系统的吞吐量




多进程与多线程

  • 多进程:指计算机同时执行多个进程,一般是同时运行多个软件。

  • 多线程:指一个进程中同时有多个线程正在执行。同样,可以理解为:同时运行一个软件中的多个功能。



多线程的缺点:

  • 线程开辟,消耗系统资源。
  • 线程切换,影响系统性能。
  • 线程争抢共享资源,存在安全性问题。


多进程、多线程的选择

  1. 对于 Windows 系统来说,开辟进程的开销很大,因此 Windows 鼓励多线程,重点是解决大量面对资源争抢与同步方面的问题。
  2. 对于 Linux 系统来说,开辟进程的开销很小,因此 Linux 鼓励多进程,重点是解决进程间通讯的方法。


异步与多线程的关系

异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。

多线程就是实现异步的一个方式。允许不同的线程同时做不同的事,谁也不用等待谁。

所以本质上,异步是最终目的,多线程只是实现异步的一种手段。



多线程的优点 / 多线程编程的好处

提高CPU的利用率。在多线程程序中,一个线程必须等待的时候(比如耗时很长的IO),CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。(牺牲空间资源,来换取时间)




并行与并发的区别

  • 并发是指宏观上在一段时间内能同时运行多个程序,在微观上,只是把这段时间再分成若干段,使多个进程快速交替的执行,使看起来像是在同时运行。
  • 并行则指同一时刻能运行多个指令。无论从微观还是宏观,二者都是一起执行的。多处理机可以并行
  • 串行:有n个任务,由一个线程按照顺序执行。

从以上本质不难看出,“并发”出现在多个进程并存且存在资源冲突时,他们争抢资源,一直在切换。




多进程,多线程的并发、并行问题

先说结论:

单CPU中进程只能是并发,多CPU计算机中进程可以并行。

单CPU单核中线程只能并发,单CPU多核中线程可以并行。


多线程是并行还是并发取决于你的CPU核心数量。如果是单核CPU,只能并发;如果是多核心CPU,就可以并行 多进程是并行还是并发取决于你的CPU数量。现代计算机(单CPU多核)只能并发执行多进程,无法并行。


理由如下:

一个CPU同时刻只能执行一个进程,他只能看到线程,即使是多核CPU,也只能是同时刻并行处理一个进程中的多个线程。如果想同时刻并行处理多个进程,只能用多CPU计算机(现阶段不存在)或多个计算机。

形象一些:一个进程相当于一个软件,线程相当于软件中的某个功能。现代计算机(单CPU多核)可以同时运行多个软件,但那不是并行的多进程,而是并发的多进程,系统是用时间片来切换的。但对于单个软件,比如在网易云音乐中一边听歌一边看评论,这就叫单CPU多核下的多线程并行。如果换成老旧的单CPU单核电脑,也可以达到两件事情''同时‘做,但那叫并发多线程,而非并行多线程。



并发编程的三要素:(也是带来线程安全所在)

  1. 原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。
  2. 可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)
  3. 有序性:程序的执行顺序按照代码的先后顺序

线程安全的问题原因有:

  1. 线程切换带来的原子性问题
  2. 缓存导致的可见性问题
  3. 编译优化带来的有序性问题



进程与程序的区别

进程是动态的、并发的、独立的。另外,进程包括程序和程序处理的对象。


游戏服务器应该给每个用户开辟一个进程还是一个线程?

进程。

因为同一进程间的线程会互相影响,一个线程崩溃可能会导致其他线程崩溃。因此要为每个用户开辟一个进程。




僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。




协程

协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程那样需要上下文切换来消耗资源,因此协程的开销远远小于线程的开销




用户线程和守护线程有什么区别?

用户线程 就是运行在前台,执行具体任务的线程,比如程序的主线程。

守护线程 运行在后台,当所有用户线程都结束运行时,守护线程会随 JVM 一起结束工作. 可见,守护线程是依赖于用户线程,当所有用户线程都退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。




操作共享数据的安全性?

答:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

其实,线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

所以说,实现线程同步,就可以保证共享数据的安全性。




在java中,线程的调度和时间分片是什么策略?

答:java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。

线程的调度不是跨平台的,它不仅仅取决于java虚拟机,还依赖于操作系统。在某些操作系统中,只要运行中的线程没有遇到阻塞,就不会放弃CPU;在某些操作系统中,即使线程没有遇到阻塞,也会运行一段时间后放弃CPU,给其它线程运行的机会。

java的线程调度是不分时的,同时启动多个线程后,不能保证各个线程轮流获得均等的CPU时间片。




Java中多线程同步是什么?

答:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态




什么是上下文的切换

当前任务执行完,CPU时间片切换到另一个任务之前,会保存当前自己的状态,以便下次再切换回这个任务时可以继续执行下去,任务从保存状态到再次加载执行就是一次上下文切换





zhuanlan.zhihu.com/p/346030596

blog.nowcoder.net/n/55a59284f…