linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步

数据就绪 - 根据系统IO操作的就绪状态

阻塞 - 调用IO方法的线程进入阻塞状态(挂起)

非阻塞 - 不会改变线程的状态,通过返回值判断

数据读写 - 根据应用程序和内核的交互方式

同步 - 数据的读写需要应用层去读写

异步 - 操作系统提供相应服务

阻塞/非阻塞都是同步IO,只用使用了特殊API才是异步IO;

五种IO模型

阻塞

调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。

非阻塞

非阻塞等待,每隔一段时间就去检测10事件是否就绪(代码轮询)。没有就绪就可以做其他事。非阻塞IO执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据errno区分这两种情况,对于accept,recv和send,事件未发生时,errno通常被设置成EAGAIN。

IO复用

Linux用 select/pol/epol函数实现IO复用模型,这些函数也会使进程阻塞,但是和阻塞IO所不同的是这些函数以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。直到有数据可读或可写时,才真正调用IO操作函数。

信号驱动

Linux 用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件

第一阶段是异步,第二阶段是同步,通过消息通知机制提高了效率;

异步IO

Linux中,可以调用 aio_read 函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。

Web服务器简介及HTTP协议

一个Web Server就是一个服务器软件,或者运行这个服务器软件的硬件。主要功能是通过HTTP协议与客户端(浏览器)进行通信,接收、存储、处理来自客户端的HTTP请求;

通常用户使用 Web 浏览器与相应服务器进行通信。在浏览器中键入"域名”或P地址:端口号”,浏览器则先将你的域名解析成相应的 P 地址或者直接根据你的IP地址向对应的 Web 服务器发送一个 HTTP 请求。这一过程首先要通过TCP 协议的三次握手建立与目标 Web 服务器的连接,然后 HTTP 协议生成针对目标 Web 服务的 HTTP 请求报文,通过 TCP、IP 等协议发送到目标 Web 服务器上。

HTTP协议(应用层的协议)

超文本传输协议 (Hypertext Transfer Protocol,HTTP) 是一个简单的请求-响应协议,它通常运行在TCP 之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCI I形式给出;而消息内容则具有一个类似 MIME 的格式。HTTP是万维网的数据通信的基础。(默认端口80)

请求响应步骤

1. 客户端连接Web服务器

2. 发送HTTP请求

3. 服务器接受请求并返回HTTP响应

4. 释放TCP连接

5. 客户端浏览器解析HTML内容

HTTP请求格式

请求方法:GET\HEAD\POST\PUT\DELETE\TRACE\OPTIONS\CONNECT;

HTTP响应格式

服务器编程基本框架和两种高效的事件处理模式

服务器编程基本框架

IO处理单元 - 处理客户连接、读写网络数据

逻辑单元 - 业务进程或线程

网络存储单元 - 数据库、五年间或缓存

请求队列 - 各单元之间的通信方式

两种高效的事件处理模式

服务器程序通常需要处理三类事件:IO事件、信号、定时事件;

两种高效的处理模式

同步IO模式 - Reactor模式

异步IO模式 - Practor模式

Reactor模式

Proactor模式

模拟Proactor模式(项目采用的方法)

  

线程同步机制类封装及线程池实现

线程池 - 防止无休止的创建/销毁线程

线程池中的线程数最直接的限制因素是CPU的处理器数量;CPU密集型任务最好等于核,IO密集型任务一般多余CPU核心数;不至于在线程处理IO过程中造成CPU空闲,导致浪费;

为什么使用线程池

1. 空间换时间,通过硬件资源换取运行效率;

2. 这组资源在服务器启动之初就完全创建初始化 - 静态资源;

3. 可以直接从池中拿,无需资源动态分配;

4. 处理完一个客户连接后,将相关资源放池中,无需系统调用释放资源;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127530.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[VSCode] 替换掉/去掉空行

