高并发系统设计细节

关键指标:响应时间、QPS(每秒查询数)、TPS(每秒处理的事务数)、成功率。根据不同的业务场景,平衡各个指标之间的关系。

响应时间:
当用户在2秒内得到响应,会感觉系统的响应很快;
当用户在2~5秒内得到响应,会感觉系统的响应速度很慢,可以接受;
当用户超过8秒仍不能得到响应,会感觉系统很糟糕,此时会选择离开站点或者发起二次请求。

SLA:服务登记协议,服务提供者对服务消费者的正式承诺,是衡量服务能力等级的关键项。
在这里插入图片描述
TPS:每秒处理的事务数,从客户端发起请求开始计时,等收到服务器端响应结果后结束计时,在计算这个时间段内总共完成的事务个数。一个事务指的是客户端发起一个请求,并且等到请求返回之后的整个过程。
QPS:每秒的查询请求数,表示服务器端每秒能够响应的查询次数。一个TPS中可能会包括多个QPS。
RT:响应时间,表示客户端发出请求到服务端返回的时间间隔,一般表示平均响应时间。
并发数:指的是系统同时能处理的请求数量。如果QPS=1000,表示每秒钟客户端会发起1000个请求到服务端,而如果一个请求的处理耗时是3s,那么意味着总的并发=1000*3=3000,也就是服务端会同时有3000个并发。

指标的计算:
假设在一个小时内,有200W用户访问系统,平均每个用户请求的耗时是3秒。
QPS=2000000/(6060)=556
并发数=556
3=1668
随着RT的值越大,并发数越多,意味着服务端占用的连接数越多,会消耗内存资源和CPU资源等。在实际业务中,RT的值越小越好,应该缩小RT的值。

2/8法则推算1000W用户的访问量:
1000w用户,每天访问的用户占20%,也就是每天有200w用户来访问。假设平均每个用户过来点击5次,总共的pv=1亿。一天24小时,根据2/8法则,每天8000w(80%)用户活跃的时间点集中在(24*0.2)5小时内。此时的 QPS = 4500(8000w/5小时,平均每秒查询数)。在这5个小时中请求并非非常平均,可能会存在大量的用户集中访问,因此一般情况下访问峰值是平均访问请求的3~4倍左右,此时的QPS大约QPS=18000。

服务器压力估计:
TCP连接对于系统资源最大的开销就是内存。
因为tcp连接归根结底需要双方接收和发送数据,那么就需要一个读缓冲区和写缓冲区,这两个buffer在linux下最小为4096字节,可通过cat /proc/sys/net/ipv4/tcp_rmem和cat /proc/sys/net/ipv4/tcp_wmem来查看。
所以,一个tcp连接最小占用内存为4096+4096 = 8k,那么对于一个8G内存的机器,在不考虑其他限制下,最多支持的并发量为:810241024/8 约等于100万。此数字为纯理论上限数值,在实际中,由于linux kernel对一些资源的限制,加上程序的业务处理,所以,8G内存是很难达到100万连接的,当然,我们也可以通过增加内存的方式增加并发量。

如何降低RT的值?
请求执行过程中会做的事情:查询数据库、访问磁盘数据、进行内存运算、调用远程服务。
每一步操作都会消耗一定量的时间,当前客户端的请求只有等到这些操作都完成之后才能返回,因此降低RT可以通过优化业务处理逻辑。

