进程是什么?进程是正在实行的程序;进程是正在打算机上实行的程序实例;进程是能分配给处理器并由处理器实行的实体。 进程一样平常会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。 综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据凑集上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。
在进程实行时,进程都可以被唯一的表示,由以下一些元素组成:
进程描述符:进程的唯一标识符,用来和其它进程区分。在Linux中叫进程ID,在系统调用fork期间天生,只是我们通过getpid返回的不是其pid字段,而是其线程组号tgid。

进程状态:我们常说的挂起、运行等状态,其表示的是当前的状态。
优先级:进程间的实行调度干系,相对付其它进程而言。
程序计数器:程序中即将被实行的下一条指令的地址,该地址是内核术中或用户内存空间中的内存地址。
内存指针:包括程序代码和进程干系数据的指针,还有和其它进程共享内存块的指针。
高下文数据:进程实行时处理器的寄存器的数据。
I/O状态信息:包括显式的I/O要求、分配给进程的I/O设备等
记账信息:可能包括处理器韶光总和、利用的时钟数总和、韶光限定等
以上的这些元素都会放在一个叫做进程掌握块的数据构造中。进程掌握块是操作系统能够支持多进程和供应多处理的构造。 当操作系统做进程切换时,它会实行两步操作,一是中断当前处理器中的进程,二是实行下一个进程。 不管是中断还是实行,进程掌握块中的程序计数器、高下文数据和进程状态都会发生变革。 当进程中断时,操作系统会把程序计数器和处理器寄存器(对应进程掌握块中的高下文数据)保存到进程掌握块中的相应位置, 进程状态也会有所变革,可能进入壅塞状态,也有可能进入就绪态。 当实行下一个进程时,操作系统按规则将下一个进程设置为运行态,并加载即将要实行进程的程序高下文数据和程序计数器等。
线程
进程有两个特性部分:资源所有权和调度实行。 资源所有权是指进程包括了进程运行所须要的内存空间、I/O等资源。 调度实行是指进程实行过程中间的实行路径,或者说程序的指令实行流。 这两个特性部分是可以分开的,分开后,拥有资料所有权的常日称为进程,拥有实行代码的可分派部分的被称之为线程或轻量级进程。
线程有“实行的线索”的意思在里面,而进程在多线程环境中被定义为资源所有者,其还是会存储进程的进程掌握块。 线程的构造与进程不同,每个线程包括:
线程状态: 线程当前的状态。
一个实行栈
私有的数据区: 用于每个线程局部变量的静态存储空间
寄存器集: 存储处理器的一些状态
每个进程都有一个进程掌握块和用户地址空间,每个线程都有一个独立的栈和独立的掌握块,都有自己一个独立实行高下文。 其构造如图8.1所示。
图8.1 进程模型图
线程在实行过程中与进程有一些不同。每个独立的线程有一个程序运行的入口、顺序实行序列和程序的出口。 但是线程不能够独立实行,必须依存在于进程之中,由进程供应多个线程实行掌握。 从逻辑角度来看,多线程的意义在于一个进程中,有多个实行部分可以同时实行。 此时,进程本身不是基本运行单位,而是线程的容器。
线程较之进程,其上风在于一个快,不管是创建新的线程还是终止一个线程;不管是线程间的切换还是线程间共享数据或通信,其速率与进程比较都有较大的上风。
并发及并行
并发又称共行,是指能处理多个同时性活动的能力,并发事宜之间不一定要同一时候发生。 比如,当代打算机系统可在同一段韶光内以进程的形式将多个程序加载到存储器中,并借由处理器的时分复用, 以在一个处理器上表现出同时运行的觉得。
并行是指同时发生的两个并发事宜,具有并发的含义,而并发则不一定并行。
并发和并行的差异便是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。
PHP的各种并发模型
既然有两种模型,那么PHP利用的是哪一种呢?答案是都支持,也便是说PHP支持多线程的模型, 在多线程情形下常日要办理资源共享和隔离的问题。PHP本身是线程安全的。
详细来说是那种模型须要看利用的是哪个SAPI,比如说在Apache中,那么就可能利用多线程模型, 也可能利用多进程模型。而php-fpm利用的便是多进程模型。
目前比较推举的办法是利用php-fpm的模型,由于这个模型对付PHP来说有诸多的上风:
内存开释大略,利用多进程模型时进程可以随意马虎通过退出的办法来开释内存, 由于PHP有非常多的扩展,稍有不慎就可能导致内存透露,fpm通过进程退出办法 大略除暴的办理了问题。
容灾能力强,同样的问题,扩展或者php可能会涌现段缺点,如果是单进程多线程模型, 那么全体PHP就挂掉了。这会影响做事,多进程的话,某个进程去世掉了也不会影响整体的做事。
多进程有多进程的上风,多线程也有多线程的上风,比如HHVM它选择的是多线程模型。 多线程模型最大的好处是信息共享和通信方便,由于在同一个进程空间内,可以直策应用指针。
比如opcode cache工具,在PHP里,apc以及opcache等等利用的是共享内存来共享opcode, 那么在HHVM中则不须要走共享内存,共享内存还有个问题是存储繁芜的数据构造未便利, 由于指针的问题,多线程情形下C/C++中的数据构造是可以共享的。这对效率提升也是有帮助的。
多进程和多线程还有一个明显的模型差异:在处理要求时的逻辑。
在多进程情形下,由于跨进程是不好通报fd连接的。那么多进程常日采取在父进程中listen(), 然后各个子进程accept()的办法来实现负载均衡。这样的模型下可能会有惊群的问题。
而多线程模型下,可以采取一个独立线程接管要求然后派发到各个worker线程的办法。
链接:https://www.jianshu.com/p/2b3e2a065aa3