十大旅游网站排名/学生个人网页设计作品

十大旅游网站排名,学生个人网页设计作品,通过网站做诈骗立案吗,县科协微网站建设一、引入 网络通信的本质就是进程间的通信,进程间通信的本质就是IO(Input,Output) I/O(input/output)也就是输入和输出,在冯诺依曼体系结构当中,将数据从输入设备拷贝到内存就叫作…

一、引入

网络通信的本质就是进程间的通信,进程间通信的本质就是IO(Input,Output)

I/O(input/output)也就是输入和输出,在冯诺依曼体系结构当中,将数据从输入设备拷贝到内存就叫作输入,将数据从内存拷贝到输出设备就叫作输出

站在进程的角度,站在网络的角度

  • 如何理解IO?

IO = 等 + 拷贝,我们在使用read/recv/send/write等,有数据的时候就拷贝到自己的或者对应的缓冲区,没有数据的时候,就进行阻塞等待或者非阻塞等待

  • 什么叫做高效的IO?

本质就是单位时间内,减少等的比重

二、五种IO模型

1.例子引入

现在我们来谈谈钓鱼,钓鱼 = 等 + 钓,IO也是等 + 拷贝,我们现在借着钓鱼的例子来理解五种IO模型

  • 现在有5个人去钓鱼
  • 张三钓鱼一直不动(别人与张三说话,张三也不理对方),眼睛一直盯着鱼漂,鱼漂动了,就拉起鱼竿
  • 李四钓鱼一直在动,没事就刷刷抖音,和张三说说话(张三不理他),顺便检测鱼漂,鱼漂动了,就拉起鱼竿
  • 王五钓鱼在鱼竿上挂了铃铛,鱼一旦上钩,铃铛就会响,就拉起鱼竿
  • 赵六钓鱼买了很多鱼竿,把每根鱼竿插在岸边,一直在岸边跑来跑去,任何一个鱼竿就绪,就拉起鱼竿
  • 田七钓鱼带来一个司机小王,但田七临时有事离开钓鱼塘,田七对小王说:渔具什么我全部给你准备好了,我在给你一个水桶,等你把水桶装满,你在打电话给我,然后回来;田七没有参与调用,只负责发起钓鱼

在IO中,这里的人可以看作系统调用、鱼竿就是sockfd,钓鱼塘是系统内部,鱼就是数据,鱼漂浮动就是数据就绪,钓就是发生拷贝

  • 张三,李四和王五的钓鱼效率本质是一样的吗?

是的,因为他们钓鱼方式都是一样的,都是先等鱼上钩,然后再将鱼钓上来

其次,他们每个人都只拿一根鱼竿,在等待鱼的上钩,当河里鱼来咬鱼钩的时候,这条鱼咬哪一个鱼钩的概率是相同的

  • 谁的效率更高?

赵六,因为赵六减少了等待概率的发生,增加了拷贝的时间,所以他的效率是最高的

赵六的效率之所以高,是因为赵六一次等待多个鱼竿的鱼上钩,可以将“等”的时间进行重叠

  • 如何看待田七的钓鱼方式?

田七没有参与调用,只负责发起钓鱼;田七没有参与等+拷贝的任意一项,而真正钓鱼的是小王,在小王钓鱼的期间,田七可以干任意的事情,如果将钓鱼看作是一种 IO 的话,那么田七的这种钓鱼方式就叫作异步 IO

  • 概念整理

张三:阻塞IO

李四:非阻塞IO

王五:信号驱动IO

赵六:多路复用/多路转接IO

田七+小王:异步IO

阻塞IO与非阻塞IO的本质就是等的方式不同

【例子】在之前的echo例子中,键盘向OS输入,实际将键盘输入的数据放入到OS内部的输入缓冲区,当进程需要这个数据的时候,将输入缓冲区的内容拷贝到进程,进程执行结果后将数据拷贝到OS内部的输出缓冲区,显示器从输出缓冲区拷贝内容,最终就把结果回显给我们

在这里插入图片描述

IO = 等 + 拷贝

多路转接的作用就是为了等待多个fd,等待该fd上面的新事件(OS底层有数据了,读时间就绪,或者OS底层有空间了,写事件就绪)就绪,通知程序员,事件已经就绪,可以进行IO拷贝了

2.阻塞IO

阻塞IO:在内核将数据准备好之前,系统调用会一直等待;所有的套接字,默认都是阻塞方式

阻塞IO是最常见的IO模型

在这里插入图片描述

