本文只是概念性的知识,内容比较零散,下篇文章再进行代码分析。
Workerman是什么,他的优势在哪?
官方给的解释是高性能socket框架,我的个人理解是实现多进程的通讯的服务框架。
与传统的PHP框架不同,并非注重功能的实现,而是专注于性能和通讯服务。
优势:
1.与传统的web服务不同,Workerman第一次运行就将环境变量、对象等资源常驻内存
2.传统的web基本只实现http协议,但Workerman可以实现多种应用层协议(比如http、websocket、text等)
socket:
套接字,是网络中不同主机间双向通信的端点的抽象层,位于TCP/IP四层中传输层和应用层之间,是一种约定或方式的接口。
进程:
进程:是系统资源调用的最小单元,程序和程序之间默认不共享数据和地址空间。想要实现进程间通信可以用:队列、管道、信号量和共享内存、信号等。
孤儿进程:父进程fork出子进程后,父进程自己退出,则子进程为孤儿进程。
僵尸进程:父进程在fork出子进程后,子进程在结束后,父进程并没有调用wait或者waitpid等完成对其清理善后工作,导致改子进程进程ID、文件描述符等依然保留在系统中,极大浪费了系统资源。叫做僵尸进程。
守护进程:是运行在后台的一种特殊进程。创建守护进程的过程:
1.父进程创建子进程,父进程退出。
2.子进程创建新会话
3.禁止子进程重新打开终端
4.设置当前目录为根目录
5.设置文件权限掩码
6.关闭文件描述符
线程:是cpu调用的最小单元,同一进程中的线程共享数据和地址空间。
进程组:每一个进程都属于一个进程组,进程组是一个或多个进程的集合,进程组中有一个进程组长。
会话:是一个或多个进程组的集合,建立会话的进程是会话的首领进程,会话中每个进程组称为一个作业。
libevent:
libevent是用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
epoll、poll、select:https://www.cnblogs.com/aspirant/p/9166944.html
都是I/O多路复用模型的实现,对用户请求进行回调执行。
select:当I/O事件发生时,会无差别轮询所有socket完成调度,浪费cpu资源。且最大连接数受内存影响。参考:https://www.cnblogs.com/Anker/p/3258674.html
poll:和select本质上没有区别,但是没有最大连接数限制。参考:https://www.cnblogs.com/Anker/p/3261006.html
epoll:可以理解为event poll,当I/O事件发生时不会采用轮询的方式,而是把哪个流发生了怎样的I/O事件通知我们。参考:https://www.cnblogs.com/Anker/p/3263780.html
epoll提供了三个函数:epoll_create(创建)、epoll_ctl(事件注册)、epoll_wait(事件等待)
epoll在事件注册时已经将已经将fd复制到内核中并未每个fd指定了回调函数
reuseport :
开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。
未开启时:多个进程监听一个socket,没有请求时这些进程处于挂起状态。当有请求时,内核会唤醒这些进程让他们竞争去处理这个连接,这个过程耗费cpu资源,叫做惊群效应。
开启reuseport后:一个端口可以被多个socket同时监听,内核可以做到将客户端连接均匀地发送到监听统一端口的一群 Socket 上。当有客户端连接到来时,内核转发连接到一个 Socket 上,而这个 Socket 只会唤醒自己隶属的那个 Worker,避免惊群效应。
参考:https://www.jianshu.com/p/97cc8c52d47a