LINUX 精通 1——2.1.1 网络io与io多路复用select/poll/epoll

news2024/12/28 22:01:16

LINUX 精通 1

day12 20240509

算法刷题: 2道高精度 耗时 107min

课程补20240430 耗时:99 min

day 13 20240512 耗时:200min

课程链接地址

前言

  1. 工作5-10年 够用

  2. 费曼:不要直接抄,自己写;不要一个截图

    总之自己总结一个心得,以后回来还能更新不断

    实事求是骗不了自己的心吧,这个技术还是比较纯粹,让我找回了从前学习的感觉, 比科研这个乌烟瘴气的东西好多了

    与阿里云合作了,>60篇,有专家博主的认证

    即使以后工作还能交流

  3. 学完了:

    简历面试前给老师看,可以了投

    问老师能拿到多少薪资,作为参考

    offer选择

零声linux c/c++如何学

  1. 切记:不要2倍速看, 每天看一点点,养成习惯,慢就是快

    😆 和拉小提琴的老师说的话一摸一样,这才是真正学一样东西的规律,而不是像现在科研环境,都被赶鸭子上轿,被折磨的非要搞出划时代的东西,搞笑呢,那不怪有造假 每天一点点不会磨灭对一件事情的热情,反而越来越想要做,会上瘾尤其是一旦有正向反馈以后 就像看历史讲座一样,我喜欢历史

  2. 课程能不能写到简历

    1. 项目做到上线

    2. 如何写?

      1. 名字自行命名 不要写课程里的一模一样的

        比如:图床 (大量的cv存图)用到这个

        用课上的技术,解决现实的具体问题

        but我做轨迹预测貌似没啥关系, 总之就可以搞一个变种,在课程项目的外面包一层壳, 问gpt

        1. 存储车辆轨迹数据:将每辆车的历史轨迹数据以键值对的形式存储在KV存储中。每个键可以是车辆ID或其他唯一标识符,而值则是该车辆的历史轨迹数据。
        2. 查询相关上下文信息:除了轨迹数据外,还可以将与轨迹预测有关的上下文信息存储在KV存储中。这些上下文信息可以包括道路状况、天气情况、交通流量等。通过相应的键来查询特定上下文信息。
        3. 轨迹预测模型训练:使用存储在KV存储中的历史轨迹数据和相关上下文信息作为训练集,构建轨迹预测模型。模型可以根据当前车辆状态和环境条件,预测出未来的行驶路径。
        4. 实时轨迹预测:当有新的实时输入(例如传感器数据)时,将其与相关的上下文信息一起查询,并输入到训练好的模型中进行实时预测。根据预测结果,可以调整车辆的行驶策略和决策。
        5. 数据更新和删除:当有新的轨迹数据生成或某些数据过期时,需要及时将其更新或从KV存储中删除,以保持存储数据的准确性和实时性。
  3. 简历

    1. 最多3个,2-3个项目够了

    2. 语言,语法本身不是重点,重点是用技术解决具体问题,什么问题用什么合适的语言

      为了应付面试可以看八股C++,从项目出发:比如项目功能里用了什么vector什么特性,虚表怎么继承,说自己理解,别全背,是用八股来提取自己项目的重点

    3. 参照大纲写你熟练 掌握 了解技术点

    4. 然后要在业务项目里 细节写你的那些功能用到了这些技术点。光写一堆技术点,你没实现过没用

      没技术点只有业务场景,就是产品经理

      只有技术没业务,没法解决什么问题

  4. 怎么看 好多啊!

    第一遍看好多好多,多看几遍+笔记整理,就这些东西+提取细节自己薄弱的地方,跟以前上学一样

    1. 第一章:先不用看

      什么时候看:因为后面工程里覆盖了这里的知识点

      因为有的知识点在压根无code,or不够,看了也没用,比如设计模式,git使用,后面都用到了,再回头看

      理论 老师喜欢用source insight, gdb调比较笨重,vscode可以。 书上不是用于开发,是原理,强调逻辑定义等。 开发是工业界,落地

      1. 红黑树:能用在哪里,三种? 作业
        1. 数据库系统:许多数据库系统使用红黑树来实现索引结构,如B+树。红黑树提供了快速的插入、删除和查找操作,并保持数据有序。
        2. C++ STL中的map和set容器:STL(标准模板库)中的map和set容器通常基于红黑树实现。这些容器支持高效的查找操作,并保持元素按照键值有序。
        3. 路由表:网络路由器通常使用红黑树来存储路由表信息。通过使用红黑树,可以高效地进行IP地址匹配以确定数据包的最佳转发路径。
        4. 计算机图形学:在计算机图形学中,红黑树可用于空间分区(如二维范围查询)和光线追踪等算法中。
        5. 任务调度器:操作系统中的任务调度器可以使用红黑树来管理任务队列,以便高效地选择下一个要执行的任务。

      开发 2-5

    2. 第二章:网络开发

      要做笔记(犯困走神的时候), 就是写技术博客,以后再次总结

      费曼plan,重在参与嘛,很不错,督促自己,就想去学呀

      细节+模棱两可的问题问老师, 发截图给老师

      以后9.1 kv存储 自行命名写简历

    3. 第三章:基础组件

      可以用api调,轮子:线程池,日志等,类似英语的基础语法,必须掌握

      看完混沌,不知道怎么用,只是自己可以实现

      1. 对于在职 拆解公司的项目:反推出哪些模块用了这些功能,面试可以说出来,即使轮子不需要你写
      2. 对于在校:9.5 魔兽世界, 连的不是魔兽server 是零声的server
    4. 第四章 中间件

      开起来就是一个线程,不是api 用网络和它交互

      每种掌握一个就ok了

      看9.2 图床 存我喜欢的东西——小鸟各种小鸟,还有风景,还有有意思的图

    5. 第五章:framework开源框架

      自选3-4个 行业相关的,其他选看

      5.1游戏的 skynet

      9.3 即时通讯 是一个万金油

      使用场景有什么:和其他人聊天, 比如boss聊天;游戏聊天区

      可以自己开发一个上线,**加自己的巧思——树洞,心灵树洞?**随机匹配陌生人聊天? 无心理负担聊天

      运维——部署、测试、性能分析 6-8

    6. 第六章 云原生

    7. 第七章 性能分析

    8. **第八章 分布式架构 **

      多台

