什么是协程?以及进程,线程,协程的区别

1.进程

1.1什么是进程?

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。常见的如PHP-FPM进程,Nginx进程。

1.2进程间通信

每个进程有自己的独立内存空间,不同进程之间的通信即IPC(Inter-Process Communication) 可以通过 Unix Socket套接字进行通信共享,例如php-fcgi.sock文件就是fpm和nginx通信的UDS(Unix Domain Socket)。

1.3优劣

优势:稳定安全
劣势:切换开销大

1.4进程关闭

每个进程都有一个父进程,进程号叫PID。可使用ps -axjf树形显示进程。当进程死亡时,会自动关闭已打开的文件,舍弃占用的内存、交换空间等系统资源。向父进程返回一个退出状态值。

顶级进程init(pid为1,PPID为0)

1.5进程状态

当我们使用Top命令时,其中的STAT字段就是进程当前的状态。比如top进程就是R,运行态,nginx进程是S,等待事件执行。偶尔会看到Ss状态,或者S+状态,这时S还是等待事件执行,后面的是描述当前进程的子状态。Ss表示包含子进程的Sleep进程。S+表示后台运行的Sleep进程。

//主状态,在第一位
D 等待IO不可中断
R Running
S Sleep等待事件执行
T Stopped

//子状态,在第二位
< 高优先级
N 低优先级
s 主进程,包含子进程
+ 位于后台的进程
| 多线程,clone线程。

1.6进程切换

1.切换页目录使用新的地址空间
2.切换内核栈
3.切换硬件上下文

2.线程

2.1什么是线程?

线程是进程的一个实体,是CPU调度和分派的基本单位。

2.2 线程间通信

它可与同一进程内的其他线程共享进程资源,线程通信靠共享内存。

2.3 优劣

优势:上下文切换快。
劣势:不够稳定容易丢失数据。

一个进程必然包括一个线程。线程比单纯的协程性能好,能利用多核达到真正的并行计算。

2.4多线程

多线程会涉及到读写同一个地址变量的问题,引入了锁的概念(如互斥锁)。

2.5线程切换

1.切换内核栈
2.切换硬件上下文

3.协程

3.1 什么是协程?

协程即用户态线程。

3.2 说人话!

协程并不是多任务并行,而是多任务串行,只是这些代码可以交叉运行。单线程的程序通过条件语句去模拟多线程的实现,使各个函数交叉运行,最终结果看起来像是并发执行。因为用户可控制且像线程,所以说是用户态线程。

3.3优劣

优势:上下文切换非常快,抗并发能力强。
劣势:变量容易污染

3.4 协程调度

1.因为协程不加锁,会导致多任务时间不能公平分享。所以协程是抢占式调度。
2.协程切换因为在线程内,所以无需切换上下文。

分时调度:所有线程轮流使用CPU使用权,平均分配每个线程的时间
抢占式调度:优先让nice值高的线程使用CPU,如果优先级一样,随机分配。(可通过nice命令增加)

3.5 协程为什么能抗并发

协程性能优势在于IO并发上。协程在遇到IO时就会挂起,切换到别的进程继续计算。然而协程本身并不是解决一切性能问题的万能灵药,背后的统一任务调度框架才是性能优异的核心原因。
PHP的Swoole和Python的asyncio之所以能处理并发,是因为它们都是epoll模型+事件循环来驱动协程。由于IO操作非常耗时,经常使程序处于等待状态,有了背后的任务调度框架为我们自动切换协程,就保证总有协程在运行,而不是在等待IO。

epoll (event poll)事件驱动模型

3.6协程实现

协程实现依赖迭代器和生成器yield
foreach可以使用curent,next模拟操作。

打赏作者

发表评论

电子邮件地址不会被公开。