1. 经典“入门级”问题:IO 多路复用是什么意思? 在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。 是不是听起来好拗口,看个图就懂了.(其实就是一个时分复用)    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流 那么,“一个请求到来了,nginx使用epoll接收请求的过程是怎样的”, 其实,ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。 其中,“复用”指的是复用同一个线程。 其实就是操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知,让你去处理读事件或者写事件。 而这个功能能够通过select/poll/epoll等来使用。这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的 I/O 操作都能在一个线程内并发交替地顺序完成 。 2.s 继续阅读 >>


刘生玺 18/08/17 21:00:21
dup函数和dup2函数 dup,dup2都是属于创建文件描述符的函数,所以返回值也是一个文件描述符。有时候我们希望把标准输入重定向到一个文件的时候,或者把标准输出重定向到一个网络连接的时候,就可以通过这两个函数实现。简而言之,这两个函数就是复制文件描述符的。dup(oldfd)执行以后会返回一个新的并且是当前系统可用的最小整数值作为新的文件描述符,此时这个新的文件描述符将指向oldfd指向的同一个文件,共享所有的锁定、读写和各项权限和标志位。dup(oldfd,newfd)的意思就是,将文件描述符newfd指向oldfd(或者说oldfd被复制之后新的文件描述符被设定为newfd),dup2多出来的就是第二个参数可以指定新文件描述符的数值,因此dup2的返回值一定是不小于newfd的整数数值的。 函数原型(使用man函数手册可见) 函数意义及其参数意义 结合标准输出文件、标准输入文件、标准错误输出文件理解 标准输入文件的文件描述符: 0 标准输出文件的文件描述符:1 标准错误输出的文件 继续阅读 >>


胡佳露 18/08/02 20:50:24
在《Linux高性能服务器编程》一书中为了帮助大家将书中的知识融汇到实际项目中,作者特意编写了一个较为完整的负载均衡服务器程序springsnail。里面用到了进程池、有限状态机这些知识点。自己是在网上找到的这个程序的源码,起初接触的时候,总共1400多行代码里面没有一行注释,网上也没有一篇博客去对这个项目进行解析,因此写这篇博客供大家一起分享学习。springsnail源码(带注释) 咱们从main函数开始,我们要介绍几个c语言中的两个宏 __FILE__:用以指示本行语句所在源文件的文件名 __LINE__:用以指示本行语句在源文件中的位置信息 这两个参数在后面咱们程序的调试中有着非常正要的作用。并且整个程序的日志系统也是依靠这两个宏和可变参的log()函数完成的。 接着大家需要了解getopt函数这个函数可以通过提取命令行参数对命令行参数进行解析。 接着后面是解析xml文件的一长串代码 vector< host > balance_srv; 继续阅读 >>


李佳灏 18/08/02 12:33:17
server.cpp #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/epoll.h> #include<netinet/in.h> #include<arpa/inet.h> #include<assert.h> #include<unistd.h> #include<errno.h> #include<string.h> #include<fcntl.h> #include<stdlib.h> #include<sys/epoll.h> #define MAX_EVENT_NUMBER 1024 #define TCP_BUFFER_SIZE 512 #define UDP_BUFFER_SIZE 1024 int setnonblock 继续阅读 >>


李佳灏 18/03/15 21:53:26
代理服务器的设置 有时使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。那么怎么解决这个问题呢? 解决的方法很简单,就是使用代理服务器。 使用代理服务器去爬取某个网站的内容的时候,在对方的网站上,显示的不是我们真实的IP地址,而是代理服务器的IP地址。并且在Python爬虫中,使用代理服务器设置起来也很简单。 给大家推荐一个网址,http://www.xicidaili.com/,这上面有免费的代理Ip。 选择好代理ip地址后,我们就可以进行相应的程序编写了,可以使用以下程序,实现通过代理服务器来爬取网站内容。 def use_proxy(proxy_addr,url): import urllib.request proxy=urllib.request.ProxyHandler({'http':proxy_addr}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPH 继续阅读 >>


