自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 CSAPP—动态内存分配

针对csapp虚拟内存管理中malloc内存分配器实现后的一些总结,书中是通过隐式链表来进行内存管理,并且采用的是双字对齐(字:4B,双字:8B)

2023-02-25 09:22:00 542 1

原创 LinuxC—网络套接字

大端存储与小端存储主机字节序和网络字节序若两个主机的字节序存储方式不同,直接传输的数据被对方接收后会就会使完全错误的,为了避免这种情况发生,从而引入主机字节序(host)和网络字节序(network)。

2023-01-30 20:04:25 539

原创 LinuxC—进程通信

定义匿名管道用来实现具有亲缘关系的进程之间的通信,匿名管道是由内核创建的一块内存区域,返回这块区域对应的文件描述符后,进程间可以通过这个文件描述符的操作来进行通信。特点相关函数1024。

2023-01-30 20:01:28 1281

原创 LinuxC—管道模拟

实现一个管道,管道可以让多线程读写数据。

2023-01-26 19:08:32 137

原创 LinuxC—高级IO

定义有限状态机(Finite State Machine) 缩写为 FSM,状态机有 3 个组成部分:状态、事件、动作。作用自然流程即解决问题的直接思路。

2023-01-26 16:13:02 884

原创 LinuxC—线程

什么是线程进程其实是一个容器,当我们在编程的时候实际上是在以线程为单位进行编程,包括处理器的调度也是以线程为单位的,一个进程可以有多个线程,一个进程的多个线程共享相同的进程空间,所以多线程之间的并发要比多进程之间的并发更加容易。线程标准线程是先有标准再有实现,所谓的pthread就是posix标准的实现线程标识符posix下的线程标识符就是pthread_t,这个数据可以是一个整数,也可以是一个结构体,所以不能单纯的将其当做一个整数来使用。

2023-01-26 16:09:05 592

原创 LinuxC—信号

kill(2) 给pid进程发送sig信号定义pid的选择pid > 0,就是给pid对应的进程发信号pid =0,给调用该方法的进程的同组进程发送sig信号,即组内广播pid = -1 ,sig会被发送给当前进程能够发送信号的所有进程,除了init进程pid < -1,会将sig发送给进程组ID为-pid的进程sig = 0时为检测pid进程或-pid进程组是否存在返回值:成功返回0失败返回-1,同时设置errnoraise(3) 给当前进程发送一个信号,自己给自己发。

2023-01-11 17:02:56 599

原创 LinuxC—进程

基本概念类型pid_t,是一个有符号16位整数,进程号是顺次向下使用(fd是优先使用当前可用最小的)shell中的ps命令能够查看当前系统的进程信息快照相关函数。

2023-01-10 20:28:40 607

原创 LinuxC—文件系统学习笔记

相关函数stat() 得到file指向的文件并将其属性回填到buf中,面对符号链接文件时获取的是所指向的目标文件的属性fstat() 得到fd指向的文件并将其属性回填到buf中lstat() 得到file指向的文件并将其属性回填到buf中,面对符号链接文件时获取的符号链接文件的属性stat结构体umask0666&0002作用:防止产生权限过松的文件。

2023-01-06 20:44:41 858

原创 LinuxC—标准IO与文件IO学习笔记

sysio是直接实现用户态切换内核态,sysio和平台是有关系的,比如windows和linux,而stdio标准IO提供了一系列标准接口使用,不用去关心平台的限制(stdio底层是依赖sysio实现的),所以stdio的可移植性比sysio好。

2023-01-06 12:53:09 561

原创 数据结构C语言描述

顺序存储线性表由数组来实现,就和java中的ArrayList一样头文件1024实现。

2023-01-05 22:08:01 461

原创 C语言学习笔记

基本类型数值类型整数 short, int, long浮点型 float, double字符型 char构造类型数组结构体 struct共用体 union枚举类型 enum指针类型空类型 void顺序选择: if-else, switch-case循环: while, do-while, for, if-goto辅助控制: continue, break​ 数据类型 函数名(【形式参数说明表】)产生及意义。

2023-01-05 22:06:13 355

原创 C循环体自动变量地址复用问题

