
网络编程
文章平均质量分 73
lyt_dawang
技术路上的追鹿人
展开
-
TCP/IP协议栈 总结(一)
TCP 提供一种面向链接的,可靠的字节流服务。面向链接意味着两个使用TCP的应用(通常一个客户端,一个服务器)在彼此交换数据前必须先建立一个TCP链接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。TCP通过下列方式来提供可靠性1.应用数据被分割成TCP认为最适合发送的数据块2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确.原创 2021-05-17 17:38:15 · 481 阅读 · 0 评论 -
mysql理解(二)_缓存
MySql主从复制1.主库更新事件(update,insert,delete)通过io-thread写入binglog;2.从库读取binglog,通过io-thread写入(write)从库本地relay log(中继日志);3.从库通过sql-thread读取(read)relay log,并把更新事件在从库中执行(replay)一遍例如微博读写分离架构如下图为什么需要缓冲层?前提读多写少,单个主节点能⽀撑项⽬数据量;数据的主要依据是mysql;mysqlm.原创 2021-05-13 16:33:56 · 283 阅读 · 1 评论 -
mysql基础操作理解(一)
MySql基础按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合;SQL定义结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL是关系数据库系统的标准语言。关系型数据库包括:MySQL, SQL Server, Oracle, Sybase, postgreSQL 以及 MS Access.原创 2021-05-13 15:21:20 · 142 阅读 · 0 评论 -
协程漫读
协程的概念协程就是充分利用给线程的CPU的时间,当遇到阻塞,执行下一个任务。协程在应用层提供上下文切换功能,当遇到阻塞时通过让出yield让出,通过协程调度已准备IO的任务,从而不至于阻塞等待IO数据导致的线程阻塞从而影响性能。协程在具备异步性能的同时又具备同步的代码逻辑结构,极具可读性。协程解决了什么问题1.协程解决了同步情况下密集IO的性能低下的问题2.协程解决了异步IO请求处理的复杂性协程如何提高同步情况下密集IO的性能底下的问题协程有两个关键的原语操作,yiel.原创 2021-04-25 17:33:03 · 173 阅读 · 0 评论 -
网络通信协议浅析
通信协议的设计核心有两点1.解析效率2.可扩展升级协议的设计细节包括1.帧数据完整性判断2.序列化与反序列化3.协议升级4.协议安全5.数据压缩网络通信协议的设计目标为:1.解析效率:互联网业务具有高并发的特点,解析效率决定了使用协议版本的CPU成本2.编码长度:信息编码出来的长度,编码长度决定了使用该协议的网络宽带以及存储成本3.可读性:编码后的数据的可读性决定了使用协议的调试和维护版本(不同的序列化协议是不同的应用场景)4.兼容性:互联网的需.原创 2021-04-14 22:21:45 · 424 阅读 · 0 评论 -
生成coredump文件
生成core文件 要寻找还未写出的日志消息,需要用到core dump时生成的core文件,但是在默认情况下是不生成的,因此需要先开启。 通过ulimit -c可查看core文件是否开启:如果显示为0,说明未开启,此时可以通过ulimit -c unlimited开启,这里unlimited指的是core文件的最大大小,可以设置为其它数字ulimit -c unlimited可以看到,运行程序生成的可执行文件core_dump,程序发生了异常退出,此...原创 2021-04-12 10:19:57 · 540 阅读 · 0 评论 -
log4cpp浅析
log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。Log4cpp中最重要概念有Category(种类)、Appender(附加器)、Layout(布局)、Priorty(优先级)、NDC(嵌套的诊断上下文)。 Category、Appender与Layout三者的关系如下图所示:...原创 2021-04-12 09:53:18 · 4955 阅读 · 0 评论 -
try-catch技术探索
不同于其他高级语言,c语言层面没有try-catch的结构,本文通过使用c语言实现该功能的方式探究try-catch的技术原理 先聊一下setjmp和longjmp方法,在c语言中使用setjmp/longjmp实现从一个函数跳转到另外一个函数 使用方法 使用setjmp在代码上设置标签,当调用longjmp时,程序的执行从longjmp处跳转到setjmp设置标签处实现跨函数的跳转。另外在初次调用setjmp时,其返回值为0,如果使用l...原创 2021-04-07 17:28:49 · 204 阅读 · 0 评论 -
无锁队列理解
由于普通锁的粒度比较大,以至于在并发量高的环境下,锁对于并发性能影响很大,本文章对无锁队列做探索,该无锁队列目前只支持单读单写,上干货 该队列由链表组成,每个节点有N个泛型T组成,该队列实现对T类型元素单读单写的无锁操作,可以方便的用在单生产者消费者模型中 队列的主要元素如下: yqueue_t的实现,每次批量分配⼀批元素,减少内存的分配和释放(解决不断动态内存分配的问题)。 yqueue_t内部由⼀个⼀个ch...原创 2021-04-05 20:56:11 · 860 阅读 · 1 评论 -
对锁的一些理解
如果多个线程访问相同的数据,并且它们中至少有一个修改了数据,那么对共享数据的所有访问必须同步以防止数据竞争。但是,一个正在读取共享数据的线程可能中断另一个正在修改相同共享数据的线程,因此,可能导致线程读取到不一致的数据。 锁的类型分几种,分别是互斥锁,自旋锁,读写锁,以及原子操作,锁的粒度依次降低 互斥锁 mutex是睡眠等待(sleep waiting)类型的锁,当线程抢互斥锁失败的时候,线程会陷入休眠。优点就是节省CPU资源,...原创 2021-03-31 21:32:32 · 255 阅读 · 0 评论 -
服务端定时器技术理解(一)
服务端在一下业务场景下,需要用到定时器1.⼼跳检测 2.技能冷却 3.武器冷却 4.倒计时 5.其它需要使⽤超时机制的功能对于服务端来说,驱动服务端逻辑的事件主要有两个,一个是网络事件,另一个是时间事件。对这两种事件的处理有两种方式:1.在主线程处理网络事件时,处理时间事件,例如ngnix,redis2.网络事件和时间事件在不同的线程中处理,例如,skynet第一种模式示例代码如下:while (!quit) { int now = get_now_.原创 2021-03-28 14:46:59 · 554 阅读 · 0 评论 -
异步请求池理解
当业务服务器访问需要等待的服务时,业务访问线程需要等待挂起直到该服务给出反馈,例如对mysql,redis,http,dns等服务的请求,这些请求的返回需要等待一段时间,大大加深了业务服务器的承载压力,也会影响其总体性能,异步请求池就是为解决这个问题应运而生的。异步请求池需要考虑下列问题:1.异步请求使用一个链接还是多个链接2.链接的网络IO的管理问题3.既然是多个链接,发完请求后响应没有接受之前,fd存储在哪里4.请求和响应能否做在一个线程之中为解决以上问题,特提出一下设.原创 2021-03-26 22:36:46 · 340 阅读 · 2 评论 -
内存池的理解(一)
内存池理解(一)内存池就是在组件启动之间,预先申请好的一大块内存,这样在组件中申请和释放内存就可以由内存池统一 管理。由内存池统一管理内存的好处如下(1)可以一定程度有效的防止内存泄漏和内存碎片化(2)当组件出现内存泄漏的时候,有通用的内存池管理可以较为方便的定位组件内存泄漏点内存池的实现有几种方式1.伙伴算法伙伴算法,简而言之,就是将内存分成若干块,然后尽可能以最适合的方式满足程序内存需求的一种内存管理算法,伙伴算法的一大优势是它能够完全避免外部碎片的产生。申请时,伙伴算原创 2021-03-24 20:28:47 · 340 阅读 · 0 评论 -
线程池学习笔记(一)
线程池线程池是事先申请号的一组线程,不断的对任务队列中的任务处理的并行处理架构,线程池原理如下图如上图,主进程产生任务后,不断的加入到线程池的任务队列中,在加入任务队列时,唤醒线程池中一个线程来处理任务更为实际示例如下图场景下面展示线程池的重要组件,上代码//线程组件typedef struct NWORKER { pthread_t thread; //线程id int terminate; //线程池终止标志 struct NWORKQUEUE *.原创 2021-03-21 11:18:02 · 166 阅读 · 0 评论 -
epoll,reactor模型理解
网络编程,根本上来说是对网络IO技巧。在对多客户端的网络编程的一个很拥有的方式是通过epoll来管理socfd,通过epoll_create创建epoll对象,通过epoll_ctl加入想要关心sockfd,可以在sockfd相应事件触发时调度sockfd去处理网络数据。通过recv或send发送数据。ractor模型,巧妙的利用epoll_event.data.ptr指针,引入较为复杂的数据结构,可以再触发相应事件的时候,通过回调对事件进行处理struct epoll_event ev;ev.原创 2021-03-12 20:11:48 · 669 阅读 · 0 评论