- 博客(44)
- 收藏
- 关注
原创 TCP三次握手四次挥手
TCP是一种面向连接、可靠的传输层协议,通过三次握手建立连接,确保数据有序传输。其头部包含序列号、确认应答号等字段,解决网络乱序和丢包问题。TCP通过四元组(源/目的IP和端口)唯一标识连接,最大连接数受文件描述符和内存限制。相比UDP,TCP更可靠但开销更大,适用于文件传输等场景。三次握手的主要目的是防止历史连接、同步序列号和避免资源浪费。MSS的设置是为了避免IP分片,提高传输效率。
2025-06-01 21:55:08
829
原创 GC垃圾回收
Go语言的垃圾回收(GC)机制经历了多次优化,从早期的标记-清除算法到V1.5的三色并发标记法,再到V1.8的混合写屏障机制,逐步减少了STW(Stop The World)对程序性能的影响。V1.3之前的标记-清除算法需要暂停程序进行标记和清除,导致程序卡顿和堆碎片问题。V1.5引入的三色并发标记法通过将对象分为黑、灰、白三色,减少了STW时间,但仍需在标记开始时暂停程序。为了解决并发标记过程中可能出现的对象丢失问题,引入了插入屏障和删除屏障机制,确保黑色对象不会直接引用白色对象。V1.8进一步优化为混合
2025-05-11 21:52:15
937
原创 MySQL事务篇
事务特性:原子性、一致性、隔离性、持久性并发事务执行引发问题:脏读、不可重复读、幻读四种隔离级别:读未提交、读提交、可重复读、串行化隔离级别越高性能越差针对快照读,使用MVCC针对当前读,使用纪录锁+间隙锁可重复读和读提交都是通过ReadView实现的,创建时机不同读提交每个select都会生成一个ReadView,事务期间多次读取同一个数据,前后两次读的数据可能会出现不一致可重复读时启动事务时生成一个ReadView,整个事务期间都用这个ReadView。
2025-04-27 11:35:25
653
原创 defer关键字
到遇到panic时,遍历本协程的defer链表,并执行defer。在执行defer过程中,遇到recover则停止panic,返回recocver处继续向下执行。没有遇到recover,遍历完本协程的defer链表后,向stderr抛出panic信息。在没有defer的情况下,其实函数的返回就是与return一致的,但是有了defer就不一样了。因为第一个执行的defer中的异常语句会覆盖main中的异常,然后被第二个执行的defer捕获。:return之后的语句先执行,defer后的语句后执行。
2025-04-13 22:14:47
459
原创 操作系统内存管理
1G的内存,游戏占用了512MB,浏览器占用了128MB,音乐占用256MB.如果我们关闭浏览器空闲内存为256MB.但是如果这个256MB不是连续的,这就会导致没有空间再打开一个200MB的程序。单片机的CPU直接操作内存的物理地址,这就导致在内存中同时运行两个程序是不可能的,有可能会出现第一个程序在2000的位置写入新的值将会擦掉第二个程序存放在相同位置上的内容。,并且操作系统会提供一种机制将不同进程的虚拟地址和不同内存的物理地址映射起来。:1.保存在段寄存器中2.最重要的是包含段号–用作段表的索引。
2025-04-05 22:11:23
302
原创 GMP调度模型
比如当G中包含创建新协程的时候,M创建了G’,为了继续执行G,需要把G’交给M‘执行,也就造成了很差的局部性,因为G’和G是相关的,最好放在M上执行,而不是其他的M‘。时启动程序后的编号为0的主线程,这个M对应的实例会在全局变量runtime.m0中,不需要在heap上分配,M0负责执行初始化操作和启动第一个G,在之后M0就和其他的M一样了。假设每个P的本地队列只能存3个G。G2在创建G7的时候,发现P1的本地队列已满,需要执行负载均衡(把P1中本地队列中前一半的G,还有新创建的G转移到全局队列)
2025-03-29 22:13:49
1095
原创 dockerSDK-Go语言实现
本文基于开发一个在线代码运行平台的项目需求上,所以需要挂载目录以达到获得执行文件的目的。首先在docker-compose 文件中,当前容器一定要跟宿主机的套接字进行挂载。创建docker客户端。
2025-03-21 21:56:46
614
原创 Redis大key
由于大key的value很大,执行读取时可能阻塞线程,这样Redis整体的每秒查询率会下降,并且客户端超时会增加,网络带宽会上涨,配置这些报警监控有助于我们发现大key的存在。大key的定义与value的大小和元素数量有关,但这个定义并不是绝对的,而是相对的,具体取决于系统的使用场景和性能要求。2.阻塞请求:对大key的操作可能耗时过长,阻塞redis单线程,影响其他请求的响应时间。3.网络阻塞:读取大key时,返回的数据包过大,可能占满网络带宽,影响其他服务通信。
2025-03-01 21:58:20
1015
原创 计网-数据链路层
1.如图所示,主机A,B,C,D,E通过一根总线进行互连,主机A要给主机C发送数据,代表帧的信号会通过总线传输到总线上的其他各主机,那么主机B,D,E如何知道所收到的帧不是发送给她们的,主机C如何知道发送的帧是发送给自己的。这是因为在网络层要讨论的是多个网络互连的问题,是讨论分组怎么从一个网络,通过路由器,转发到另一个网络。(在发送前采用零比特填充法,对数据部分进行扫描,每5个连续的比特1后面就插入1个比特0,这样就确保了帧定界在整个帧中的唯一性,)接收方主机收到有误码的帧后,不会接收改帧,将其丢弃。
2025-02-16 17:26:42
779
原创 解数独力扣
2.每到一个位置如果为空,for循环遍历1-9,通过函数判断是否能放这个数字能放开始回溯判断放下这个数字之后。3.不设结束条件,一直循环判断下去知道所有位置全部填满数字然后return true表示找到解。1.双层循环每一个位置都要去判断能不能放数字。
2025-01-25 21:17:11
285
原创 Go 语言 select 的实现原理
select是Go在语言层面提供的I/O多路复用的机制,其专门用来让Goroutine同时等待多个channel是否准备完毕:可读或可写。在Channel状态改变之前,select会一直阻塞当前线程或者goroutine。特性:case 必须是一个通信操作,主要是指对通道(Channel)进行发送或者接收数据的操作。select 语句中除 default 外,各 case 执行顺序是随机的。select 语句中如果没有 default 语句,则会阻塞等待任意一个 case满足执行条件。
2025-01-18 15:11:53
999
原创 Golang 反射
在这个例子中,Serialize函数接受一个interface{}类型的对象,通过反射获取对象的类型是结构体后,遍历结构体字段。根据字段类型将字段值转换为字节切片并拼接起来,实现简单的序列化。形式)和函数参数列表。通过反射获取函数的值对象,将参数转换为反射值对象后,使用。这里展示了如何在不知道函数具体类型的情况下,通过反射来调用函数。函数用于动态地调用一个函数。方法来调用函数,并返回函数调用的结果(以。
2024-11-24 15:34:34
623
原创 Golang defer关键字
第一个例子中,当defer语句被执行时,它都会捕获t当前值的副本,并不是t的地址。由于t是在循环遍历的,每次迭代都会创建t的副本,而不是t的地址。由于t是在循环中逐一遍历的,每次迭代都会创建t的新副本。因此当main函数结束时,defer语句会按照后进先出的顺序执行,但是每个defer调用都会打印循环结束时t的最终副本,即“c”。当defer调用Close(t)时,它传递了t的当前值的副本给Close函数。这意味着每个defer调用都捕获了循环中t的当前值的副本。调用都会创建额外的栈帧。
2024-11-17 22:59:50
668
2
原创 goroutine 介绍
并发和并行的根本区别是:并发在同一时间段内一起执行,而并行强调同一时刻开始执行。线程比如打开腾讯视频然后开始下载多个视频,下载任务就是线程。但是这并不是同时进行的,只是时间片比较短切换的比较快。
2024-11-10 18:00:00
437
原创 Golang文件操作
/创建一个新文件,写入内容5句“hello,Gardon”//1.打开文件file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666)//0666在windows下面没有作用if err!= nil{return//关闭文件//准备写入五句话“hello,Gardon”//写入时,使用带缓存的 *Writerfor i := 0;i < 5;i++{
2024-11-02 15:51:40
807
原创 组合总和II
跟组合总和另外两道题最明显的不同是给定数组里有重复元素,那么就要保证生成的结果集内没有重复结果,可以在递归函数中增加一个判断,判断当前循环的元素与上一个元素是否相等。抽象来说就是当上一个元素的深度遍历结束开始右移对下一个元素进行深度搜索是判断这两个元素是否相同。
2024-10-24 16:15:11
232
原创 回溯--组合(Go)
在一次循环中,先将1加入path切片。第一步先判断path切片的长度是否等于题目要求的k,若相等就结束此次循环。不相等下一步进入for循环先判断在这一分支中加上所有剩下的数是否小于k,若小于k则这个分支永远不满足题目要求立即结束(即剪枝),也就是图片中数字4这一分支。将这次的数加入path分支进入回溯,回溯符合要求结束本次回溯之后,path切片弹出2,下次循环加入3。看了代码随想录中关于这道题的视频解析,首先就是将这几个数按顺序依次列出这个数的树形结构。
2024-10-21 14:35:51
176
原创 gin框架下token令牌验证
作者的项目token里包含了用户的账号密码及角色,大家按需来定义// Claims Token结构体Username string `json:"username"`//账号Password string `json:"password"`//密码Role string `json:"role"`//角色jwt.StandardClaims //内置结构体,包含token令牌本身的信息我定义的密钥长度为七// 定义密钥。
2024-09-25 16:07:29
511
原创 计网第一章完结
TCP/IP协议的网络接口层没有具体内容是可以互连全世界各种不同的网络接口例:(有线的以太网接口,无线电WiFi接口),所以TCP/IP结构在本质上只有上面的三层。计算机主机和服务器包含TCP/IP的所有协议,操作系统含有完整的体系结构,而路由器的最高层为网际层,只包含网际层和网络接口层。协议三要素:语法→定义所交换信息的格式,语义→定义通信双方所要完成的操作,同步→定义通信双方的时序关系。帧的’类型‘字段、IP数据报的‘协议字段’,TCP报文段或UDP用户数据段的“端口号”字段都是SAP。
2024-08-04 21:49:23
429
1
原创 Goland 通道
channel本质是一个数据结构-队列【示意图】数据是先进先出线程安全,多goroutine访问时,不需要加锁,channel本身是线程安全的channel是他有类型的,一个string类型的channel只能存放string类型的数据。
2024-07-13 15:08:11
468
原创 计网(1.1~1.4)
网络:由若干结点和连接这些结点的链路组成互联网:多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,也可 被称为“网络中的网络因特网是世界上最大的互连网络计算机网络的精确定义并未统一计算机网络的简单定义:一些互相连接的、自治的计算机的集合互连是指计算机之间可以通过有线或无线的方式进行数据通信自治是指独立的计算机,它有自己的硬件和软件,可以单独运行使用集合是指至少需要两台计算机。
2024-07-12 21:34:52
647
原创 go mod相关知识点
在 Go Module出现之前,Go语言的依赖管理方面已经推出了GOPATH和vendor,它的出现解决了GOPATH无法让多个项目共享同一个package的不同版本和vendor无法很好的管理依赖的package等问题。这种分离的设计使得go.mod文件可以灵活地修改和更新以来信息,而go.sum文件则保证了每次构建时使用的确切依赖版本和安全性。go.sum则是自动生成的文件,记录了具体版本和哈希值,以保证构建时的版本一致性和安全性。go mod 是Go语言的依赖管理工具,很大程度上简化了依赖的管理。
2024-06-24 00:17:12
214
原创 切片与底层数组的关系
diySlice3与diySlice共享同一个底层数组,而且即使切片的长度小于其容量,仍然可以访问底层数组中超出切片长度范围的元素,此时底层数组的元素为8和1,所以diySlice[0:2]的结果为8和1。diySlice的容量在make时已经定义为2,长度为切片中元素的个数即为1。另外开辟一个新的底层数组,将diySlice2的元素迁移过去,此时diySlice2和diySlice不再共享同一个底层数组,修改diySlice2中的值不会影响diySlice的值。
2024-06-02 18:04:28
377
原创 Golang----切片
最后,切片的引用会指向新的底层数组,原数组会被垃圾回收。当切片是截取已定义数组而定义时,切片是数组的一个引用,修改切片的值会直接修改数组的值。当直接通过make定义切片或直接声明切片时,切片的底层数组对程序员是不可见的,只能通过切片操作底层数组。总的来说,Go的设计者不断优化切片扩容的机制,其目的只有一个:就是控制让小的切片容量增长速度快一点,减少内存分配次数,而让大切片容量增长率小一点,更好地节省内存。Go 中切片的扩容机制是基于动态数组的,这意味着切片的底层数组会动态调整大小以适应元素的增加。
2024-06-02 16:55:30
916
1
原创 go build -o 文件名.exe 时出现找不到包的情况解决办法
在go语言下载之后,一般就去配置GOROOT和GOPATH,但是此时黑窗口运行第一个helloworld时往往会报错,经过搜索我发现是因为go.mod跟GOUROOT和GOPATH发生冲突,然后就把go.mod删除了。但是在黑窗口运行需要导入第三方库的代码时就会报错,显示找不到文件路径。就是删除GOROOT和GOPATH(确保删除干净),然后在需要go build的文件路径下 使用如下命令。打开GoModule,然后就可以成功运行go build -o 文件名.exe。
2024-05-09 15:48:56
671
1
原创 并发安全的sync.Map
1.sync.Map是线程安全的,读取,插入,删除也都保持着常数级的时间复杂度。2.通过读写分离,降低锁时间来提高效率,适用于读多写少的场景。3.Range 操作需要提供一个函数,参数 是 k,v ,返回值是一个布尔值:f func(key,value interface{}) bool。
2024-05-08 18:13:10
1406
1
原创 Golang有关Map知识点
哈希冲突是指不同的值通过哈希计算被分到相同的bucket例:解决哈希冲突的方法:Golang的map采用链地址来解决这个问题,即在同一个位置存储一个键值对链表。当发生冲突时,新的键值对会被添加到这个链表的末尾。产生冲突往往跟关键字的比较次数密切相关,产生的冲突少查找的效率就高。
2024-05-07 10:21:11
405
1
原创 VirtualBox光盘莫名消失,出现一个...GB卷下载的东西全出现在了那里解决办法
打开虚拟电脑出现了这个界面,然后之前安装的hadoop和java所在的文件目录全都不见了,光盘也不见了,试着搜了一下光盘莫名其妙不见,找到了一篇试了下,之前的虚拟电脑又回来了!------来源于一篇解决下载安装光盘后打开虚拟电脑光盘没出现解决办法的帖子。
2024-04-09 15:21:57
665
1
原创 洛谷P8772求和(Java)
记Sn为全部前n项和,这道题通过对式子变换可以得到S=(Sn-an)*an+(Sn-1-an-1)*an-1+.....+(S2-a2)*a2。举例:1 3 6 9。
2024-03-20 16:52:11
373
1
原创 198.打家劫舍Java版
通过循环使新数组的第三个元素即以后的元素都等于原有数组隔一个数相加和中间数的最大值。设新数组名字为ex,即ex[i]=Math.max(ex[i-2]+nums[i-1],ex[i-1]).其中由于新数组要比原有数组多一个长度,所以ex中下标为i的数值对应应该加nums数组中下标为i-1的数值。刚开始一点思路都没有就去找了视频和题解,然后大致看了一眼开始自己写,首先要先把数组为空,数值是0的情况和长度为1的情况挑出来,然后在写的过程中我发现长度为2的数组情况也很特殊,因此先把这些特殊情况挑出来。
2024-02-18 21:39:55
391
1
原创 移动零元素
定义一个j=0,然后一个循环遍历判断当前元素是否为0,然后使每个非零元进入nums[j++]的位置,此时经过循环新的nums数组权威非零元素,按照原来nums数组的长度在现在nums数组末位添0。题目描述:给定一个数组,把里面的零元素移动到数组的末位,同时保证非零元素的相对位置。一层循环查找每个元素是否为0,二层循环把0元素往后移动到数组末位。二:根据零元素个数在末位添零。
2024-01-23 18:01:24
430
原创 双指针字符串1768
1.获取两个字符串的长度,然后采用一个循环,条件是循环变量小于word1和word2的长度,两个if语句根据先后顺序执行当i>word1的长度时不执行第一个if语句!开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。题目描述:给你两个字符串。
2024-01-21 15:03:30
414
2
原创 P1909 [NOIP2016 普及组] 买铅笔Java
根据题目描述,可以把三种铅笔的价格存入一个长度为3的一维数组中,通过循环将不同种类的铅笔的个数及价格输入,再把P老师买这种铅笔所需钱数存入数组中,然后使用数组排序(默认为升序)进行排序,输出下标为-1的值即为所需最少花费钱数。
2023-12-10 16:38:05
203
1
原创 maven新建Java类报错Error occurred during initialization of boot layer
在这个地方添加--module-path "D:\jdk\FX\javafx-sdk-21\lib" --add-modules javafx.controls,javafx.fxml,刚开始新建类也是报这种错但是没有记录,在连接数据库的时候又出现了这个错误,声明一下我并不知道这个错误只是记录一个解决办法。刚才又实验发现,不添加程序实参只把VM那个选项取消也是可以成功运行的!上面显示找不到放置Java模块依赖,把这个选项取消点击确定页面发生变化。
2023-10-19 11:18:45
322
原创 JavaFX通过按钮点击在一个舞台上切换不同场景
JavaFX项目在刚开始创建时有两个类,一个是HelloApplication另一个是HelloController其中HelloApplication用于写各种方法并绑定不同的FXML文件,HelloController控制类处理用于控制FXML文件中的UI元素和处理逻辑。本文使用图书管理系统部分代码去展示不同。
2023-10-11 09:20:24
642
1
原创 MySQL约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCES 主表(主表列名);[CONSTRAINT][外键名称] FOREING KEY (外键字段名) REFERENCES 主表(主表列名)约束时作用于表中字段上的,可以在创建表/修改表的时候添加约束。概念:外键用来让两张表的数据之间进行连接,从而保证数据的一致性和完整性。概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。用于对输入的数据进行限制,以满足对数据的要求。
2023-10-01 09:15:39
77
1
原创 MySQL多表查询
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。联合查询-union,union all:把多次查询的结果合并起来,形成一个新的查询结果集。子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。子查询:SQL语句嵌套SELECT语句,称为嵌套查询,又称子查询。自连接查询,可以是内连接查询,也可以是外连接查询。子查询返回的结果是一列(可以是多行),这种子查询成为列子查询。
2023-09-23 15:57:17
67
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人