运行结果如下:可以看到输出了we are,两个我们输入的字符串,这是因为ss[i]中存储的指针是指向一个通过malloc()申请的内存,这块内存如果我们不主动释放,他是会一直存在的,当再循环体中第二次创建str的时候,str指向的又是一块新的内存,所以ss[0]和ss[1]是指向两个字符串了。下面是错误的代码,主要是为了反应一个问题,就是在C语言中循环体中的自动变量的内存地址是会被复用的。在做《C Primer Plus》第12章课后习题的第9题的过程中发现的一个问题。

2022-10-15 18:31:21 280

原创 JVM常见问题总结

针对JVM常见问题的总结,主要就是分为JVM内存模型、类加载系统、垃圾回收几个部分,主要参考周志明老师的《深入理解Java虚拟机》一书JVM内存结构指的是JVM运行时数据区的内存分布,共分为五个部分,分别是虚拟机栈、本地方法栈、程序计数器、堆和方法区,其中虚拟机栈,本地方法栈和程序计数器是线程私有的,堆和方法区是线程共享的。对这些分区的接受如下:堆区是用来存放Java对象的地方,我们的Java对象基本都是存放在堆中,同时堆区也是JVM垃圾回收最频繁的地方,可能出现OOM方法区主要存放了类型数据,存在垃圾回收

2022-06-18 20:20:11 525

原创 网络IO系统

传统的网络文件传输流程如下:将磁盘中的数据拷贝到内核缓冲区中(DMA拷贝)将内核缓冲区中的数据拷贝到用户空间中(CPU拷贝)将数据从用户空间再拷贝到socket缓冲区中(CPU拷贝)将socket中的数据拷贝到网卡中(DMA拷贝)前面两次过程涉及到一次read()系统调用,后面两次过程涉及到一次write()系统调用,整个过程共有两次系统调用,两次CPU拷贝和两次DMA拷贝,可见性能是非常差的,所以需要对传统的文件传输方式进行优化所谓的mmap技术就是将read()系统调用换成了mmap()系统调用,所谓的

2022-06-05 11:25:10 151

原创 Spring IOC与AOP

目录1 IOC2 AOP2.1 什么是AOP2.2 代理模式2.3 AOP日志中方法互相调用日志答应问题2.4 AOP事务IOC是什么IOC就是控制反转,这是一种设计思想,简而言之就是将我们程序中手动创建的对象交由我们的外部框架来完成,在Spring中这个就是交由Spring的IOC容器来完成,这个IOC容器实际上就是一个map,里面保存了我们的对象IOC有什么作用?IOC有以下作用:使得对象之间的耦合度降低使得我们的资源变得容易管理,因为我们将对象的生成与管理权利交给了我们的IOC容器举个例子来说明以下I

2022-06-05 10:15:09 123

原创 Kafka相关知识点总结

目录1 介绍下kafka?2 Kafka是怎么设计的?3 为什么要用消息系统?4 Consumer Group机制?5 Consumer的分区分配策略有哪些?6 Reblance机制?7 位移提交?8 kafka 如何保证消费者不会重复消费数据?9 Kafka 在处理海量数据为什么这么快?10 Kafka怎么保证消息可靠传输?11 为什么不让一个partition被同组的多个consumer消费kafka是一款分布式流处理平台,用于实时构件流处理应用。它有一个核心的功能广为人知,即作为企业级的消息引擎被广泛

2022-06-01 19:49:37 216

原创 redis缓存相关问题总结

目录1 缓存穿透2 缓存击穿3 缓存雪崩 4 三者对比5 数据库与缓存一致性问题先说一下查询数据的流程吧我们在查询一个key的时候,首选会到Redis中取查询,如果查询到的key不存在,那么我们就会去数据库中查询这个key,如果查询到了,我们就会在缓存中更新这个key并返回数据,这样以后的请求就会在缓存中直接查询到key。但是,如果没有查询到,那么Redis中就一直没有这个key,每次请求都会去查询数据库,由于数据库IO操作要与磁盘交互,相对内存中的操作时非常慢的,倘若这些请求非常之多,那么会给服务器端带来

2022-05-31 20:26:30 183

原创 MySQL主从架构

