Linux 项目实战记录

2023-05-16

1.阻塞/非阻塞、同步/异步(网络IO)

典型的一次IO的两个阶段是什么?数据就绪和数据读写

数据就绪:根据IO操作的就绪状态

        阻塞 :1、调用IO方法的线程进入阻塞状态,(函数进入waiting函数等待);

        非阻塞:不会改变线程的状态,通过返回值判断(会立即返回);

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

1、size == -1

EINTR:不是一种错误 要处理,信号产生,进入中断(中断当前程序),中断回来会返回-1,产生一个EINTR错误号。recv没有数据 也会返回-1(非阻塞法人时候),返回EAGAIN/ EWOULDBLOCK错误号。

2、size == 0

读取到数据末尾了,对方连接关闭了/3、size > 0 读取到了多少的数据

同步:会一直等待结果返回(我觉得这里同步和阻塞是一样的)。

异步:函数调用IO操作后,不管有没有返回值,就去干自己的事了(编程复杂)

怎样理解阻塞非阻塞与同步异步的区别? - 知乎 (zhihu.com) 讲的挺不错的(通知,信号,回调函数)。

char buf[1024];

int len = ssize_t recv(int sockfd, void *buf, size_t len, int flags);

当用的是同步的调用方式时候,会将TCP读缓冲区间的数据加载到buf数组,加载完成后,返回读取成功字节数,此时才会继续执行下一个函数。反之异步,在调用recv函数时,会继续执行下去,只是你需要将socket关键字,以及buf数组传到系统函数里面,数据的拷贝是通过操作系统来完成的,当将读缓冲区的数据全部都复制到buf数组的时候,操作系统会通过通知,信号,回调函数等方式,来告诉主函数。而非阻塞指的是马上调用马上返回一个数值,这个就是和异步的区别。

linux 中异步的io是aio_read(),

aio_write(); 

视屏原话:

一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪” 和 “数据读写”,据就绪阶段分为 阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。

同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是 由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时 (或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以 处理其它逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。

2、Unix/Linux上的五种IO模型

IO多路复用是同步的还是异步的?epoll(检测数据到达,数据的存取都是在原先进程操作), poll, select。

1、a.阻塞 blocking

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

2、b.非阻塞 non-blocking(NIO)(Java)

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

3、c.IO复用(IO multiplexing)

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

对于a,b两种IO模型,a模型阻塞,自然不讲。b模型不阻塞,读数据的时候,也会阻塞在哪里。就算读完了,也会有其他情况,阻塞在哪里,其他线程或者进程到达了,也读取不了,单线程和单进程每次就只能检测一个。

4、d.信号驱动(signal-driven)

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

信号驱动与io复用的区别:

        多路复用是内核们监听多个文件描述符,阻塞在监听的函数比如select, 拷贝数据也是阻塞的,多路复用只是防止进程在某个io阻塞后,不能及时处理其他io的事件。信号驱动则是先登记信号处理函数,当数据准备完毕后由内核发送信号给进程,让进程处理。信号驱动不阻塞在数据准备过程,但阻塞在数据拷贝,所以两者都是同步IO,

5、e.异步(asynchronous)

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

/* Asynchronous I/O control block. */
struct aiocb
{
int aio_fildes; /* File desriptor. */
int aio_lio_opcode; /* Operation to be performed. */
int aio_reqprio; /* Request priority offset. */
volatile void *aio_buf; /* Location of buffer. */
size_t aio_nbytes; /* Length of transfer. */
struct sigevent aio_sigevent; /* Signal number and value. */
/* Internal members. */
struct aiocb *__next_prio;
int __abs_prio;
int __policy;
int __error_code;
__ssize_t __return_value;
#ifndef __USE_FILE_OFFSET64
__off_t aio_offset; /* File offset. */
char __pad[sizeof (__off64_t) - sizeof (__off_t)];
#else
__off64_t aio_offset; /* File offset. */
#endif
char __glibc_reserved[32];
};
通常用户使用 Web 浏览器与相应服务器进行通信。在浏览器中键入“域名”或“IP地址:端口号”,浏览器则
先将你的域名解析成相应的 IP 地址或者直接根据你的IP地址向对应的 Web 服务器发送一个 HTTP 请
求。这一过程首先要通过 TCP 协议的三次握手建立与目标 Web 服务器的连接,然后 HTTP 协议生成针
对目标 Web 服务器的 HTTP 请求报文,通过 TCP、IP 等协议发送到目标 Web 服务器上。
4.

3、Web Server(网页服务器)

一个 Web Server 就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主 要功能是通过 HTTP 协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自 客户端的 HTTP 请求,并对其请求做出 HTTP 响应,返回给客户端其请求的内容(文件、网页等)或返 回一个 Error 信息。

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

4.HTTP协议(应用层的协议)

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

HTTP是万维网的数据通信的基础。

HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万 维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定 义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。

4.1 概述

HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览 器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们 称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如 HTML 文件和图 像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中 间层”,比如代理服务器、网关或者隧道(tunnel)。

尽管 TCP/IP 协议是互联网上最流行的应用,HTTP 协议中,并没有规定必须使用它或它支持的层。事实 上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP 假定其下层协议提供可靠的传输。因 此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在 TCP/IP 协议族使用 TCP 作为其传 输层。

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比 如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

4.2 工作原理

HTTP 协议定义 Web 客户端如何从 Web 服务器请求 Web 页面,以及服务器如何把 Web 页面传送给客 户端。HTTP 协议采用了请求/响应模型客户端向服务器发送一个请求报文,请求报文包含请求的方 法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版 本、成功或者错误代码、服务器信息、响应头部和响应数据。

研究http就是研究http报文的格式

以下是 HTTP 请求/响应的步骤:

        1. 客户端连接到 Web 服务器

        一个HTTP客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认为 80 )建立一个 TCP 套接 字连接。例如,http://www.baidu.com。(URL)

        2. 发送 HTTP 请求

        通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文由请求行、请求 头部、空行和请求数据 4 部分组成

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

        Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端读取。一个 响应由状态行、响应头部、空行和响应数据 4 部分组成。

        4. 释放连接 TCP 连接

        若 connection 模式为 close,则服务器主动关闭 TCP连接,客户端被动关闭连接,释放 TCP 连 接;若connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

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

        客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应 头告知以下为若干字节的 HTML 文档和文档的字符集。客户端浏览器读取响应数据 HTML,根据 HTML 的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
