
零声教育上课笔记
文章平均质量分 54
我要这脸有何用
今天的不开心就让他过去吧,这样每天都能开开心心.
展开
-
异步请求池
请求组件:1. 线程池2. 协程3. 异步请求池请求第三方服务:以mysql为例:客户端send请求给业务服务器,业务服务器收到后进行解析,解析后调用mysql_query(sql)执行sql语句请求mysql服务器返回数据,这个请求mysql服务器请求时间很长,要等mysql服务器数据的返回才继续往下执行,否则就是阻塞状态。在单线程里面如果发多个请求,这些请求就是串行的,会很慢。异步请求:每次发完请求后不等待结果的返回,直接去干其他的事情,用一个线程去专门接收mysql数据库的返回。这样就实现原创 2022-03-28 16:02:27 · 995 阅读 · 0 评论 -
Reactor框架(事件驱动式框架)代码总结
1. 三个struct结构体1. 事件结构体,每个fd对应一个eventstruct ntyevent { int fd; //每个event对应一个fd int events; void *arg; int (*callback)(int fd, int events, void *arg); //回调函数 int status; char buffer[BUFFER_LENGTH]...原创 2022-03-27 21:13:29 · 1540 阅读 · 0 评论 -
五种IO模型
在调用read函数的时候要经过两个阶段:1. 等待数据阶段:没有数据→数据就绪2. 数据拷贝阶段:将数据从内核拷贝到用户态(read),或者从用户态拷贝到内核态(write),这个阶段数据拷贝→拷贝完成。阻塞IO在这种情况下调用read的时候,如果数据还没有准备好,那就会被阻塞,等到准备好并拷贝完返回结果才解除阻塞状态,所以他会在两个阶段都阻塞。系统调用一般都是阻塞型的,只有当结果返回的时候才会解除阻塞状态。非阻塞IO可以设置socket来让其变成非阻塞IO(fcnt...原创 2022-03-26 21:30:59 · 529 阅读 · 0 评论 -
log4cpp
fwrite -> 用户态缓冲区 -> write ->内核 write -> 内核当每次写入的数据较小(小于1024)的时候fwrite的效率更高。但如果每次写的数据很多(比如2900)则write的效率更高,因为fwrite要进行二次拷贝日志输出方式:输出到控制台 输出到本地文件 通过网络输出到远程服务器日志回滚:本地日志支持最大文件限制,当本地日志到达最大文件限制的时候新建一个文件,每天至少一个文件。Log4cpp配置文件:可以分模块打印不同的日志,也原创 2022-03-24 21:35:48 · 614 阅读 · 0 评论 -
MySQL
数据库类型:1.关系型数据库mysql 2. redis mongo 3. elasticsearchOLTP(一般就是我们,对数据库进行增删改查)、OLAP(对数据进行分析)SQL:结构化查询语言DQL:查询语句DML:引起数据库数据变更的语句,增删改DDL:数据定义语句,create,alter,dropDCL:数据控制语句,grant,revokeTCL:事务控制语言commit,rollback复合键:多个列作为一个键MySQL体系结构:连接件connectors原创 2022-03-23 20:15:36 · 466 阅读 · 0 评论 -
内存池的实现与场景分析
内存池是对malloc在堆上申请出来的空间进行的管理!内存池作用:(内存池要用但不要自己造,要懂他的原理)避免频繁分配内存(recv之前malloc一块空间,让recv函数来用,这种方式内存会被频繁分配释放和使用,会造成内存碎片化,这样当我们再次申请一块大内存的时候会遇到分配失败的情况。)内存池:jemalloc,tcmalloc避免频繁分配与释放方法: 1. 使用链表,每次malloc把块加入到链表中,不释放,调用free的时候直接在结构体里设置一个fla...原创 2022-03-22 14:53:51 · 855 阅读 · 0 评论 -
协程设计原理与汇编实现
协程:针对IO密集型方法。1. 为什么要有协程?解决什么问题?2. 协程提供了什么原语操作?3.协程的切换4.协程的定义(结构体)5. 协程的调度策略6.调度器如何定义7. 协程api的实现,hook8. 协程对于多核的模式如何实现9.如何测试协程为什么会有协程:同步的编程方式,异步的性能//同步func() { while(1) { epoll_wait(); for(;;) { recv(..原创 2022-03-18 18:03:15 · 137 阅读 · 0 评论 -
UDP可靠传输
如何做到可靠传输?1. ACK机制 2. 重传机制 3. 序号机制(3 2 1 -> 2 3 1) 4. 重排机制 (2 3 1 -> 3 2 1) 5. 窗口机制UDP: 无连接,不可靠传输,不适用流量控制和拥塞控制,支持一对一,一对多,多对一和多对多交互通信,面向报文,首部开销小,仅8字节,适用于实时应用(IP电话、视频会议等)TCP:面向连接,可靠传输,使用流量控制和拥塞控制,只能一对一通信,面向字节流,首部最小20字节,最大60字节,适用于要求可靠传输的应用(文件传输)A原创 2022-03-18 09:50:49 · 3067 阅读 · 0 评论 -
Posix API与网络协议栈
Posix APIserver: 1.socket 2.bind 3.listen 4.accept 5.recv 6.send 7.closeclient: 1.socket 2.bind(optional) 3.connect 4.send 5.recv 6.closesetsockopt() getsockopt()fd是从3开始。0.1.2已被系统占用TCB五元组(remoteip, remoteport, localip, localport, proto);三次握手发生在原创 2022-03-17 16:55:53 · 1761 阅读 · 0 评论 -
redis、memcached、nginx网络组件
reactor的应用梳理reactor网络编程 编程细节,一些返回值和错误码 redis、nginx、memcached、reactor具体使用网络编程关注的问题:连接的建立 客户端连接服务器 三次握手首先发送connect包(半连接队列),服务器发送ack,客户端发送同步这样连接就建立了(全连接队列)int clientfd = accept(listenfd, addr, sz); 根据addr和sz可以获取到客户端的ip地址(可以用来做黑白名单) 如果clientfd==原创 2022-03-17 13:45:52 · 3039 阅读 · 0 评论 -
智能指针总结
#include <iostream>#include <memory>using namespace std;/* * 四个智能指针,auto_ptr, unique_ptr, shared_ptr, weak_ptr,其中 * 后三个是C++11支持,第一个已经启用。 * * auto_ptr缺点: * 1. 两个auto_ptr指向同一个内存的话会造成多次析构释放。 * 2. 采用“=”赋值语句的时候,会将右边的所指向的内存转移到左边的智能指针上,这样原来.原创 2022-03-14 16:00:09 · 228 阅读 · 0 评论 -
Reactor网络框架笔记
#include <errno.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <unistd.h>#include <sys/poll.h>#include .原创 2022-03-14 11:35:28 · 133 阅读 · 0 评论 -
网络编程--io(select,poll,epoll)笔记总结
1. 最简单的网络框架,只能1服1客。问题:能够连接多个客户端,但只有一个客户端可以发送信息。原因:三次握手是在协议栈里面完成的,与应用层没有关系。建立连接后,直接对第一个客户端进行读写,无法对别的客户端获取listenfd,connfd。#include <error.h>#include <netinet/in.h>#include <stdio.h>#include <stdlib.h>#include <string.h&g原创 2022-03-13 16:30:55 · 1803 阅读 · 0 评论 -
磁盘存储链式的B树与B+树(上课笔记)
内存与磁盘区别:1. 内存块,磁盘慢2. 断电以后内存数据消失,磁盘持久存储磁盘的慢是慢在寻址。磁盘使用红黑树来进行寻址。为了减少寻址次数,就有了多叉树 b树。1个1024叉的B树,最小单位是4K,要寻址4G的内存,只需要2次寻址找到对应的单元。B-树的性质:一颗M阶B树T,满足以下条件:1. 每个节点至多有M棵子树2. 根节点至少拥有两棵子树3. 除了根节点以外,其余每个分支结点至少拥有M/2棵子树4. 所有的叶节点都在同一层上(那么一定平衡)5. 有k棵子原创 2022-03-11 14:11:45 · 722 阅读 · 0 评论