fork进程
1.进程是什么?写程序的应该都知道。今天就了解一下关于进程的一些知识:
简单的说,进程就是程序的一次执行过程。
2. PID和PPID
每个进程都有自己唯一的标识号,就是PID ,同一个程序每次运行的PID都是不一样的,
PPID是进程的父ID,就是生成进程的进程,在Linux中,除了1号进程init由系统内核产生,其他的进程都有PPID。
以下是查看PID和PPID的伪代码
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("PID", os.Getpid())
fmt.Println("PPID", os.Getppid())
}
得到进程的id后,可以通过kill对进程发生信号。
3. 操作系统给每个进程分配3个文件操作符,
stdin 0stdout 1stderr 2
像Linux常用的操作
./demo 2>&1 >/dev/null
就是把错误输出2重定向到标准输出1,/dev/null是空设备,所有输入的东西都被丢弃
4. 进程的状态:
进程并不是总是运行的,它也分7种状态:
状态的定义在fs/proc/array.c
/** The task state array is a strange "bitmap" of* reasons to sleep. Thus "running" is zero, and* you can test for combinations of others with* simple bit tests.*/static const char * const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "t (tracing stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */};
常见的进程转换图如下:
进程切换
5. 进程CPU切换
每个进程运行的时候,必须占用一个CPU,在早期的硬件,还是单核的时候,多个进程必须轮流执行,才能实现系统的多任务。
在现在,硬件核数大幅增加,实现了真正意义上的并行计算,这也是支持多线程编程的语言能火的原因。
当运行的进程很多时,CPU要进行时间片的切换。那么我们在 设置多进程服务器的时候,是不是设置的进程越多越好呢?
显然不是,以nginx+php-fpm为例:
nginx:是master+worker模式,Master进程只负责管理Worker进程,而Worker进程是负责处理真实的请求,Worker的数目,一般和cpu个数一致。
php-fpm:是PHP的进程管理器,也是多进程模式运行,也是master+worker模式,
为了了解worker进程数量的配置,我们先了解PHP处理请求的流程:
listen.backlog = 511 排队的请求数
pm.max_children = 5 最大子进程数
pm.start_servers = 2 服务启动时的子进程数
随着请求的增加,子进程数动态增加,直到达到最大值,当所有子进程都是忙碌,这时再进来的请求会放入等待队列,等待队列也达到最大值,
就会出现502 bad gateway,
同理,worker的数量也不是越多越好,因为PHP脚本,一般有很多的IO操作,所以设置的数目要比cpu个数多,具体设置多少,要根据实际情况进行
调整。
满足需求的情况下尽量减少cpu的切换。