写点什么

进程和 nginx

发布于: 2021 年 03 月 05 日
进程和nginx

进程和线程

进程:程序分配和管理资源的基本单位

线程:程序运行的基本单位,进程的一个执行单元

协程:比线程更加轻量级


僵尸和孤儿进程

  1. 僵尸进程(Z):一个进程使用 fork() 创建子进程,如果子进程退出,而父进程并没有调用 wait() 或 waitpid() 获取子进程的状态信息,那么子进程的描述符仍然保存在系统中、

  2. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程 (进程号为 1)收养,并由 init 进程对它们完成状态收集工作

解决办法:僵尸进程可以通过发送信号的方式,kill 父进程,让僵尸进程成为孤儿进程被 init 回收。

进程状态

  1. 运行态(R)

  2. 就绪态(S)

  3. 阻塞态(D)

IO 多路复用技术

多路是多个 socket 连接,复用是公用一个线程或者进程。不是单个连接处理更快,而是单个进程/线程处理更多的请求

  1. select 监听多个文件描述符 (1024 个文件描述符),阻塞等待其中一个可读或者可写。

  2. poll 没有最大文件描述符数量的限制。select 和 poll 都是将所有的文件描述符复制到 用户态和内核的地址空间之间,遍历所有的文件,而不管是不是已经就绪的文件。

  3. epoll 没有文件描述符的限制,使用一个文件描述符管理多个文件描述符,当有一个文件描述符就绪后,就放到 就绪表中,而不用遍历所有的描述符)

epoll LT 与 ET 模式的区别

  1. epoll 有 EPOLLLT 和 EPOLLET 两种触发模式,LT 是默认的模式,ET 是“高速”模式。

  2. LT 模式下,只要这个 fd 还有数据可读,每次 epoll_wait 都会返回它的事件,提醒用户程序去操作

  3. ET 模式下,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论 fd 中是否还有数据可读。所以在 ET 模式下,read 一个 fd 的时候一定要把它的 buffer 读完,或者遇到 EAGAIN 错误

nginx 进程分配 worker

  1. worker 进程竞争请求连接,这种竞争会导致不公平。

  2. nginx 通过只有获得 accept_mutex 锁的进程开能接受连接,添加 accept 事件。

  3. ngxacceptdisabled 的值是 nginx 单进程的所有连接总数的八分之一

  4. 当 ngxacceptdisabled 减去 当前进程空闲连接数量,大于 0 时,说明当前空闲连接数小于 ngxacceptdisabled 标准。就不再去获取 accept_mutex 锁,不去 accept, 自己的连接就控制下来,其他进程的连接池就会被利用到


局部性原理

包括时间局部性、空间局部性、内存局部性等




进程的组成


物理内存、虚拟内存、共享内存


  1. 虚拟内存:为了满足物理内存不足而提出的策略,它是利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间叫交换空间(Swap Space)Linux 会在物理内存不足时,使用虚拟内存,内核会把暂时不用的内存快信息写到虚拟内存,这样物理内存就得到了释放。

  2. 共享内存:进程间通信最简单方式之一。共享内存允许两个或更多进程访问同一块内存,多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用


netstat 查看网络状态


  1. -a 所有连接协议 UDP(netstat -at)、TCP(netstat -at)、UNIX (netstat -ax)

  2. -p 添加 PID/进程名称

  3. -n 加速输出、使用数字代替

  4. -l 显示监控端口 UDP(netstat -lt)、TCP(netstat -lt)、UNIX (netstat -lx)


用户头像

多读书多看报,少吃零食多睡觉 2018.08.07 加入

还未添加个人简介

评论

发布
暂无评论
进程和nginx