IO模型分析

IO模型分析 本文主要讲的是网络IO技术,在网络IO中常见模型有五种BIO,NIO,AIO,I/O multiplexing,Signal driven I/O,分别对应的是阻塞IO,非阻塞IO,异步IO,IO多路复用,信号驱动IO。本文主要讲述阻塞IO与三种IO多路复用 BIO 常见阻塞式IO即一个线程对应一个IO处理,当IO事件阻塞时,当前线程也一起阻塞,直到IO事件就绪。这种IO效率较为低下,在等待IO就绪期间线程一直处于阻塞状态,线程利用率低。此种IO模型除开初学者进行多线程IO训练,使用较少。 Select select属于NIO的一种,属于非阻塞式IO,无需实现多个线程等待多个IO事件的就绪,select会维护一个名叫fd_set的事件描述符数组。 每一次需要发起IO请求时,就加入一个事件描述符到管道中,然后由select函数进行管道的遍历,不断的轮询管道中各个IO事件的状态,当出现某个IO事件状态为就绪时,就进行此IO事件的处理,这样多个线程的IO阻塞模型转换为IO的多路复用,也就是只需阻塞一个线程,监听管道描述符的IO事件状态,当有就绪事件时并进行处理,减少了IO事件未就绪时线程等待的开销,极大的提高了系统的性能。 Poll poll函数为select函数的升级版,在select函数中维护了事件描述符数组,然而数组必须规定数组长度,无法像链表一样实现可增长。因此poll函数在用户态维护了描述符数组,在内核态处理IO操作时,将其转换为链表,这样就摆脱了最大文件描述符数量的限制。但是poll和select中内核态与用户态的拷贝带来性能损失问题始终没有解决。 Epoll epoll是一种更为高效的多路复用技术,也是Nginx服务器能处理高流量背后的技术支撑他最大的特点就是解决了select和poll中描述符序列中携带未就绪序列导致浪费的问题。他直接将描述符序列插入到内核中的epoll_event的红黑树描述符序列中,选择红黑树的原因是由于描述符序列需要频繁的查找,插入,删除,红黑树是最好的选择。 红黑树是一种自平衡二叉查找树,具有以下优点: 任何一个节点的左右子树的高度差不超过一倍。 查找、插入、删除操作的时间复杂度都是 $O(log n)$。 它能够快速地支持区间查找和排序等操作。 内核对红黑树中文件描述符进行监听,在使用 epoll_wait 等待事件时,可以指定一个回调函数,该函数将在事件到达时被调用,当事件触发后,内核会调用该回调进行操作。 epoll中水平触发和垂直触发 水平触发 当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_ wait 时,会再次响应应用程序并通知此事件。 边缘触发 当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_ wait 时,不会再次响应应用程序并通知此事件。例如这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你。

March 3, 2023 · 1 min · 32 words · ecturing

并发编程

并发编程 以下是一些常用的并发编程模型和技术: 信号量(Semaphore):用于保护共享资源、协调进程间同步和互斥操作的机制,可以限制对某个共享资源的访问数量。 锁:在多线程或多进程的环境中,如果多个线程或进程同时访问共享数据,可能会导致数据不一致或竞争条件等问题,从而影响程序的正确性和可靠性。为了解决这些问题,可以使用锁来同步多个线程或进程之间对数据的访问,锁一般分为两种,互斥锁和读写锁。 原子操作(Atomic Operation):通过CPU提供的原子指令(例如Compare-and-swap、Fetch-and-add等)来对内存进行原子操作,从而避免并发情况下的数据竞争。 事件驱动(Event-driven):使用消息队列、事件循环等机制,将任务分解为小而独立的事件单元,并通过异步调用来执行这些事件单元,以提高程序的并发性能。 Actor模型:基于对象的并发编程模型,通过创建多个Actor对象,每个对象都有自己的状态和行为,可以相互发送消息来进行通信和协作。 协程(Coroutine):一种轻量级的线程,可以在一个或多个线程中执行,通过协作式调度的方式实现非抢占式的多任务处理,从而提高程序的并发性能。 数据流(Dataflow):使用管道、通道等机制,将数据从一个任务顺序传递到另一个任务,以实现并发数据处理。 锁 自旋锁:即CAS 读写锁:常见IO操作中的读写锁 互斥锁: 信号量: 事件驱动 数据流 数据流模型是go语言中最常见的一个模型,它使用了select加channel的方法实现了数据流模型,每一份数据就像水流一样流动。 原子操作

January 9, 2023 · 1 min · 19 words · ecturing

家庭网络布局设计

