进程
进程是操作系统分配资源和调度的一个独立单位,是程序在操作系统中的一次执行过程。进程拥有独立的地址空间和系统资源(如文件句柄、内存等),进程间的通信(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
命令以树状图的形式显示进程的层次结构
线程
线程是进程中的一个实体,是被操作系统调度的最小单位。它是进程中的一个执行流程,线程共享所属进程的地址空间和资源,但每个线程有自己的执行堆栈和程序计数器。
线程的特点:
- 共享性:同一进程下的线程可以共享进程的资源,如内存、文件句柄等。
- 轻量级:线程的创建、销毁和切换通常比进程更快,消耗的资源更少。
- 并发性:多线程可以实现并发执行,提高程序的执行效率。
- 通信简便:线程间通信可以直接通过读写共享数据来实现,无需复杂的IPC机制。
协程
协程主要是解决进程和线程的痛点!
若干个生产者线程向队列中写入数据,若干个消费者线程从队列中消费数据,会发现线程阻塞,线程阻塞状态和可运行状态之间的切换,线程上下文的切换,这些都是都是非常耗费性能的操作。
协程从属于线程,程序可以直接控制,不会被操作系统所控制,又称为用户态线程。一个线程可以拥有多个协程,从而避免了多线程切换的资源耗费。
线程从属于进程,一个进程至少包含有一个主线程,打开进程后,实际上是进程中的线程在处理事物,是程序的实际执行者。
进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。
进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
线程是操作系统的最小执行单元,进程是操作系统的最小资源管理单元,都是被操作系统所管理。
使用多线程时需要注意对统一资源的管理,不然容易造成死锁,即一个线程在等待另外一个线程释放资源,另一线程也在等待其他线程释放资源,导致两个线程都无法继续执行。
如何有多个 CPU 的服务器,则可以开启多个进程,实现并行。
并发与并行
并发(Concurrency)和并行(Parallelism)是多任务处理的两个相关概念:
- 并发:指系统能够在宏观上同时处理多个任务,但在单核处理器上,并发实际上是通过任务切换和时间分片来实现的。
- 并行:指多个任务在同一时刻真正同时执行,这通常需要多核处理器或多处理器系统。
在多核处理器上,多线程可以实现真正的并行处理,而在单核处理器上,多线程主要实现并发处理。
并发
并发是指系统能够在宏观上同时处理多个任务的能力。在单核处理器上,这通常是通过任务切换和时间分片来实现的,而在多核处理器上,可以实现真正的并发。
- 多线程(Multithreading):
- 在程序中创建多个线程,使得它们可以由操作系统在单个处理器上交替执行,从而实现并发。
- 多线程在单核处理器上通过时间片轮转实现,并在多核处理器上可以实现更高效的并发。
- 异步编程(Asynchronous Programming):
- 使用异步I/O和事件驱动编程模型,允许程序在等待一个长时间操作(如网络请求或磁盘I/O)完成时继续执行其他任务。
- 异步编程模型在许多现代编程语言中都有支持,如JavaScript的Promises、Python的asyncio库等。
- 协程(Coroutines):
- 协程是一种轻量级的线程,可以在用户级别进行调度,而不需要操作系统内核的介入。
- 协程允许程序在执行长时间操作时挂起当前任务,并在操作完成后恢复执行,这在Go语言和Python的asyncio库中得到了广泛应用。
并行
并行是指多个任务在同一时刻真正同时执行。这通常需要多核处理器或多处理器系统。
- 多进程(Multiprocessing):
- 创建多个进程,每个进程可以在不同的CPU核心上运行,实现真正的并行执行。
- 多进程模型在操作系统级别进行资源隔离,通常比多线程模型更消耗资源,但可以提高程序的稳定性。
- 分布式计算(Distributed Computing):
- 将任务分散到多台计算机或服务器上执行,通过网络进行通信和协调。
- 分布式计算可以在地理上分散的多个节点上实现并行处理,适用于大规模数据处理和高性能计算任务。
- GPU计算(GPU Computing):
- 利用图形处理单元(GPU)的并行处理能力进行通用计算(GPGPU)。
- GPU拥有大量的并行处理核心,适合执行可以并行化的计算密集型任务,如图形渲染、科学模拟和深度学习等。
相关链接: