- 博客(37)
- 收藏
- 关注
原创 项目日记---高并发内存池整体框架
这整个三层结构的设计是十分巧妙的,在线程缓存中是不需要加锁的,因为每个线程独享这个结构,这也是这个项目比较快的原因之一,在中心缓存中也不需要完全加锁,而是使用桶锁,只有当不同的线程进入到同一个桶时才会有锁互斥!
2025-08-03 22:28:09
476
原创 项目日记---定长内存池实现
malloc其实是一个通用的内存池,在任何场景下都可以使用,但这也意味着在大部分场景下它都不会是最高效的,malloc的通用性注定了这种情况的发生。本期实现的定长内存池则是针对固定大小内存块的申请和释放而设计的内存池,由于定长内存池只需要支持固定大小的内存块的申请和释放,因此我们可以将其性能提升,同时在实现定长内存池的时候也不需要考虑内存碎片的问题,因为申请和释放的内存块是固定大小。我们可以通过实现定长内存池来熟悉一下对简单内存池的控制,其次,这个定长内存池后面会作为高并发内存池的一个基础组件。
2025-07-30 14:56:41
835
原创 项目日记---高并发内存池项目介绍
在说内存池之前,我们得先了解一下“池化技术”。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己进行管理,以备不时之需。我们在学习linux的时候学习过进程池和线程池,为了不平凡的创建和销毁进程或线程,我们提前申请了一批进程或线程,使用的时候直接用就好,任务完成后线程返回线程池等待下一个任务到来避免了频繁的创建和销毁带来的损耗。所以内存池在这里的思想也类似。内存池是指程序预先向操作系统申请一块足够大的内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;
2025-07-29 11:19:16
831
原创 有序数组中出现次数超过25%的元素
给你一个非递减的整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。请你找到并返回这个整数6题目解析:有序数组,找到其中出现次数大于数组长度1/4的数返回解法思路:解法一:因为数组有序,所以直接遍历一次用len变量记录每个数出现次数,如果大于1/4则返回,时间复杂度O(N)解法二:将数组以25%为单位分为4个部分,因为有序,所以相同的数会连续出现,又因为题目说一定有一个数出现频率大于25 %,所以这4部分的三个连接点25%、50%、75%一定会有答案出现。
2025-07-23 21:50:37
222
原创 统计公平数对的数目
给你一个下标从开始、长度为n的整数数组nums,和两个整数lower和upper,返回。如果(i, j)数对满足以下情况,则认为它是一个6共计 6 个公平数对:(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5)。1只有单个公平数对:(2,3)。
2025-07-23 21:37:04
279
原创 二分查找:区间内查询数字的频率
请你设计一个数据结构,它能求出给定子数组内一个给定值的。子数组中一个值的指的是这个子数组中这个值的出现次数。请你实现arrvalue一个指的是数组中一段连续的元素。指的是nums中包含下标left和right的中间一段连续元素。// 返回 1。4 在子数组 [33, 4] 中出现 1 次。// 返回 2。33 在整个子数组中出现 2 次。query105。
2025-07-21 20:52:03
297
原创 可获得的最大点数
几张卡牌,每张卡牌都有一个对应的点数。点数由整数数组cardPoints给出。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿k张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。给你一个整数数组cardPoints和整数k,请你返回可以获得的最大点数。12第一次行动,不管拿哪张牌,你的点数总是 1。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12。4无论你拿起哪两张卡牌,可获得的点数总是 4。55。
2025-07-17 15:06:39
342
原创 爱生气的书店老板
有一个书店老板,他的书店开了n分钟。每分钟都有一些顾客进入这家商店。给定一个长度为n的整数数组customers,其中是在第i分钟开始时进入商店的顾客数量,所有这些顾客在第i分钟结束后离开。在某些分钟内,书店老板会生气。如果书店老板在第i分钟生气,那么,否则。当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续minutes分钟不生气,但却只能使用一次。请你返回这一天营业下来,最多有多少客户能够感到满意。16。
2025-07-17 14:12:51
197
原创 长度为 K 子数组中的最大和
给你一个整数数组nums和一个整数k。请你从numsk返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回0。是数组中一段连续非空的元素序列。15nums 中长度为 3 的子数组是:- [1,5,4] 满足全部条件,和为 10。- [5,4,2] 满足全部条件,和为 11。- [4,2,9] 满足全部条件,和为 15。- [2,9,9] 不满足全部条件,因为元素 9 出现重复。- [9,9,9] 不满足全部条件,因为元素 9 出现重复。
2025-07-17 11:33:00
128
原创 几乎唯一子数组的最大和
给你一个整数数组nums和两个正整数m和k。请你返回nums中长度为k的子数组的,如果不存在几乎唯一子数组,请你返回0。如果nums的一个子数组有至少m个互不相同的元素,我们称它是子数组。子数组指的是一个数组中一段连续的元素序列。18总共有 3 个长度为 k = 4 的几乎唯一子数组。分别为 [2, 6, 7, 3] ,[6, 7, 3, 1] 和 [7, 3, 1, 7]。这些子数组中,和最大的是 [2, 6, 7, 3] ,和为 18。23总共有 5 个长度为 k = 3 的几乎唯一子数组。
2025-07-17 11:20:26
188
原创 每日一问--Linux--进程和线程、并行和并发、用户态和内核态
多个线程则是共享同一份进程地址空间,在Linux中,线程其实是轻量级进程,每个线程有自己的PCB结构,但是一个进程下的多线程共享同一份进程地址空间,所以线程的创建和销毁开销较小,线程间切换也只需保存少量上下文信息,线程切换开销更少。每个进程拥有独立的进程地址空间,所以进程的创建和销毁的开销会大,同时进程间切换也需要v保存更多上下文信息在寄存器里,因此进程间切换的开销也更高。线程是程序执行的最小单位,线程是进程的子任务,一个进程至少有一个线程,一个进程可以有多个线程,多线程共享这个进程的进程地址空间。
2025-07-17 10:53:40
216
原创 半径为 k 的子数组平均值
给你一个下标从开始的数组nums,数组中有n个整数,另给你一个整数k。nums中一个以下标i为且为k的子数组中所有元素的平均值,即下标在i - k和i + k范围(i - k和i + k)内所有元素的平均值。如果在下标i前或后不足k个元素,那么是-1。构建并返回一个长度为n的数组avgs,其中avgs[i]是以下标i为中心的子数组的。x个元素的是x个元素相加之和除以x,此时使用截断式,即需要去掉结果的小数部分。23152。
2025-07-13 21:18:54
329
原创 大小为 K 且平均值大于等于阈值的子数组数目
给你一个整数数组arr和两个整数k和threshold。请你返回长度为k且平均值大于等于threshold的子数组数目。3子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6。其他长度为 3 的子数组的平均值都小于 4 (threshold 的值)。6前 6 个长度为 3 的子数组平均值都大于 5。注意平均值不是整数。题目解析:计算长度大小为k的子数组的平均值,将平均值与threshold比较,返回平均值大于threshold的子数组的数目。
2025-07-13 20:40:32
168
原创 子数组最大平均数 I
给你一个由n个元素组成的整数数组nums和一个整数k。请你找出平均数最大且k的连续子数组,并输出该最大平均数。任何误差小于10-5的答案都将被视为正确答案。12.75最大平均数 (12-5-6+50)/4 = 51/4 = 12.755.00000题目解析:固定长度子数组计算平均值,取最大平均值返回。解法思路:暴力解法:计算每个长度为k的子数组的平均数,取最大返回,时间复杂度O(nk)。固定长度子数组,可以利用定长滑动窗口解法将时间复杂度降到最O(n)。1.入窗口2.判断3.出窗口。
2025-07-12 22:30:26
142
原创 定长子串中元音的最大数目
给你字符串s和整数k。请返回字符串s中长度为k的单个子字符串中可能包含的最大元音字母数。英文中的为(aeiou3子字符串 "iii" 包含 3 个元音字母。2任意长度为 2 的子字符串都包含 2 个元音字母。2"lee"、"eet" 和 "ode" 都包含 2 个元音字母。0字符串 s 中不含任何元音字母。1。
2025-07-12 21:54:07
202
原创 字母异位词分组
利用哈希表分组,以排序后的字符串位key值,排序前的字符串添加到对应的vector中作为value值,然后将所有的value整合起来返回。给你一个字符串数组,请你将 字母异位词 组合在一起。如aab、aba、baa,这三个词在排序后都是aab,所以他们是字母异位词。排序后是 aet 的字符串,排序前是 eat,tea,ate。如果两个字符串从小到大排序后相等,那么他们就是字母异位词。排序后是 ant 的字符串,排序前是 tan,nat。排序后是 abt 的字符串,排序前是 bat。
2025-07-11 11:06:42
143
原创 Linux多线程---线程池实现
线程池(Thread Pool)是一种多线程处理模式,用于管理和复用线程资源,避免频繁创建和销毁线程带来的性能开销。其核心思想是预先创建一定数量的线程,当有任务提交时,从线程池中获取可用线程执行任务,任务完成后线程不销毁而是返回线程池等待下一个任务。看完定义,你可能会觉得线程池和进程池好像很像,他们都是管理并发执行单元的技术,但是两者在实现机制,资源消耗和使用场景方面有很大差异。首先,线程池内的线程是共享进程地址空间的,线程切换开销很小,而进程池内的进程都有自己的独立空间,切换开销很大。
2025-06-08 11:31:40
705
原创 Linux进程间通信----简易进程池实现
我们首先实现几种不同的任务函数,利用回调函数的方式让我们的子进程随机执行任务,为了完成这一步我们利用数组将task(任务)函数用数组管理起来,形成任务清单,任务的发放方式也改为向管道内发送task函数数组的下标,即发放task清单序号,子进程根据从管道内收到的序号去执行清单上对应task。完成任务需要工作人员,在主任务执行的途中源源不断的有新的支线任务来临。进程池是一种多进程编程模式,核心思想是先创建好一定数量的子进程用作当作资源,这些进程可以帮助完成任务并且重复利用,避免频繁的进程的创建和销毁的开销。
2025-06-01 20:50:19
1093
原创 Linux进程间通信----管道
两个进程之间可以直接进行数据的传递吗?答案是不能,因为进程具有独立性,每个进程有独立的地址空间和资源,防止一个进程直接访问或干扰另一个进程的数据和状态,所以不能直接通信。
2025-05-28 16:23:39
1016
原创 Linux基础IO----动态库与静态库
库是由一些.o文件打包在一起而形成的可执行程序的半成品。如何理解这句话呢?首先,一个程序在运行前需要进行预处理、编译、汇编、链接这几步。
2025-05-26 17:10:47
838
原创 Linux基础IO---缓冲区----文件系统----软硬链接
在 Linux 的中,是用于暂存文件数据的内存区域,主要作用是减少磁盘 I/O 次数、提升读写效率。
2025-05-25 19:33:25
976
原创 Linux基础IO----重定向
上次我们谈到了FD文件描述符的分配规则:我们知道进程会默认打开三个文件流,stdin、stdout、stderr,他们的文件描述符分别是0、1、2此后我们再打开文件的话,被打开的文件的FD就会从3开始往后排。那么按照FD的分配策略,我们将对应显示器文件的stdout文件流关闭,然后在打开一个文件并进行像显示器输入的操作会发生什么呢?按照理论,stdout被关闭那么2的位置就空了出来,此时新打开的文件的FD就是2。代码试验关闭stdout:执行打印发现程序并没有打印信息打开一个文件再次尝试输出:我们发现输出消
2025-05-22 12:17:43
619
原创 Linux基础IO----C语言文件IO、系统文件IO
实际上,我们这里所说的当前路径不是指可执行程序所处的路径,而是指该可执行程序运行成为进程时我们所处的路径。
2025-05-20 12:41:40
898
原创 Linux编写简易shell--myshell
经过之前的学习,我们了解到进程概念和进程控制,对于进程程序替换我们通过编写小程序简易shell来加深理解。SHELL。
2025-05-19 20:37:22
592
原创 进程控制----进程创建、进程终止
main函数的返回值是进程的退出码,一般退出码为0表示执行成功。信号码非0的时候代表进程出现异常而退出,所以如果信号吗非0就无需在意退出码了,因为程序根本都没执行完,只需查看信号码。此时,内核会复制该内存页,为写入进程创建一个私有副本,并将新页标记为可写,而另一个进程继续使用原始页。fork之前父进程独立执行,fork之后,父子两个执行流分别执行。通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。2.函数的执行情况,成功还是失败,以及失败原因。
2025-05-16 21:13:06
588
原创 进程概念---进程地址空间
如图所示,这就剩进程地址空间的样子。进程地址空间是操作系统为每个进程分配的一块虚拟内存区域,它为进程提供了一个独立的、连续的内存视图。这个空间包括了代码区、数据区、堆区、栈区等,每个区域都有其特定的用途和访问权限。进程地址空间的存在使得每个进程都认为自己独占了整个系统的内存资源,而实际上,真正的物理内存是由操作系统通过页表里虚拟地址对物理地址的映射管理和调度的。程序代码在内存中的映射,存放函数体的二进制代码。在程序运行初已经对变量进行初始化的数据。在程序运行初未对变量进行初始化的数据。
2025-05-16 19:20:10
835
原创 进程优先级和环境变量
这些路径用 : 隔开,内部存着Linux的一些指令,这也是为什么这些系统指令可以不需要./ls 而是直接ls就可以使用的原因,ls等等其他指令和我们写的程序一样都是可执行程序,唯一的执行时唯一的区别就是不需要./ 操作,那么./操作代表的是什么呢?swap(&active,&expired)交换两个指针的内容,这样填满的“过期队列”就能够被CPU执行,空的“活跃队列”就能够接受新的进程,如此往复实现进程的调度。为了解决这个问题,我们可以看到图中第二部分过期队列,他的内容和上面的活跃队列几乎一样。
2025-05-14 16:38:38
1025
原创 进程的概念
课本观点:进程是程序执行的一个实例,一个正在执行的程序等内核观点:进程担当分配系统资源(CPU,内存)的实体我们平常写的代码在编译连接后会形成一个可执行程序,这个程序的本质是存储在磁盘里的文件。而我们运行程序的时候就是可执行程序从磁盘调度到内存,然后由内存交给CPU处理,所以当可执行程序加载到内存时,我们称这个程序为进程。简而言之就是运行起来的程序就是进程。运行起来的程序就是进程。
2025-05-13 14:57:17
814
原创 了解冯诺依曼体系结构
冯诺依曼体系结构是现代计算机的基础,由输入设备、输出设备、内存和CPU(包括运算器和控制器)组成。输入设备如键盘、鼠标,输出设备如显示器、声卡,而内存作为中间设备,协调CPU与外部设备的数据传输。内存的存在解决了CPU与外部存储设备速度不匹配的问题,提高了计算机效率。数据通过总线在设备间流动,内存作为缓冲,减少了CPU等待时间,提升了处理速度。冯诺依曼体系结构通过合理分配设备性能,实现了高效且成本可控的计算机系统。例如,在QQ聊天中,消息通过键盘输入,经内存和CPU处理,再通过网络传输到对方电脑,最终显示在
2025-05-11 21:03:18
775
原创 linux系统程序--进度条小程序实现
行缓冲的触发条件当标准输出连接到终端时,默认使用行缓冲模式。在这种模式下,遇到换行符\n或者调用fflush()函数,都会促使缓冲区的内容被输出到终端。缓冲区的作用缓冲区能够减少系统调用的次数,从而提高程序的运行效率。举个例子,如果有多次printf输出操作,这些输出内容会先在缓冲区里积累,等到满足刷新条件后,再一次性输出。
2025-05-09 21:05:00
969
2
原创 论坛系统项目测试报告
论坛系统测试报告 开源论坛系统黑盒测试报告 测试周期:2025.4.29-2025.5.4 联系邮箱:[email protected]项目概述……………………………………………………………………1测试范围…………………………
2025-05-03 12:36:13
751
原创 结构体的详解
有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化。
2023-07-12 20:50:24
492
1
原创 新人的第一篇博客
希望自己能够通过多年的努力学习提升自己编程水平最后能够进入到网易、腾讯这样的大公司进行我感兴趣的游戏编程内容,中国有句古话说的好:求其上者得其中,求其中者得其下。定好一个高目标并为之努力相信我最后能够得到一个不差的结果。目前不仅仅是完成学校的学习工作,同时我也会通过编程相关的书籍以自学的方式加强自己对编程的理解,也希望通过在csdn上的博客记录为自己留下学习的痕迹。除开学校的编程课程学习,我希望自己能够尽可能的每天完成一些编程题目的训练,比如完成线上编程题目的训练如牛客网训练题和学校的oj网站训练题。
2023-04-02 11:44:53
61
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人