再谈binlogmysql的高可用架构都是基于binlog来实现的,binog是归档所用,主要两种格式,分别是statements和rows格式,两个格式的区别如下: statements 该格式下的binlog记录的是我们直接执行的语句,比如执行 delete * from t where id = 1; 这是产生的binlog记录的就是这条执行的语句。但是这类binlog存在一个问题就是我们的语句在主库和从库中有可能会通过不同的索引执行,这样就可能会导致主库和从库的不一致性.

2022-05-26 10:32:06 198

原创 MySQL事务和锁

0 引言针对mysql事务相关知识的总结,分为事务,MVCC和锁三个部分1 事务与其ACID特性事务是并发控制的基本单位,是一系列对于数据库的操作,这些操作要么全部成功,要么全部失败,事务由4大特性,分别是原子性,一致性,隔离性和持久性原子性:一个事务中的操作要么全部成功,要么全部失败 一致性:事务执行前后,必须保证从一个一致性状态到另一个一致性状态 隔离性:一个事务中执行的操作对于和他并发执行的事务来说是不可见的 持久性:一个事务结束后,其对数据库的修改就是永久的,即使发生系统崩溃,

2022-05-26 10:05:40 95

原创 MySQL日志系统知识点总结

目录0 引言1 redo日志2 undo日志3 binlog日志4 redo日志的两阶段提交0 引言针对mysql日志系统的一些总结,主要是Innodb的redo日志和undo日志,然后就是server层的binlog日志,复习资料主要来自极客时间《Mysql实战45讲》和《MySQL是怎样运行的》1 redo日志redo日志是什么redo日志记录了我们对于数据的改动操作。我们在对数据库进行操作的时,都是对buffer pool中的页面进行操作,当系统崩溃时这

2022-05-25 10:27:01 184

原创 MySQL不同的count函数效率

不同引擎下的count()函数对于innodb引擎,count()函数的效率是O(N),走的是全表扫描,对于myIsam引擎,查询的时间复杂度是O(1),myisam引擎把一个表的总行数写在了磁盘上。因为innodb要支持MVCC,所以innodb需要返回多少行是不确定的当然前面所说的是针对没有过滤条件的语句,对于有过滤条件的语句,myIsam也不能这么快innodb引擎解决count()慢的方法 利用缓存做一个计数器 当我们第一次查询的时候,就将count()得到的结果放到缓.

2022-05-24 10:15:53 324

原创 MySQL连接,排序,分组语句的执行流程

0 引言针对mysql中连接(join),分组(group by),排序(order by)语句查询过程的一些知识总结,主要学习资源来自极客时间的《mysql45讲》与《mysql是怎样运行的》1 连接语句

2022-05-24 10:13:07 435

原创 Java并发编程——ReentrantLock

1 类图结构ReentrantLock是JUC包下的一个独占锁,类图结构如下:可以看到,其实现了Lock接口,并且底层是通过AQS抽象同步队列来实现的,我们直到AQS中有一个state状态变量,在ReentrantLock,state = 0时表示该锁还未被任何线程持有,大于1时则表示该锁已经被线程所持有,并且表示了该锁的重入次数。其中Sync是该类的一个内部类,NonfairSync和FaiSync分别对应获取锁的非公平与公平策略。对于这个锁,我们常用的就是lock与unlock方法,再就是C

2022-05-23 11:21:46 162

原创 MySQL索引知识点总结

0 引言针对MySQL索引相关知识点的总结,文中图片来自小林coding1 InnoDB索引底层的数据结构1.1 什么是索引首先还是说一下为什么需要索引,索引就是用来帮助我们快速查找数据用的,最典型的例子就是我们书的目录,当我们要查找某一章节的内容的时候可以先到目录中找到对应章节的页码,然后直接翻到对应页就可以了,这里的目录就可以理解为一个索引。这里只是说一下什么是索引,以及索引是干什么用的,我们innodb引擎的索引与目录这种还是有非常大的区别的,在我们的InnoDB引擎中——索引即数据,

2022-05-23 10:23:58 374 3

原创 操作系统—进程管理

目录0 引言1 什么是进程2 进程的状态3 进程控制块PCB4 如何执行进程的控制5 线程6 进程和线程的区别7 上下文切换8 进程调度算法9 进程通信机制0 引言对操作系统进程管理部分知识点的总结1 什么是进程程序是完成特定任务的一段指令集合,进程就是我们程序的一次动态执行过程2 进程的状态 创建态 就绪态 运行态 阻塞态 就绪挂起态 阻塞挂起态 终结态 3 进程控制块PC

