进程学习三
进程进阶
1.进程锁
这里的进程锁与线程锁、互斥量、读写锁和自旋锁不同,它是通过记录一个PID文件,避免两个进程同时运行的文件锁。
2.各种进程的概念
(1)孤儿进程
孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。
孤儿进程与僵尸进程是完全不同的,后面会详细介绍僵尸进程。而孤儿进程借用了现实中孤儿的概念,也就是父进程不在了,子进程还在运行,这时我们就把子进程的PPID设为1。前面讲PID提到,操作系统会创建进程号为1的init进程,它没有父进程也不会退出,可以收养系统的孤儿进程。
(2)僵尸进程
当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
(3)守护进程
可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。
3.进程间通信
IPC全称Interprocess Communication,指进程间协作的各种方法,当然包括共享内存,信号量或Socket等。
进程间通信有以下几种方式:
(1)管道
管道是进程间通信最简单的方式,任何进程的标准输出都可以作为其他进程的输入。
(2)信号
(3)消息队列
(4)共享内存
(5)信号量
信号量本质上是一个整型计数器,调用wait时计数减一,减到零开始阻塞进程,从而达到进程、线程间协作的作用。
(6)socket
也就是通过网络来通信,这也是最通用的IPC,不要求进程在同一台服务器上。
4.信号
信号只是告诉进程发生了什么事件,而不会传递任何数据。
例子:
import os/signal
siganl.Notify()
signal.Stop()
5.文件描述符
Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件。
内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。
6.epoll
Epoll是poll的改进版,更加高效,能同时处理大量文件描述符,跟高并发有关。
重点看看epoll,它大幅提升了高并发服务器的资源使用率,相比poll而言哦。前面提到poll会轮询整个文件描述符集合,而epoll可以做到只查询被内核IO事件唤醒的集合,当然它还提供边沿触发(Edge Triggered)等特性。
C10K问题,指的是服务器如何支持同时一万个连接的问题。如果是一万个连接就有至少一万个文件描述符,poll的效率也随文件描述符的更加而下降,epoll不存在这个问题是因为它仅关注活跃的socket。
epoll是怎么实现的呢?
简单来说,epoll是基于文件描述符的callback函数来实现的,只有发生IO事件的socket会调用callback函数,然后加入epoll的Ready队列。