最近在学swoole,发现里面设计好多操作系统里面的概念,这些基础知识正是自己欠缺的。根基不牢的高楼大厦,犹如空中楼阁,随时都要崩塌,早发现早治疗哈哈^_^。
一、概念
1) 进程:是指正在运行的一个程序,不仅仅包含这个程序的代码( code ),数据( data ),文件,还包括当前的运行状态,
即指令( Program Counter ),栈,和当前 CPU 寄存器的值(有时还包括堆)。新创建一个进程需要在内存中创建以上所有内容。
对于 Web Server 来说,服务不同连接的代码、数据、文件都是相同的,只是运行状态不同。所以对每个连接都重新创建进程会造成资源浪费。
2) 线程:基本上就是对进程的代码、数据、文件进行重用,每个线程只是保存了不同的运行状态。于是节省了资源。
3)开销:另一方面,单个 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 有优势。