- 博客(13)
- 收藏
- 关注
原创 进程间通信(二)
本文主要探讨了进程池创建与管理的两个关键问题及其解决方案,并介绍了命名管道和SystemV共享内存的使用方法。在进程池部分,分析了文件描述符继承导致的资源泄漏问题,提出倒序删除和子进程单一写入端两种解决方案。命名管道部分阐述了其特性(可见性、半双工、同步阻塞)及创建使用方法。SystemV共享内存部分详细说明了其系统调用流程(ftok、shmget、shmat等)和特性(随内核生命周期、高效通信、无保护机制)。文章通过代码示例展示了这三种进程间通信方式的具体实现。
2025-12-23 09:09:53
784
原创 进程间通信(一)
进程通信是操作系统中的重要机制,主要包括数据传输、资源共享、事件通知和进程控制四大目的。匿名管道是常见的进程间通信方式,通过pipe()系统调用创建,适用于父子进程间的单向通信,具有字节流传输、同步机制等特点。进程池则通过预先创建和管理一组进程来提高效率,避免频繁创建销毁进程的开销。本文详细介绍了匿名管道的工作原理、通信特点、四种典型通信情况以及PIPE_BUF的概念,并提供了一个简易进程池的实现方案,包括创建、任务分配和终止流程。通过合理使用这些通信机制,可以显著提高系统性能和资源利用率。
2025-12-17 17:15:41
682
原创 库的理解与加载
无论是自己生成的.o文件还是静态库中的.o文件,本质都要把.o文件进行连接,研究静态连接,本质是就是在研究.o文件是如何连接的。接下来我们写了两个简单的程序,code.c 和 hello.c , 其中code.c中调用了hello.c,以此来体会静态连接的过程。首先我们编写好以下两个程序并将其编译为.o文件,然后多它进行反汇编,查看汇编命令。
2025-12-15 19:04:45
822
原创 库的概念及简易制作
库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:// ubuntu 动静态库// C//C++// Centos 动静态库// C// C++
2025-12-01 21:26:25
738
原创 make/makefile的基本使用
摘要:Makefile是工程编译的核心文件,其编写能力反映开发者管理大型项目的水平。基本Makefile包含依赖关系和编译命令,使用@可隐藏命令输出。系统通过文件的Modify time判断是否需要重新编译,.PHONY修饰的目标可强制执行。Makefile采用栈式推导过程,逐层查找依赖文件。扩展语法支持宏定义和自动化变量:$@表示目标文件,$^表示依赖列表,$<表示首个依赖文件,这些特性显著提升了编译效率。
2025-07-29 17:17:56
266
原创 数论初步学习
给定一个包含 n 个元素的序列 A,记作 A1,A2,A3,...,An。求另一个包含 n 个元素的待定序列 X,记 S=i=1∑nAi×Xi,使得 S>0 且 S 尽可能的小。
2025-05-18 17:59:29
856
原创 Dijkstra堆优化
在未优化版本中,我们寻找当前最短路和更新新的节点的距离时使用的for循环是将一些多余的部分重复计算了,这也是我们主要优化的部分,这次我们使用优先队列来维护当前最短路和更新新的节点的距离,为了使用方便我们使用大根堆来优化,每次更新当前点到新的节点距离时将符合条件的点的距离的负值插入到队列中,这样每次距离最小的值的负值就是最大的(在队首),所以每次寻找最小距离时只需要把队首出队即可。国王想让小明回答从皇宫到每个建筑的最短路径是多少,但紧张的小明此时已经无法思考,请你编写程序帮助小明回答国王的考核。
2025-05-18 17:05:21
382
原创 再练树形dp
首先我们读题,一株奇怪的花卉,上面共连有 N 朵花,共有 N−1 条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人恶心。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。咱们再看数据范围,就可以想到用树形dp来解决。思路:本题没有给哪个节点是根节点,所以我们可以将每一个初始遍历到的节点当做为根节点,然后再进行剪枝。
2025-04-14 19:56:44
395
原创 经典树形dp
现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。状态转移方程为f[u][1]+=f[son][0];初始化状态发遍历u从1到n,f[u][1]=Ru(当前职员参加的快乐指数);f[u][0]表示以u为根的子树,且u不参加舞会的最大快乐值。f[u][1]表示以u为根的子树,且u参加了舞会的最大快乐值。我们定义一个f[][]数组。
2025-04-07 22:49:26
173
原创 【无标题】
因为题目要求出最大值和最小值所以定义两个dp,dp1[i][j]为第i到第j堆的得分,dp2[i][j]同样如此,初始状态的定义dp1[h][h]=0,dp2[h][h]=0,dp1数组中其余定义为1e8,dp2数组中其余定义为-1。那为什么要加上sum[j]-sum[i-1]呢,例如在4,5,9中[4,5],9,在这个例子中i为1,j为3,k为2,三堆石子得分应该为4,5->9;那么4,[5,9]中,得分为5,9->14;由于我们把他变为两条合成的链了,最终在从i=1遍历区间为n的dp数组即可;
2025-03-30 17:13:13
574
原创 基础线性dp
大致思路:题目要确保走过沿途的所有线段最终到达(n,n)点,首先我们定义一个dp[n][2],dp[n][0]代表到第n行的左边的所走的长度,dp[n][1]代表到第n行的右边所走的长度。然后我们定义初始状态,dp[1][0]=(0,0)点到达右端点的距离+右端点到左端点的距离,dp[1][1]=(0,0)点到达右端点的距离。状态转移需要比较上一段出发点在左端点或在右端点到当前一段左端点的距离,同理在比较上一段出发点在左端点或在右端点到当前一段右端点的距离。首先我们观察题目,发现是一个线性dp题。
2025-03-23 23:03:26
194
原创 逛画展P1638
1.使用双指针来控制范围大小,先固定左指针,移动右指针,当范围内画作所属作家刚好达到m位停止右指针的移动,则继续通过滑动左指针继续改变窗口。3.在每个不同窗口下记录范围大小,与上一次窗口大小比较,更新范围及左右边界。首先我们来观察题目,题目大意是希望以最小的价格可以看到所有画师的作品。到这里我们可以想到用滑动窗口来解决。2.每次使用哈希表来标记已看到的画家。
2025-03-16 16:03:18
236
原创 Dijkstra求最短路径
通过4.5步操作,一直更新每个节点到出发点0的距离,直至其为最短距离,找到下面图中终点4的前驱节点一直找到前驱节点为0是。则最短路径为0->7->6->5->4。
2024-11-24 13:24:09
912
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