- 博客(91)
- 收藏
- 关注
原创 Linux:缓冲区_glibc封装
本来,./a.out是要通过stout在显示器上显示的,但是由于文件描述符1被log.txt占用导致,原先在stdout显示的,只能显示显示在文件中,这样完成了写入,这也是重定向的原理。printf, write向C语言缓冲区写入,但后面close(fd), 关闭后, 进程退出,由于fd被关闭了,找不到对应fd地内核缓冲区,所以无法打印。1.外设,磁盘,显示器等,一定有读写方法,但是实现方法不一样,一切外设设备都需要读写。(2)./a.out > log.txt, 是普通文件,则是全缓冲,子进程的。
2025-12-20 20:44:12
893
原创 Linux:基础IO(18+19)+文件描述符
struct file 表示被打开的文件, 对文件的管理就变成了对struct file链表的增删查改。文件打开 -- 内核创建struct file内容加载到文件缓冲区, 属性初始化到struct file系统初始化,创建一个文件描述符表:struct files_struct里面包含一个对象, struct file* fd_array[]指向不同的被打开的文件。文件描述符的本质就是数组下标。
2025-12-18 19:30:42
606
原创 Linux:进程控制
退出码(退出状态)可以告诉我们最后⼀次执⾏的命令的状态。在命令结束以后,我们可以知道命令 是成功完成的还是以错误结束的。其基本思想是,程序返回退出代码 0 时表⽰执⾏成功,没有问题。代码 1 或 0 以外的任何代码都被视为不成功。
2025-12-17 17:49:05
667
原创 Linux:环境变量
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 ⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。环境变量通常具有某些特殊⽤途,还有在系统当中通常具有。
2025-12-15 18:51:26
665
原创 Linux:44线程互斥lesson32
原则:尽量加锁的范围粒度要细,尽量不要加太多非临界区代码我们用swap,exchange将内存中的变量,交换到CPU的寄存器中“本质是当前线程/进程,在获取锁,因为是交换,不是拷贝,所以1只有1份,所以谁申请到,谁的al > 1,mutex就jiaohuan谁持有锁”锁就是mutex的内容1,谁的%al持有1,谁就持有锁。释放锁,就是向mutex里面写1就可以了。代码3:自动释放锁。
2025-05-11 11:02:11
852
原创 Linux:41线程控制lesson29
1. 如果thread线程通过return返回,value_ptr所指向的单元⾥存放的是thread线程函数的返回值。2. 如果thread线程被别的线程调⽤pthread_cancel异常终掉,value_ptr所指向的单元⾥存放的是常 数PTHREAD_CANCELED。3. 如果thread线程是⾃⼰调⽤pthread_exit终⽌的,value_ptr所指向的单元存放的是传给 pthread_exit的参数。
2025-04-23 20:52:32
1169
原创 Linux:42线程控制lesson30
ID:线程控制块的起始地址返回值:线程执行完,的返回值,被join回收分离:joinable = 0线程分离joinable!=0,线程不分离joinable线程标记位。
2025-04-23 20:51:00
893
原创 Linux:40线程理解_页表转换
让我们现在总结⼀下:单级⻚表对连续内存要求⾼,于是引⼊了多级⻚表,但是多级⻚表也是⼀把双 刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率。有没有提升效率的办法呢?计算机科学中的所有问题,都可以通过添加⼀个中间层来解决。MMU 引⼊ 了新武器,江湖⼈称快表的 TLB (其实,就是缓存) 当 CPU 给 MMU 传新虚拟地址之后, MMU 先去问 TLB 那边有没有,如果有就直接拿到物理地址发到 总线给内存,⻬活。
2025-04-21 10:14:35
814
原创 Linux:39内核与用户--信号-lesson28(待)-未完多个子进程处
DFL:默认。子进程给父进程发送,SIG_CHLD,父进程处理用的是缺省 的ign如果不理解可以认为:两种是不一样的系统默认->僵尸手动默认->可以做到后面的20分钟方案一和方案二。
2025-04-13 21:13:56
1003
1
原创 Linux:38信号捕捉_穿插中断
a.处理信号的合适时机:进程由内核态返回到用户态的时候b.如果是默认/忽略:照常c.捕捉过程,实际上就如右上所示当执行自定义方法的时候,要进行身份切换(由内核态转化为用户态,以免在用户态写一些非法操作需要(内核权限才可以进行的操作))
2025-04-13 15:43:53
810
原创 Linux:35.其他IPC和IPC原理+信号量入门
---------------------------------------------------------------------------------------------------------------------------------这种相似性,叫做system V标准。 ----------------------------------------------------------------------------------------------------------
2025-04-12 20:20:29
683
原创 Linux:37信号lesson26(未完)
信号量集第一个成员*sem.base:起始信号量可以malloc多个信号量sem_nsems:有多少个信号量。
2025-04-12 19:53:29
1135
原创 图论:多源最短路
1. 状态表⽰: f[k][i][j] 表⽰:仅仅经过[1, k] 这些点,结点i ⾛到结点j 的最短路径 的⻓度。2. 状态转移⽅程:• 第⼀种情况,不选新来的点: f[k][i][j] = f[k - 1][i][j];• 第⼆种情况,选择新来的点: f[k][i][j] = f[k - 1][i][k] + f[k - 1][k][j],i->k的路径+k到j的路径之和,把k作为中转点。找以k为中转点,i到j是否存在更小的路径,存在的话,那就更新,不在的话,那就维持原判。
2025-04-07 16:47:49
703
原创 图论:拓扑排序
拿最大的进行更新,因为大的做完了,小的也就做完了。记录ret:是餐厅里的摄像头,in不为0。加了一个标记要砸坏的bool st[]进队列:是餐厅里的摄像头,并且没有前辈。最短时间,所有情况下,取最大值。
2025-04-07 16:43:36
505
原创 图论:最小生成树
由于克鲁斯卡尔算法要把所有的边进行排序没所以我们要创建一个起点,终点,边的结构体。dfs:把所有的路径都找到。(遍历到一条边就加入路径)瓶颈树:生成所有生成树中,最大边权值最小的那棵树。用胶囊把所有可以到的点统计到。->生成最小生成树。最小生成树:利用dfs找到的路径据生成最小生成树。距离最短->所有距离的总和。--->最小生成树。选边的时候,优先去往高的位置的边,其次才是距离。最小生成树的最大边值也就是最终结果。题目没有明确给出那就自己创建。
2025-04-07 16:41:58
769
原创 图的储存+图的遍历
和树的存储⼀模⼀样,只不过如果存在边权的话,我们的vector数组⾥⾯放⼀个结构体或者是pair即 可。和树的存储⼀模⼀样,只不过如果存在边权的话,我们多创建⼀维数组,⽤来存储边的权值即可。
2025-04-07 16:39:53
409
原创 动态规划:区间dp
k把点分成左右两端,左端的代价,加右端的代价,加把两个合在一起的代价和f[i][j]一起取最小值,即可。把f[i][i] 初始化成0,是根据实际,单独一个不需要合并,代价为0。先全部初始化成无穷大,因为避免取最小值时产生影响。处理环行问题的常见技巧:倍增/复写。
2025-04-07 16:06:37
458
原创 动态规划:背包问题
背包问题是动态规划中最经典的问题,很多题⽬或多或少都有背包问题的影⼦。它的基本形式是:给 定⼀组物品,每个物品有体积和价值,在不超过背包容量的情况下,选择物品使得总价值最⼤。背包问题有多种变体,主要包括:1. 01背包问题:每种物品只能选或不选(选0次或1次)。2. 完全背包问题:每种物品可以选择⽆限次。3. 多重背包问题:每种物品有数量限制。4. 分组背包问题:物品被分为若⼲组,每组只能选⼀个物品。5. 混合背包:以上四种背包问题混在⼀起。
2025-04-07 16:04:48
1454
原创 动态规划:经典线性dp
f[i][j]表示:s的【1,i】区间内,以及t的【1,j】区间内,所有子序列中,最长公共子序列。增加:也就是[ i ] 变成 [ j - 1],把b[j] 插入到 [i]后面 ,i++,j不变。跟上面的类似,f[i][j]是指把1-i变成到1-j的最小操作数。a[i] == a[j]相等->那就前面的操作数一样。删除:也就是[ i - 1] 编程[ j ]修改 :[i- 1] 变成 [ j - 1]到 1~i-1和1~j-1找最长公共子序列。(1)1~i+1~j-1里面拿。根据实际意义进行初始化。
2025-04-07 16:01:38
431
原创 第四章:动态规划
比方说,我们要凑 j = 1,a[i] = 9, a[i]%5 == 4, j - a[i] = -3,我们本来是要找-3的位置的,使得取模 == 1但是我们是找不到的,但是我们可以反向的向前找2,4+2 == 6 ,取模 == 1。4. 输出具体⽅案。f[i][j]表示:s的【1,i】区间内,以及t的【1,j】区间内,所有子序列中,最长公共子序列。选,就找[j - a[i]]的,注意,这里会出现负数的情况,但在这道题中,负数也是有意义的。然后用f[i][j-b[i]]+w[i]替代max的第二部分!
2025-03-30 15:20:51
1238
原创 Trie树(字典树)/(前缀树)
注意:(1)在一条边上存字符(2)如果前缀相同的话,就可以实现复用。(3)从根节点出发到某个节点的路径就代表一个字符串(4)有->复用没有->创建(5)维护信息:pass:标记当前节点一共经过多少次end:b=标记当前节点是以多少个字符串作为结尾。
2025-03-23 18:17:21
386
原创 扩展域并查集
1 和 2是敌人,那么就把1好12链接起来:表示1和2是敌人2和11链接起来也是这个道理然后2 和3使敌人同理。最后12连接了1 和 3,表名1 和 3 是 2 的敌人,1和3 就是朋友。
2025-03-22 19:07:39
294
原创 并 查 集
初始状态下,所有的元素单独成为⼀个集合:• 让元素⾃⼰指向⾃⼰即可。3.2 查询操作查询操作是并查集的核⼼操作,其余所有的操作都是基于查询操作实现的! 找到元素x 所属的集合:• ⼀直向上找爸爸~3.3 合并操作将元素x 所在的集合与元素y 所在的集合合并成⼀个集合:• 让元素x 所在树的根节点指向元素y 所在树的根节点。反过来也是可以的)3.4 判断操作3.5 并查集的优化极端情况:在合并的过程中,整棵树变成⼀个链表。 路径压缩:在查询时,把被查询的节点到根节点的路
2025-03-22 12:59:15
1026
原创 第三章:单调队列
如果当前a[i] >= a[q.back()],那么把比a[i]小的全部都出队列,然后推进去。根据队头和队尾的下标判断是否超出m;如果 < 那就推进队尾。
2025-03-21 19:42:38
273
原创 第三章:单调栈
记录详情 - 洛谷 | 计算机科学教育新生态int n;int a[N];int ret[N];i <= n;i >= 1;i <= n;
2025-03-20 19:51:42
390
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