自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 git操作克隆无法访问

然后再看看http是否可以连接404不可以连接。然后查看dns域名解析器是否可以解析可以解析。首先ping看镜像源网络是否通畅。由于导入了镜像源无法访问。所以说是导入镜像源的问题。然后移除不必要的镜像源。

2025-01-19 19:48:15 588

原创 leetcode(hot100)22-28

用双指针思想,一个定义在A链表一个定义在B链表 这里要知道的是两个无论相交不相交链表指针走完两个链表的路程是相同的,所以设置一个循环 ,当两个指针不相等的时候循环,相等了就返回其中一个节点。解题思路: 双指针思想,做一个循环,当cur指针不为空指针时,先保存cur的下一个指针地址 因为反转后无法通过cur->next来查找cur的下一个地址,解题思路:先制作一个容器用来保存链表中的内容 然后用一个for循环来判断回文。解题思路:利用双指针,快慢指针,如果是环形那么快慢指针一定会相遇。

2025-01-17 10:59:28 333

原创 leetcode(hot100)18-21

做个标记,遍历这个矩阵对于0这一个下标的行和列分别做标记,然后用两个for循环让这一行和这一列都置为0。解题思路:找到四个边界 left right top bottle 这道题和螺旋矩阵2的思想一样。用一个while循环来进行循环 循环条件是i>=0 && j<列。从右向左,否则进入下一个循环从右向左,找一个中间站tmp来存储需要旋转的值;找到底角,然后一个向上搜素一个向右搜索。这道题可以考虑用二叉树的思想来做,否则进入下一个循环从上至下,否则进入下一个循环从下至上,

2025-01-13 15:09:35 262

原创 leetcode(hot100)13-17

首先排序 二维数组排序只排第一列 然后 result.back()[1] = max(result.back()[1],right);由于轮转 n 次等于没有轮转,轮转 n+1 等于轮转 1 次,依此类推,轮转 k 次等于轮转 kmodn 次。主要思路利用前缀和 然后前缀和sum-minsum等于最终的结果 minsum怎么求呢 minsum=min(minsum,sum)解题思路:将数组视为哈希表 我们将所有1到n范围内的数放入哈希表中,也可以得到最终的答案。解题思路:前缀和 动态规划。

2025-01-13 13:34:06 346

原创 leetcode(hot100)10、11、12

这道题哈希表所采用的思想和两数之和用相同的方法 前缀和就相当于两数之和的和 然后从哈希表中去寻找sum-k的值 找到的值就是结果,首先将哈希表的键置0值置为1因为如果sum-k刚好等于0那这个时候怎么办。首先想一想滑动窗口的大概思路,然后按照滑动窗口的框架来写 dp中主要存储的是下标,保持队列单调递减,当加入的值小于dp中的值时用pop_back,更新最小窗口长度和起始位置 收缩窗口,移动左指针 如果某个字符的频率不再满足 t 中的要求,减少 valid。解题思路:使用一个双端队列deque。

2025-01-13 11:29:40 437

原创 Webserver(定时器实现)

我们的服务器程序中往往需要处理众多的定时事件,因此有效的组织定时事件,使之能在预期时间内被触发且不影响服务器主要逻辑,对我们的服务器性能影响特别大。服务器主循环每建立一个连接则为该连接创建一个定时器节点,插入到最小堆中,主循环通过GetNextTick清除超时的节点,关闭对应连接,释放连接资源,然后获取最先要超时的连接的。只有堆顶定时器的时间到了,才会到其他时间较晚的定时器的时间。然后,再次从剩余的定时器中找出超时时间最小的一个(堆),并将这段最小时间设置为下一次定时任务处理函数的定时值。

2025-01-06 14:17:30 349

原创 leetcode(hot100)8、9

用滑动窗口来解决 然后返回滑动窗口左指针。首先遍历p的所有字母,保存在一个数组中(下标表示字母,值表示字母出现的次数),然后处理s的数组,判断左指针是否小于0 即确定窗口大小是否符合标准标准了,符合标准之后就是比较两个数组是否相等 相等就是放入结果中。解题思路:看到重复用哈希表 本题用哈希表和滑动窗口滑动窗口用两个指针表示, 哈希表用来存储无重复的值,如果遍历哈希表找到了则说明这是重复的 需要移动这个窗口 滑动窗口向右移(用while循环),然后插入这个值,最终取最大的长度。然后在分为两种情况来考虑。

2025-01-06 14:06:09 503

原创 leetcode(hot100)6、7

利用双指针不断向中间移动,然后通过动态更新leftmax和rightmax,当左指针最大高度小于右指针最大高度就左移反之就右移。较大的一边还有可能影响后续柱子的储水量,所以暂时不移动。解题思路:先排序再利用双指针思想然后再去重处理。如果 leftmax < rightmax,说明。当前柱子的储水量取决于较小的一边。考虑-1,-1,2这种情况。

2025-01-05 14:05:56 475

原创 leetcode(hot100)5

