异步io

Swoole入门到实战(一):PHP7&Swoole源码安装、玩转网络通信引擎、异步非堵塞IO场景

匿名 (未验证) 提交于 2019-12-02 22:11:45
一、PHP7源码安装和Swoole源码编译安装 1.1 PHP7源码安装 1.1.1 获取源码与安装 获取PHP7源码: www.php.net tar -xzvf ... # 解压命令 . /configure --prefix=/ home /study/ php # 安装至某个路径,提前安装gcc等 make # 编译 make install # 安装 bin 目录下 php -m # 查看 PHP 安装的扩展 1.1.2 简化PHP执行命令 alias vim /.bash_profile alias php= /home/work /soft/php /bin/php # 添加 source /.bash_profile # 注意 source FileName 在当前 bash 环境下读取并执行 FileName .bash_profile .profile 等等 注: 该命令通常用命令“ . ”来替代 如: source /etc/profile . /etc/profile 是等效的 php -i | grep php.ini # 查找PHP的配置文件 1.2 Swoole源码编译安装 获取swoole源码: https://gitee.com/swoole/swoole.git phpize 是用来扩展 php 模块的,通过 phpize 可以建立 php

Linux五种IO模型

匿名 (未验证) 提交于 2019-12-02 21:56:30
Ŀ¼ Linux下可用的IO模型有5种,分别是: 阻塞式IO 非阻塞式IO IO复用 信号驱动式IO(SIGIO) 异步IO(Posix的aio_系列函数) 其中, 除了异步IO,其余都属于同步IO模型。 在这5种模型中,我们目前只关注前3种,并且把IO复用放在网络编程专题中讲,本文只简单介绍阻塞式IO和非阻塞式IO的概念与区别。 阻塞式IO是Linux中最基本、最常用的IO模型,指的是可能会使进程永远阻塞的函数, 一般表现为: 进程或线程调用某个函数,该函数需要满足特定条件才能向下执行 如果条件不满足,则会使调用进程或线程阻塞,让出CPU控制权,并一直持续到条件满足为止 在Linux中,阻塞式IO一般作为默认属性出现, 如mq_receive、sem_wait、sem_post等 在默认情况下,所有的套接字都是阻塞的, 我们以UDP套接字为例来展示阻塞式IO模型,如下图所示。 进程调用recvfrom接收数据,但由于内核还未准备好,进程就会阻塞;直到内核准备好数据,recvfrom完成数据复制工作,进程才能解除阻塞状态。 顾名思义, 非阻塞式IO不会使调用进程或线程永远阻塞, 具体表现为: 如果IO操作不能完成,则立即出错返回, 调用进程或线程继续向下执行。 对于一个给定的描述符,有两种将其指定为非阻塞式IO的方法: 调用open创建或打开文件时指定O_NONBLOCK标志

linux-nginx