1 数据库优化

  • 当18000个请求进入到服务端并且被接收后,开始执行业务逻辑处理,那么必然会查询数据库。每个请求至少都有一次查询数据库的操作,多的需要查询3~5次以上,我们假设按照3次来计算,那么每秒会对数据库形成54000个请求,假设一台数据库服务器每秒支撑10000个请求(影响数据库的请求数量有很多因素,比如数据库表的数据量、数据库服务器本身的系统性能、查询语句的复杂度),那么需要6台数据库服务器才能支撑每秒10000个请求。
  • 如果数据库服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。
    数据表数据量过大,比如达到几千万甚至上亿,这种情况下sql的优化已经毫无意义了,因为这么大的数据量查询必然会涉及到运算。
    可以缓存来解决读请求并发过高的问题,一般来说对于数据库的读写请求也都遵循2/8法则,在每秒54000个请求中,大概有43200左右是读请求,这些读请求中基本上90%都是可以通过缓存来解决。
  • 分库分表,减少单表数据量,单表数据量少了,那么查询性能就自然得到了有效的提升•读写分离,避免事务操作对查询操作带来的性能影响。
  • 写操作本身耗费资源数据库写操作为IO写入,写入过程中通常会涉及唯一性校验、建索引、索引排序等操作,对资源消耗比较大。一次写操作的响应时间往往是读操作的几倍甚至几十倍。
  • 锁争用写操作很多时候需要加锁,包括表级锁、行级锁等,这类锁都是排他锁,一个会话占据排它锁之后,其他会话是不能读取数据的,这会会极大影响数据读取性能。所以MYSQL部署往往会采用读写分离方式,主库用来写入数据及部分时效性要求很高的读操作,从库用来承接大部分读操作,这样数据库整体性能能够得到大幅提升。
  • 为什么数据放入redis缓存中能提升性能?
    (1)redis存储的是k-v数据,时间复杂度是0(1),MySQL存储引擎的底层实现是B+树,时间复杂度是O(logn)。
    (2)Mysql数据存储是存储在表中,查找数据时要先对表进行全局扫描或根据索引查找,这涉及到磁盘IO,磁盘查找如果是单点查找可能会快点,但是顺序查找就比较慢。而redis不用这么麻烦,本身就是存储在内存中,会根据数据在内存的位置直接取出。
    (3)Redis是单线程的多路复用IO,单线程避免了线程上下文切换的开销,而多路复用IO避免了IO等待的开销,在多核处理器下提高处理器的使用效率可以对数据进行分区,然后每个处理器处理不同的数据。

2 磁盘数据访问优化
对磁盘的访问主要是读和写操作,优化方案如下:
(1)磁盘的页缓存,借助缓存IO,充分利用系统缓存,降低实际IO的次数。
(2)顺序读写,可以用追加写代替随机写,减少寻址开销,加快IO写的速度。
(3)SSD代替HDD,固态硬盘的IO效率远远高于机械硬盘。
(4)在需要频繁读写同一块磁盘空间时,可以用mmap(内存映射)代替读写,减少内存的拷贝次数。
(5)在需要同步写的场景下,尽量将写请求合并,而不是让每个请求都同步写入磁盘,可以用fsync。

3 合理利用内存
充分利用内存缓存,把一些经常访问的数据和对象保存在内存中,这样可以避免重复加载或者避免数据库访问带来的性能损耗。比如利用redis缓存热点数据。

4 调用远程服务
远程服务调用的影响IO性能因素:
远程调用等待返回结果的阻塞、异步通信、网络通信的耗时、内网通信、增加网络带宽、远程服务通信的稳定性。

