- 博客(23)
- 收藏
- 关注
原创 2.3.1(项目)kv存储——框架梳理(待定)
(1)底层网络框架;(2)业务层的协议设计(发什么数据,以及收什么数据);(3)业务层的引擎设计;目的:通过定义函数建立网络层和业务层的联系,并从原有已以网络框架为主改造后以业务框架为main函数,确保此后网络层隔离和透明(以reactor.c为例)。要求:reactor.c(手写)、ntyco协程(看懂)、io_uring(看懂)。做法:用做reactor的做法来做kvstore的网络框架核心:是设置自定义的结构体,明确什么事件执行什么回调函数。while(1){}循环里,(a)EPOLLIN事件执行re
2025-01-18 23:51:34
1916
1
原创 1.1.1 C语言常用的一些函数(持续更新)
如果需要获取错误描述并在代码中使用,而不是直接打印,可以使用strerror(errno)。读取系统定义的全局变量errno,然后通过查找对应的错误码输出一个与其相关联的错误消息。创建的新进程,它是父进程的一个副本,几乎所有的数据(变量、文件描述符等)都会被复制。是C标准库中的一个函数,用于比较两个字符串的大小(基于字典序)。(b)分配tcp控制块(tcb)connect客户端发送连接请求。把fd和ip绑定到tcp控制块。从内核copy数据到用户空间。从用户空间copy数据到内核。
2025-01-15 14:38:52
1031
原创 2.1.8 epoll的实现原理
答:epoll可以通过单线程模式实现用户态的协议栈。答:每一帧数据从网卡接收完,到达应用程序需要2次的数据迁移,第一次是从网卡copy协议栈,第二次是从协议栈copy到应用程序。如果把协议栈做到用户空间(范围包括原本的协议栈部分和应用程序部分),这样数据只需要从网卡copy到用户空间就可以了,,因此用户态的协议栈实现高性能网络,比如C10M的实现(C10M 是 "Concurrency 10 Million"(并发 1000 万)的缩写,通常用来描述一个系统或应用程序的并发连接能力。通过户态的协议栈)。
2025-01-05 22:53:21
392
原创 1.2.1-2部分数据结构的说明02_链表
int data;} Node;//(1) 创建指针Node* A;A = NULL;//(2) 构建第1个节点,并写入数据和地址//(3)把新节点的地址写入之前的尾节点(也就是说,新节点的名称就是之前尾节点写入的link)A = temp;//(4)遍历节点地址后,插入新节点= NULL){ //用最后一个节点地址为空,作为判断//(5)创建新节点,并在新节点内写入数据//(6)把新节点的地址写入之前的尾节点截图参考来自,很好的视频。
2025-01-05 13:13:56
477
原创 1.5-1 linux的部分基础命令01
(2)查看linux检查系统版本:lsb_release -a。(1)查看当前linux内核版本:uname -r。
2025-01-04 09:45:13
164
原创 2.1.7-1 io_uring的使用
(3)TCP和UDP的区别?答:我们有5点:第1个TCP基于连接的,UDP是基于数据报的。第2点在分包和粘包的解决方案上是不一样的。TCP可以通过2种方式,1种方式是通过在TCP数据包的前面加上一个长度,另一种可以做分隔符。而UDF必须为每个包加上一个id值。第3点在并发的方式上面也是不一样的,TCP可以直接通过epoll直接管理io就可以,而对于UDP我们需要通过模拟TCP的方式建立连接。第4点在使用场景上面,UDF是做实时性比较强的方面,比如实时对战的游戏。
2025-01-04 09:37:41
761
原创 2.1.6-4 用DPDK实现TCP协议栈并发
事件调用的什么,有个叫回调函数,这个回调函数是个通知。注意,整个epoll函数,3+1一共4个函数,3个对外接口,1个对内接口。答:两个结构体(1个描述整集/整体(eventpoll)和1个表述节点/元素(epitem))、两个数据结构(红黑树(整集)和队列(就绪))。”(非内核)的实现流程,包括epll_create()、epill_ctl()和epoll_wait()这3个函数的实现。(2)epll_create()、epill_ctl()和epoll_wait()这3个接口分别实现什么?
2025-01-04 09:30:50
320
原创 2.1.6-3 DPDK实现TCP的三次握手的代码说明
(1)为什么TCP不像UDP一样,TCP内部参数里不用写长度?答:当前包的seqnum减去上一个包seqnum就知道上个包的总长度。而acknum的id值表示确认接收的数据,不变就表示没接收。windows size的id值表示对方还能接收多少,如果超过就不接收了。(2)接收方怎么保证TCP数据的接收顺序?答:延迟确认,即接收方接收一部分数据后,等待一段时间(TCP默认是200 ms)为再发送确认信息。
2025-01-04 09:25:01
294
原创 0. 总框架
(1)网络的代码怎么写:管理io的io多路复用(select/poll/epoll),多线程多进程结合业务怎么做,阻塞/非阻塞,同步/异步,来了数据后的业务如何做→量化指标:实现网络框架(你的设计理念,你的做法,你的适配业务,把性能参数调节好,很有必要)(4)linux的命令:makefile/cmake,git/svn,看内存,看网络状态(netstat),看磁盘,比如(htop,top),tcp抓包(tcpdump),测试(iperf)针对于(a)磁盘(b)网络(c)内存。
2025-01-04 09:00:34
444
原创 2.1.5-2 协程设计原理与汇编实现-02
答:(1)需要fd,(2)协程本身的"ctx[xx]",(3)协程的入口函数,对应create_coroutine(co_id id, void *(*entry)(void *))的第2个参数,(4)需要传到协程里的参数。考虑下面这个协程如何实现,会对协程的结构体有深入的认识。b)协程不是单一的,可能有很多个。比如我们有10万个fd的时候,对应10万个coroutine。答:ntyco/sample里有“nty_server.c”文件可测并发。b)需定义:epoll、之前协程定义的3个数据结构。
2024-12-23 12:51:37
297
原创 20241218_reactor简化第1版
(8)recv()和send()类似都是4个参数,recv(fd, buffer(自定义要装数据的数组), 1024(数组大小), 0(flag用于后续筛选)),send(fd, buffer(自定义要装数据的数组), count(数据大小), 0(flag用于后续筛选))当EPOLLOUT选择send()。(6)socket(AF_INET(IPV4), SOCK_STREAT(TCP), 0(指定协议))网络TCP连接还需要socket(),bind(),accept(),recv()和send()。
2024-12-18 16:12:21
843
原创 20241217_epoll
(1)epoll有1个结构体 epoll_event 和3个函数 epoll_create, epoll_ctl和epoll_wait网络TCP连接还需要socket(),bind(),accept(),recv()和send()。(2)epoll_event经常用的参数events和data.fd(3)epoll_create(任意整数)(5)epoll_wait(epfd, 口袋,sizeof(口袋), -1一直阻塞)
2024-12-17 17:15:28
482
原创 晨读_20241217
而 memcpy 可以确保 rbuffer 和 wbuffer 互相独立,rbuffer 存储了收到的数据,而 wbuffer 则是准备发送的缓存区。这种设计符合 回调机制 的思想。就是说EPOLLIN和EPOLLOUT都是内核自己已经判断好的,而EPOLL_CTL_MOD会更新内核的这个判断,而再往后才是epoll_wait提取这个结果。b)一个函数 A 中定义的参数,只能在函数 A 内部使用,如果你希望将这个参数传递给函数 B,需要显式地将其作为参数传递给函数 B,比如。b)是参数在不同函数间的传递。
2024-12-17 15:40:05
150
原创 2.1.3-3 第二次Reactor代码(百万并发测试过程的报错信息)
做服务器性能测试的时候,并发量时迟(延迟,每个请求多长时间返回)、测试用例(业务代码,发什么数据和回什么数据)这四组都是重要的参数。并发 → 网络io的并发,是服务端最基础的技能。备注:研发和运营的数据不相同。
2024-12-15 13:51:11
1813
原创 2.1.6-1 dpdk的环境设置
(1)本大章主要包括4方面:a)网卡;b)网卡驱动;c)协议栈(以太网、ip协议解析、udp解析、tcp解析);
2024-12-02 22:19:05
2176
原创 2.1.5-1 协程设计原理与汇编实现(recv从同步改成异步)-01
(1)协程也个框架,可以参照“ntyco”仿写一遍前面已经有“进程”和“线程”的概念,为什么还要“有协程”?协程实现的过程,有哪些原语操作(原语操作是基本的、不可分割的,比如把大象放进冰箱的步骤有打开open冰箱门push放进去close关闭冰箱门)?当我们要实现协程的时候,需要定义哪些东西?包括struct coroutine;调度器(用来管理多个协程的)如何定义?包括struct scheduler;定义完调度器后,在执行过程中的执行策略?在应用程序调用协程的时候,怎么和posix api做到一致。
2024-12-01 17:49:20
840
原创 2.1.4 posix api
(1)我们写api的时候有哪些客户端和服务器?以下是网络开发写代码能用到的api对于服务器posix api也称系统调用,包括(socket返回的是fd)、(绑定一个特定的接口)、(绑定完之后进行)、(listen完当有3次握手当有客户端连接进来之后,用来创建一个客户端fd)、和客户端包括(但是是optional)、(在udp里的作用是)、(连接成功返回后可发数据给server端)、(发送完以后是接收数据)、另外还有。
2024-11-30 15:30:33
513
原创 2.1.3-2 webserver和websocket(reactor 怎么用)
(1)本节目的是通过webserver和websocket理解reactor的好处。(2)reactor使网络和业务两者相隔离,两者通过request和response两个函数相联系。(3)reactor里有哪些函数?
2024-11-29 22:04:21
502
原创 2.1.3-1 第一次Reactor代码(流程梳理)
(2)这个主循环里面获取每个io的事件。主循环作为一个server进行7*24小时的运行,当某个io有事件的时候执行对应的回调函数。if如果事件可读就执行recv回调函数(callback),如果可写就执行send回调函数。(4)reactor特点: 不同io事件做不同的action;io做到独立封装,比如读缓冲区、写缓冲区、读长度、写长度、对应的回调函数都需要准备好。(3)每个函数和结构的含义说明(
2024-11-29 14:48:48
269
原创 2.1.2 网络io多路复用
(1)fd_set是什么?是个比特集合,用来表示一组描述符fd,与文件描述符fd是映射关系,而且映射关系是由操作系统内部定义,无法人为自定义。默认定义了1024比特,对应就可以是1024个fd,df_set的大小通过重新编译可以更改。(2)select()是个函数,也是系统调用。每次系统调用带3个集合(包括可读、可写、出错),也就是每次调用都需要把fd的集合复制到内核里面,然后再循环判断fd(maxfd就是循环)。
2024-11-28 20:56:36
410
原创 2.1.1 网络io
(1)在客户端和服务器之间通信,建立连接、收发数据,网络io是指连接两者通信的管道,但不包括传输的内容。(2)“服务器server”就像在酒店,酒店大堂经理带你去大堂,然后给你安排一个具体接待的人(也就是会见到2个人,一个大堂经理sockfd和一个具体接待的人fd)(3)流程是:客户端首先碰到酒店大堂经理(也就是sockdf),酒店大堂经理经过listen()函数已经准备好接待客人,通过accept函数找到具体接待的人(根据客户端生成的新的fd),并通过这个新的fd接收客户端发送的信息。
2024-11-28 10:47:01
489
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人