第1章 2.1.1 网络io与io多路复用select/poll/epoll

这个在入门课里讲过啊,but我云里雾里的第8节

有的地方可以快进,大部分开1.25正好,1.5也行稍微有点快 脑子来不及反应

引入

网络应用,底层都是网络

  1. 使用微信,发送文字,视频,如何通过网络IO实现
  2. 使用抖音,视频资源如何到达手机的app上
  3. 使用github,gitlab.0voice.com上,git clone为什么能到本地
  4. 为什么共享单车扫了以后就能开锁
  5. 为什么能通过手机远程操作你家的空调

有意思啊,能解决实际需求

具体

client通过网络连接server,类似水管,但是具体内容不限的

网络是连接client和server的fd(file descriptor) :在计算机编程中,socketfd是指套接字描述符(socket file descriptor)。套接字描述符是一个整数值,用于标识操作系统内核中打开的套接字(socket)对象。它可以用来进行对网络通信的读写操作以及其他相关的操作。通过使用套接字描述符,程序可以与网络上的其他主机进行通信。

fd对应的userinfo可以改

在/share下
mkdir 20404	
cd 20404	
mkdir 2.1.1-network-io
touch networkio.c

或者直接在本地ftp里操作

开发环境搭建:
  1. 编写代码:代码编辑器(记事本也行),老师用source insight太卡了,我喜欢用vscode而且里面可以直接命令行调试,不用再额外开一个xshell
  2. 编译:linux下gcc/g++
  3. 运行:Ubuntu
  4. 终端工具ssh:xshell,putty,crt,mobaxterm,vscode里
  5. linux文件与windows映射,samba在装linux时候自带的,回去自己看入门课程的第一节笔记
