
c/c++linux后台开发
文章平均质量分 61
jsc723
这个作者很懒,什么都没留下…
展开
-
ubuntu16修改ip地址
How to set static IP Address in Ubuntu Server 16.04It is really important to know how to configure static IP Address on Ubuntu Server, Because it is almost impossible to run a server without a static IP Address.During the installation, Ubuntu Server by d转载 2022-04-07 14:30:06 · 1014 阅读 · 0 评论 -
3.2.5 c/c++内存泄漏检测
方案1因为malloc是weak symbol,用户可以直接定义一个自己的版本覆盖glibc的采用__libc_malloc和__libc_free这两个别名调用原先的版本用__builtin_return_address得到调用mallloc的地址(注意这个函数只有参数为0时可以保证不seg fault)在每次malloc时以分配的地址为名生成一个文件free时再删除用addr2line -f -e memleak -a 0x4006f7得到具体的行号(编译时需要加-g)方案2使用宏原创 2021-12-25 09:23:25 · 145 阅读 · 0 评论 -
c/c++linux后台开发学习笔记 3.2.4 死锁
死锁存在的条件如果在一个系统中以下四个条件同时成立,那么就能引起死锁:互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程可使用。如果另一进程申请该资源,那么申请进程应等到该资源释放为止。占有并等待:—个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。非抢占:资源不能被抢占,即资源只能被进程在完成任务后自愿释放。循环等待:有一组等待进程 {P0,P1,…,Pn},P0 等待的资源为 P1 占有,P1 等待的资源为 P2 占有,……,Pn-1 等待的资源为 Pn 占有,P原创 2021-12-25 07:59:48 · 813 阅读 · 0 评论 -
c/c++ linux后台开发学习笔记 3.2.3 定时器
定时器应用心跳检测技能冷却倒计时定时任务超时机制概述服务器定时器两种实现:网络时间和事件时间在一个线程中处理epoll_wait时timeout设成最近一个定时器的时间网络时间和事件时间在不同线程中处理多开一个线程专门处理定时任务,没任务时调用sleep接口设计// 初始化定时器void init_timer();// 添加定时器Node* add_timer(int expire, callback cb);// 删除定时器bool del_time原创 2021-12-25 07:27:33 · 337 阅读 · 0 评论 -
c/c++ linux后台开发 3.2.2无锁队列
无锁队列使用场景至少每秒十几万读写才考虑使用,否则没有意义循环数组无锁队列实现这个队列结构简单,有大小上限,可以适用于多写多读的情况接口bool enqueue(const ELEM_T &a_data); // ⼊队列 bool dequeue(ELEM_T &a_data); // 出队列 bool try_dequeue(ELEM_T &a_data); // 尝试⼊队列成员ELEM_T m_thequeue[Q_SIZE]; volatile QUEUE原创 2021-12-19 13:21:06 · 1811 阅读 · 0 评论 -
c/c++linux后台开发3.2.1锁、原子操作CAS、try/catch、线程私有空间
头文件总之缺什么就包含一下吧#include <stdio.h>#include <string.h>#include <stdlib.h>#define __USE_GNU#include <sched.h>#include <unistd.h>#include <pthread.h>#include <setjmp.h>#include <sys/syscall.h>锁//适原创 2021-12-19 06:07:55 · 412 阅读 · 0 评论 -
c/c++linux 后台开发 3.1.4 mysql连接池的实现
为什么要连接池如果没次连接数据库都开一个新的连接,则需要没次都1)tcp三次握手,四次挥手。而且内核创建TCB也有资源消耗2)应用层用户验证、关闭连接连接池和长连接的区别长链接是每个线程一个连接,只是连接不断开连接池是线程需要访问了采取获取一个连接,用完之后归还,耦合度更低连接池设计代码很简单,空闲的连接一个链表,使用的连接可以放在一个树里(方便查询)mysql重连机制设置启用(当发现连接断开时的)自动重连my_bool reconnect = true;mysql_option原创 2021-12-19 05:19:59 · 247 阅读 · 0 评论 -
c/c++ linux后台开发学习笔记 3.1.3 异步请求池的原理与实现
同步请求while(...) { msg = prepare_msg(...); send(msg, ip); res = recv(...); process_res(res);}很明显,这样做效率低异步请求func callback(res) { process_res(res);}while(...) { msg = prepare_msg(...); send_async(msg, ip, callback);}这样就能发送异步请求,在请求返回时通过回调函数处理请原创 2021-12-16 10:12:40 · 1868 阅读 · 0 评论 -
c/c++linux后台开发学习笔记 3.1.2 内存池原理与实现
内存池的作用减少内存碎片,使服务器能长时间运行而不出现内存不够的情况内存池使用场景1)一个连接一个内存池,连接存在时内存池只分配内存,不释放内存。连接断开时把整个内存池释放。(如果我们手写内存池,只推荐这种场景)2)一个进程一个内存池,进程退出时才释放。这种情况不推荐手写,推荐使用谷歌的tcmalloc内存池原理内存分大块和小块,内存池先分配大块(node),再在大块中分配小块。内存池的一些状态本身也保存在大块之中。如果要分配的内存本来就是大块(large),则另行分配,全都存在一个链表中,内原创 2021-12-15 05:49:17 · 1369 阅读 · 0 评论 -
c/c++后台开发学习笔记 3.1.1线程池
线程池的使用场景减少线程创建于销毁的开销异步解耦线程池的组成任务任务队列线程执行队列(线程队列,即所有线程)定义//封装一个线程struct worker { pthread_t id; int terminate_flag; struct worker *prev; struct worker *next;};//相当于c++ std::packaged_taskstruct job { void (*job_func)(void *arg); void *fu原创 2021-12-09 04:27:02 · 140 阅读 · 0 评论 -
c/c++后台开发学习笔记 1.1.3 海量数据去重的Hash,BloomFilter,bitmap
背景判断单词拼写是否正确判断垃圾邮件url去重缓存穿透问题(访问不存在的元素会穿透redis缓存而始终访问mysql,造成mysql压力过大)需求海量数据中查询某个字符串是否存在平衡二叉树红黑树、AVL,b/b+树, 跳表时间复杂度是O(log2(n))10亿节点最多比较30次散列表(哈希表)根据key计算在表中存储的位置hash函数Hash(key)–>addr; 两个key被隐射到一个地址称为冲突负载因子:数据储存元素个数/数据长度 (越小冲突越小)冲突处理原创 2021-12-06 07:36:23 · 1007 阅读 · 0 评论 -
c/c++后台开发学习笔记POSIX API与网络协议栈
网络编程常用接口int socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);int listen(int sockfd, int backlog);int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen);int con原创 2021-12-06 05:41:14 · 264 阅读 · 0 评论 -
c/c++linux后台开发学习笔记 2.2.2 reactor在网络组件中的应用
网络编程关注的问题连接的建立分为两种:服务端处理接收客户端的连接,服务端作为客户端连接第三方服务;int clientfd = accept(listenfd, addr, sz);int connectfd = socket(AF_INET, SOCK_STREAM, 0); connect(connectfd, (struct sockaddr *)&addr, sizeof(addr));连接的断开分为两种:主动断开和被动断开;// 主动关闭 close(fd); sh原创 2021-11-28 05:12:22 · 1313 阅读 · 0 评论 -
c/c++ 后台开发学习笔记 2.1.4 websocket协议与服务器实现
websocket 协议websocket是对tcp的简单封装,没有http那么长的文件头,提高了数据传输的效率。多用于服务器主动与客户端通信websocket有三个状态handshake --回应握手请求-> transmission --接受到FIN-> closedwebsocket包格式官方文档 0 1 2 3 0 1 2 3 4 5 6 7 8原创 2021-11-26 09:45:46 · 427 阅读 · 0 评论 -
c/c++后台开发学习笔记 2.1.3 http服务器实现
接上一节2.1.2http在ntyevent结构体中增加http相关变量,用于recv和send之间的数据传递struct ntyevent { int fd; int events; void *arg; int (*callback)(int fd, int events, void *arg); int status; char buffer[BUFFER_LENGTH]; int length; long last_active; // http param int原创 2021-11-26 09:21:08 · 398 阅读 · 0 评论 -
c/c++后台开发学习笔记 2.1.2 reactor原理与实现,实现百万级并发
reactor把epoll返回的fd读写事件进行封装,并为每种事件设置回调函数,把所有关注的fd以及对应的事件存储在一个数据结构里,与epoll内部的红黑树的节点形成一一对应的关系。epoll返回时使用data.ptr得到我们数据结构中对应的entry,再进行处理对fd的封装如下typedef int (*NCALLBACK)(int fd, int events, void *arg);struct ntyevent { int fd; int events;原创 2021-11-26 07:11:08 · 795 阅读 · 0 评论 -
c/c++后台开发学习笔记 2.1.1 网络io与select,poll,epoll
五种IO模型阻塞IO非阻塞IO在系统未准备好时立即返回需要轮询在从内核读取数据到用户空间(或写入内核)时任然会阻塞fcntl(fd, F_SETFL, O_NONBLOCK)多路复用IOselect,poll,epoll事件驱动异步IO告诉系统要IO,系统完成IO后通过信号告诉用户在数据IO的期间是非阻塞的信号驱动IO用sigaction注册SIGIO的回调函数在等待数据到达的期间是非阻塞的数据就绪时,系统用SIGIO通知用户,触发回调函数回调函数调用原创 2021-11-24 04:40:47 · 154 阅读 · 0 评论 -
c/c++linux后台开发学习笔记 1.1.2 b树/b+树
b/b+树的特点有序平衡(到任意叶子节点的距离相等)高度低,减少磁盘IO,B+用于数据库存储,B树只用于学术研究b树与b+树的区别b树在中间节点和叶子节点上都存储数据b+树只在叶子节点上存数据,并且将叶子节点连起来形成链表,方便范围查询b树定义一个t阶b树,每个节点(除了根节点)至少有t-1个key,最多有2t-1个可以,子节点的个数是key数+1根节点至少有一个keyb树插入总是从叶子插入,增高是因为叶子分裂def btree_insert(root, k): if原创 2021-11-23 05:32:28 · 255 阅读 · 0 评论 -
c/c++Linux后台开发课程笔记 - 1.1.1红黑树
红黑树的应用场景进程调度cfsepollnginx timerstd::map红黑树的性质节点是红色或者黑色根节点是黑色叶节点(NIL)是黑色红色节点的子节点只能是黑色从根节点到任意叶节点的路径的黑色节点数(黑高)相等红黑树定义typedef int KEY_TYPE;typedef struct _rbtree_node { unsigned char color; struct _rbtree_node *left; struct _rbtree_node *r原创 2021-11-22 09:25:17 · 116 阅读 · 0 评论