进程管理基础知识
-
什么是进程?什么是线程?什么是协程?
- 进程
- 一个正在执行的程序,是操作系统资源分配的最小单位,具有独立的地址空间
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
- 结构特征:进程由程序、数据和进程控制块三部分组成
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变
- 线程
- 轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)的最小单位,是进程的一个实体
- 主线程是创建进程中产生的第一个线程,也就是main函数对应的线程
- 线程自己不拥有系统资源,只拥有在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
- 一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行
- 线程也有就绪、阻塞和运行三种基本状态
- 协程
- 比线程更加轻量级,是一种用户态的轻量级线程,协程的调度完全由用户控制
- 协程是一个线程执行,两个子过程通过相互协作完成某个任务
- 协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行
- 进程
-
进程、线程、协程之间有什么优缺点
-
进程
- 每个进程相互独立,不影响主程序的稳定性
- 通过增加CPU就可以提高性能
- 可以通过减少线程加锁/解锁的影响来提高性能
- 进程之间不共享资源,有利于资源保护
- 逻辑控制复杂,需要和主程序交互
- 进程拥有独立的内存空间,创建进程开销大
- 多进程调度开销比较大
-
线程
- 同一进程的线程共享资源,提高了程序的运行效率
- 创建线程开销较少,运行消耗资源也较少
- 线程不能独立运行,必须存在于进程中
- 线程之间的同步和加锁/解锁比较麻烦
- 每个线程与主程序共用地址空间,受限于2GB地址空间
- 到达一定的线程数程度后,即使再增加CPU也无法提高性能
- 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也需要消耗较多的CPU
-
协程
- 无需线程上下文切换的开销
- 方便切换控制流,简化编程模型
- 高并发性、高扩展性、低成本
- 协程需要用户自己编写调度逻辑
- 无法利用多核资源:协程的本质就是单线程,它不能同时将单个CPU的多核用上,协程需要配合进程才能运行在多核CPU上
- 进程堵塞操作会堵塞掉整个程序
-
-
进程和线程的区别与联系
- 进程是资源分配的最小单位,线程是cpu调度的最小单位
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源;
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
- 系统开销:多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些
-
和多线程相比,协程有什么优势?
- 极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显
- 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多
-
进程种类
- 交互进程:由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
- 批处理进程:这种进程和终端没有联系,是一个进程序列。
- 监控进程(也称守护进程):Linux系统启动时启动的进程,并在后台运行。
-
进程通信机制
- 管道( pipe ):
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 - 有名管道 (namedpipe) :
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 - 信号量(semophore ) :
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 - 消息队列( messagequeue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 - 信号 (sinal ) :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 - 共享内存(shared memory ) :
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 - 套接字(socket ) :
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。
- 管道( pipe ):