双指针思想,首先计算当前面积,然后更新最大容量。移动指针的条件就是当左边高度小于右边了就左指针向右移 反之右指针向左移。如果左侧高度 height[i] 小于右侧高度 height[j],移动左指针 i++,如果右侧高度 height[j] 小于或等于左侧高度,移动右指针 j--。解题思路:(感觉用到了贪心)

2025-01-05 13:40:15 470

原创 leetcode(hot100)4

还有一种解法就是利用while循环双指针条件,当不为0就两个指针一起移动 ,为0就只移动右指针。不为0时交换左右数值,为0就不交换了。解题思路:双指针思想 利用两个for循环,第一个for循环把所有非0的全部移到前面,第二个for循环将指针放在非0的末尾全部加上0。

2025-01-05 13:20:24 342

原创 leetcode(hot100)3

解题思路:本题用的是unordered_set,只需要集合就行 set存储的数据不能重复,将所有的数据都存储在set中,然后寻找验证它是不是开头(通过寻找num-1),然后验证它的下一个数存不存在,存在结果就加一,数字也加一,不存在就跳过。

2025-01-03 19:17:25 281

原创 leetcode(hot100)

所以这个设置一个这样的map容器,然后将strs中的字符串先排序 排完之后放入map中,这样map中的键对应的是一个排序好的字符串,map中的值对应的。是一个原始的字符串,是一堆字符串,因为map的键不可以重复但是值可以重复。然后设置一个二维动态数组容器,将map中的值放入容器中。这两个的区别是一个只能存储单一的string类型 一个可以存储一个字符型容器。

2025-01-03 16:23:09 309

原创 leetcode(hot100)1

解题思路:首先想到用一个键值对哈希表来存储数值和下标,map的键对应的是数组的值,map的值对应的是数组的下标,这样当有数组值重复的时候只需要覆盖掉然后获取最新的下标就可以了。然后用一个循环来循环这个数组,先把不符合的值放在map里面 然后再寻找符合target - nums[i]的值。符合就返回,不符合就继续放入map中。

2025-01-03 15:48:59 440

原创 webserver的http实现

当这个过程中,出现多个请求,第一个请求会带有请求头信息,前面一个请求的发送的报文如果没有满时,会把后面一个请求的内容填上,这个操作就叫。get的参数是显式的,get的参数会附加在url之 中,以 “?在生成的响应报文中并没有返回消息的具体内容,文件也并不在缓冲区,因此传输的时候采取分块写的方式,一块传输buff里面的内容,另一块传输内存映射的文件指针。传统的控制流程都是按照顺序执行的,状态机能够处理任意顺序的事件,并能提供有意义的响应--即使这些事件发生的顺序和预计的不同。

2025-01-02 19:41:39 984

原创 MySQL数据库(日志)

把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog=1的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binog 写磁盘成功,就算 redo log 的状态还是prepare 也没有关系,一样会被认为事务已经执行成功;:在事务提交之前,将事务所做的修改操作记录到redo log中,然后再将数据写入磁盘。

2025-01-02 18:42:03 870

原创 MySQL数据库(锁)

当在数据量非常大的数据库表执行 update 语句时,如果没有使用索引,就会给全表的加上 next-key 锁, 那么锁就会持续很长一段时间,直到事务结束,而这期间除了 select ... from语句,其他语句都会被锁住不能执行,业务会因此停滞。那么有了「意向锁」,由于在对记录加独占锁前,先会加上表级别的意向独占锁,那么在加「独占表锁」时,直接查该表是否有意向独占锁,如果有就意味着表里已经有记录被加了独占锁,这样就不用去遍历表里的记录。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

2024-12-25 21:37:56 1064

原创 MySQL数据库八股(事务)

假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取数据,然后继续执行代码逻辑处理,在这过程中如果事务 B 更新了这条数据,并提交了事务,那么当事务 A 再次读取该数据时,就会发现前后两次读到的数据是不一致的,这种现象就被称为不可重复读。事务是由mysql的引擎来实现的,我们常见的innoDB引擎它是支持事务的。,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。

2024-12-25 15:05:40 1062

原创 MySQL数据库(索引)

删除节点的时候非常复杂,比如删除根节点中的数据,可能涉及复杂的树的变形,B+ 树的插入也是一样,有冗余节点,插入可能存在节点的分裂(如果节点饱和),但是最多只涉及树的一条路径。B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。使用前缀索引是为了减小索引字段大小,可以增加一个索引页中存储的索引值,有效提高索引的查询速度。

2024-12-24 14:57:51 913

原创 操作系统(锁)

死锁是指的多个线程或者进程被同时阻塞,它们又都在等待某个资源被释放,由于进程/线程被无限期阻塞,因此程序不可能正常的运行。互斥:资源必须处于非共享模式,即一次只有一个进程可以使用,如果另一进程申请该资源,那么必须等到该资源被释放为止。占有并等待:一个进程至少占有一个资源,并在等待另一资源,而该资源被其他的进程所占有。非抢占:资源不能被抢占,只能在持有资源的进程完成任务后,该资源才会被释放。循环等待:p2进程等待的资源被p1占有,p1等待的资源被p2所占有,这种情况。预防:避免死锁的问题就是破坏其中一个条件就