应用进程通过recvfrom函数从某个套接字上读取数据时,如果底层的数据没有准备好,那么这个进程就一直在这个地方等待着,一旦数据就绪后,才会将数据从内核拷贝到用户空间,最后recvfrom才会返回

这种以阻塞方式进行IO操作的进程或线程,在“等”和“拷贝”期间都不会返回,在用户看来就是阻塞了,因此被称为阻塞IO

3.非阻塞IO

如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码

非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询,这对CPU来说是较大的浪费,一般只有特定场景下才使用

在这里插入图片描述

当调用recvfrom函数以非阻塞方式从某个套接字上读取数据时,如果底层数据没有准备好,那么recvfrom就会立马错误返回,而不是让该进程进行阻塞等待

因为没有读取数据,所以该进程或线程后续还需要继续调用recvfrom函数,检测底层数据是否就绪,如果没有就继续错误返回,直到监测到底层有数据后,再将数据从内核拷贝到用户空间,再进行成功返回

阻塞与非阻塞的区别就是,非阻塞可以去做其他事情,而阻塞就一直在等

fcntl

在Linux操作系统中,fcntl() 函数是一个用于文件控制的系统调用。它允许你以不同的方式操作打开的文件描述符。这个函数接受三个参数:

fd:要操作的文件描述符。

cmd:指定要执行的文件控制命令。

...:根据 cmd 命令的不同,可能需要传递额外的参数。

cmd 参数值用途
F_DUPFD复制文件描述符,返回一个新的文件描述符,它是当前最低可用文件描述符。
F_GETFD获取文件描述符的close-on-exec标志。
F_SETFD设置文件描述符的close-on-exec标志。
F_GETFL获取文件状态标志和访问模式(如O_RDONLY, O_WRONLY, O_RDWR)。
F_SETFL设置文件状态标志,如O_APPEND, O_NONBLOCK等。
F_GETLK获取记录锁。
F_SETLK设置或释放记录锁(非阻塞)。
F_SETLKW设置或释放记录锁(阻塞)。

将指定的文件描述符设置为非阻塞模式