3. 浏览器发出读取文件( URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三
次握手的第三个报文的数据发送给服务器;
4. 服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
5. 释放 TCP 连接;
6. 浏览器将该 HTML 文本并显示内容。

 HTTP 协议是基于 TCP/IP 协议之上的应用层协议,基于 请求-响应 的模式。HTTP 协议规定,请求从客 户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端 在没有接收到请求之前不会发送响应。

4.3 HTTP 请求报文格式

5、服务器的基本框架

虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理。

 

         I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。
        一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并发处理。
        网络存储单元可以是数据库、缓存和文件,但不是必须的。请求队列是各单元之间的通信方式的抽象。I/O 处理单元接收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处理竞态条件。请求队列通常被实现为池的一部分。

6.两种高效的事件处理模式

服务器程序通常需要处理三类事件:I/O 事件、信号及定时事件。有两种高效的事件处理模式:Reactor 和 Proactor,同步 I/O 模型通常用于实现 Reactor 模式异步 I/O 模型通常用于实现 Proactor 模式

6.1 Reactor模型

要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作 线程(逻辑单元),将 socket 可读可写事件放入请求队列,交给工作线程(一般是子线程)处理。除此之外,主线程不做 任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

使用同步 I/O(以 epoll_wait 为例)实现的 Reactor 模式的工作流程是:

        1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
        2. 主线程调用 epoll_wait 等待 socket 上有数据可读。
        3. 当 socket 上有数据可读时, epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列。
        4. 睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求,然后往 epoll内核事件表中注册该 socket 上的写就绪事件。
        5. 当主线程调用 epoll_wait 等待 socket 可写。
        6. 当 socket 可写时,epoll_wait 通知主线程。主线程将 socket 可写事件放入请求队列。
        7. 睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户请求的结果。

 6.2 Proactor模式

Proactor 模式将所有 I/O 操作都交给主线程和内核来处理(进行读、写),工作线程仅仅负责业务逻 辑。使用异步 I/O 模型(以 aio_read 和 aio_write 为例)实现的 Proactor 模式的工作流程是:

1. 主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置, 以及读操作完成时如何通知应用程序(这里以信号为例)。

2. 主线程继续处理其他逻辑。

3. 当 socket 上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据 已经可用。

4. 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求 后,调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以 及写操作完成时如何通知应用程序。

5. 主线程继续处理其他逻辑。

6. 当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。

7. 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket。

 

7 线程池

线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和 CPU 数量差不多。线程池中的所 有子线程都运行着相同的代码。当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子 线程来为之服务。相比与动态的创建子线程,选择一个已经存在的子线程的代价显然要小得多。至于主 线程选择哪个子线程来为新任务服务,则有多种方式:

        1、主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算法和 Round Robin(轮流选取)算法,但更优秀、更智能的算法将使任务在各个工作线程中更均匀地分配,从而减轻服务器的整体压力。
       2、主线程和所有子线程通过一个共享的工作队列来同步,子线程都睡眠在该工作队列上。当有新的任务到来时,主线程将任务添加到工作队列中。这将唤醒正在等待任务的子线程,不过只有一个子线程将获得新任务的”接管权“,它可以从工作队列中取出任务并执行之,而其他子线程将继续睡眠在工作队列上。

同一时刻,有一万个客服端来了,就需要申请一万个线程池,线程数量太多,消耗的资源,来一个客户端,就需要创建一个线程,线程创建时间和线程消耗时间。解决这个问题,是通过线程池, 容器里面的线程是固定数量的,来一个客户端,就去池子里面去找一个空闲的线程去服务。

 

线程池中的线程数量最直接的限制因素是中央处理器(CPU)的处理器(processors/cores)的数量
N :如果你的CPU是4-cores的,对于CPU密集型的任务(如视频剪辑等消耗CPU计算资源的任务)来
说,那线程池中的线程数量最好也设置为4(或者+1防止其他因素造成的线程阻塞);对于IO密集
型的任务,一般要多于CPU的核数,因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一
般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导
致资源浪费。

        1、空间换时间,浪费服务器的硬件资源,换取运行效率。

        2、池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源。

         3、当服务器进入正式运行阶段,开始处理客户请求的时候,如果它需要相关的资源,可以直接从池中 获取,无需动态分配。

        4、当服务器处理完一个客户连接后,可以把相关的资源放回池中,无需执行系统调用释放资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 项目实战记录 的相关文章

  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • PyQt5 - 无法使用 QVideoWidget 播放视频

    from PyQt5 QtWidgets import from PyQt5 QtMultimedia import from PyQt5 QtMultimediaWidgets import from PyQt5 QtCore impor
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • Linux编程——交叉编译器基本指令介绍

    Linux编程 交叉编译器基本指令介绍 arm span class token operator span linux span class token operator span gnueabihf span class token o
  • 马尔可夫链蒙特卡洛采样(MCMC)

    首先我们要明确的是马尔可夫链蒙特卡洛采样以下简称MCMC xff0c 它首先是个采样方法 1 采样的目的 采样作为任务 xff0c 用于生成新的样本求和 求积分 比如我们知道样本z的后验分布 我们经常会有一个需求 xff0c 得到目标函数f
  • dlang语法的简单整理

    dlang整理 为什么使用dlang 优点 xff1a 快速 xff0c 开发高效的 xff0c 方便 xff0c 无虚拟机的 xff0c 快速的 xff0c 高性能的 垃圾回收 缺点 xff1a 语法较为复杂 xff0c 支持gc 曾经很
  • docker 搭建基于prometheus的监控体系

    Prometheus是一个时间序列数据库 但是 xff0c 它不仅仅是一个时间序列数据库 它涵盖了可以绑定的整个生态系统工具集及其功能 Prometheus主要用于对基础设施的监控 包括服务器 xff0c 数据库 xff0c VPS xff
  • React回退上个页面及跳转下个页面

    回退上个页面 React 不保存数据 span class token keyword this span span class token punctuation span props span class token punctuati
  • Linux上jar包运行,但是接口测试Connect超时

    工作过程中遇到的 xff0c 这个异常就是连接超时 引起连接超时的问题有很多 xff0c 因为是feign调用超时 xff0c 我第一时间没怀疑是不是我的程序无法访问 xff0c 我一直怀疑是feigin那部分出错了 xff0c 什么跨服务
  • 网络调试助手(pc端)+ESP8266指令

    一 所需软件 链接 xff1a https pan baidu com s 1ycyOSZJOsiIocY3umrG7 g 提取码 xff1a 38f2 链接 xff1a https pan baidu com s 1EUuXUKcvf A
  • AD、PADS、allegro 哪个好用?

    AD PADS allegro 哪个好用 xff1f 用哪个都没问题 xff0c 都能完成任务 xff0c 主要看公司的选择了 AD是元老级的软件了 xff0c 也是PCB设计最先出的软件 xff0c 使用最为广范 在很多操作上都非常的人性
  • 基于python+pyqt5的串口助手

    基于python 43 pyqt5的串口助手 环境 xff1a pycharm python3 8 xff0c pyqt5 xff0c pyserial xff08 需要该节的工程文件 请私信 xff0c 或加VX xff1a Crazzy
  • STM32F4四轴飞行器总结

    xff08 菜鸡一枚 xff0c 记录一些学习的体会 xff0c 并记录了学习时提出的问题 xff0c 便于自己再次查阅 xff0c 若有错误之处 xff0c 希望大佬们指正 xff0c 谢谢 xff09 四旋翼简介 xff1a 嵌入式芯片
  • 详解RTK,RTD,SBAS,WAAS,PPP,PPK,广域差分等技术之间的关系与区别

    RTK与RTD的区别 xff0c 一个是载波相位差分 一个是码差分 xff0c 并且RTK的定位精度要高一些 RTK与PPK的区别 xff0c 一个是实时提供数据信息 xff0c 一个是事后处理 WAAS是SBAS系统一个具体的实例 xff
  • c实现set集合

    集合有点编程语言会带有 xff0c 有的没有 但是我想redis的集合set你一定听说过或者用过 下面咱们用链表来实现set 相信有了前面的基础我们可以很容易的实现set集合 需要引入我的链表的list c和list h 头文件 span
  • 实时单目物体SLAM Real-time Monocular Object SLAM

    2015 摘要 xff1a 我们提出了一个基于对象的实时SLAM系统 xff0c 该系统利用了迄今为止最大的对象数据库 我们的方法包括两个主要部分 xff1a 1 xff09 利用对象刚性约束改进地图并找到其真实比例的单目SLAM算法 xf
  • linux下多线程服务器编程

    前言 xff1a 整个程序的架构就是一开始创建一个线程 xff0c 在这个线程里面做下面几个操作 xff1a 1 调用socket xff0c 创建监听客户端的socket 2 设置socket属性 xff0c 端口可以重用 3 调用bin
  • MavLink简单使用

    参考连接 xff1a https mavlink io zh 整体说明 本文不探究mavlink协议的具体内容 xff0c 只说明如何简单使用 环境 xff1a win10 c c 43 43 MAVLink仓库clone 我们其实clon
  • gazebo支持的载具类型

    类型make指令四旋翼make px4 sitl gazebo具有光流的四旋翼make px4 sitl gazebo iris opt flow3DR Solo xff08 四旋翼 xff09 make px4 sitl gazebo s
  • YoLov3目标检测代码C++版本运行

    论文地址 xff1a YOLO YOLOv2 YOLO9000 YOLOv3 YOLOv4 YOLO系列权重 配置文件下载地址 xff1a https github com AlexeyAB darknet 代码解读 xff1a Deep
  • C++ ::

    表示作用域 xff0c 和所属关系 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c
  • 下载Gazebo模型

    下载Gazebo模型 这时运行下面Gazebo命令 xff0c OK xff0c 错误没有了 xff0c 但怎么是一抹黑啊 xff01 roscore amp rosrun gazebo ros gazebo 首次运行Gazebo xff0
  • Linux 项目实战记录

    1 阻塞 非阻塞 同步 异步 网络IO 典型的一次IO的两个阶段是什么 xff1f 数据就绪和数据读写 数据就绪 xff1a 根据IO操作的就绪状态 阻塞 xff1a 1 调用IO方法的线程进入阻塞状态 xff0c xff08 函数进入wa