VSCode中使用快捷键CtrlH,出现替换功能,在上面的“查找”框中输入正则表达式: ^\s*(?\r?$)\n然后选择右侧的“使用正则表达式”;“替换”框内为空,点击右侧的“全部替换”,即可去除所有空行。 参考 [VS…

MySQL 连接出现 Authentication plugin ‘caching_sha2_password‘ cannot be loaded

在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin caching_sha2_password cannot be loaded 出错 出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法:把my…

Linux内核分析与应用2-内存寻址

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看 留此记录,蜻蜓点水,可作抛砖引玉 2.1 内存寻址 数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂 计算机体系结构中的核心问题之一,就是如…

AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 , 外围简单 、 内置功率管 , 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 ,温度保护点为…

力扣(LeetCode)算法_C++——稀疏矩阵的乘法

给定两个 稀疏矩阵 :大小为 m x k 的稀疏矩阵 mat1 和大小为 k x n 的稀疏矩阵 mat2 ,返回 mat1 x mat2 的结果。你可以假设乘法总是可能的。 示例 1: 输入:mat1 [[1,0,0],[-1,0,3]], mat2 [[7,0,0],[0,0,0],[0,0,1]] 输出&am…

mysql 增量备份与恢复使用详解

目录 一、前言 二、数据备份策略 2.1 全备 2.2 增量备份 2.3 差异备份 三、mysql 增量备份概述 3.1 增量备份实现原理 3.1.1 基于日志的增量备份 3.1.2 基于时间戳的增量备份 3.2 增量备份常用实现方式 3.2.1 基于mysqldump增量备份 3.2.2 基于第三方备份工具进行增…

Vue中表单手机号验证与手机号归属地查询

下面是一篇关于Vue中如何进行表单手机号验证与手机号归属地查询的Markdown格式的文章,包含代码示例。 Vue中表单手机号验证与手机号归属地查询 手机号验证和归属地查询是许多Web应用程序中常见的功能之一。在Vue.js中,我们可以轻松地实现这两个功能。本…

如何使用Web Storage对页面中数据进行监听?

当使用Web Storage存储的数据发生变化时,会触发Window对象的storage事件,我们可以监听该事件并指定事件处理函数,当其他页面中的localStorage或 sessionStorage中保存的数据发生改变时,就会执行事件处理函数。 监听storage事件的…

SpotBugs(是FindBugs的继任者)安装、使用

SpotBugs介绍 SpotBugs和FindBugs的关系 SpotBugs是FindBugs的继任者,从SpotBugs停止的地方继续。 备注:FindBugs项目已经停止了,从2015年发布3.0.1版本以后再没有新的版本。 SpotBugs通过静态分析寻找java代码中的bug,通过发现…

JavaScript 运行时比较: Node.js、 Deno 和 Bun

文章目录 为什么选择正确的 JavaScript 运行时很重要介绍 JavaScript 运行时Node.jsDenoBun 比较 JavaScript 运行时性能社区稳定性安全附加功能 小结 JavaScript 运行时可帮助您构建高级的、服务器驱动的 JavaScript 项目,这些项目不依赖于用户的浏览器来运行。 有…

Linux 安装配置使用 FTP 服务

学习场景:使用摄像机做区域报警,预警后将预警图片传输到 FTP 服务上,所以搭一个环境测试一下,这里我使用的是树莓派 4B,官方 32 位系统,其他 Linux 系统应该通用 下面说两个 FTP 应用 一、vsftpd vsftpd 是…

基于python实现贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题(附完整源码下载)

背包问题算法设计 问题要求在一个物品集合中选择合适的物品放入背包,在放入背包中的物品总重量不超过背包容量的前提下,希望放入背包的物品总价值最大。根据是否允许部分物品放入背包的要求,背包问题可以分为【分数背包问题】和【0-1背包问题…

形态图像处理

形态图像处理 预备知识 反射、平移结构元 腐蚀和膨胀 腐蚀 将 B 平移,当其原点位于 z 时,其包含在 A 中,则 z 为一个有效的位置,所有有效的z构成了腐蚀之后的结果腐蚀缩小或细化了二值图像中的物体可以将腐蚀看作形态学滤波操…

Solidity 小白教程:12. 事件

Solidity 小白教程:12. 事件 这一讲,我们用转账 ERC20 代币为例来介绍solidity中的事件(event)。 事件 Solidity中的事件(event)是EVM上日志的抽象,它具有两个特点: 响应&#x…

探索云计算和大数据分析的崛起:API行业的机遇与挑战【电商大数据与电商API接入】

I. 引言 随着云计算和大数据分析技术的快速发展,企业和个人对数据分析和处理的需求不断增加。在这个信息爆炸的时代,数据已成为企业决策和战略规划的重要基础。云计算提供了强大的计算和存储能力,使得大规模数据的处理和分析变得更加容易和高…

科技成果鉴定测试报告一般包含哪些测试内容?

软件测评报告 一、科技成果评价是需要做第三方软件测评报告,一般是证明技术指标点是否完善,覆盖主要申报内容,应用软件项目科技成果鉴定测试内容: (一)是否完成合同或计划任务书要求的指标; …

List常见面试问题

List的特点有哪些? Java中的List是一种存放有序的、可以重复的数据的集合,它允许重复元素的存在。List中的元素都有对应的一个序列号(索引)记录着元素的位置,因此可以通过这个序列号来访问元素。 ‍ Java中集合有哪些? Java中…

Ubuntu tmux 默认安装 快捷键

安装 sudo apt install tmux 启动tmux tmux 注意下方已显示[0] 0:bash 左右分屏 依次输入两组快捷键:Ctrlb, Shift5 即:% 上下分屏 依次输入两组快捷键:Ctrlb, Shift 即:" 切换窗口(注意:鼠标点击没有切换效果&#x…

【LeetCode算法系列题解】第61~65题

CONTENTS LeetCode 61. 旋转链表(中等)LeetCode 62. 不同路径(中等)LeetCode 63. 不同路径 II(中等)LeetCode 64. 最小路径和(中等)LeetCode 65. 有效数字(困难&#xff…

Neo-reGeorg隧道搭建

目录 Neo-regeorg前言 环境搭建 具体使用 kail安装Neo-reGeorg kail内生成webshell并设置密码 kail与win10连接 windows server内打开服务 kail虚拟机访问windows server以及所在的内网 Neo-regeorg前言 regeorg为reDuh的升级版,主要功能就是把内网服务器的…