冯鑫 17/08/17 20:20:58
一、信号概述 1.发送信号 【1】 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 该函数将信号sig发送给目标进程;目标进程由pid指定,可能取值如下: pid参数 含义 pid>0 信号发送给PID为pid 的进程。 pid=0 信号发送给本进程组内的其他进程 pid = -1 信号发送给除init进程外的所有进程,但发送者需要拥有对目标进程发送信号的权限 pid < -1 信号发送给组ID为-pid的进程组中的所有成员 【2】 linux定义的信号值均大于0,如果sig取值为0则kill函数不发送任何信号。将sig值设为0时,可用来检测目标进程或进程组是否存在,因为检查在信号发送之前执行。但是这种检测方式是不可靠的,因为一方面由于进程PID的回绕,可能导致被检测到的pi 继续阅读 >>


闫钰晨 17/08/07 16:57:00
前言 本篇心路历程太多,放在最后了。 正文 在云服务器(阿里云、腾讯云)上部署Zookeeper集群模式时,无法成功的原因有很多,网上主要提到了端口被占用(未开放)和防火墙开启两种问题,类似的博客很多,本文不再赘述。 如果你已经针对上述两种情况做了修改依然没有成功,那么就可能出现了本篇的问题。 Zookeeper在启动时,并不会打印信息,即使集群启动失败,依然会显示: 这样我们看不到日志信息,无法判断出现的问题,通过 # zkServer.sh start-foreground 可以看到Zookeeper启动时的信息。 每次Zookeeper启动时信息很多,一定翻到最上面要从第一条开始看。 如果有这条错误消息 2017-08-05 09:27:32,253 [myid:1] - ERROR [/xxx.xx.xxx.xxx(你的IP):3888:QuorumCnxManager$Listener@763] - Exception while listening java.net.BindException: 无法指定被请求的地址 继续阅读 >>


康艺杰 17/08/05 10:06:20
一、select系统调用 1.selectAPI 原型: #include<sys/select.h> int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout) 【1】nfds参数指定被监听的文件描述符的总数。 【2】readfds,writefds,exceptfds分别指向可读,可写和异常等事件对应的文件描述符集合。通过这三个参数传入自己感兴趣的文件描述符;select调用返回时,内核将修改它们来通知应用程序哪些文件描述符已经就绪。三个参数都是fd_set结构指针类型: #include <typesizes.h> #define __FD_SETSIZE 1024 #include <sys/select.h> #define FD_SETSIZE __FD_SETSIZE typedef long int __fd 继续阅读 >>


闫钰晨 17/08/04 15:11:45
有时候会想把github上的文件删除,但是本地仓库里的文件想保留下来该怎么办,只要用三条命令就能完成了 git rm --cached filename/-r directory git commit "xxxx" git push 1.删除github文件,本地保留 git rm --cached test.txt git commit -m "delete file" git push 此时github上已经不存在了 2.删除远程code 文件夹,本地保留 一定要注意,删除文件夹要使用-r 参数 git rm --cached -r code git commit -m "delete directory" git push 作者:FallingU 发表于 2017/08/03 21:47:42 原文链接 https://blog.csdn.net/FallingU/article/deta 继续阅读 >>


李东林 17/08/03 21:47:42
并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法 1、半同步/半异步模式 1.1半同步/半异步模式 【1】同步:程序完全按照代码顺序执行;异步:程序的执行需要由系统事件来驱动。常见的系统事件包括中断,信号等。 【2】同步线程:按照同步方式运行的线程;异步线程:按照异步方式运行的线程。 异步线程执行效率高,实时性强,但是程序相对负责,难以调试和扩展,不适合于大量的并发。 同步线程效率相对较低,实时性较差,但逻辑简单。 像服务器这种既要求较好的实时性,又要能同时处理多个客户请求的应用程序,就要同时使用同步线程和异步线程来实现,即半同步/半异步模式。 【3】半同步/半异步模式中,同步线程用于处理客户逻辑,即逻辑单元;异步线程用于处理I/O事件,即I/O处理单元。 异步线程监听到客户请求之后,就将其封装成请求对象插入请求队列,请求队列通知某个工作在同步模式的工作线程来读取并处理该请求对象。具体选择哪个工作线程取决于请求队列的设计 【4】半同步/半 继续阅读 >>


闫钰晨 17/07/29 15:58:01