编写:
配置
  1. linux在应用层里网络通信的实现,不论什么语言实现,底层都是socket无其他方法

  2. 老师敲代码为什么有提示:因为加载了内核源码 01:27:29处

    1. soureinsight里新建project然后synchronize files

    2. vscode成功啦啦啦啦啦

      这个include不要自己找,代码里放在问题上,点快速修复可以看到含头文件的路径复制过去

      ctrl+shift+p——>c++配置json
      "includePath": [
          "${workspaceFolder}/**",
          "/usr/include/**"
      ],
      

      VSCODE中C/C++ 自动提示、补全 配置_vscode c语言代码提示-CSDN博客

      【c++代码提示】VScode c++ 代码自动补全/智能提示设置_vscode c++ 提示-CSDN博客

code
  1. // 创建socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
  2. // 绑定本地端口
    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s.addr = htons(INADDR_ANY); // 默认0.0.0.0 绑本地地址;htons转成网络字节序
    

    本地网卡

    ifconfig
    
    ens33     Link encap:Ethernet  HWaddr 00:0c:29:31:b3:43  
              inet addr:192.168.243.128  Bcast:192.168.243.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe31:b343/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:353041 errors:0 dropped:0 overruns:0 frame:0
              TX packets:223361 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:238434200 (238.4 MB)  TX bytes:81289772 (81.2 MB)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:298113 errors:0 dropped:0 overruns:0 frame:0
              TX packets:298113 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1 
              RX bytes:57946571 (57.9 MB)  TX bytes:57946571 (57.9 MB)
    

    一张网卡ens33,没有二段网桥接,直接NAT映射的

    lo是回环地址

    0.0.0.0表示这两个任何一个网卡都可以使用

  3. 解释

    tcp server是酒店提供服务

    ​ 门口迎宾的人:socketfd,client跑来先碰到迎宾,安排和client绑定地址 端口,绑定;socketfd干嘛?迎宾然后正式上岗,listen监听(client发给server的data)

    ​ 点菜的人

  4. 编译

    gcc -o networkio networkio.c
    然后想找头文件
    man 函数名看在哪
    
    ./networkio
    

    绑——listen——连接

    1. netstat非常常用,看服务有没有起来:比如redis,sql等等起来没

      netstat -anop用于列出当前所有网络连接的详细信息。-a 选项表示显示所有连接和监听端口,-n 选项表示以数字形式显示地址和端口号,而不进行域名解析。-o 选项可以显示与每个连接关联的进程 ID(PID),最后的 p 选项用于显示与 PID 相关的进程名称。

      grep 2000则用于在结果中筛选出包含 “2000” 的行。 2000前面设的端口sin_port 2000(Global Regular Expression Print”,它是一个强大的文本搜索工具)

      此时0.0.0.0:2000已经起来了,说明socketfd正式工作了

    2. 端口绑完不能再,此时还想:./networkio不行,因为端口2000已经bind被绑了
      在这里插入图片描述

    3. 绑完进入listen以后可以被连接,且会产生新的连接,用netassist.exe连接,上面是用命令行连接,注意端口号和tcp client

      此时2000是2条io不是连接,但不完全是io,因为还没分配io
      在这里插入图片描述

    4. 连接以后io能通信,可以send,也能receive只是没打印

      网络助手里send以后,下面可以看到发了多少字节

    5. 用accept分配io:tcp协议的连接与io:不一样的,我懂了,连接是连了,但是数据无法解析出来,需要用io来操作数据

      再加分配io编译

      printf("listen finished\n");
      
      // 分配io
      struct sockaddr_in clientaddr;
      socklen_t len = sizeof(clientaddr);
      
      // 前面sock fd,Await a connection on socket FD. When a connection arrives, open a new socket to communicate with it,
      int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
      
      
      char buffer[1024] = {0};
      int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
      printf("recv: %s\n", buffer);
      
      
      getchar();// 阻塞在这里,一直等命令行给东西进来
      
      

      ./networio以后阻塞在accept()这行,已listen,sockfd上岗了

      netassist.exe连接后,阻塞recv()这行,点send以后就会recv有反应了

      加日志打印信息, client回传server收到的buffer大小

          // 分配io
          struct sockaddr_in clientaddr;
          socklen_t len = sizeof(clientaddr);
      
          // 前面sock fd,Await a connection on socket FD. When a connection arrives, open a new socket to communicate with it,
          printf("accept\n");
          int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
          printf("accept finished\n");
      
          char buffer[1024] = {0};
      	int count = recv(clientfd, buffer, 1024, 0); 
      	//Read N bytes into BUF from socket FD.
          printf("recv: %s\n", buffer);
      
      	// client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
          count = send(clientfd, buffer, count, 0);
          printf("send: %d\n", count);
      
    6. 跟着老师捋了一遍流程

      ./networkio以后,client遇到了tcp酒店的迎宾小姐sockfd,小姐建立了listen,上岗开始分配tcp server酒店的端口与地址和client绑定

      网络助手是client点连接就完成tcp连接 accept finished

      然后client发server:2000数据,打印同时也收到server send回来的数据

      在这里插入图片描述

    7. fd就是io与tcp连接信息一一对应:

      如果有accept两者生命周期极其类似,当accept后返回fd io

      如果无accept函数,就会连接,但是io fd没有晚很多

      虽然没有调用aceept()但也可以建立TCP链接,只要服务器listen()了就可以。只不过建立好了TCP链接,但没有办法获取和客户端之间的文件描述符FD。

      而accept()的作用就是获取已经建立连接的FD描述符IO

      sockfd是0.0.0.0:2000 默认两个卡都行

      clientfd是192.168.243.128:2000

      但是代码只有一个accept send分配不了多个client与server的io,所以加while多个io数据弄出来 可以起多个client网络助手连接

      在这里插入图片描述

      用#if 0编译的时候可以屏蔽

    8. 多个client问题——多路IO阻塞

      如果connect一个就send,再connect send没问题

      但是如果先对1 2 3 都按connect,再 3 2 1按send,发现3 2不会收到,1以后 123同时收到

      在这里插入图片描述

      即如果第1个connect的如果还未接受到数据,后面connect上的client都不会收到数据,即时通讯里不希望这样

      为什么

      因为:1过来卡在accept, 2再accept,3再accept.

      3必须等2的send执行完才会执行3的send,2必须等1的send执行完,才会执行2的send,所以23能发收不了,只能等1收了才收

      1-accept-send-2-accept-send-3-accept-send

      在这里插入图片描述

    9. 多路IO阻塞改进

      报错:

      /tmp/ccv3SqvF.o: In function main': networkio.c:(.text+0x1cc): undefined reference to pthread_create’ collect2: error: ld returned 1 exit status

      要-lpthread

      gcc -o networkic networkic.c -lpthread
      

      此时1 2 3连,3发就能收不用等12,2发能收不用等1

      void *client_thread(void *arg){
          // 为了防止多路io阻塞,开一个线程
          int clientfd = *(int *) arg; //先转成int *,强制转换成指向int,再取arg指针内容最外面*
      
          char buffer[1024] = {0};
          int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
          //Read N bytes into BUF from socket FD.
          printf("recv: %s\n", buffer);
      
          // client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
          count = send(clientfd, buffer, count, 0);
          printf("send: %d\n", count);
      
      }
      
      
      #else
              while(1){
                  printf("accept\n");
                  int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
                  printf("accept finished\n");
      
                  // 启动线程
                  pthread_t thid; // thread id
                  pthread_create(&thid, NULL, client_thread, &clientfd); //线程id,属性,入口函数,线程值
          }
      #endif
      
      

      but只能收发一条,多条加while

      void *client_thread(void *arg){
          // 为了防止多路io阻塞,开一个线程
          int clientfd = *(int *) arg; //先转成int *,强制转换成指向int,再取arg指针内容最外面*
      
          // 收多条 while
          while(1){
              char buffer[1024] = {0};
              int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
              //Read N bytes into BUF from socket FD.
              printf("recv: %s\n", buffer);
      
              // client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
              count = send(clientfd, buffer, count, 0);
              printf("send: %d\n", count);
          }
      }
      