家庭网络布局设计 网络拓扑图 router0为运营商光猫。两个无线路由器均开启路由功能。 Mercury为全千兆路由,三个千兆口,Wan口与Lan口自动选择 TP为全百兆路由,一个Wan,三个Lan口 光猫自带一个千兆口,三个百兆口。 需求分析 香橙派服务器包含NAS系统,实现全屋路由器覆盖区域均能访问服务器服务。但普联路由器无配置静态路由选项,无法访问水星路由下的香橙派服务器。目标实现普联路由器能访问服务器。 方案分析 静态路由 静态路由配置是多路由连接时实现不同网段访问的最简单的配置选项,通过配置普联路由的静态路由,将需要访问水星路由下服务器网段添加到静态路由表中,但是由于普联路由器不支持静态路由,此法行不通。 DMZ服务 百度百科解释为: DMZ是为了解决安装防火墙后外部网络的访问用户不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。该缓冲区位于企业内部网络和外部网络之间的小网络区域内。在这个小网络区域内可以放置一些必须公开的服务器设施,如企业Web服务器、FTP服务器和论坛等。另一方面,通过这样一个DMZ区域,更加有效地保护了内部网络。因为这种网络部署,比起一般的防火墙方案,对来自外网的攻击者来说又多了一道关卡。 更加通俗的解释为:DMZ是一个服务,可以将局域网网中的某些服务暴露到广域网。在通过路由器拨号连接互联网的网络中,开启DMZ会将某些服务之间暴露到公网中。在上述网络拓扑图中,开启Mercury路由的DMZ服务,将OrangePi的IP地址设置为DMZ暴露地址。这样OrangePI就暴露在Router0的子网下,在TP-Link下的设备,由于NAT转换的存在可以访问Router0的子网设备,也就是Mercury路由器,由于开启了DMZ服务,这样我们直接访问Mercury的IP地址等同于 直接访问OrangePi服务器。同时可以发现DMZ服务会将整个服务器暴露到上级网络,所以当需要暴露到公网时,请对DMZ主机做防火墙。 虚拟服务器 虚拟服务器与DMZ有一定相似之处,他们都是为了将服务映射到广域网,DMZ服务会将整个设备映射到广域网,但是虚拟服务器可以只用单独映射端口,比如我有一个Samba文件共享服务器,我将在路由上对内网服务器445端口进行映射,这样广域网设备可以直接连接到内网的Samba服务 路由桥接 网络拓扑图中,将TP-LINK路由器的lan口连接到Mercury的lan口,wan口不连接,这样TP-Link路由就桥接到了Mercury的子网,所有连接到该路由器的设备都属于Mercury的子网,这样TP-LINK的设备均能访问Mercury的服务器。

January 3, 2023 · 1 min · 20 words · ecturing

由于切换Shell导致服务器无法正常登录,SSH与VNC均无法登录

故障原因 ​ 使用chsh命令切换Shell,提示输入密码,输入正确密码后提示错误 故障表现 ​ SSH端退出再次登录,SSH无法登录,提示PublicKey校验失败。 ​ 进入服务器管理页面,进入上次使用后未关闭的VNC连接,更换SSH的key,仍然无果。SSH日志内容如下 ​ 注销VNC登录后,进入登录页面,再次登录,登录成功画面闪烁一次,再次提示输入用户名密码登录,重复如此,重启无效 解决方法 服务器VNC界面采用VNC登录,发送命令Ctrl+Alt+Del命令重启服务器,登录界面选择Advanced options for Ubuntu 进入系统恢复模式 选择进入超级用户模式 ​ 输入以下命令 1 vim /etc/passwd ​ 首行登录shell目录错误,这是系统无法进入的根本问题,因为设置shell命令失效,给予了操作系统启动shell错误位置,导致系统无法启动。更换正确启动shell目录,系统恢复正常

November 26, 2022 · 1 min · 24 words · ecturing

深入理解计算机系统

第一章计算机系统漫游 第一部分 程序结构与执行 第二章 信息的表示与处理 二进制 十进制 十六进制互转 低转高:用短除法反复短除高进制取余 高转低:用高进制的幂乘以每个高进制数字 字数据大小 每台计算机都有字长,指明指针数据的标称大小(normal size),虚拟地址以字来编码,对于$\omega$位的机器虚拟地址范围为:0~$2^{\omega}-1$,程序最多访问$2^{\omega}$个字节 32位机器虚拟地址限长为$2^{32}$字节=$2^{32}/2^{30}$=$2^{2}$=4Gb,32位操作系统最多只能使用4Gb的内存 寻址和字节顺序 小端法 最低有效字节在最前面 大端法 最高有效字节在最前面 整数表示 原码,补码,反码 机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。 真值:因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. [+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反 补码的表示方法是: 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) [+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补...

November 16, 2022 · 2 min · 318 words · ecturing