2024-12-23 17:47:06 309

原创 操作系统(内存管理)

虚拟内存:是操作系统提供给每个运行中程序的一种地址空间,每个程序在运行时认为自己拥有的内存空间就是虚拟内存,其大小可以远远大于物理内存的大小。虚拟内存通过将程序的地址空间划分成若干个固定大小的页或段,并将这些页或者段映射到物理内存中的不同位置,从而使得程序在运行时可以更高效地利用物理内存。物理内存:是计算机中实际存在的内存。内存条。

2024-12-23 17:45:55 1083

原创 操作系统八股(进程管理)

僵尸进程:子进程已经终止,但是父进程仍在运行,且父进程没有调用wait等函数用来示范子进程所占用的资源,导致子进程的pcb还在系统中,但无法进一步使用。避免此情况的发生需要调用wait和waitpid来回收子进程。孤儿进程:一个进程的父进程已经终止或者不存在,但是该进程还在运行。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。

2024-12-22 10:36:07 715

原创 计算机网络(网络层)

客户端首先发起 **DHCP 发现报文(DHCP DISCOVER) **的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址。,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;

2024-12-21 15:18:19 988

原创 计算机网络八股(传输层)

这样设计的目的是为了。例如:发送方和接受方端建立TCP连接的时候,接受方告诉发送方“我的接收窗口,rwnd= 400”,这时候发送方的发送窗口发送的数据报总大小不能超过接收端给出的接收窗口的数值,这个数值的单位是字节,而不是报文段。不过,即使是在这种场景下,只要连接的是不同的服务器,端口是可以重复使用的,所以客户端还是可以向其他服务器发起连接的,这是因为内核在定位一个连接的时候,是通过四元组(源IP、源端口、目的IP、目的端口)信息来定位的,并不会因为客户端的端口一样,而导致连接冲突。

2024-12-16 13:29:16 2119

原创 webserver log日志系统的实现

同步日志,日志写入函数与工作线程串行执行,由于涉及到I/O操作,当单条日志比较大的时候,同步模式会阻塞整个处理流程,服务器所能处理的并发能力将有所下降,尤其是在峰值的时候,写日志可能成为系统的瓶颈。在write_log()函数内部,通过isasync变量判断写日志的方法:如果是异步,工作线程将要写的内容放在阻塞队列中,由写线程在阻塞队列中取出数据,然后写入日志:如果是同步,直接写入日志文件。如果没有加锁,可能会在读取队列状态时,另一个线程修改队列,导致读取到不一致的状态。

2024-12-14 11:03:41 2199

原创 webserver buffer类的实现

然后因为缓冲区的大小是固定的大小,但是et模式需要一次性将数据全部读取到缓冲区,那么就有可能装不下这些数据,如果将缓冲区设置的过大就会导致缓冲区的利用率很低,所以这时候需要临时创建一个缓冲区来环节,将存不下的放到临时缓冲区,这样就可以一次性将所有的数据读入,这里利用的临时缓冲区的计数是一个分散读的计数,即将数据分散读取到内存中不同的位置,然后在使用append将两块内存中的数据拼接到一起。我们以vector容器作为底层实体,在它的上面封装自己所需要的方法来实现一个buffer缓冲区,满足读写的需要。

2024-12-12 21:06:04 1105

原创 计算机网络八股(http篇)

请求头部中的 If-Modified-Since:当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;客户端发起的请求,必须使用的是奇数号 Stream,服务器主动的推送,使用的是偶数号 Stream。

2024-12-10 16:27:16 714

原创 Webserver 数据库连接池的实现

系统无法根据不同模块的需求创建独立线程池,线程池通常在一个系统里可以应用于不同的场景,不同的任务类型 所以不需要设置成单例模式,但是连接池不一样,连接池的话它是一个稀有资源的,创建连接池的开销比较大,连接池的大小具有全局性的,如果有多个可能会重复创建连接,浪费资源。线程池的线程通常是 长时间存活 的,不同于数据库连接池的连接,线程池的线程是为了长期使用而存在的。在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,更加安全可靠。

2024-12-09 14:22:16 1952

原创 Webserver 线程池详解

主要启动线程池 构造函数 主要用来初始化线程池,创建工作线程并分配资源 确保线程池具备处理任务的能力。Append函数主要是向任务队列中添加任务,确保任务能够被工作线程执行,控制队列容量。主要是释放线程池的资源,防止内存泄漏,回收线程池所分配的内存资源。这是线程的实际任务处理逻辑,线程会不断从任务队列中获取任务并执行。作为线程的入口函数,由 pthread_create 调用。每个线程执行 worker,启动线程池中的任务处理逻辑。一个是线程管理 : 线程数量,线程池的数组。

2024-12-07 11:49:02 544

空空如也

空空如也

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

TA关注的人

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