- 博客(26)
- 收藏
- 关注
原创 时间轮定时器实现
1 定时器应用场景a. 批量处理定时任务b. 心跳检测c. 和网络事件一起使用2 时间轮2.1 什么是时间轮时间是一种调度模型, 为高效解决调度任务而产生的2.2 为什么要用时间轮在讨论为什么定时器要用时间轮之前, 我们先了解一下几种其他实现方式的调度器a. 有序队列添加/删除任务: 遍历每一个节点, 找到相应的位置插入, 因此时间复杂度为O(n)处理到期任务: 取出最小定时任务为首节点, 因此时间复杂度为O(1)b. 红黑树有序队列的性能瓶颈在于插入任务和删除任务(
2021-07-31 16:12:44
1749
原创 TCP/IP协议深度解析
TCP如何有序性的ARPTCP的拥塞控制TCP的半连接队列与全连接队列TCP粘包与分包网线断了, TCP怎么处理TCP的长连接与短连接TCP的11个状态迁移send返回正数, 是不是成功?阻塞与非阻塞, send/recv, -1如何取到一帧完整的数据包raw socketnetmapdpdk1 网络协议栈1.1 OSI模型物理层: 传输的光电信号数据链路层: 数字信号网卡: 将数字信号转换为光电信号(AD/DA), 因此不属于协议栈的那一层1.2 协议栈是什.
2021-05-15 23:27:52
515
13
原创 KMP字符串匹配算法
引入在字符串匹配时, 如果运用暴力匹配法:text: abababcpattern: ababc暴力匹配法:1.abababcababc2.abababc a 3.abababc ababc而这种匹配的效率并不高, 我们通常更希望的做法是:1.abababcababc2.abababc ababc而如果想像上面那样直接+2去匹配的方式,则可以运用kmp的算法kmp算法原理首先我们得解决一个问题, 就是每次匹配不成功的话, 应该要跳
2021-01-20 22:47:36
464
2
原创 线程池的实现(自动扩容与删减)
在高并发场景、IO密集型时我们往往需要创建多线成去执行相应的任务,但往往频繁地去创建和销毁线程会影响整个系统的性能,因此提前创建好线程池,当有任务时,直接丢进线程池里去执行就可以了,而不用再另外创建线程线程池的实现主要实现思想:首先统一创建多条线程,并等待任务的到来(pthread_cond_wait);当有任务加进任务队列里,便唤醒一条等待的线程(pthread_cond_signal);被唤醒的线程从任务队列里取出一个任务,并执行相应的任务(回调)工作组件(消费者):维护线程队列,执行相应的
2021-01-11 21:35:42
1384
原创 网络IO的阻塞/非阻塞与同步/异步
在学习网络IO的时候总是被阻塞/非阻塞, 同步/异步搞得团团转, 本文是自己对这部分的一些学习心得IO模型小明去打水杯子:用户空间水:数据饮水机:内核空间阻塞/非阻塞IO小明拿杯子去打水, 饮水机内不一定有水, 当饮水机没水他就在原地等待, 直到饮水机有水, 阻塞IO他就先离开, 等一会儿再来看看饮水机有没有水, 非阻塞IOrecv时可设置成阻塞和非阻塞阻塞时, 会一直等待, 直到有数据了才往下执行非阻塞时, 当没有数据时, 便会直接返回, 往下执行IO复用小明厌倦了总是
2020-12-31 14:32:48
243
原创 关于运行VMware等虚拟机导致win10蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)
关于运行VMware等虚拟机导致win10蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)之前可以正常打开虚拟机的,但今天突然运行虚拟机系统时就死机了,通过重装软件,恢复系统备份等方式都无效,最后查出来是因为更新了Windows的相关补丁导致的,Hyper-V被默认开启以下方法同样适用于win10家庭中文版升级高版本的VMware16似乎能解决该冲突的问题win10家庭中文版因为在(控制面板–>程序–>程序和功能–>启用或关闭windows功能)中没有 H
2020-12-28 00:11:29
38619
37
原创 B-树学习笔记
1 性质1. 每个结点至多拥有M课子树2. 根结点至少拥有两颗子树3. 除了根结点以外,其余每个分支结点至少拥有M/2课子树4. 所有的叶结点都在同一层上5. 有k课子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排序6. 关键字数量满足ceil(M/2)-1 <= n <= M-12 插入先裂变再添加叶子结点不满(小于m-1),直接插入如果结点满了(等于m-1),对该结点先进行裂变,这样叶子结点就为不满状态,这时在插入裂变x分裂的父结点,y要分裂的结
2020-12-19 22:49:41
188
2
原创 reactor 模型
reactor 模型主要框架:当有事件发生时,调用对应的回调函数(数据接受/发送,处理);reactor 会一直跑 run,即一直处在 epoll_wait 中等待事件的到来;当有事件到来,会调用相应事件的回调函数(之前的事件注册);以下例子利用reactor模型实现接受客户端消息,并将消息发回给客户端:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <s
2020-11-28 00:03:11
409
1
原创 搞懂红黑树及其应用场景
红黑树1 性质1. 每个结点是红的或黑的2. 根结点是黑的3. 每个叶子结点是黑色的4. 如果一个结点是红的,则它的两个儿子都是黑的(不能有连续两个红色结点)5. 对每个结点,从该节点到其子孙结点的所有路径上的包含相同数目的黑结点2 插入插入结点时默认是插入的红色结点,因为只有插入红色结点,在没调整的情况下,才能保证性质 5(所有路径包含相同数目的黑结点)因为插入的结点为红色,因此如果父结点也为红色,则需要调整调整方法1). 插入结点为根结点 --> 变色2). 插入结点的
2020-11-27 23:56:24
5351
原创 二叉树学习笔记
二叉树插入插入值 < 结点值,插入结点的左子树插入值 > 结点值,插入结点的又子树不插入相同的值遍历1 前序遍历根结点 -> 左子树 -> 右子树2 中序遍历左子树 -> 根结点 -> 右子树3 后序遍历左子树 -> 右子树 -> 根结点删除结点1 删除的结点没有左右子树直接删除该结点 if (del_node->entry.left == NULL && del_node-&g
2020-11-27 23:43:12
328
原创 Linux下TCP服务器学习笔记
流程(模型)1.定义套接字:intint sfd; // 监听套接字int cfd; // 传输套接字2.创建tcp协议套接字:socket();int socket(int domain, int type, int protocol);domain: 通信域[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOzCZetu-1604814834270)(en-resource://database/1190:1)]type: 类型[外链
2020-11-08 14:06:03
335
2
原创 快速排序-quick sort
#include <stdio.h>void sort(int *data, int left, int right){ int i, j, key; i = left; j = right; key = data[left]; if (right <= left) return; while (i != j) { while (i < j && key <= data[j]) { j--; } data[i
2020-11-03 23:41:23
167
原创 归并排序-gerge sort
#include <stdio.h>#include <stdlib.h>void sort(int *data, int *temp, int start, int middle, int end){ int i, j, k; if (end <= start) return; i = start; j = middle + 1; k = start; while (i <= middle && j <= end)
2020-11-03 23:23:16
176
原创 希尔排序-shell sort
希尔排序算法思想: 分组int data[] = {56, 34, 54, 50, 81, 70, 7, 74, 26, 65, 71, 4, 37, 76, 91, 36};第一个循环(分组):初始值 gap = length / 2, 即 gap = 16 / 2 = 8, 先分为8组进行(目的组内排序)gap = gap / 2, 直到 gap < 0 结束, 即 gap = 8 --> 4 --> 2 --> 1 --> 0第二个循环(遍历每个
2020-11-02 19:46:13
187
原创 杂项设备:注册设备->注册驱动->生成节点
杂项设备 注册设备 –> 注册驱动 –> 生成设备节点1、注册设备目的:注册完后可在虚拟平台总线下可以查到注册的设备(ls /sys/devices/platform/)结构体文件:include/linux/platform_device.h使用结构体 platform_device struct platform_device { const char
2018-01-07 16:09:14
1430
原创 linux下udp学习笔记
1.定义套接字:int int sockfd;2.创建udp套接字:socket(); sockfd = socket(AF_INET, SOCK_DGRAM, 0);3.绑定端口:bind(); // 定义 struct sockaddr_in server; // 赋值 bzero(&server, sizeof(server
2017-09-26 17:18:35
682
原创 linux下编写tcp客户端学习笔记
1.定义套接字:int int sockfd; // 通信套接字2.创建tcp服务套接字:socket(); sockfd = socket(AF_INET, SOCK_STREAM, 0);3.连接指定服务器:connect(); // 设置端口和IP struct sockaddr_in servaddr; bzero(&servaddr
2017-09-25 17:23:38
385
原创 linux下编写tcp服务器学习笔记
1.定义套接字:int int listenfd; // 监听套接字 int sockfd; // 传输套接字2.创建tcp协议套接字:socket(); listen = socket(AF_INET, SOCK_STREAM, 0);3.绑定服务器IP和端口:bind(); // 定义 struct sockaddr_in sockva
2017-09-25 16:40:17
367
翻译 6.按键操作
1.创建事件:SDL_Event SDL_Event event;2.检测有无事件需要处理:SDL_PollEvent(); SDL_PollEvent( &event );3.检测按键是否被按下:SDL_KEYDOWN if(event.type == SDL_KEYDOWN)4.检测按下的按键类型:event.key.keysym.sym
2017-09-23 22:37:48
376
翻译 5.true_type字体
*需要拓展库SDL_ttf1.表面 SDL_Surface *message = NULL;2.将用到的字体:TTF_Font TTF_Font *font = NULL;3.字体颜色:SDL_Color SDL_Color textColor = {255, 255, 255};4.打开字体:TTF_OpenFont(); //
2017-09-23 22:37:10
574
翻译 4.精灵图
*精灵图是一系列保存在同一个图像文件中的图像。当你有数量庞大的图像,但不想处理那么多的图像文件时,精灵图就派上用场了。1.SDL_BlitSurface();2.SDL_Rect
2017-09-23 22:36:33
246
翻译 3.关键色
现在你将学会如何处理关键色。用口语解释就是:如何在应用表面时除去背景色。1.映射关键色:SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b); // SDL_Surface-->SDL_PixelFormatUint32 colorkey = SDL_MapRGB(optimizedImage-
2017-09-23 22:35:48
339
翻译 2.优化表面的加载
*目前基本所有图形化的操作系统默认都采用32位色(即“真彩色“)显示整个视窗系统,即每一像素用32位表示,其中分别是红色、绿色、蓝色和Alpha混合(即RGBA),各占8位。*如果这个位图是24位色的,而窗口是32位色的,将一个表面blit到另一个不同格式的表面上不是一个好主意,因为这样SDL会在每次blit时做一次临时性的格式转换,这会导致程序的运行效率降低。
2017-09-23 22:33:26
272
翻译 1.加载图片
1.创建表面:SDL_Surface SDL_Surface *background = NULL; // 即将加载并显示的图片 SDL_Surface *screen = NULL; // 屏幕上可见的窗口(画布)2.设置窗口:SDL_SetVideoMode(); screen = SDL_SetVideoMode(640, 480, 32, SDL_SWS
2017-09-23 22:21:46
345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人