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

嵌入式学习37-TCP并发模型

TCP并发模型:
1.TCP多线程模型:
    缺点:
        1.创建线程会带来 资源开销                                                                                                                2.能够实现的  并发量  比较有限 

2.IO模型:
    1.阻塞IO:
          没有数据到来时,可以让任务挂起                                                                                                        节省CPU资源开销,提高系统效率
    
    2.非阻塞IO:
           程序接收到数据时一直执行        效率很低

    3.异步IO
             只能绑定一个文件描述符用来    读取数据

    4.多路复用IO
        select
            1.select监听的集合中的文件描述符有  上限限制                                                                                                       
            2.select有 内核层 用户层数据空间    拷贝   的过程,占用系统资源开销                                                                                                       
            3.select必须  轮询检测  产生  事件  的文件描述符                                                                                                       
            4.select  只能工作   在  水平触发  模式(低速模式)                                                                                            无法工作  在  边沿触发  模式(高速模式)

        poll   (监听的集合中的文件描述符有  没有上限限制
            1.poll有  内核层 向  用户层 数据空间  拷贝  的过程,占用系统资源开销                                                                                          
            2.poll必须  轮询检测  产生  事件  的文件描述符                                                                                          
            3.poll  只能工作在水平触发模式(低速模式)                              与select相同                                                 无法工作在边沿触发(高速模式)

水平触发:产生事件通知,没处理完成,下次继续通知此事件,阻塞在这里,直到处理完成此事件(低速)。

边沿触发:产生事件的时刻通知,只通知一次,下次通知其它事件,不阻塞。

poll:内部链表结构,所以无上限。

  
3.函数接口:
    1.select 
      int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
      功能:
             select  监听  文件描述符集合                                                                                                              是否 有文件描述编程 ready状态

                                   

select  监听  文件描述符集合 ,若有状态 , 将没有ready状态的T除                                                                                                   若无状态,将阻塞继续等待                                                                参数:
        nfds:                                                                                                                                                             最大文件描述符的值  +1 
        readfds:                                                                                                                                                                读 文件描述符集合
        writefds:                                                                                                                                                             写  文件描述符集合
        exceptfds:                                                                                                                                                             其余  文件描述符集合
        timeout:                                                                                                                                                             等待的时长
                      NULL 一直等待(超时处理
      返回值:
        成功   返回   文件描述符集合中  的  文件描述符个数
        失败   返回   -1 

    void FD_CLR  (int fd, fd_set *set);
    功能:
          将文件描述符   fd  从集合中清除 

    int  FD_ISSET   (int fd, fd_set *set);
    功能:
         判断文件描述符  fd  是否仍在集合中 

    void FD_SET(int fd, fd_set *set);
    功能:
        将文件描述符  fd  加入到 集合中

    void FD_ZERO(fd_set *set);
    功能:
        将文件描述符集合   清0 

    2.poll  
      int poll(struct pollfd *fds, nfds_t nfds, int timeout);
      功能:
             监听  文件描述符集合  是否  有事件发生
      参数:
        fds:                                                                                                                                                             监听  文件描述符集合  数组空间首 地址
        nfds:                                                                                                                                                           监听   文件描述符集合  元素个数
        timeout:                                                                                                                                                           等待的时间   (非0)                                                                                                                                              (-1 一直等待
      返回值:
        成功  返回  产生事件的文件描述符  个数
        失败  返回  -1 

    struct pollfd {
        int   fd;         /* file descriptor */
        short events;     /* requested events */
        short revents;    /* returned events */
    };

    fd:                                                                                                                                                           监听的文件描述符
    events:                                                                                                                                                           要监听的 事件                                                                                                                          POLLIN:                                                                                                                                                                是否 可读                                                                                                                         POLLOUT:                                                                                                                                                           是否 可写
    revents:                                                                                                                                                           实际  产生的  事件 

    3.epoll 
      int epoll_create(int size);
      功能:
          创建 一张 内核事件表
      参数:
        size:                                                                                                                                                           事件的 个数
      返回值:
        成功返回文件描述符
        失败返回-1 
    
      epoll_ctl 
      int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
      功能:
              维护  epoll时间表
      参数:
        epfd:                                                                                                                                                           事件表  的文件描述符
        op:
            EPOLL_CTL_ADD   添加事件
                                                                                                                                                                       EPOLL_CTL_MOD   修改事件
                                                                                                                                                                       EPOLL_CTL_DEL   删除事件
        fd:
            操作 的文件描述符
        event:
            事件 对应的 事件 
        
        typedef union epoll_data {
            void        *ptr;
                int          fd;
            uint32_t     u32;
            uint64_t     u64;
        } epoll_data_t;

        struct epoll_event {
            uint32_t     events;      /* Epoll events */
            epoll_data_t data;        /* User data variable */
        };

      返回值:
        成功返回0 
        失败返回-1 

      epoll_wait 
      int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);
      功能:
        监听  事件表中  的  事件
      参数:
        epfd:                                                                                                                                                           文件描述符
        events:                                                                                                                                                           存放  实际产生事件  的数组空间 首地址
        maxevents:                                                                                                                                                           最多  存放事件  个数
        timeout:                                                                                                                                                           设定监听的时间(超过该时间  则不再监听
                         -1 一直监听直到有事件发生
      返回值:
        成功返回产生事件的文件描述符个数
        失败返回-1 
        如果时间达到  仍没有事件发生  返回0 

相关文章:

嵌入式学习37-TCP并发模型

TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来 资源开销 2.能够实现的 并发量 比较有限 2.IO模型: 1.阻塞IO: 没有…...

C语言字符函数和字符串函数

前言 今天这篇博客咱们一起来认识一些特殊的函数,在编程的过程中,我们经常要处理字符和字符串,为了方便字符和字符串,C语言提供了一些库函数,让我们一起看看这些函数都有什么功能吧!!&#xff0…...

Go语言必知必会100问题-22 空切片与nil切片有区别吗?

空切片与nil切片有区别吗? 很多开发人员经常混淆nil切片和空切片,不清楚什么时候使用空切片什么时候使用nil,而有些库函数又对这两者使用进行了区分。下面先来看看它们的定义。 空切片是length为0的切片当切片等于nil时为nil切片 下面是几种不同空切片…...

【C++进阶】C++多态概念详解

C多态概念详解 一,多态概念二,多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写(覆盖)和重定义(隐藏)的区别 三,抽象…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 2、线条平滑曲面但有间隔

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata imp…...

前端精准测试调用链路分析

精准测试在评估需求的测试范围时,需要评估一下代码的影响范围,这个范围有两部分:一是需求直接修改的代码;二是修改代码影响到的功能模块。代码影响到的功能一般是通过调用链路分析来实现的,java和kotlin代码可以由java…...

Objective-C blocks 概要

1.block的使用 1.1什么是block? Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块,封装了函数调用及调用…...

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用(不推荐) 先下载到本地,以.rpm文件名结尾,下载完成后,再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …...

DevOps实战:Docker、Kubernetes与Jenkins的完美融合

DevOps与容器化技术:Docker、Kubernetes和Jenkins 引言 在软件开发领域,DevOps文化和容器化技术已经成为当今最热门的话题之一。DevOps的目标是缩短开发和运维之间的距离,提高软件交付的速度和质量。而容器化技术,如Docker和Kub…...

Python面向对象——程序架构

需求 创建图形管理器 -记录多种图形(圆形、矩形.) --提供计算总面积的方法, 要求:增加新图形,不影响图形管理器 测试: 创建图形管理器,存储多个图形对象。 通过图形管理器,调用计算总面积方法 思路 ​​​​​​​ 代码 # ------…...

springboot单体项目链路日志跟踪及接口耗时

最近接触一个新的传统项目,在联调过程中,查看日志特别不方便,既无trackId,即无接口耗时,所以写了该博客。话不多说,直接上代码 1、实体类user package com.yk.domain;import lombok.Data;@Data public class User {private Long id;private String username;private St…...

力扣hot---岛屿数量

dfs思路: 首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的…...

如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&…...

Nginx反向代理详解

1. 什么是反向代理 反向代理是一种服务器代理的方式,它代理了客户端的请求并将请求转发给后端服务器,然后将后端服务器的响应返回给客户端。在这个过程中,客户端并不直接与后端服务器通信,而是通过反向代理服务器来实现请求转发和…...

【Android】 ClassLoader 知识点提炼

1.Java中的 ClassLoader 1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。其中系统类 加载器包括3种,分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。 1.1.1.Bootstra…...

16. C++标准库

C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…...

JVM内存结构介绍

1. 什么是JVM 我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 Windows 系统上安装。 Java 代码为什么可以在 Windows…...

Linux常见指令总结

ls:显示当前目录下文件列表 常用的命令行参数: -l 显示更多的文件属性 -a 显示所有的文件/目录(包括隐藏的) -d 只显示目录 ps:参数可以叠加使用。 例如:ls -la 显示所有文件…...

Day35-Linux网络管理5

Day35-Linux网络管理5 1. 网卡配置2. DNS客户端域名解析配置3. 给网卡配多个IP4. ip地址查看和设置4.1 ifconfig命令4.2 ip命令4.3 ip命令:查看和设置网络配置4.4 ip命令帮助 5. 路由5.1 路由功能分类:5.2 查看路由:5.3 路由表:5.…...

9个神奇免费AI编程助手,实现高效自动代码生成!

在AIGC技术工具快速发展的时代,对高效智能编程工具的需求和关注已达到空前的高度。本文将介绍9款免费且好用的AI编程助手工具。无论你是经验丰富的开发人员还是刚开始编程旅程的新手,这些AI代码软件都能帮助你提高项目开发的生产力、创造力和准确性&…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

Tauri2学习笔记

教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...

标注工具核心架构分析——主窗口的图像显示

🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...

前端异步编程全场景解读

前端异步编程是现代Web开发的核心,它解决了浏览器单线程执行带来的UI阻塞问题。以下从多个维度进行深度解析: 一、异步编程的核心概念 JavaScript的执行环境是单线程的,这意味着在同一时间只能执行一个任务。为了不阻塞主线程,J…...

5. TypeScript 类型缩小

在 TypeScript 中,类型缩小(Narrowing)是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码,确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…...

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug? Pug(原名 Jade)是一种高效的网页模板引擎,通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签,使用缩进定义结构,…...