综上最终版

#include<sys/socket.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<pthread.h>

void *client_thread(void *arg){
    // 为了防止多路io阻塞,开一个线程
    int clientfd = *(int *) arg; //先转成int *,强制转换成指向int,再取arg指针内容最外面*

    // 收多条 while
    while(1){
        char buffer[1024] = {0};
        int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
        //Read N bytes into BUF from socket FD.
        printf("recv: %s\n", buffer);

        // client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
        count = send(clientfd, buffer, count, 0);
        printf("send: %d\n", count);
    }
}


int main(){
    // 创建socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    // 绑定本地端口
    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htons(INADDR_ANY); //绑网卡地址 默认0.0.0.0 绑本地地址;htons转成网络字节序 
    servaddr.sin_port = htons(2000); // 0-1023系统默认 大于1024都能用

    if(-1 == bind(sockfd, (struct sockaddr*)&servaddr, sizeof(struct sockaddr))){
        printf("bind failed: %s\n", strerror(errno));
    }
    
    listen(sockfd, 10);
    printf("listen finished\n");

    // 分配io
    struct sockaddr_in clientaddr;
    socklen_t len = sizeof(clientaddr);


#if 0
// 第一版,屏蔽掉
    // 前面sock fd,Await a connection on socket FD. When a connection arrives, open a new socket to communicate with it,
    printf("accept\n");
    int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
    printf("accept finished\n");

    char buffer[1024] = {0};
    int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
    //Read N bytes into BUF from socket FD.
    printf("recv: %s\n", buffer);

    // client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
    count = send(clientfd, buffer, count, 0);
    printf("send: %d\n", count);
#elif 0
// 一直只要有连接,就分配io,来accept send
    while(1){
        // 前面socfd,Await a connection on socket FD. When a connection arrives, open a new socket to communicate with it,
        printf("accept\n");
        int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
        printf("accept finished\n");

        char buffer[1024] = {0};
        int count = recv(clientfd, buffer, 1024, 0); //Read N bytes into BUF from socket FD.
        //Read N bytes into BUF from socket FD.
        printf("recv: %s\n", buffer);

        // client回传server收到的buffer信息,server会打印收到的信息,client端打印buffer大小
        count = send(clientfd, buffer, count, 0);
        printf("send: %d\n", count);
    }

#else
        while(1){
            printf("accept\n");
            int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len);
            printf("accept finished\n");

            // 启动线程
            pthread_t thid; // thread id
            pthread_create(&thid, NULL, client_thread, &clientfd); //线程id,属性,入口函数,线程值
    }