2022-05-15 20:03:17 360

原创 操作系统—内存管理知识点总结

目录0 引言1 虚拟内存1.1 为什么引入虚拟内存1.2虚拟地址和物理地址如何实现转换1.3 Linux系统内存管理措施2 页面置换算法0 引言对操作系统的虚拟内存、进程空间、页面置换算法进行了知识点总结,文中的图片均来自小林coding1 虚拟内存1.1 为什么引入虚拟内存虚拟内存是我们操作系统用来做内存管理的,我们应用进程看到的就是虚拟内存,而不是物理内存。不直接使用物理内存的原因也很简单,倘若我们的应用进程直接操作物理内存,则在多线程并发的场景下就很..

2022-05-14 21:43:17 275

原创 计算机网络—HTTP知识点总结

0 引言针对HTTP协议的知识点总结1 什么是HTTP协议HTTP协议中文名是超文本传输协议,分为三个层面来理解:协议:规定了应用进程之间通信的规范 传输:两点之间传输数据 超文本:能传输的数据不仅只有文本内容,还有图片,视频等超文本内容2 HTTP报文有什么请求报文 请求行 请求方法:GET/POST 请求url地址 协议及其版本号 请求头 包含了客户端的一些属性,格式为 属性名:属性值,服务端可以通过这一部

2022-05-13 20:13:00 502

原创 计算机网络—TCP知识点总结(二)

0 引言前面一篇文章对TCP连接建立和关闭的知识进行了归纳,这篇将对TCP连接传输数据过程中的相关知识点进行归纳1 TCP连接为什么是可靠的在进入正题前,首先来一个问题:TCP连接为什么是可靠的?对于这个问题,主要由以下几点原因校验和:TCP首部有一个校验和字段,通过该字段可以对传输的数据进行校验,来判断数据在传输的过程中是否出错 请求应答机制:我们的TCP报文的传输是基于请求应答机制的,也就是一方发送的报文一定会接受对方对于该报文的确认报文 重传机制:当我们的报文在网络中被阻塞或者丢失

2022-05-12 19:46:10 484

原创 计算机网络—TCP知识点总结(一)

0 引言文章主要对TCP相关的知识点进行了总结,文中的图片均来自小林Coding《图解网络》1 什么是传输层?传输层位于应用层的下层,为应用程序提供端到端的逻辑通信。传输层有两个非常重要的作用——复用和分用。复用的意思是在应用层的角度来看,我们不同的应用程序都能够被封装成一定格式的传输层报文后进行传输;分用的意思是将我们的传输层报文头部去除后可以将数据传输给不同的应用进程。2 传输层协议传输层有两个非常重要的协议,分别是TCP协议(传输控制协议)和UDP协议(用户数据报协议)。二者的区别

2022-05-12 18:25:59 1450

原创 计算机网络—IP知识点总结

目录0 引言1 IP地址2 网络中如何找下一跳3 ARP协议4 DHCP协议5 NAT协议0 引言对网络层相关知识点进行了总结,主要由IP地址,ARP协议,DHCP协议和NAT;复习资料主要是小林Coding的图解网络,地址如下https://xiaolincoding.com/1 IP地址IPV4地址:32位 分类地址 A/B/C/D/E类,E类没有用,D类地址 用于多播,A/B/C类地址的组成是网络号+主机号 无分类地址 0.0.0.0

2022-05-10 20:48:44 1329

原创 Redis独立功能实现

复习《redis设计与实现》最后一章后对部分知识点的总结主要对三个部分进行梳理:1 发布与订阅:频道订阅;模式订阅;发布消息2 事务:事务的执行过程;watched命令的实现;事务的ACID特性3 慢查询日志:作用与数据结构...

2022-04-06 18:45:15 416

原创 Redis多机数据库的实现

复习《Redis设计与实现》多级数据库实现部分后的知识导图这一部分主要就是介绍了三个方面:1 主从复制:PSYNC命令,完全重同步与部分重同步2 哨兵模式:哨兵系统的建立,故障检测,故障转移3 集群模式:集群节点的基本数据结构;槽指派;集群命令的执行过程;重新分片(ASK错误与ASKING命令);复制与故障转移...

2022-04-05 19:52:52 913

