进程

  • 进程是操作系统分配资源和调度的一个独立单位,是程序在操作系统中的一次执行过程。进程拥有独立的地址空间和系统资源(如文件句柄、内存等),进程间的通信(IPC,Inter-Process Communication)需要特定的机制,如管道、信号、消息队列、共享内存和套接字等。
  • 进程的特点
  • 独立性:每个进程都有自己独立的地址空间和系统资源。
  • 隔离性:一个进程崩溃通常不会影响其他进程。
  • 资源开销:创建和维护进程需要较多的系统资源和时间。
  • 通信复杂性:进程间通信需要特定的IPC机制。

Linux 查看进程

ps命令是“process status”的缩写,用于查看当前系统中的进程状态

ps aux # 查看所有正在运行的进程,STAT进程状态,R 运行或处于可运行状态,S 睡眠,D 表示不可中断的睡眠状态,通常用于等待I/O操作,Z 表示僵尸状态,T 表示停止或追踪状态
ps -ef | grep process_name |  grep -v grep | awk '{print $2}' | xargs kill # 找出所有包含process_name的进程并 kill 掉

top命令提供了一个实时更新的进程列表,按照CPU使用率排序。它显示了系统的动态视图,包括进程的CPU和内存使用情况

pstree命令以树状图的形式显示进程的层次结构

线程

线程是进程中的一个实体,是被操作系统调度的最小单位。它是进程中的一个执行流程,线程共享所属进程的地址空间和资源,但每个线程有自己的执行堆栈和程序计数器。

线程的特点

  1. 共享性:同一进程下的线程可以共享进程的资源,如内存、文件句柄等。
  2. 轻量级:线程的创建、销毁和切换通常比进程更快,消耗的资源更少。
  3. 并发性:多线程可以实现并发执行,提高程序的执行效率。
  4. 通信简便:线程间通信可以直接通过读写共享数据来实现,无需复杂的IPC机制。

协程

协程主要是解决进程和线程的痛点!
若干个生产者线程向队列中写入数据,若干个消费者线程从队列中消费数据,会发现线程阻塞,线程阻塞状态和可运行状态之间的切换,线程上下文的切换,这些都是都是非常耗费性能的操作。
协程从属于线程,程序可以直接控制,不会被操作系统所控制,又称为用户态线程。一个线程可以拥有多个协程,从而避免了多线程切换的资源耗费。

yield这个关键字就是用来产生中断, 并保存当前的上下文的, 比如说程序的一段代码是访问远程服务器,那这个时候CPU就是空闲的,就用yield让出CPU,接着执行下一段的代码,如果下一段代码还是访问除CPU以外的其它资源,还可以调用yield让出CPU. 继续往下执行,这样就可以用同步的方式写异步的代码了.

yield让协程暂停,和线程的阻塞是有本质区别的。协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。

线程从属于进程,一个进程至少包含有一个主线程,打开进程后,实际上是进程中的线程在处理事物,是程序的实际执行者。
进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。
进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
线程是操作系统的最小执行单元,进程是操作系统的最小资源管理单元,都是被操作系统所管理。
使用多线程时需要注意对统一资源的管理,不然容易造成死锁,即一个线程在等待另外一个线程释放资源,另一线程也在等待其他线程释放资源,导致两个线程都无法继续执行。
如何有多个 CPU 的服务器,则可以开启多个进程,实现并行。

并发与并行

并发(Concurrency)和并行(Parallelism)是多任务处理的两个相关概念:

  • 并发:指系统能够在宏观上同时处理多个任务,但在单核处理器上,并发实际上是通过任务切换和时间分片来实现的。
  • 并行:指多个任务在同一时刻真正同时执行,这通常需要多核处理器或多处理器系统。

在多核处理器上,多线程可以实现真正的并行处理,而在单核处理器上,多线程主要实现并发处理。

并发

并发是指系统能够在宏观上同时处理多个任务的能力。在单核处理器上,这通常是通过任务切换和时间分片来实现的,而在多核处理器上,可以实现真正的并发。

  1. 多线程(Multithreading)
    • 在程序中创建多个线程,使得它们可以由操作系统在单个处理器上交替执行,从而实现并发。
    • 多线程在单核处理器上通过时间片轮转实现,并在多核处理器上可以实现更高效的并发。
  2. 异步编程(Asynchronous Programming)
    • 使用异步I/O和事件驱动编程模型,允许程序在等待一个长时间操作(如网络请求或磁盘I/O)完成时继续执行其他任务。
    • 异步编程模型在许多现代编程语言中都有支持,如JavaScript的Promises、Python的asyncio库等。
  3. 协程(Coroutines)
    • 协程是一种轻量级的线程,可以在用户级别进行调度,而不需要操作系统内核的介入。
    • 协程允许程序在执行长时间操作时挂起当前任务,并在操作完成后恢复执行,这在Go语言和Python的asyncio库中得到了广泛应用。

并行

并行是指多个任务在同一时刻真正同时执行。这通常需要多核处理器或多处理器系统。

  1. 多进程(Multiprocessing)
    • 创建多个进程,每个进程可以在不同的CPU核心上运行,实现真正的并行执行。
    • 多进程模型在操作系统级别进行资源隔离,通常比多线程模型更消耗资源,但可以提高程序的稳定性。
  2. 分布式计算(Distributed Computing)
    • 将任务分散到多台计算机或服务器上执行,通过网络进行通信和协调。
    • 分布式计算可以在地理上分散的多个节点上实现并行处理,适用于大规模数据处理和高性能计算任务。
  3. GPU计算(GPU Computing)
    • 利用图形处理单元(GPU)的并行处理能力进行通用计算(GPGPU)。
    • GPU拥有大量的并行处理核心,适合执行可以并行化的计算密集型任务,如图形渲染、科学模拟和深度学习等。