#endif


    getchar();// 阻塞在这里,一直等命令行给东西进来

    printf("exit\n");

    
    return 0;
}

一请求一线程,并且每个请求互不影响,入门课根本没听懂也没操作会,这次吃透了

ps:

  1. gitlab配置:后面再说:

    git ssh密钥绑定https://blog.csdn.net/Yaoyao2024/article/details/132123525?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171547948716800188566050%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171547948716800188566050&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-132123525-null-null.142v100pc_search_result_base8&utm_term=git%20ssh%20key&spm=1018.2226.3001.4187

  2. 安康鱼的雄鱼完全寄生在雌鱼上,性寄生完成繁殖,母亲活的久但是会更痛,怀孕期间各项技能以透支的方式提高技能,但是带来的损伤无法逆转https://bilibili.com/video/BV1Js421A74m/?vd_source=81d34670595467089254a377dbe64851

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

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

相关文章

【微服务】spring aop实现接口参数变更前后对比和日志记录

目录 一、前言 二、spring aop概述 2.1 什么是spring aop 2.2 spring aop特点 2.3 spring aop应用场景 三、spring aop处理通用日志场景 3.1 系统日志类型 3.2 微服务场景下通用日志记录解决方案 3.2.1 手动记录 3.2.2 异步队列es 3.2.3 使用过滤器或拦截器 3.2.4 使…

安全工程师面试题

安全工程师面试题安全工程师是一个非常重要的职位&#xff0c;他们负责保护公司的网络和系统免受黑客和恶意软件的攻击。如果你想成为一名安全工程师&#xff0c;那么你需要准备好面试。下面是一… 1安全工程师面试题 安全工程师是一个非常重要的职位&#xff0c;他们负责保护…

