要成为一名优秀的软件工程师,流程和线程是必须了解和掌握的知识点,不仅因为它们是计算机科学的基础知识,还因为知道如何在正确的时间使用它们可以提高程序的执行效率,即提高性能。
在了解进程和线程之前,我们先来谈谈程序,其实所谓的程序就是工程师编写的**集合,程序经过编译器或解释器的处理,转换成机器可以理解和执行的形式。
进程是执行并加载到内存中的程序。 进程也是操作系统分配的最小资源单位,可以从操作系统中获取,如CPU时间、内存等依此类推,这意味着进程在运行时消耗了多少 CPU 和内存。 下面是 macOS Activity Monitor 的截图,相信使用不管是哪个操作系统的读者都见过类似的界面,并且监视器列出了你电脑正在运行的应用程序,它们实际上是进程,你可以看到每个进程消耗的 CPU、CPU 时间和每个进程的独立 ID(PID)。
优点:每个进程都有自己独立的系统资源分配空间,不同进程之间不共享资源,因此无需对进程进行互斥操作。 缺点:建立流程和切换流程的上下文更耗费资源,并且流程之间的通信需求更复杂。 总结:一个程序已经写好了,但还没有执行,程序执行完后就变成了一个进程。
线程可以想象存在于进程中,一个进程中至少会有一个线程,前面说进程是操作系统分配的最小资源单位,线程是操作系统可以调度的最小单位,也就是说,实际执行任务的不是进程, 但是进程中的线程,一个进程可以有多个线程,其中多个线程可以共享进程的系统资源,并且该进程可以比作一个工厂。线程是工厂中负责实际执行任务的工人。
我认为,如果我们继续使用工厂和工人的比喻,这两个概念会更容易理解和记忆。
多处理就像设置许多工厂(通常是 CPU 的数量),每个工厂都有同时完成更多事情的优势。
另一方面,多线程将许多员工聚集在同一个工厂,其优点是有机会在相对较短的时间内完成相同的工作。
如前所述,在多线程中,不同的线程可以共享资源,如果两个线程同时访问或更改全局变量,则可能会出现同步问题。 在执行过程中争用资源时可能会发生死锁,因此在使用多线程时必须特别小心以避免这些情况。
并行并行是利用多个CPU来实现对并行处理任务的需求(即多个任务同时执行),并发是多个任务在争夺同一个CPU的资源,所以在一个时间点只会执行一个任务, 仅仅因为切换速度非常快,用户通常不会觉得任务实际上是在切换。
协程是一个用户模式的轻量级执行线程,协程的调度完全由用户控制。
想想进程中的线程,以及线程中的协程。 协程的调度完全由用户控制协程还将有自己的寄存器、上下文、堆栈等,协程的调度器控制当前执行的协程以及要阻止的协程。 如果协程卡住了,它会直接在用户端将另一个协程切换到这个线程继续执行,这样其他协程就不会被阻塞,从而可以有效利用资源,从而实现并发的概念。
相较于构建线程需要花费MB的内存,创建协程可以压到kB级,协程之间的切换绝对比线程之间的切换要快。
通过本文,我们已经谈到了进程、线程和协程的概念,但实际上,在使用多进程、多线程开发时需要考虑的因素很多,如果你不小心,可能会导致上面提到的race condition
或者性能不升反降,所以在实践中还是要仔细考虑和验证的。