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模拟操作。
网友评论