【全开源】Java俱乐部系统社区论坛商城系统源码-奔驰奥迪保时捷大众宝马等汽车俱乐部

特色功能&#xff1a; 会员中心&#xff1a;会员中心可以帮助企业更好地管理客户&#xff0c;包括设置积分商城、会员卡充值、个人汽车档案等功能&#xff0c;对不同的会员群体展开有针对性的营销&#xff0c;并维护和积累自己的粉丝群体。信息服务&#xff1a;负责定期发布新…

后端项目开发笔记

Maven打包与JDK版本不对应解决方法 我这里使用jdk8。 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configurat…

【Docker】Ubunru下Docker的基本使用方法与常用命令总结

【Docker】docker的基本使用方法 镜像image与容器container的关系基本命令- 查看 Docker 版本- 拉取镜像- 查看系统中的镜像- 删除某个镜像- 列出当前 Docker 主机上的所有容器&#xff0c;包括正在运行的、暂停的、已停止的&#xff0c;以及未运行的容器- 列出当前 Docker 主机…

day05-面向对象内存原理和数组

day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时&#xff0c;需要在内存中分配空间。为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域…

leetcode——反转链表

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;创建三个指针n1,n2,n3&#xff0c;遍历原链表&#xff0c;通过三者之间的关系将链表反转。下面给出图示&#xff1a; 下面给出题解代码&#xff1a; typedef struct ListNode ListNode; struct List…

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…

vmware虚拟机内删除文件后宿主机空间不释放

问题描述 linux下&#xff0c;vmware内虚拟机删除文件&#xff0c;宿主机空间不释放&#xff0c;D盘快满了 解决方法 通过vmware-toolbox进行空间回收 安装 在虚拟机内操作 yum install -y open-vm-tools 清理 在虚拟机内操作 #查看磁盘的挂载点 sudo /usr/bin/vmware…

设计模式-结构型-桥接模式-Bridge

桥接模式可以减少类的创建 矩阵类 public class Matrix {private String fileName;public Matrix(String fileName) {this.fileName fileName;}public String getFileName() {return fileName;} } 图片抽象类 public abstract class Image {protected ImageImp imp;public …

C#二维数组(矩阵)求伴随矩阵和逆矩阵

程序框架及winform窗体 窗体控件: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Matrix {internal class Algorithm_Gallery{// <summary>/// 计算 A[p,q] 位于 [,]temp 的块辅因子…

Oracle数据库之 常用数据库对象(二)

目录 1.视图 1.1.什么是视图&#xff1f; 1.2.创建视图的语法 1.3.简单视图和复杂视图 1.4.创建复杂视图 1.4.1.创建复杂视图的步骤 1.4.2.示例 1.4.3.注意事项 1.5.视图中使用DML的规定 1.5.1.屏蔽DML操作 1.6.删除视图 2.序列 2.1.语法&#xff1a; 2.2.查询序…

【AI源码】音频和图片生成你的数字人口播

带表情、带头部运动。适合做一些名人短视频鸡汤口播 类似此前微软和阿里emo那个方案 1、介绍: 能够通过单张静态肖像和输入音频生成具有自然流动运动的谈话视频,它采用了一种普遍的运动表示方法,能够捕捉广泛的面部动态,包括细微的表情和头部运动。 2、框架概述 (1)该…

【18-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

信息检索(37):Query-as-context Pre-training for Dense Passage Retrieval

Query-as-context Pre-training for Dense Passage Retrieval 标题摘要1 引言2 初步&#xff1a;上下文监督预训练2.1 coCondenser2.2 CoT-MAE 3 查询即上下文预训练3.1 预训练3.2 微调 4 实验4.1 预训练4.2 微调4.3 基线4.4 主要结果4.5 域外评估 5 分析5.1 生成的查询数量的影…

【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…

【一支射频电缆的诞生】GORE 戈尔

工具连接&#xff1a; https://microwave-cablebuilder.gore.com/ 控制参数&#xff1a; 连接器&#xff1a; 欣赏

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

力扣每日一题124:二叉树中的最大路径和

题目 困难 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root…