零声教育
文章平均质量分 51
零声教育课程笔记
高二的笔记
这个人很懒,什么都没有写。
展开
-
3.2.6 手把手实现分布式锁
锁是一种资源,需要存储;同时要保证可用性,避免锁失效 ->一个进程多线程中的锁资源存储在进程中。加锁解锁行为是网络通信,需要锁超时->进程是资源的容器,线程是执行的单元。2.哪些锁是自己加锁自己释放锁?哪些是自己加锁,可能由别的线程释放锁?行为:加锁,解锁-》网络交互-》锁超时功能,由锁存储的所在节点来实现。加锁对象和解锁对象必须为同一个 -》除了因为网络异常而造成锁超时情况。重入锁和非重入锁:允许同一个线程多次持有锁。条件的判断是一个临界资源,需要互斥锁保护。怎么获知持有锁对象的释放锁行为?原创 2024-01-27 22:24:05 · 427 阅读 · 0 评论 -
3.2.5 手写内存泄漏检测组件
1.内存泄漏(a.是否有内存泄漏 b.在哪里有内存泄漏)2.try-catch调用malloc 没有调用free#include <stdio.h>#include <stdlib.h>int main(){ void *p1 = malloc(5); void *p2 = malloc(10); void *p3 = malloc(15); free(p1); free(p3); return 0;}上面这个程原创 2024-01-27 10:11:03 · 426 阅读 · 0 评论 -
3.2.4 手写死锁检测组件
其实要检测是否发生死锁,我们还要从锁上下手,我们要对锁的前后时机进行掌控,比如说现在是谁持有锁,谁想占用锁?而需要通过hook,让上锁,解锁操作调用我们自己的函数,这样,我们就能根据线程和锁记录一些关键信息,从而构建一个有向图,之后判断这个有向图是否成环就能知道是否发生了死锁。定义了五个线程,每个线程都持有一把互斥锁,线程一首先将r1上锁,之后sleep(1)等待线程二将r2上锁,依次,线程五将r5上锁后,等待r1被释放,然而线程1还在等待r2的释放,无法将r1释放,依次。至此,我们就可以完成死锁的检测。原创 2024-01-23 19:22:12 · 424 阅读 · 0 评论 -
4.2.2 MySQL索引原理以及SQL优化
不要使用索引场景:没有where/group by/order by中使用,区分度不高的列,经常修改的列,表数据量少。准备 将SQL语句发送给服务器进行解析,编译和优化 生成一个执行计划并缓存。索引的代价:占用空间,维护的代价。数据结构:B+树索引、hash索引、全文索引(根据关键字索引全局)索引的使用场景:where、group by、order by。列属性:主键索引、唯一索引、普通索引、前缀索引。物理存储:聚集索引、辅助索引(二级索引)列的个数:单列索引、组合索引。索引的目的:提升搜索效率。原创 2023-10-31 14:27:32 · 131 阅读 · 0 评论 -
4.2.1 SQL语句、索引、视图、存储过程
范式可以避免数据冗余,减少数据库的空间,减小维护数据完整性的麻烦;但是采用数据库范式化设计,可能导致数据库业务涉及的表变多,并且造成更多的联表查询,将导致整个系统的性能降低;drop 快 删除整张表结构和表数据,包括索引、约束、触发器等 不能进行回滚。2.查询缓存 kv存储,命中直接返回,否则继续执行 8.0已经删除。范式二:确保表中的每列都和主键相关,而不能只与主键的某一部分相关。范式三:确保每列都和主键直接相关,而不是间接相关,减少数据冗余。5.执行器 根据执行计划,从存储引擎获取数据,并返回客户端。原创 2023-10-31 07:30:01 · 392 阅读 · 0 评论 -
4.5.1 Nginx反向代理与系统参数配置conf原理
listen在master进程,connection在work进程。nginx ->进程 -> server。原创 2023-10-30 07:53:33 · 93 阅读 · 0 评论 -
2.3.1 协程设计原理与汇编实现
同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来继续处理就绪事件。5.协程的scheduler如何定义。b.不同体系机构,汇编代码不一样。7.如何与posix api兼容。4.协程的struct如何定义。9.协程的性能如何测试?1.为什么要有协程?汇编实现切换的优缺点。6.调度策略如何实现。原创 2023-10-26 18:09:08 · 348 阅读 · 0 评论 -
3.1.2 内存池的实现与场景分析
1.避免频繁分配/释放内存(产生大量的内存碎片)原创 2023-10-26 16:12:51 · 83 阅读 · 0 评论 -
3.1.1手写线程池与性能分析
使用场景:如果一个锁持有临界资源的时间 (O(n))大于重新访问锁的时间,就用互斥锁。2.io密集型(网络io,磁盘io)两倍的核心数个。区别在于一个线程在执行临界资源,其他线程在干什么。某类任务特别耗时,严重影响该线程处理其他任务。自旋锁其他线程发现锁被占用时,一直循环等待。1.线程池是是什么,组成结构,为什么。互斥锁其他线程发现锁被占用时去做别的。线程池是管理维持固定数量的池式结构。消费者线程 取出任务,执行任务。3.线程池在开源框架中的应用。队列 存储任务 调度线程池。2.线程池实现 核心代码。原创 2023-10-22 20:20:52 · 134 阅读 · 0 评论 -
1.2.1 创建型设计模式
观察者模式:定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。设计模式是指在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。策略模式:定义一系列算法,把他们一个个封装起来,并且使他们可相互替换。比喻:整洁的房间,好动猫,怎么保证房间的整洁?继承:无需修改原有类的情况下通过继承实现对功能的扩展。稳定点:一对多的依赖关系,一变化多跟着变化。前提:具体需求既有稳定点,又有变化点。设计模式是怎么来的?原创 2023-10-19 09:25:47 · 288 阅读 · 0 评论 -
关于柔性数组
struct sdshdr16 *p = malloc(sizeof(sdshdr16) + 柔性数组大小)其实在malloc分配后,会在前面有16字节存放长度,free时先向前偏移16字节,找到长度,在释放。柔性数组放在最后其实就是一个语法糖,告诉编译器,这块内存要动态分配。既然柔性数组的大小是运行时确定的,那free怎么知道要释放多大呢?而普通指针需要malloc和free两次。malloc(buf的大小)柔性数组只需要分配一次,1.方便内存分配释放。原创 2023-08-20 08:01:10 · 211 阅读 · 0 评论 -
2.2.3 Posix API与网络协议栈
FIN包一般是携带包,比如携带在最后一次发送数据包的标志位上,如果一直没有发送数据,则会单独发送FIN包。两端同时调用close()?进入CLOSING状态(下图的同时关闭状态)五元组(sip, dip, sport, dport, proto)上面的是建立连接抓取的包,下面的是服务端主动断开连接发送的网络包。大量close_wait状态?没有及时调用close();SYN_SENT如何转为SYN_RECV?如何通过网络数据包,查找半链接队列的节点。端口65535个,如何做百万级别的连接。原创 2023-04-30 16:24:43 · 763 阅读 · 0 评论 -
2.1.3 http服务器的实现
从最初的reactor到现在的HTTP协议的解析与封装,其实都是一个思想,每一个链接所对应的资源或上下文都单独管理,比如一个链接对应一个结构体,这里面包含它的读写缓存,sockfd,如果考虑HTTP协议的话还可以加上对应的协议头的key-value形式的存储,之后,凡是涉及这个sockfd相关的资源,都可以在这个结构里面找到,这样一来就将业务和网络底层隔离开来,我们只需要关注读写buffer里面的内容。更进一步,当有多个链接时,如何更合理的管理这些链接(结构),链表的形式?原创 2023-04-26 21:37:17 · 102 阅读 · 0 评论 -
2.2.1服务器百万并发实现
接上节课,上节课中,我们使用了epoll实现了同时监听多个文件描述符,是对IO的管理,也提到了reactor是对事件的管理,那具体来说是怎样的呢?reactor是事件驱动模型,也就是EPOLLIN/EPOLLOUT,同时,我们应该维护一种结构,对于每个fd,都应该有这样一种记录该fd相关的结构。对事件管理的方式,这样一来,我们可以将网络与业务分离,业务人员只需要在回调函数中读写相应的。(目前虚拟机网络没有调试好,导致网络通信有些问题,后续再写百万并发部分,先挖个坑)再往后,为了提高处理能力,我们可以将。原创 2023-04-22 19:16:32 · 479 阅读 · 0 评论 -
2.1.2事件驱动reactor的原理与实现
所以,ET模式效率高的原因就在于同一事件(比如可读或可写事件)只会触发一次,而LT只要状态不变就会一直触发。同时这也引出了一个问题,对于ET模式,当有事件来时,就要一次把这个事件处理完,因为之后不会再触发该事件,即使上一次该事件没处理完。水平触发在于看当前状态,比如当前状态是高电平就会一直触发,而边沿触发在于看状态变化,比如从低电平变为高电平,这个过程只会触发一次,想要再次触发,只能状态发生改变。以上便是epoll相关的内容,epoll是对IO的管理,接下来的reactor则是对事件的管理。原创 2023-04-18 21:16:48 · 445 阅读 · 0 评论 -
2.1.1网络io与io多路复用select/poll/epoll
值得注意的是select是通过判断fd_set中的某些位,从而判断是否发生事件,因此,select所能处理的文件描述符个数是有限的,只有1024个。但是他们都有性能瓶颈,他们返回就绪的文件描述符个数,但仍需我们自己去遍历到底是哪个文件描述符上有事件,而。,支持的文件描述符数量不受限制,并且每次调用无需重新设置事件,因为内核不会修改,而是通过。若想实现多个客户端连接,并支持收发数据,也把。来一个连接,创建一个线程,该线程循环负责该客户端的数据收发。程序运行后,立马连接,发现可以连接成功,并且10秒后,原创 2023-04-16 20:40:05 · 393 阅读 · 0 评论