5 异步化架构
微服务中的逻辑复杂处理时间长的情况,在高并发下,导致服务线程消耗尽,不能创建线程处理请求。可以考虑在架构上做调整,先返回结果给客户端,让用户可以继续使用客户端的其他操作,再把服务端的复杂逻辑处理模块做异步化处理。异步化处理适用于客户端对处理结果不敏感不要求实时的情况,比如群发邮件、群发消息等。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 第1 章 简介(1) 1.1 简介 1.1.1 简史 1.1.2 创始之初 1.1.3 繁衍 1.1.4 BSD 1.1.5 System V 1.1.6 商业化 1.1.7 Mach 1.1.8 标准 1.1.9 OSF 和UI 1.1.10 SVR4 及其之后 1.2 演变的动力 1.2.1 功能 1.2.2 网络 1.2.3 性能 1.2.4 硬件变化 1.2.5 改进质 1.2.6 模式变化 1.2.7 其他应用领域 1.2.8 简洁就是美 1.2.9 灵活性 1.3 回顾与展望 1.3.1 UNIX 好在哪里 1.3.2 UNIX 的误区在哪儿 1.4 本书的范围 1.5 参考文献 第2 章 进程与内核(17) 2.1 简介 2.2 模式.空间和上下文 2.3 进程抽象 2.3.1 进程状态 2.3.2 进程上下文 2.3.3 用户凭证 2.3.4 u 区和proc 结构 2.4 内核态下运行 2.4.1 系统调用接口 2.4.2 中断处理 2.5 同步 2.5.1 阻塞操作 2.5.2 中断 2.5.3 多处理器 2.6 进程调度 2.7 信号 2.8 新进程和程序 2.8.1 fork 和exec 2.8.2 进程创建 2.8.3 fork 优化 2.8.4 执行一个新程序 2.8.5 进程终止 2.8.6 等待进程终止 2.8.7 僵尸(Zombie)进程 2.9 小结 2.10 练习 2.11 参考文献 第3 章 线程和轻级进程(41) 3.1 简介 3.1.1 动机 3.1.2 多线程和多处理器 3.1.3 并发和并行 3.2 基本抽象概念 3.2.1 内核线程 3.2.2 轻级进程 3.2.3 用户线程 3.3 轻级进程设计——要考虑的问题 3.3.1 fork 的语义 3.3.2 其他的系统调用 3.3.3 信号传递和处理 3.3.4 可视性 3.3.5 堆栈增长 3.4 用户级线程库 3.4.1 编程接口 3.4.2 线程库的实现 3.5 调度器调用 3.6 Solaris 和 SVR4 的多线程处理 3.6.1 内核线程 3.6.2 轻级进程的实现 3.6.3 用户线程 3.6.4 用户线程的实现 3.6.5 中断处理 3.6.6 系统调用处理 3.7 Mach 中的线程 3.7.1 Mach 的抽象概念——任务和线程 3.7.2 Mach 的C-threads 3.8 Digital UNIX 3.8.1 UNIX 接口 3.8.2 系统调用和信号 3.8.3 pthreads 线程库 3.9 Mach 3.0 的续体 3.9.1 编程模型 3.9.2 使用续体 3.9.3 优化 3.9.4 分析 3.10 小结 3.11 练习 3.12 参考文献 第4 章 信号和会话管理(72) 4.1 简介 4.2 信号生成和处理 4.2.1 信号处理 4.2.2 信号生成 4.2.3 典型情景 4.2.4 睡眠和信号 4·3 不可靠信号 4.4 可靠的信号 4.4.1 主要特性 4.4.2 SVR3 的实现 4.4.3 BSD 信号管理 4.5 SVR4 信号机制 4.6 信号机制的实现 4.6.1 信号生成 4.6.2 信号传递和处理 4.7 异常 4.8 Mach 中的异常处理 4.8.1 异常端口 4.8.2 错误处理 4.8.3 调试器的交互 4.8.4 分析 4.9 进程组和终端管理 4.9.1 基本概念 4.9.2 SVR3 模型 4.9.3 局限性 4.9.4 4.3BSD 中的进程组和终端 4.9.5 缺点 4.10 SVR4 会话的体系结构 4.10.1 目的(动机) 4.10.2 会话和进程组 4.10.3 数据结构 4.10.4 控制终端 4.10.5 4.4BSD 中会话的实现 4.11 小结 4.12 练习 4.13 参考文献 第5 章 进程调度(98) 5.1 简介 5.2 时钟中断处理 5.2.1 调出链表 5.2.2 报警 5.3 调度器的目标 5.4 传统的UNIX 调度 5.4.1 进程优先级 5.4.2 调度器的实现 5.4.3 运行队列管理 5.4.4 分析 5.5 SVR4 的调度器 5.5.1 类无关层 5.5.2 调度类的接口 5.5.3 分时类 5.5.4 实时类 5.5.5 系统调用priocntl 5.5.6 分析 5.6 Solaris2.x 调度的改善 5.6.1 抢占式内核 5.6.2 多处理器的支持 5.6.3 隐式调度 5.6.4 优先级逆转 5.6.5 优先级继承的实现 5.6.6 优先继承的局限性 5.6.7 Turnstiles 5.6.8 分析 5.7 mach 中的调度 5.7.1 多处理器的支持 5.8 Digital UNIX 的实时调度器 5.8.1 多处理器支持 5.9 其他的一些调度实现 5.9.1 fair share 调度 5.9.2 最终期限驱动调度 5.9.3 三级(Three-Level)调度器 5.10 小结 5.11 练习 5.12 参考文献 第6 章 进程间通信(130) 6.1 简介 6.2 通用IPC 方法 6.2.1 信号 6.2.2 管道 6.2.3 SVR4 的管道 6.2.4 进程跟踪 6.3 System V 的进程间通信 6.3.1 公共元素 6.3.2 信号 6.3.3 消息队列 6.3.4 共享内存 6.3.5 讨论 6.4 Mach IPC 6.4.1 基本概念 6.5 消息 6.5.1 消息的数据结构 6.5.2 消息传递接口 6.6 端口 6.6.1 端口名字空间 6.6.2 端口数据结构 6.6.3 端口变换 6.7 消息传递 6.7.1 端口权力的传递 6.7.2 脱机内存 6.7.3 控制流 6.7.4 通知 6.8 端口操作 6.8.1 释放一个端口 6.8.2 备份端口 6.8.3 端口集合 6.8.4 端口的添加 6.9 扩展性 6.10 Mach 3.0 的改进 6.10.1 一次发送权 6.10.2 Mach 3.0 的通知 6.10.3 发送权的用户引用记数 6.11 讨论 6.12 小结 6.13 练习 6.14 参考文献 第7 章 同步和多处理器(164) 7.1 简介 7.2 传统UNIX 内核中的同步 7.2.1 中断屏蔽 7.2.2 睡眠和唤醒 7.2.3 传统方法的局限性 7.3 多处理器系统 7.3.1 内存模型 7.3.2 同步支持 7.3.3 软件体系结构 7.4 多处理器同步问题 7.4.1 唤醒丢失问题 7.4.2 巨群问题 7.5 信号灯 7.5.1 提供互斥访问的信号灯 7.5.2 使用的信号灯的事件等待 7.5.3 用于控制可计数资源的信号灯 7.5.4 信号灯的缺点 7.5.5 护卫 7.6 自旋锁 7.6.1 自旋锁的使用 7.7 条件变 7.7.1 实现问题 7.7.2 事件 7.7.3 阻塞锁 7.8 读写锁 7.8.1 设计考虑 7.8.2 实现 7.9 引用计数 7.10 其他考虑 7.10.1 死锁避免 7.10.2 递归锁 7.10.3 阻塞还是自旋 7.10.4 锁什么 7.10.5 粒度和持续时间 7.11 例子分析 7.11.1 SVR 4.2/MP 7.11.2 Digital UNIX 7.11.3 其他实现 7.12 小结 7.13 练习 7.14 参考文献 第8 章 文件系统接口和框架(191) 8.1 简介 8.2 文件的用户接口 8.2.1 文件和目录 8.2.2 文件属性 8.2.3 文件描述符 8.2.4 文件1/O 8.2.5 分散-聚集I/O(Scatter-Garther I/O) 8.2.6 文件加锁 8.3 文件系统 8.3.1 逻辑磁盘 8.4 特殊文件 8.4.1 符号链接 8.4.2 管道和FIFO 8.5 文件系统框架 8.6 vnode/vfs 体系结构 8.6.1 目标 8.6.2 设备 1 门的经验 8.6.3 vnode/vfs 接口概述 8.7 实现概述 8.7.1 目标 8.7.2 v 节点和打开文件 8.7.3 v 节点 8.7.4 v 节点引用计数 8.7.5 vfs 对象 8.8 文件系统相关对象 8.8.1 每个文件的私有数据 8.8.2 vnodeops 向 8.8.3 vfs 层中的文件系统相关部分 8.9 安装一个文件系统 8.9.1 虚拟文件系统转换 8.9.2 mount 的实现 8.9.3 VFS-MOUNT 处理 8.10 对文件的操作 8.10.1 路径名遍历 8.10.2 目录查找缓存 8.10.3 VOP_LOOKUP 操作 8.10.4 打开文件 8.10.5 文件I/O 8.10.6 文件属性 8.10.7 用户凭证 8.11 分析 8.11.1 SVR4 实现的缺点 8.11.2 4.4BSD 模型 8.11.3 OSF/1 方法 8.12 小结 8.13 练习 8.14 参考文献 第9 章 文件系统实现(227) 9.1 简介 9.2 System V 文件系统(s5fs) 9.2.1 目录 9.2.2 i 节点 9.2.3 超级块 9.3 s5fs 内核组织 9.3.1 内存i 节点 9.3.2 i 节点查找 9.3.3 文件I/O 9.3.4 i 节点的分配与回收 9.4 对s5fs 的分析 9.5 伯克利快速文件系统(FFS) 9.6 硬盘结构 9.7 磁盘组织 9.7.1 块和碎片 9.7.2 分配策略 9.8 FFS 的增强功能 9.9 分析 9.10 临时文件系统 9.10.1 内存文件系统 9.10.2 tmpfs 文件系统 9.11 特殊目的文件系统 9.11.1 specfs 文件系统 9.11.2 /proc 文件系统 9.11.3 处理器文件系统 9.11.4 半透明文件系统 9.12 以往的磁盘缓存 9.12.1 基本操作 9.12.2 缓冲区头结构 9.12.3 优点 9.12.4 缺点 9.12.5 保证文件系统的一致性 9.13 小结 9.14 练习 9.15 参考文献 第10 章 分布式文件系统(255) 10.1 简介 1O.2 分布式文件系统的一般特征 10.2.1 设计考虑 10.3 网络文件系统(NFS) 10.3.1 用户透视 10.3.2 设计日标 10.3.3 NFS 组成 10.3.4 无状态 10.4 协议族 10.4.1 扩展数据表示(XDR) 10.4.2 远程过程调用(RPC) 10.5 NFS 实现 10.5.1 控制流 10.5.2 文件句柄 l0.5.3 mount 操作 10.5.4 路径名查找 10.6 UNIX 语义 10.6.1 打开文件权限 10.6.2 删除打开文件 l0.6.3 读和写 10.7 NFS 性能 10.7.1 性能瓶颈 10.7.2 客户端高速缓存 10.7.3 延迟写 10.7.4 重传高速缓存 10.8 专用NFS 服务器 10.8.1 Auspex 功能性多处理器结构 10.8.2 IBM 的HA-NFS 服务器 10.9 NFS 安全性 10.9.1 NFS 访问控制 10.9.2 UID 重新映射 10.9.3 root 重新映射 10.10 NFSv3 10.11 远程文件共亨(RFS)文件系统 10.12 RFS 结构 10.12.1 远程消息协议 10.12.2 有状态操作 10.13 RFS 实现 10.13.1 远程安装 10.13.2 RFS 客户和服务器 10.13.3 崩溃恢复 10.13.4 其他问题 10.14 客户端高速缓存 10.14.1 高速缓存一致性 10.15 Andrew 文件系统 10.15.1 可扩展的结构 10.15.2 存储和名字空间组织 10.15.3 会话语义 10.16 AFS 实现 10.16.1 缓存以及一致性 10.16.2 路径名查找 10.16.3 安全 10.17 AFS 的缺陷 10.18 DCE 分布式文件系统(DCE DFS) 10.18.1 DFS 体系结构 10.18.2 高速缓冲区一致性 10.18.3 令牌管理器 10.18.4 其他DFS 服务 10.18.5 分析 10.19 小结 10.20 练习 10.21 参考文献 第11 章 高级文件系统(298) 11.1 简介 11.2 传统文件系统的局限 11.2.1 FFS 磁盘布局 11.2.2 写的主导性 11.2.3 元数据更新 11.2.4 崩溃恢复 11.3 文件系统成簇(Sun-FFS) 11.4 日志方法 11.4.1 基本特征 11.5 日志结构文件系统 11.6 4.4BSD 日志文件系统 11.6.1 写日志 11.6.2 数据检索 11.6.3 崩溃恢复 11.6.4 清除进程 11.6.5 分析 11.7 元数据日志 11.7.1 正常操作 11.7.2 日志的一致 11.7.3 崩溃恢复 11.7.4 分析 11.8 Episode 文件系统 11.8.1 基本抽象 11.8.2 结构 11.8.3 记日志 11.8.4 其他特性 11.9 监视器(watchdog) 11.9.1 目录监视器 11.9.2 消息通道 11.9.3 应用 11.10 4.4BSD 端口文件系统 11.10.1 使用端曰(portals) 11.11 堆栈式文件系统层 11.11.1 框架和接口 11.11.2 Sun Soft 原型 11.12 4.4BSD 文件系统接口 11.12.1 Nullfs 和Union Mount 文件系统 11.13 小结 11.14 练习 11.15 参考文献 第12 章 内核内存管理(328) 12.1 简介 12.2 功能需求 12.2.1 评估标准 12.3 资源映射图分配器 12.3.1 分析 12.4 简单2 次幂空闲表 12.4.1 分析 12.5 McKusick-Karels 分配器 12.5.1 分析 12.6 伙伴系统 12.6.1 分析 12.7 SVR4 Lazy 伙伴算法 12.7.1 Lazy 合并 12.7.2 SVR4 实现细节 12.8 Mach/1 的zone 分配器 12.8.1 垃圾收集 12.8.2 分析 12.9 多处理器的分层分配器 12.9.1 分析 12.10 Solaris 2.4 的Slab 分配器 12.10.1 对象复用 12.10.2 硬件Cache 利用率 12.10.3 分配器footprint 12.10.4 设计与接口 12.10.5 实现 12.10.6 分析 12.11 小结 12.12 练习 12.13 参考文献 第13 章 虚存(352) 13.1 简介 13.1.1 内存管理的石器时代 13.2 分页 13.2.1 功能需求 13.2.2 虚拟地址空间 13.2.3 页面初始访问 13.2.4 交换区 13.2.5 转换映射图 13.2.6 页面替换策略 13.3 硬件需求 13.3.1 MMU 缓存 13.3.Z Intel 80x86 13.3.3 IBM RS/6000 13.3.4 MIPS R3000 13.4 4.3BSBSD 实例研究 13.4.1 物理内存 13.4.2 地址空间 13.4.3 页面在哪里 13.4.4 交换区 13.5 4.3BSD 内存管理操作 13.5.1 创建进程 13.5.2 页面失效处理 13.5.3 空闲页面链表 13.5.4 交换 13.6 分析 13.7 练习 13.8 文献 第14 章 SVR4 VM 体系结构(382) 14.1 动机 14.2 内存映射文件 14.2.1 mmap 及相关系统用 14.3 VM 设计原理 14.4 基本抽象概念 14.4.1 物理内存 14.4.2 地址空间 14.4.3 地址映射 14.4.4 匿名页面 14.4.5 硬件地址转换 14.5 段驱动程序 14.5.1 seg-vn 14.5.2 seg-map 14.5.3 seg-dev 14.5.4 seg-kmem 14.5.5 seg-kp 14.6 交换层 14.7 VM 操作 14.7.1 创建一个新映射 14.7.2 匿名页面处理 14.7.3 创建进程 14.7.4 共享匿名页面 14.7.5 页面失效处理 14.7.6 共享内存 14.7.7 其他部件 14.8 与v 节点子系统的交互 14.8.1 v 节点接口变化 14.8.2 统一的文件访问 14.8.3 其他问题 14.9 Solaris 中的虚拟交换空间 14.9.1 扩展交换空间 14.9.2 虚交换管理 14.9.3 讨论 14.10 分析 14.11 性能改进 14.11.1 高失效率原因 14.11.2 SVR4 对SunOS VM 实现的改进 14.11.3 结果与讨论 14.12 小结 14.13 练习 14.14 参考文献 第15 章 进一步关于内存管理的主题(413) 15.1 简介 15.2 Mach 的内存管理设计 15.2.1 设计目标 15.2.2 编程接口 15.2.3 基本抽象概念 15.3 共享内存设施 15.3.1 copy-on-write 共享 15.3.2 读写共享 15.4 内存对象和Pager 15.4.1 内存对象初始化 15.4.2 内核与pager 间的接口 15.4.3 内核与pager 交互 15.5 外部pager 和内部pager 15.5.1 一个网络共享内存服务器 15.6 页面替换 15.7 分析 15.8 4.4BSD 的内存管理 15.9 快表(TLB)一致性 15.9.1 单处理机上的TLB 一致性 15.9.2 多处理机问题 15.10 Mach 的TLB 击落算法 15.10.1 同步和死锁避免 15.10.2 讨论 15.11 SVR4 和SVR4.2 UNIX 中的TLB 一致性 15.11.1 SVR4/MP 15.11.2 SVR4.2/MP 15.11.3 Lazy 击落算法 15.11.4 立即击落 15.11.5 讨论 15.12 其他TLB 一致性算法 15.13 虚地址缓存 l5.13.1 映射变化 15.13.2 地址别名 15.13.3 DMA 操作 15.13.4 维护缓存一致性 15.13.5 分析 15.14 练习 15.15 参考文献 第16 章 设备驱动程序I/O(446) 16.1 简介 16.2 概述 16.2.1 硬件配置 16.2.2 设备中断 16.3 设备驱动程序框架 16.3.1 设备和驱动程序分类 16.3.2 调用驱动程序代码 16.3.3 设备开关表 16.3.4 驱动程序入口点 16.4 I/O 子系统 16.4.1 主、次设备号 16.4.2 设备文件 16.4.3 specfs 文件系统 16.4.4 公共snode 16.4.5 设备克隆 16.4.6 字符设备I/O 16.5 poll 系统调用 16.5.1 poll 的实现 16.5.2 4.3BSD select 系统调用 16.6 块I/O 16.6.1 buf 结构 16.6.2 与v 节点的交互 16.6.3 设备访问方法 16.6.4 到块设备的raw I/O 16.7 DDI/DKI 说明 16.7.1 建议 16.7.2 第三部分函数 16.7.3 其他部分 16.8 新的SVR4 版本 16.8.1 多处理器可靠驱动程序 16.8.2 SVR4.1/ES 的变化 16.8.3 动态加载和卸载 16.9 发展趋势 16.10 小结 16.11 练习 16.12 参考文献 第17 章 流(477) 17.1 目的 17.2 概述 17.3 消息和队列 17.3.1 消息 17.3.2 虚拟拷贝 17.3.3 消息类型 17.3.4 队列和模块 17.4 流I/O 17.4.1 STREAMS 调度程序 17.4.2 优先带(Priority Bands) 17.4.3 流控制 17.4.4 驱动程序尾 17.4.5 流头 17.5 配置和设置 17.5.1 配置一个模块或驱动程序 17.5.2 打开流 17.5.3 插入(Pushing)模块 17.5.1 克隆设备 17.6 STREAMS ioctl 17.6.1 STR ioctl 处理 17.6.2 透明ioctl 17.7 内存分配 17.7.1 扩展STREAMS 缓冲区 17.8 多路复用 17.8.1 上部多路复用器 17.8.2 下部多路复用器 17.8.3 链接流 17.8.4 数据流 17.8.5 普通链接和持久链接 17.9 FIFO 和管道 17.9.1 STREAMS FIFO 17.9.2 STREAMS 管道 17.10 网络接口 17.10.1 传输供应者接口(TPI) 17.10.2 传输层接口(TLI) 17.10.3 sockets 17.10.4 SVR4 socket 实现 17.11 小结 17.12 练习 17.13 参考文献
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于C和C++开发的多线程高并发服务器源码+项目说明(课程设计).zip 基于Linux操作系统下由C语言编写的服务器引擎,该引擎由四个层次组成: | 层次 | 说明 | | -------------- | ------------------------------------------------- | | Process Layer | 处理层 数据的识别,处理与输出等数据加工接口 | | Network Layer | 网络层 基础的网络协议与网络数据传输等网络相关接口 | | Resource Layer | 资源层 相关文件操作和数据库操作等资源相关接口 | | Core Layer | 核心层 基础的数据结构和数学函数等基础函数接口 | 以上四个层次由低至高为 Core Layer -> Resource Layer -> Network Layer -> Process Layer,应基于"高层能调用低层的接口,而低层无法调用高层的接口"的原则来构建该引擎 用户应使用Linux操作系统运行以下代码(已用makefile文件集合),以在bin文件夹输出server.out可执行文件 ```shell make ``` 更多详细细节见项目说明!!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值