void SetNonBlock(int fd)
{int fl = ::fcntl(fd, F_GETFL);if(fl < 0){std::cout << "fcntl error" << std::endl;return;}::fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

下面代码演示了非阻塞能够收到EWOULDBLOCK返回

并且也能区分error是出错了 还是因为非阻塞返回的

#include <iostream>
#include <cstdio>
#include <unistd.h>
#include "Comm.hpp"#include <sys/select.h>int main()
{char buffer[1024];SetNonBlock(0);while(true){// printf("Enter# ");// fflush(stdout);ssize_t n = ::read(0, buffer, sizeof(buffer)-1);if(n > 0){buffer[n] = 0;printf("echo# %s", buffer);}else if(n == 0)  // ctrl + d{printf("read done\n");break;}else{// 如果是非阻塞,底层数据没有就绪,IO接口,会以出错形式返回// 所以,如何区分  底层不就绪  vs   真的出错了? 根据errno错误码if(errno == EWOULDBLOCK){sleep(1);std::cout << "底层数据没有就绪,开始轮询检测" << std::endl;std::cout << "可以做其他事情" << std::endl;// do other thingcontinue;}else if(errno == EINTR){continue;}else{perror("read");break;}// perror("read\n"); // printf("n=%ld\n", n);// //底层数据没有就绪: errno 会被设置成为 EWOULDBLOCK EAGAIN// printf("errno=%d\n", errno); // break;}}return 0;
}

测试结果:
当我们输入数据,而不按回车的时候,底层仍然在轮询检测,当我们输入回车的时候;echo出来的内容与我们输入的内容一致

在这里插入图片描述

4.信号驱动

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作

在这里插入图片描述

应用程序通过系统调用sigaction来设置一个SIGIO信号的处理函数。这个处理函数将在接收到SIGIO信号时被触发。内核处于等待状态,直到数据准备好。数据准备好时,内核会发出一个SIGIO信号通知应用程序。应用程序捕获到SIGIO信号后,它会执行recvfrom系统调用来从网络接收数据,recvfrom系统调用完成后,内核会将控制权交还给应用程序,同时传递回成功的指示,数据报从内核空间复制到用户空间,应用程序现在可以在用户空间内处理收到的数据报了

如果数据正在从内核空间拷贝到用户空间的缓冲区过程中,那么在此期间,应用程序可能会暂时阻塞,直到数据拷贝完成。

信号的产生是异步的,但信号驱动 IO 是同步 IO 的一种。

因为它依然参与了等 + 拷贝

5.IO多路转接

虽然从流程图上看起来和阻塞IO类似,实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态

使用select最主要的目的:将等 + 拷贝两个操作分开。select专门负责等,recvfrom负责拷贝

在这里插入图片描述

  • 应用程序通过调用select函数来阻塞自己,等待多个套接字中的任何一个变为可读状态。这意味着应用程序会暂停执行,直到至少一个套接字准备好读取数据。
  • 当操作系统检测到某个套接字的数据已经准备好可以读取时,它会通知应用程序,并通过select函数返回这个信息。
  • 应用程序收到操作系统的通知后,它可以通过recvfrom系统调用来实际从套接字中读取数据。这个调用会将数据从网络层复制到应用程序指定的缓冲区中。
  • 内核负责管理数据的接收、存储以及最终传递给应用程序的过程。具体来说,当数据到达内核的网络堆栈时,内核会将其暂存起来,然后根据应用程序的要求进行相应的处理。
  • 数据被内核成功接收并准备好供应用程序读取的状态。
  • 内核将数据从其内部缓存(通常称为“内核空间”)拷贝到应用程序分配的用户空间内存区域
  • 数据拷贝完成后,应用程序就可以访问这些数据并进行进一步的处理了。

因为这些多路转接接口是一次 “等” 多个文件描述符的,因此能将 “等” 的时间重叠,数据就绪后再调用对应的 recvfrom 等函数进行数据的拷贝,此时这些函数就能够直接进行拷贝,而不需要 “等” 了

6.异步IO

由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。

在这里插入图片描述

应用进程调用aio_read函数发起一个异步读操作。内核检查数据是否准备好供读取(如果数据未准备好,内核会等待直到数据准备好;一旦数据准备好,内核会将数据拷贝到用户空间缓冲区中)当数据被成功拷贝到用户空间时,内核通知应用程序数据已经可用,应用程序可以继续执行其他任务,而不需要等待I/O操作的完成,当I/O操作完成后,内核通过信号或回调函数通知应用程序。

7.小结

任何IO过程中,都包含两个步骤,第一个是等待,第二是拷贝,而且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间。让IO更高效,最核心的办法就是让等待的时间尽量少

三、高级IO重要概念

1.同步通信 VS 异步通信(Synchronous Communication / Asynchronous Communication)

同步和异步关注的是消息通信机制

  • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

另外,我们回忆在讲多进程多线程的时候,也提到同步和互斥,这里的同步通信和进程之间的同步是完全不想干的概念

  • 进程 / 线程同步:指的是在保证数据安全的前提下,让进程/线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,谈论的是进程/线程间的一种工作关系。
  • 同步 IO:指的是进程/线程与操作系统之间的关系,谈论的是进程/线程是否需要主动参与 IO 过程。

注意:尤其是在访问临界资源的时候,一定要弄清楚这个 “同步”,是同步通信异步通信的同步,还是同步与互斥的同步。

2.阻塞 VS 非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

3.其他高级 IO

非阻塞 IO、 纪录锁、系统 V 流机制、 I/O 多路转接(也叫 I/O 多路复用), readv 和 writev 函数以及存储映射 IO( mmap ),这些统称为高级 IO。

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

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

相关文章

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

从零开始实现 C++ TinyWebServer 处理请求 HttpRequest类详解

文章目录 HTTP 请求报文HttpRequest 类实现 Init() 函数实现 ParseRequestLine() 函数实现 ParseHeader() 函数实现 ParsePath() 函数实现 ParseBody() 函数实现 ParsePost() 函数实现 ParseFromUrlEncoded() 函数实现 UserVerify() 函数实现 Parse() 函数HttpRequest 代码Http…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统&#xff08;四&#xff09; 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结&#xff08;核心概念速记&#xff09;&#xf…

LLM之RAG理论(十四)| RAG 最佳实践

RAG 的过程很复杂&#xff0c;包含许多组成部分。我们如何确定现有的 RAG 方法及其最佳组合&#xff0c;以确定最佳 RAG 实践&#xff1f; 论文 《Searching for Best Practices in Retrieval-Augmented Generation》给出了回答。 本文将从以下三方面进行介绍&#xff1a; 首先…

利用knn算法实现手写数字分类

利用knn算法实现手写数字分类 1.作者介绍2.KNN算法2.1KNN&#xff08;K-Nearest Neighbors&#xff09;算法核心思想2.2KNN算法的工作流程2.3优缺点2.4 KNN算法图示介绍 3.实验过程3.1安装所需库3.2 MNIST数据集3.3 导入手写数字图像进行分类3.4 完整代码3.5 实验结果 1.作者介…

好吧好吧,看一下达梦的模式与用户的关系

单凭个人感觉&#xff0c;模式在达梦中属于逻辑对象合集&#xff0c;回头再看资料 应该是一个用户可以对应多个模式 问题来了&#xff0c;模式的ID和用户的ID一样吗&#xff1f; 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

python socket模块学习记录

python黑马程序员 通过python内置socket模块&#xff0c;在电脑本地开发一个服务器&#xff0c;一个客户端&#xff0c;连接后进行连续的聊天。服务器和客户端均可输入exit&#xff0c;主动退出连接。 服务器开发.py import socket# 创建Socket对象 socket_server socket.s…

chap1:统计学习方法概论

第1章 统计学习方法概论 文章目录 第1章 统计学习方法概论前言章节目录导读 实现统计学习方法的步骤统计学习分类基本分类监督学习无监督学习强化学习 按模型分类概率模型与非概率模型 按算法分类按技巧分类贝叶斯学习核方法 统计学习方法三要素模型模型是什么? 策略损失函数与…

爬虫案例-爬取某站视频

文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤&#xff1a; 1.下载 FFmpeg&#xff1a; 2.访问 FFmpeg 官网。 3.选择 Wi…

车载以太网网络测试-22【传输层-DOIP协议-5】

目录 1 摘要2 DoIP时间参数2.1 ISO 13400定义的时间参数2.2 参数示例 3 DoIP节点内部状态机4 UDSonIP概述5 总结 1 摘要 本文继续对DOIP协议进行介绍&#xff0c;主要是DOIP相关的时间参数、时间参数定义以及流程示例。推荐大家对上文专题进行回顾&#xff0c;有利于系统性学习…

(论文总结)思维链激发LLM推理能力

研究背景&动机 背景:扩大模型规模已被证实具有提升模型性能和模型效率的功效&#xff0c;但是LLM对于完成推理、算术任务仍有较大不足。 动机:从之前的应用和研究中得知&#xff0c;可以用生成自然语言解释、使用神经符号等形式语言的方法来提高大模型的算术推理能力&…

anythingLLM结合searXNG实现联网搜索

1、docker-compose 部署searXNG GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker. cd /usr/local git clone https://github.com/searxng/searxng-docker.git cd searxng-docker 2、修改 .env文件 # By default…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List的基本使用方法 List组件的构建声明是这个样子的 List(value?: {space?:number | string, initial…

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…

【TI MSPM0】Timer学习

一、计数器 加法计数器&#xff1a;每进入一个脉冲&#xff0c;就加一减法计算器&#xff1a;每进入一个脉冲&#xff0c;就减一 当计数器减到0&#xff0c;触发中断 1.最短计时时间 当时钟周期为1khz时&#xff0c;最短计时时间为1ms&#xff0c;最长计时时间为65535ms 当时…

从WebRTC到嵌入式:EasyRTC如何借助大模型提升音视频通信体验

随着人工智能技术的快速发展&#xff0c;WebRTC与大模型的结合正在为音视频通信领域带来革命性的变革。WebRTC作为一种开源实时通信技术&#xff0c;以其低延迟、跨平台兼容性和强大的音视频处理能力&#xff0c;成为智能硬件和物联网设备的重要技术支撑。 而EasyRTC作为基于W…

自由学习记录(45)

顶点片元着色器&#xff08;important&#xff09; 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多&#xff0c;灵活性较强&#xff0c;性能消耗更可控&#xff0c;可以实现更多渲染细节 4.适用于光照处理较少&#xf…

Quartus + VScode 实现模块化流水灯

文章目录 一、通过VScode编写Verilog代码二、模块化编程三、代码示例 一、通过VScode编写Verilog代码 1、下载Vscode 2、下载相关插件 搜索Verilog就会弹出有如图所示的插件&#xff0c;下载并安装 3、创建Quartus项目 4、创建完成后点击Tools&#xff0c;选择Options 然后在…

tryhackme——The Lay of the Land

文章目录 一、网络基础设施1.1 内网1.2 DMZ区1.3 网络枚举&#xff08;Network Enumeration&#xff09; 二、域环境三、用户和组管理四、安全解决方案4.1 基于主机的安全解决方案4.1.1 防病毒软件4.1.2 Microsoft Windows Defender4.1.3 主机防火墙4.1.4 安全事件记录与监控4.…

STM32---FreeRTOS消息队列

一、简介 1、队列简介&#xff1a; 队列&#xff1a;是任务到任务&#xff0c;任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09;。 FreeRTOS基于队列&#xff0c;实现了多种功能&#xff0c;其中包括队列集、互斥信号量、计数型信号量、二值信号量…