原创 Redis单机数据库实现

根据《Redis设计与实现》复习时总结的思维导图,针对的第二部分——单机数据库的实现这一部分主要总结了以下几个点1 redis数据库的结构redisserver -> db[] -> redisDb -> keys(键空间dict)2 redis过期键,过期键存储在redisDb的expires字典中;然后还讨论了过期键的回收策略:惰性删除与定期删除3 redis持久化:RDB,AOF持久化,分别从文件格式,文件载入,文件写入与同步策略进行了总结...

2022-04-05 19:46:12 1498

原创 Redis数据结构与对象

最近复习Redis过程中整理总结的思维导图,均参考《Redis设计与实现》redis底层的数据结构有:简单动态字符串,双端链表,字典,跳跃表,整数集合,压缩列表我们在使用命令操作时,并不是直接操作的这些数据结构,而是操作的redis利用这些数据结构实现的redis对象,也就是我们常说的string,list,hash,set,zset...

2022-04-04 20:05:21 797

原创 MySQL加锁过程分析

目录1 MySQL加锁规则2 案例分析2.1 数据准备2.2 案例12.3 案例23 总结如何分析加锁最近在通过极客时间的专栏,MySQL45讲复习mysql,看完了锁的部分,结合原来看到《Mysql是怎样运行的书》,做了一些小总结1 MySQL加锁规则这里我们提到的加锁规则都是在隔离级别为可重复读的情况,具体规则如下:我们加锁的最基本的单位都是next-key lock,是对一个左开右闭的区间进行加锁这里注意next-key lock可以认为是一个复合锁,是record lock 和ga

2022-03-24 22:39:42 912

原创 Java并发编程—线程池

1 多线程存在的性能问题多线程虽然可以提高我们的并发量,提高硬件的使用率,但是也存在非常大的性能问题。主要有以下三点调度开销上下文切换:我们的线程数一般都是大于我们的CPU核心数的,所以操作系统就需要跟据一定的算法,给每个线程分配一定的时间片,当时间片用完后就调度其他线程的使用CPU资源。整体的过程如下所示CPU保存当前即将挂起线程的环境===>CPU找到并恢复即将开始的线程的运行环境以此类推,这样就可以进行线程的上下文切换,这个过程是非常耗费时间的。如果线程数目非常大,就存在非常多

2022-03-21 18:30:13 294

原创 对象的比较==,equals和compareTo

最近刷算法题的时候老是在这上边入坑,属于是很不细心了,记录一下这个错误。这三者的区别如下:== 比较的是两个对象的地址equals 比较是调用的对象的equals方法compareTo 是调用对象的compareTo对象的方法进行比大小遇见的坑:就是在做算法题的时候,我们集合中存的都是对象,当我们要把集合中的元素拿出来做一些比较时最好是不要直接用==,A对象 - B对象 > 0这样的判断,尤其是在等式的两边都是对象不是基本数据类型的时候(学JavaSE的时候这一点整的很明白,一

2022-03-19 15:54:09 347

原创 快速失败与安全失败

最近复习集合的时候复习到的两个概念,原来确实没接触过,前不久在项目中还碰到了相关的问题,那时只是了解了一下为会抛出java.util.ConcurrentModificationException异常。今天看到这个概念了就再次记录一下。首先明确一下,快速失败和安全失败都是针对迭代器来说的概念,下面是一些解析快速失败fast-fail现象:在使用迭代器遍历集合对象时,如果在遍历的过程中对集合中的元素进行了修改就会抛出ConcurrentModificationException异常原理:

2022-03-18 19:45:05 471

原创 Java并发编程—生产者消费者Java实现

这里写目录标题1 什么是生产者消费者模型2 通过BlockingQueue实现生产者消费者模型3 通过Condition实现4 通过监视器锁对象的方法实现1 什么是生产者消费者模型简单来说,生产者向一块固定的空间生产资源,消费者消费这个空间的资源,具体过程如下:生产者向一定大小的区域S生产资源,当S满时生产者阻塞消费者从S中获取资源,当S为空时,消费者被阻塞消费者在消费资源后会唤醒因S满而被阻塞的生产者生产者在生产资源后会唤醒因S空而被阻塞的消费者2 通过BlockingQueue实现生产

2022-03-17 18:56:52 668

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除