当前位置: 首页 > news >正文

赣州网站建设新闻做网站平台需要多少钱

赣州网站建设新闻,做网站平台需要多少钱,运城做网站,软件app开发公司哪个好Redis网络模型 一、用户空间和内核空间#xff08;前提#xff09;问题来了#xff1a;为啥要区分用户空间和内核空间呢#xff1f;我们来看看两个空间以及硬件是如何操作的 二、Linux中五种IO模型1、 阻塞IO2、非阻塞IO3、IO多路复用3.1、SELECT3.2、poll3.3、epoll 4、信… Redis网络模型 一、用户空间和内核空间前提问题来了为啥要区分用户空间和内核空间呢我们来看看两个空间以及硬件是如何操作的 二、Linux中五种IO模型1、 阻塞IO2、非阻塞IO3、IO多路复用3.1、SELECT3.2、poll3.3、epoll 4、信号驱动IO5、异步IO 三、Redis中的网络模型四、Redis通信协议定义RESP2协议-数据类型 五、Redis内存回收 一、用户空间和内核空间前提 我们知道操作系统采用的是虚拟地址空间以32位操作系统举例它的寻址空间为4G(2的32次方)这里解释二个概念: 寻址: 是指操作系统能找到的地址范围32位指的是地址总线的位数你就想象32位的二进制数每一位可以是0可以是1是不是有2的32次方种可能2^32次方就是可以访问到的最大内存空间也就是4G。 虚拟地址空间 为什么叫虚拟因为我们内存一共就4G但操作系统为每一个进程都分配了4G的内存空间这个内存空间实际是虚拟的虚拟内存到真实内存有个映射关系。例如X86 cpu采用的段页式地址映射模型。 操作系统将这4G可访问的内存空间分为二部分一部分是内核空间一部分是用户空间。 内核空间是操作系统内核访问的区域独立于普通的应用程序是受保护的内存空间。 用户空间是普通应用程序可访问的内存区域。 以linux32位操作系统为例 将最高的1G字节从虚拟地址0xC0000000到0xFFFFFFFF供内核使用称为内核空间而将较低的3G字节从虚拟地址0x00000000到0xBFFFFFFF供各个进程使用称为用户空间 每个进程可以通过系统调用进入内核因此Linux内核由系统内的所有进程共享。于是从具体进程的角度来看每个进程可以拥有4G字节的虚拟空间。 问题来了为啥要区分用户空间和内核空间呢 其实早期操作系统是不区分内核空间和用户空间的但是应用程序能访问任意内存空间如果程序不稳定常常把系统搞崩溃比如清除操作系统的内存数据。后来觉得让应用程序随便访问内存太危险了就按照CPU 指令的重要程度对指令进行了分级指令分为四个级别Ring0~Ring3 (和电影分级有点像)linux 只使用了 Ring0 和 Ring3 两个运行级别进程运行在 Ring3 级别时运行在用户态指令只访问用户空间而运行在 Ring0 级别时被称为运行在内核态可以访问任意内存空间。 用户态的程序不能随意操作内核地址空间这样对操作系统具有一定的安全保护作用。 我们来看看两个空间以及硬件是如何操作的 **写数据到磁盘**首先将数据写到用户空间的缓冲区然后调用内核内核则将数据从空间缓冲区copy到内核缓冲区然后再将缓冲区中的数据写入磁盘。 从网络中或者磁盘中读数据 进程首先切换到内核态调用内核从网卡或者磁盘中读但是没有的时候就需要等待有则将数据读到内核的缓冲区再copy到用户区使用。 其实这里就有很多空间进行IO优化了比如没有数据读的时候需要一直等待一直占用cpu资源以及读写的多次拷贝两个空间的来回切换等等。 二、Linux中五种IO模型 1、 阻塞IO 顾名思义没有数据的时候一直等待有数据则拷贝到用户空间进行处理。 2、非阻塞IO 顾名思义没有就返回错误但是会一直请求花里胡哨其实一点用也没有用户还是停留在访问等待直到有数据盲目等待拷贝到用户空间进行处理。 注意由于没有数据的时候一直访问cpu一直执行指令可能性能更低cpu空转甚至不如阻塞IO。 3、IO多路复用 看到这里大家发现其实不管阻塞IO还是非阻塞IO第一阶段都需要等待数据恰好没数据但是当多个进程来时等待会影响整个业务下面用个生活中的例子来表示排队点餐。 如果第一顾客还没想好自己要吃啥的时候后面的顾客都需要等待等待数据 如果已经想好了开始点餐读取数据 那我们如何提高点单速率呢 多加几个前台多线程不排队谁想好了吃啥服务员就先给谁点单读数据 显然第二种更好一点不需开多线程去提高效率。 问题又来了如何知道顾客已经想好了数据就绪 这里需要了解一个概念-文件描述符File Decriptor简称FD是一个从0开始的无符号整数自然数用来关联Linux中的一个文件。在Linux中一切皆文件常规文件视频硬件等待当然包括网络套接字Socket。 IO多路复用 是利用单线程来同时监听多个FD并且在某个FD可读、可写时得到通知从而避免无效的等待充分利用了CPU的资源。 在等待数据方面用户调用select方法同时监听多个FD如果都没有数据则等待也就是所有顾客都没有想好吃啥这个时候才阻塞等待当有一个想好了就可以进行点餐。从而避免了没有数据的时候直接调用recvfrom函数去内核空间中等待浪费cpu资源。 那我们再深一层解析一下监听和通知 方式有三种 一个是上面说的select 还有poll 和epoll 他们有啥区别吗 依旧使用前面的生活案例来解释 select和poll 当有顾客想好了然后通知给点单前台但是前台是不知道具体哪一位顾客准备好了然后就一个一个问顾客遍历,找到了再进行点单。 其实他的缺点也看到了就是有人下单了无法立即确定是哪一个顾客。 epoll 有一个顾客想好后会显示到点单员电脑上直接下单准备食物即可。 转换成计算机的话 select和poll只会通知用户进程有FD就绪但是不确定是哪一个FD需要逐个遍历FD来确定epoll 则会通知用户进程FD就绪的同时把已就绪FD写入用户空间中。更高效 3.1、SELECT 上源码 本质是数组存二进制位0表示未就绪1则表示就绪共有三个一个是监听读事件一个写数件还一个是异常事件1024位。 select函数同时监听这三者的状态。 流程如图假设8个位置我们假设监听FD为125。 过程 执行select函数需要内核空间帮我监听拷贝数组到内核空间遍历数组没有则休眠有则唤醒并且传回用户空间又将数组拷贝回去然后用户空间再遍历一次找到相关的就绪FD。 不足 执行select需要拷贝一份到内核空间监听完之后又要拷贝一份到用户空间一次监听就要2次切换在监听后续的fd又需要重复以上操作。内核空间监听需要遍历整个数组监听到返回给用户空间又要遍历一遍数组查找就绪fd两次遍历大小不能超过1024若超过需要修改源码很麻烦 3.2、poll 直接上源码 其实和select的数据结构差不多只是数组中添加了一个状态从而无需三个数组换汤不换药 执行流程 1、创建数组pollFD添加监听的fd信息数组大小自定义 2、调用poll函数将数组拷贝到内核空间转链表存储无上限 3、内核遍历判断是否就绪 4、数据就绪或者超时后拷贝数组到用户空间返回就绪数量n 5、使用进程判断n大于零就开始遍历数组找就绪的fd 其实本质和select没啥区别只不过数组自定义可以大于1024个fd同时监听内核中采用链表存储再一个fd越多遍历越慢性能反而下降。意义不大所以很少使用这种方式 3.3、epoll 上源码 底层结构和过程本质是由一个红黑树和一个链表组成调用创建函数epoll_create创建并且返回,epoll_ctl()函数将fd加入到红黑树中监听作用并且设置回调函数一旦回调函数触发就将该fd添加到链表list_head中再通过epoll_wait函数检查链表有则返回就绪fd数量并且将链表中fd复制到events数组中给用户空间使用。 我们将之前select的不足截取过来对比 最后总结 我们来看看相对前面二者的不足epoll做了啥优化。 对于解决监听上限的问题基于epoll是使用红黑树存储fd理论上数据可以很大而且红黑树查询性能不受很大的影响。对于每次监听都需要将数组拷贝到内核空间epoll只需要执行一次epoll_ctl()就将所有fd存入红黑树中以后每次添加fd元素即可在等待就绪时函数epoll_wait()无需传参无需重新拷贝fd数组到内核空间。对于将就绪的fd拷贝回用户空间epoll无需遍历所有数组去找就绪的而是返回的都是就绪的。 4、信号驱动IO 是与内核简历sigIO的信号关联并且设置回调当有fd就绪就会发出sigIO信号通知用户期间用户可以执行其他业务无需阻塞等待。 特点可以看到在等待数据阶段是直接交给内核空间用户空间不管的 这里需要和非阻塞IO区分等待阶段非阻塞IO是一直询问有木有数据本质还是阻塞 为啥我们不使用他呢有啥缺点 在大量IO操作的时候信号较多sigIO函数不能及时处理可能导致信号队列溢出内核空间和用户空间的频繁信号交互性能也较低 5、异步IO 整个过程都是非阻塞的用户进程调用完异步API就去做别的事情数据等待和拷贝都是异步执行一条龙服务。 使用相对多一点但是还是有个缺点如果io多了内核IO性能不是很高导致内存消耗过多导致整个崩溃就像老板一直把事情交给你不管你死活 总结 前四种IO都是同步IO只有最后一个是异步IO以数据拷贝是否阻塞为基准 三、Redis中的网络模型 简单解释 底层就是使用IO多路复用事件派发首先是服务端可读连接应答处理器将客户端socketFD注册到IO多路复用程序进行客户端的读写监听当客户端需要操作就绪 时也就是客户端可读会使用命令请求处理器首先将请求的数据Redis6.0前是单线程之后引入多线程写入缓冲区再将数据转化为redis命令并且执行将返回值写入缓冲区当多个操作后就将多个client写入队列再通过遍历队列绑定命令回复处理器Redis6.0之前是单线程逐个处理之后引进多线程提升了回复效率。 引入多线程 对于redis来说在监听fd以及命令执行的时候主线程单线程是完成足够的纯内存真正影响性能的永远是IO就是读命名和回复响应值来回的拷贝占用网络资源。 四、Redis通信协议 定义 Redis是一个CS架构软件通信一般分两步 客户端Client向服务端Server发生一条命令。服务端解析并且执行命令返回响应结果给客户端。 因此二者之间数据交互需要有个格式规范这个规范就是通信协议。 而Redis中采用的就是RESPRedis Serialization Protocol协议 Redis1.2版本引入该协议Redis2.0版本成为标准称为RESP2Redis6.0版本升级为RESP3增加了更多的新数据类型和特性–客户端缓存 但目前默认使用的是RESP2,也是我们下面学习的。 RESP2协议-数据类型 通过首字节的字符来区分不同的数据类型常用的包括5种 单行字符串首字节是‘ ’后面跟上单行字符串以“\r\n”结尾。如“ok” :“ok\r\n” 错位Error首字母‘-’与单行字符串一样只不过是错误信息。如“-Error Message\r\n” 数值首字节为‘’后面跟上数字格式字符串也是“\r\n”结尾。如“:10\r\n” 多行字符串首字节为“$”表示二进制安全本质和SDS一样记录字符串占用字节大小内容中存在\r\n也没事最大支持521MB 数组首字节是 *后面跟上数组元素个数在跟上元素类型不限中文3个字节 五、Redis内存回收 参考我另一篇文章–《redis面试篇》中的过期策略和淘汰策略
http://www.hkea.cn/news/14499559/

