进程和 nginx
进程和线程
进程:程序分配和管理资源的基本单位
线程:程序运行的基本单位,进程的一个执行单元
协程:比线程更加轻量级
僵尸和孤儿进程
僵尸进程(Z):一个进程使用 fork() 创建子进程,如果子进程退出,而父进程并没有调用 wait() 或 waitpid() 获取子进程的状态信息,那么子进程的描述符仍然保存在系统中、
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程 (进程号为 1)收养,并由 init 进程对它们完成状态收集工作
解决办法:僵尸进程可以通过发送信号的方式,kill 父进程,让僵尸进程成为孤儿进程被 init 回收。
进程状态
运行态(R)
就绪态(S)
阻塞态(D)
IO 多路复用技术
多路是多个 socket 连接,复用是公用一个线程或者进程。不是单个连接处理更快,而是单个进程/线程处理更多的请求
select 监听多个文件描述符 (1024 个文件描述符),阻塞等待其中一个可读或者可写。
poll 没有最大文件描述符数量的限制。select 和 poll 都是将所有的文件描述符复制到 用户态和内核的地址空间之间,遍历所有的文件,而不管是不是已经就绪的文件。
epoll 没有文件描述符的限制,使用一个文件描述符管理多个文件描述符,当有一个文件描述符就绪后,就放到 就绪表中,而不用遍历所有的描述符)
epoll LT 与 ET 模式的区别
epoll 有 EPOLLLT 和 EPOLLET 两种触发模式,LT 是默认的模式,ET 是“高速”模式。
LT 模式下,只要这个 fd 还有数据可读,每次 epoll_wait 都会返回它的事件,提醒用户程序去操作
ET 模式下,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论 fd 中是否还有数据可读。所以在 ET 模式下,read 一个 fd 的时候一定要把它的 buffer 读完,或者遇到 EAGAIN 错误
nginx 进程分配 worker
worker 进程竞争请求连接,这种竞争会导致不公平。
nginx 通过只有获得 accept_mutex 锁的进程开能接受连接,添加 accept 事件。
ngxacceptdisabled 的值是 nginx 单进程的所有连接总数的八分之一
当 ngxacceptdisabled 减去 当前进程空闲连接数量,大于 0 时,说明当前空闲连接数小于 ngxacceptdisabled 标准。就不再去获取 accept_mutex 锁,不去 accept, 自己的连接就控制下来,其他进程的连接池就会被利用到
局部性原理
包括时间局部性、空间局部性、内存局部性等
进程的组成
物理内存、虚拟内存、共享内存
虚拟内存:为了满足物理内存不足而提出的策略,它是利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间叫交换空间(Swap Space)Linux 会在物理内存不足时,使用虚拟内存,内核会把暂时不用的内存快信息写到虚拟内存,这样物理内存就得到了释放。
共享内存:进程间通信最简单方式之一。共享内存允许两个或更多进程访问同一块内存,多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用
netstat 查看网络状态
-a 所有连接协议 UDP(netstat -at)、TCP(netstat -at)、UNIX (netstat -ax)
-p 添加 PID/进程名称
-n 加速输出、使用数字代替
-l 显示监控端口 UDP(netstat -lt)、TCP(netstat -lt)、UNIX (netstat -lx)
评论