匿名 (未验证) 提交于 2019-12-02 21:56:30
IO 分为内存 IO ,网络 IO ,磁盘 IO IO 模型: 同步 IO 模型: 同步阻塞:一个进程对应一个 IO ,进程在运行时,不能去干别的,一直等待 同步非阻塞:一个进程对应一个 IO ,进程运行时,可以去做别的事,等待别的程序的数 据传输,进程会定时询问是否准备完成 多路访问的 IO 模型-- IO 复用( select poll epoll ) 多线程运行 这种情况适合大并发请求的情况, 异步 IO 模型: *异步 10 * 进程只需要发起请求,内核准备数据,当数据准备就绪以后,会主动通知进程; apache 采用的 select 就是同步 IO 模型,而 nginx 采用的就是 epoll 的异步模型;所以,从这点上说, nginx 要远远由于 apache ; nginx 适用环境:小文件的高并发传输 nginx - engine X ( Tengin :属于淘宝公司对 nginx 的=次开发优化版本,更好的支持高并发,与 web 安全功能); 由俄罗斯 I 君开发的, 2004 年开发的, I 君为 elusive 第二大网站开发的一个前端静态资源解析程序 安装 nginx 安装 nginx : ./ configure -- prefix = /usr/ local / nginx -- conf - path =(配置文件一定要放到程序目录下,不要放到 etc

IO类型

匿名 (未验证) 提交于 2019-12-02 21:56:30
我的内容来自于《马哥Linux2016最新高薪运维视频课程-Nginx应用基础及配置详解》 httpd:MPM prefork,worker,event prefork:主进程,生成多个子进程,每个子进程处理一个请求; worker:主进程,生成多个子进程,每个子进程再生成多个线程,每个线程响应一个请求 event:主进程,生成多个子进程,每个子进程响应多个请求 I/O类型: 同步I/O和异步I/O:synchronous,asynchronous 关注的是被调用者的消息通知机制 同步I/O:调用发出之后结果不会立即返回,但一旦返回,则返回既是最终结果 异步I/O:调用发出之后,被调用方立即返回消息,但返回的并不是最终结果;被调用方完成任务后会通过状态、通知机制等来通知调用者,或者通过回调函数来处理结果 阻塞I/O和非阻塞I/O:block,nonblock 关注的是调用者等待被调用者返回调用结果时的状态 阻塞:调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后才能继续 非阻塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者 I/O模型: blocking I/O:阻塞式I/O nonblocking I/O:非阻塞式I/O I/O multiplexing:复用型I/O 阻塞型,是阻塞在内核的代理上;当在内核代理上阻塞时,其调用者是没有阻塞的,可以发送请求

Netty事件监听和处理(上)

匿名 (未验证) 提交于 2019-12-02 21:53:32
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app。 今天给大家送了福利:小爱音箱F码,据说卖的比较好,不太好抢到,借着这次公司福利,分享给大家,以表大家的支持和鼓励。 掘金的运营真的很贴心,主动找到我说:我的福利文章不是技术型文章,不能推送到信息流,只能在个人主页看到,为了让更多的人参与这次抽取,建议写一篇技术文章,末尾加上送福利的内容。再次感谢掘金运营小哥「刺客」的贴心和建议。 RabbitMQ实战的后续章节还没来得及看,这篇就总结下之前在项目组分享过的技术点:Netty事件监听和处理。 通过介绍,你会了解到: 事件监听、NIO、线程模型等相关概念; Netty总体结构; 事件监听和处理; 项目实践总结; 本篇先介绍下前两节,下一篇介绍后两节。 本篇最后会说明下福利的抽取规则,大家积极参与 >_< Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理。 所以,先介绍下事件监听、责任链模型、socket接口和IO模型、线程模型等基本概念,对后面理解Netty的事件监听和处理有很大帮助。 JDK监听器模式主要包含以下元素:

BIO、NIO、AIO

匿名 (未验证) 提交于 2019-12-02 21:52:03
一、扫盲概念 1、同步与异步 (1)同步:指一个线程要等待上一个线程执行完之后才开始执行当前的线程。(有一个等待过程) (2)异步:指的是一个线程的执行不需要在意其他线程的执行。(没有等待过程) (3)同步异步发生在两个(或多个)线程间。 举例:   两个人去吃饭,用线程 A 、线程 B 表示。   同步:线程 A 喊 线程 B 去吃饭,B 听到了就和 A 一起去吃饭。 B 没听到,则 A 就一直喊,直至B听到了,然后与 A 一起去吃饭。   异步:线程 A 喊 线程 B 去吃饭, 不管 B 有没有听到, A 先去吃饭了,B 可能跟着 A 一起吃饭,也可能过几个小时再去吃饭。 2、阻塞与非阻塞 (1)阻塞:指的是调用者发起一个调用请求后,调用者一直等待被调用者处理请求并返回结果,不能进行其他的处理。即当前线程被挂起,无法继续别的处理,需要等待条件满足才会继续处理。 (2)非阻塞:指的是调用者发起一个调用请求后,调用者不用等待被调用者处理请求的返回结果,可以进行其他的处理。 (3)阻塞与非阻塞发生在同一线程间。 举例:   一个人去食堂吃饭,用线程A表示。   阻塞:A 来到食堂买饭,某个打菜的窗口有很多人,需要排队等候,此时A只能默默的排队,不能去买其他吃的,直至A来到打菜的窗口。   非阻塞:A来到食堂买饭,到某个窗口,说出菜名,拿到一张号码,听号取餐,此时A可以去买其他吃的

day40

£可爱£侵袭症+ 提交于 2019-12-02 16:29:14
目录 软件开发架构: 软件开发架构: C/S: Client: 客户端 Server: 服务端 优点: 占用网络资源少,软件的使用稳定 缺点: 服务端更新后,客户端也得跟着跟新. 需要使用多个软件,需要下载多个客户端 B/S: Browser: 浏览器(客户端) Server: 服务端 服务端与客户端作用: 服务端: 24小时不间断提供服务 客户端: 需要体验服务端时,再去连接服务端,并享受服务 一 网络编程: 1.互联网协议OSI七层协议 1)应用层 2)表示层 3)会话层 4)传输层 5)网络层 6)数据链路层 7)物理连接层 - 物理连接层 基于电信号发送二进制数据. - 数据链路层 1) 规定好电信号的分组方式 2) 必须要有一块网卡: - mac地址: 12位唯一的16进制字符串 - 前6位: 厂商号 - 后6位: 流水号 - 以太网协议: 在同一个局域网内通信. - 单播 1对1吼 - 广播 多对多吼 - 广播风暴: - 不能跨局域网通信 - 网络层 - ip: 定位局域网的位置 - port: 唯一标识一台计算机上一个应用程序. - arp协议: 将mac地址获取,并解析成ip和port. - 传输层 - TCP 特点: TCP协议称之为流式协议. 若想要通信,必须建立连接,并建立双向通道. - 三次握手,四次挥手 - 三次握手建连接 -

