php、apache、nginx、线程、进程、协程

php、apache、nginx、线程、进程

     最近在学swoole,发现里面设计好多操作系统里面的概念,这些基础知识正是自己欠缺的。根基不牢的高楼大厦,犹如空中楼阁,随时都要崩塌,早发现早治疗哈哈^_^。

    概念

     1) 进程

     进程就是应用程序的启动实例。例如:打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源,数据资源,独立的内存空间。

     一个进程中不仅仅包含这个程序的代码 (code),数据(data),文件,还包括当前的运行状态,即指令(Program Counter),栈,和当前 CPU 寄存器的值(有时还包括堆)。新创建一个进程需要在内存中创建以上所有内容。对于 Web Server 来说,服务不同连接的代码、数据、文件都是相同的,只是运行状态不同。所以对每个连接都重新创建进程会造成资源浪费

     2) 线程

     线程属于进程,是程序的执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程有两种调度策略,一是:分时调度,二是:抢占式调度。

     基本上就是对进程的代码、数据、文件进行重用,每个线程只是保存了不同的运行状态。于是节省了资源。

     3)协程

     协程是轻量级线程,协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。

     协程是属于线程,协程是在线程里执行的。

     协程的调度是用户手动切换的,所以又叫用户空间线程。

     协程的调度策略是:协作式调度

     4)开销

    单个 CPU 同一时间只能执行一条指令,即只能运行一个进程。为了让系统能「看起来」在同时进行多个进程, CPU 需要不断地在进程之间切换。

    这就是 Multiprogramming 的概念。而进行进程切换的时候不但需要把 CPU 的当前指令指针( Program Counter )切换到下一个进程,并且需要保存当前进程的运行状态,载入下一个进程上次被中断时的运行状态。这部分时间其实 CPU 是没有做什么对程序来说有意义的事情的,称为进程切换的开销( Overhead )。

    线程之间的切换代价要小于进程之间的切换代价,因此使用线程节省了时间。

   各概念之间的联系

   1、线程与进程的关系:

   1) 一个进程可以有很多线程。多进程可以很好的利用 CPU 。

   2) 多个线程是运行在单一进程的上下文中的,其实对于单一进程中的每一个线程,都有它自己的上下文,但是由于共同存在于同一进程,所以它们也共享这个进程,包括它的代码、数据等等。

   2、 Apache、nginx在处理php请求上的区别:

   1) Apache+php_module 是父进程+子进程的模式,每个访问请求会生成子进程,就不会有阻塞了。

   2) Nginx+PHP-FPM 的话感觉 Nginx 和 PHP 相互独立了, Nginx 遇到自己处理不了的请求就会给 PHP-FPM ( PHP FastCGI进程管理器)处理,

   每来一个请求就会交给一个子进程去处理(这里根据 PHP 的运行配置不同效果也不同,子进程的数量可以是固定的也可以动态生成),然后 Nginx 对交给 PHP-FPM 的请求进行轮训( epoll 机制)。

   这样处理性能和资源占用都比 Apache 有优势。

posted @ 2018-08-07 18:06  欢乐豆123  阅读(710)  评论(0编辑  收藏  举报