
linux
文章平均质量分 74
小瑞的学习笔记
写博客完全是为了回顾学过的知识点,如果能帮助到您,那真是的十分荣幸.
展开
-
nginx线程池源码剖析
条件变量 - 一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。任务队列 - 按顺序保存待处理的任务序列,等待线程中的线程组处理。网络上的请求和响应,互斥锁,等待同步方式调用的数据库响应。任务 - 待处理的工作,通常由标识、参数和处理函数组成。互斥锁 - 保证在任一时刻,只能有一个线程访问该对象。读取文件,但文件尚未缓存,从硬盘中读取较为缓慢。线程池 - 由多个已启动的一组线程组成。这个主要对,互斥锁和条件变量进行了一层封装。解决方案: 运用多进程或多线程技术解决。原创 2023-04-13 10:46:33 · 517 阅读 · 0 评论 -
gtest--单元测试
TEST是gtest的测试宏,我们的测试用例必须按照这样格式写,isPrimeTest是测试套的名字,一个测试套下可以有多个测试用例,那么Positive、Trivial就是我们测试用例的名称,EXPECT_EQ、EXPECT_FALSE和EXPECT_TRUE等等,都是gtest提供的测试断言,比如 EXPECT_EQ(1, Factorial(1));基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。原创 2023-03-21 13:16:13 · 1465 阅读 · 0 评论 -
protobuf序列化
协议的模板所有的message必须定义到一个文件中,且文件的后缀名为.proto。例如我们定义的bike.proto文件required:必须填发送的数据bike.proto// 使用的版本 package tutorial;// 生成一个包把类放进去 // 申请短信请求 message mobile_request {// 按顺序写编号 }原创 2023-04-09 17:10:33 · 1124 阅读 · 1 评论 -
TCP分包和粘包
相关的,路由器有一个MTU( 最大传输单元)一般是1500字节,除去IP头部20字节,留给TCP的就只有MTU-20字节。TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS).如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送.b)服务端:先解析本次数据包,获取数据大小N,再读取N个字节,这N个字节就是一个完整的数据内容。当应用层数据超过1460字节时,TCP会分多个数据包来发送。a)客户端:先发送包表示和长度,再发送数据内容。原创 2023-04-08 19:12:03 · 2579 阅读 · 0 评论 -
Libevent学习之旅
libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。跨平台,支持Windows、Linux、BSD和Mac OS;支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;支持I/O,定时器和信号等事件;采用Reactor模式;原创 2023-04-08 14:39:54 · 456 阅读 · 0 评论 -
epoll之多路IO复用
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。LT模式(水平触发)下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作;而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。原创 2023-04-06 10:07:46 · 417 阅读 · 0 评论 -
select之多路IO复用
举一个简单地网络服务器的例子,如果你的服务器需要和多个客户端保持连接,处理客户端的请求,属于多进程的并发问题,如果创建很多个进程来处理这些IO流,会导致CPU占有率很高。所以人们提出了I/O多路复用模型:一个线程,通过记录I/O流的状态来同时管理多个I/O,需要的线程数大大减少,减少了内存开销和上下文切换的CPU开销。原创 2023-04-03 17:46:00 · 240 阅读 · 0 评论 -
项目日志-文件重定向
在通常情况下,Linux/UNIX每个程序在开始运行的时刻,都会打开3个已经打开的stream. 分别用来输入,输出,打印诊断和错误信息。每一次重定向,输出到文件中,都会从开端写入数据,导致之前的调试信息被覆盖,如果想保存之前的调试信息,那么就只能在重定向文件中追加调试信息 这里把 ‘>’ 换成 ‘>>’ 就可以了。总的来说,stdin,stdout和stderr还是和终端有密切关系,通常在生产环境时,会将这3个流重定向到其它文件。注意:stderr是不缓存的,stdout则进行行间缓存。原创 2023-03-23 21:22:08 · 609 阅读 · 0 评论 -
内存检测Valgrind
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,我们可以使用它的工具:Memcheck。原创 2023-03-19 19:44:43 · 195 阅读 · 0 评论 -
Coredump 调试
程序异常退出时,会产生一个core文件,该文件记录了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。------------------这里我们设置文件权限666 所有用户都可以对文件进行读写。当前执行程序的用户对core目录有写权限且有足够的空间存储core文件;生成不受限制的core文件;coredump是什么?原创 2023-03-19 16:39:55 · 375 阅读 · 0 评论 -
gdb调试常用操作
每次程序调用一个函数,函数的地址、参数、函数内部变量都会被压入“栈”(Stack) 中,运行时堆栈信息对于程序员非常重要,使用 “bt”命令可以看到当前运行时栈的情况。比较人性化的是,gdb 提供了watch 命令,用于设置另一种断点:“观察点”。gdb是GNU 发布的一个强大的程序调试工具,也是Linux 程序员不可或缺的一大利器。gdb将命令分为12个大类,使用命令: “help 子类别”可以查看没类下面的详细帮助。另外,其还支持命令缩写,如, h 代表 help ,命令用于设置断点,命令接受。原创 2023-03-19 15:41:30 · 334 阅读 · 0 评论 -
Makefile的学习笔记
当然,我们的makefile并不复杂,所以在两个地方加也不累,但如果makefile变得复杂,那么我们就有可能会忘掉一个需要加入的地方,而导致编译失败。只要我们的Makefile写得够好,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。原创 2023-03-18 21:58:48 · 103 阅读 · 0 评论 -
文件锁 fcntl
**文件锁**- 锁只有一把。以读方式给数据加锁——读锁。以写方式给数据加锁——写锁。- 读共享,写独占。写锁优先级高。 >函数定义:int fcntl(int fd, int cmd, struct flock *lock);原创 2023-03-12 16:52:04 · 311 阅读 · 0 评论 -
fsync的使用
正常写入数据的时候,会将文本先写入缓冲区,然后达到一定数目的时候,写入磁盘,但是当数据正在写入的时候,如果linux系统突然关机,就会造成数据丢失原创 2023-03-12 13:36:03 · 1737 阅读 · 0 评论 -
c++回声服务器的实现
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。af 取值可选为 AF_INET 和 AF_INET6 ,即和 ipv4 和ipv6对应。h表示host,n表示network,l表示32位长整数,s表示16位短整数。原创 2023-03-01 22:28:12 · 283 阅读 · 0 评论