怎么查看java进程PID对应的服务 如何查看进程的pid_子进程

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 */};

常见的进程转换图如下:




怎么查看java进程PID对应的服务 如何查看进程的pid_PHP_02

进程切换



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的切换。