网络编程面试题整理(三)

回眸只為那壹抹淺笑 提交于 2019-12-02 10:44:17
1: 什么是并发和并行? 并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。 2: 进程锁和线程锁的作用? 线程锁: 大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法 / 代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。 但是,其余线程是可以访问该对象中的非加锁代码块的。    进程锁: 也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的, 但是可以使用本地系统的信号量控制(操作系统基本知识)。 3: 解释什么是异步非阻塞? 首先需要知道什么是同步和异步: 同步和异步 是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。同步方法表明调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。异步方法表明,方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法

IO模型

自作多情 提交于 2019-12-02 09:13:52
同步和异步 同步 函数或方法被嗲用的时候,调用者是否得到最终结果 直接得到最终结果的,就是同步调用, 不直接得到最终结果的,就是异步调用 阻塞和非阻塞 函数与或方法调用的时候,是否立刻返回 立刻返回就是非阻塞调用 不立刻返回就是阻塞调用 注意: 同步,异步强调的是,是否得到(最终的结果) 阻塞,非阻塞敲掉的是时间,是否等待 IO模型 IO的两个阶段 数据准备阶段 内核空间赋值回用户进程缓冲区阶段(将数据从内核拷贝到进程中)] 同步IO包括:阻塞IO,非阻塞IO,IO多路复用 阻塞IO(blocking IO) 而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存, 然后kernel返回结果,用户进程才解除block的状态,重新运行起来。 所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。 非阻塞IO(non-blocking IO) 进程调用read操作,如果IO设备没有准备好,立刻返回error,进程不阻塞. 用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后复制数据到用户空间 第一阶段是非阻塞的. 第二阶段是阻塞的,即内核空间和用户空间之间的赋值数据是阻塞的. 不建议使用,因为其缺点明显: ​ 循环使用recv()大幅度推高CPU占用, ​

1024 笔记

孤人 提交于 2019-12-02 06:51:06
目录 1. Event事件 定义 方法 2. 进程池与线程池 定义 作用 使用 进程池 线程池 3. 协程 定义 代码实现 4. TCP服务端实现协程 5. IO模型 1. Event事件 定义 Event事件的作用: 用来控制线程 事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。 方法 set() : 将标志设为True,使处于阻塞状态的线程恢复运行状态。 wait() : 如果标志为True将立即返回,否则线程阻塞(可传时间) clear(): 将标志设为False。 isSet() : 获取内置标志状态,返回True或False。 from threading import Event import time from threading import Thread # 调用Event类实例化一个对象 e = Event() def light(): print('红灯亮...') time.sleep(5) # 发送信号true,其他所有进程准备执行 e.set() # flag变为true ,阻塞态变为运行 print('绿灯亮...') def car(name): print('正在等红灯...') #