相关文章:

  • 龙华网站建设的软件湖南省住房建设厅网站
  • 免费视频素材网站哪个最好做网站需要icp经营许可证
  • wordpress主题中心开发wordpress目录seo
  • 如何做网站泛目录解析安卓app用什么语言开发
  • 深圳网站建设..wordpress大学模板
  • 如何提高网站加载速度慢怎样用电脑做网站
  • 深圳最好的营销网站建设公司网站建设费属于广告费用吗
  • 有什么网站可以帮人做模具吗做的网站
  • 关于做网站的保山市住房和城上建设局网站
  • 成都多享网站建设公司网站建设进度总结
  • 腾讯云如何做网站黄冈论坛遗爱网贴吧
  • 怎样做网站优化 知乎wordpress管理邮件
  • 网站数据库问题seo关键词推广优化
  • 网站建设哪家好推荐万维科技做一个网站分析应该怎么做
  • 杭州网站seo推广软件企业型网站建设方案
  • 鹤壁市住房和城乡建设局网站郑州网站建设公司
  • 邢台地区网站建设优化推广网站排名
  • 佛山建设网站公司wordpress 投稿 标签
  • 去哪里学习建设网站昆山网站建设怎么样
  • 深圳分销网站设计电话做模型找三视图那些网站
  • 什么网站可以卖自己做的东西京东短网址在线生成
  • 怎么把做的页面放到网站上北京首都功能优化
  • php网站的优点西安旅游服务网站建设
  • 做什么网站流量大wap网站现在还有什么用
  • dedecms仿站教程建网站的公司深圳
  • 一般什么行业做网站的多河北建筑培训网实名认证
  • 电脑做网站用word做网站如何可以实现窗口切换功能
  • 网站开发工程师的生活形态手机网站设计要求
  • 环保网站 中企动力建设白云网站建设
  • 建站公司人员配置店铺运营思路