php有关于进程的概念,php 进程 线程 协程相关概念
发布日期:2021-06-24 12:08:44 浏览次数:2 分类:技术文章

本文共 3155 字,大约阅读时间需要 10 分钟。

1.并发(concurrency)和并行(parallellism)是:

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

并发的关键是你在一个处理器上有处理多个任务的能力,不一定要同时。

并行的关键是你在多个不同的处理器上可以同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『同时』。

2.进程

进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。

3.线程

线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。

线程较之进程,其优势在于一个快,不管是创建新的线程还是终止一个线程;不管是线程间的切换还是线程间共享数据或通信,其速度与进程相比都有较大的优势。

线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。

4.进程与线程的区别

每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独立执行上下文。

线程在执行过程中与进程有一些不同。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在于进程之中,由进程提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个进程中,有多个执行部分可以同时执行。 此时,进程本身不是基本运行单位,而是线程的容器。

解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文)。一个线程只能属于一个进程,而一个进程可以有多个线程,一个进程至少包括一个线程

(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束

(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,CPU分给线程,即真正在CPU上运行的是线程。

(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

5.多进程与多线程对比图

73434a48a162?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

多进程和多线程还有一个明显的模型区别:在处理请求时的逻辑。

①在多进程情况下,由于跨进程是不好传递fd连接的。那么多进程通常采用在父进程中listen(), 然后各个子进程accept()的方式来实现负载均衡。这样的模型下可能会有惊群的问题。

②而多线程模型下,可以采用一个独立线程接受请求然后派发到各个worker线程的方式。

6.协程

协程就是用户态的线程,要理解是什么是“用户态的线程”,必然就要先理解什么是“内核态的线程”。 内核态的线程是由操作系统来进行调度的,在切换线程上下文时,要先保存上一个线程的上下文,然后执行下一个线程,当条件满足时,切换回上一个线程,并恢复上下文。 协程也是如此,只不过,用户态的线程不是由操作系统来调度的,而是由程序员来调度的,是在用户态的。

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

①协程的出现

在协程出现之前,要实现多任务并发,在无OS(操作系统)时代,可以使用状态机的思想对多任务进行拆解,在单进程环境中运行多任务,但是这种模式下需要开发者对每个任务有清晰的了解,也要开发者自行开发与任务相关功能(如任务间的通讯)。

后来出现了OS(操作系统),咱们就开始使用OS提供的进程和线程功能来轻易实现多任务了。在OS中,程的上下文切换是OS内核控制。但是后来却出现了一个问题,频繁的进程上下文切换导致了OS性能的降低(主要是短时执行消耗小的任务进程)。

为了解决这个问题,开始提出新的概念,就是在同一进程或线程中运行多个任务,这种问题就相当于回到了早期的无OS时代的多任务实现。而现在解决方案称为协程。其本质是,将将任务切换的部分工作从内核转移到应用层。

②php中协程的基本工具以及基本使用

要实现协程,php给出了两个新东西:生成器和yield关键字。

(1)什么是生成器?

生成器继承了实现了迭代器,在php代码中和函数的定义类似,不过内部使用了yield关键字,如:

73434a48a162?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

使用时,这样子:

73434a48a162?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

好了,这样使用代表什么意思呢?

(1)首先$my_gen = gen();这句代码只是实例化一个新的生成器,里面的代码并未执行;

(2)$my_gen->current();这句代码就执行了生成器里面的step2中的yield “gen1”了,这时代码中断,并且字符串“gen1”被传进了生成器$my_gen,并且作为current()函数的返回值;

这里如果继续用current()方法来调取,则结果也不变,$my_gen的返回值仍然是gen1

(3)send(“main send”)执行完之后,字符串”main send”被传递进了生成器$my_gen, 同时生成器作为step2中yield的返回值传递给ret; 通过send()方法则会找到之前的上下文,并继续向下走。

(4) 生成器step3执行完后,在step4时,遇到yield就会再次进入中断。

7.PHP的各种并发模型

PHP支持多线程的模型, 在多线程情况下通常要解决资源共享和隔离的问题。PHP本身是线程安全的。

具体来说是哪种模型需要看使用的是哪个SAPI,比如说在Apache中,那么就可能使用多线程模型, 也可能使用多进程模型。而php-fpm使用的就是多进程模型。

目前比较推荐的方式是使用php-fpm的模型,因为这个模型对于PHP来说有诸多的优势:

①内存释放简单,使用多进程模型时进程可以容易通过退出的方式来释放内存, 由于PHP有非常多的扩展,稍有不慎就可能导致内存泄露,fpm通过进程退出方式 简单粗暴的解决了问题。

②容灾能力强,同样的问题,扩展或者php可能会出现错误,如果是单进程多线程模型, 那么整个PHP就挂掉了。这会影响服务,多进程的话,某个进程死掉了也不会影响整体的服务。

③多进程有多进程的优势,多线程也有多线程的优势,比如HHVM它选择的是多线程模型。 多线程模型最大的好处是信息共享和通信方便,因为在同一个进程空间内,可以直接使用指针。

转载地址:https://blog.csdn.net/weixin_32646781/article/details/116158606 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:php store_result,PHP: mysqli_stmt::store_result - Manual
下一篇:matlab用gui设计科学计算器,用gui设计计算器

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月26日 18时48分51秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android网!2021中级Android开发面试解答,进阶学习资料! 2019-04-29
android自动化测试工具!为什么有人说Android开发不再吃香?建议收藏 2019-04-29
android系统架构五层!最详细的解释小白也能听懂,2年以上经验必看 2019-04-29
android线刷包!跟我一起手写EventBus吧,大厂内部资料 2019-04-29
android实战!百度、阿里、滴滴、新浪的面试心经总结,满满干货指导 2019-04-29
Android小技巧:一线互联网移动架构师NDK模块开发!含BATJM大厂 2019-04-29
android市场前景!最详细的docker中安装并配置redis,实战解析 2019-04-29
万字Android技术类校招面试题汇总,深度好文 2019-04-29
三级缓存对性能的影响,我的头条面试经历分享,3面直接拿到offer 2019-04-29
三级缓存框架问题你都了解了吗?面试必备 2019-04-29
BAT常见的20道Android面试题详解,全网疯传 2019-04-29
BAT等大厂必问技术面试题,妈妈再也不用担心我找工作了! 2019-04-29
BAT等大厂必问技术面试题,成功拿下大厂offer 2019-04-29
一眼就能看懂的Android自学手册,送大厂面经一份! 2019-04-29
一线互联网大厂中高级Android面试真题收录!大牛最佳总结 2019-04-29
一个小例子彻底搞懂Android的MVP模式到底是什么?醍醐灌顶! 2019-04-29
一个小例子彻底搞懂Android的MVP模式到底是什么?面试资料分享 2019-04-29
mmkv跨进程,4个改变你编程技能的小技巧,已开源 2019-04-29
互联网寒冬公司倒闭后,使用指南 2019-04-29
疯狂涨知识!这位阿里P7大牛分析总结的属实到位 2019-04-29