- 博客(151)
- 收藏
- 关注
原创 C++的类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast
2025-02-25 23:26:25
365
原创 Linux - 进程间通信(3)
同一个文件的都是差不多的,因此不用再创建一份,操作系统不做浪费时间和空间的事情。创建了三个窗口,一个一直向管道输入,一个一直读取,一个手动检测管道大小。因为 FIFO0 文件虽存在于文件系统中,但其内容都存放在内存里,-- 则需要解决子进程所继承的父进程遗留的多余wfd,我们在。我们怎么保证两个毫不相关的进程打开了同一个文件呢?即可,就不会出现,多个wfd指向一个管道。当然,我们管理管道的声明周期时,肯定是。创建两个.cc文件分别模拟两个进程,命名:该管道有名字,因为。(当然,rm也可以删除)
2025-02-02 21:13:15
816
原创 Linux - 进程间通信(1)
一个进程分别以读方式和写方式打开时,它会生成两份struct file结构体,当我们fork一个子进程时,子进程会将父进程的PCB和文件描述符表都拷贝一份,因为。d. 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。c. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。--- 管道被写满,写条件不具备 --- wait 写条件具备(即读取)
2025-01-24 21:19:46
1146
原创 基础IO -- 动静态库(2)
ELF格式的可执行程序,二进制是有自己的固定格式的,固定格式里边一定要有自己的elf可执行程序的头部,0000 -- ffff(全0到全f的方式整体对所有的地址进行编址) ---- 平坦模式。2.加载 -> 每一行代码和数据,就都有了物理地址,自己的虚拟地址自己也知道,然后就可以。我们的可执行程序,编译成功,但是没有进行加载运行,二进制代码中有“地址”吗?-- 因此我们直接看源代码,不用加载运行,我们可以在我们的大脑中运行这个程序。动态库,因为动态库要在程序运行的时候,要找到动态库加载并运行。
2025-01-21 13:30:24
1033
原创 基础IO -- 动静态库(1)
我们的编译不是使用了我们的stdio和math库吗,为什么可执行文件中不包含?将这个mylib目录打包压缩给别人,别人就可以去使用我们写的这一个库。下面才是C++的标准库,上面的只是配置过Vim后显示出来的。那我们可不可以自己指定头文件的路径及名称?但是你会发现,当你拷贝到搜索路径后,并且。为什么不需要指定头文件名称呢?,gcc编译时还是会有报错提示。中的实现,来成功编译代码了。但是不能直接使用,而是需要。成.a类似静态库文件。
2025-01-17 22:13:45
1074
原创 基础IO -- 软硬链接
硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定目录下,若是把目标文件删除掉,即类似于删掉.exe可执行文件导致软链接无效。这样会很麻烦,这时候就可以使用软链接来。任何一个目录,刚开始新建的时候,其就类似于Windows中的。目录A内部,新建一个目录,当我们将目标文件删除时,这时,引用计数变为了3。(也就是备份文件)。
2025-01-15 21:33:21
534
原创 基础IO -- 文件系统
将一个分区分为了若干个组:文件 = 内容 + 属性(本质也是数据)文件在磁盘存储,本质是:文件的内容+文件的属性数据Linux文件系统特点:文件内容和文件属性分开存储。
2025-01-14 12:17:51
1372
原创 基础IO -- 标准错误输出stderr
这里我们谈一下以前只是了解过的stderr通过两段代码,显然,我们可以知道的对于重定向,中> : 全称叫做因此只会更改1号fd(即stdout)里面的内容,而打印。
2024-10-31 22:16:36
733
原创 基础IO -- 重定向 && 缓冲区
而重定向则是,write将数据直接写在内核级缓冲区内,而printf和fprintf写在stdout的缓冲区,因此一开始write就已经刷新到了log.txt,提高效率听起来有点扯,因为本来可以把数据直接写到操作系统里面,却要写到stdout的缓冲区中,这不是多此一举,,因此printf和fprintf还在stdout的缓冲区内未刷新,因此hello write先打印,而后。比如在寄快递,你把你的快递交给驿站,驿站再寄给你的朋友,,如果正常运行的话,则会一行一行的刷新出来。时,缓冲区刷新到内核里,这样就。
2024-10-24 09:12:58
1016
原创 基础IO -- 理解文件(1)
以前学习过在C语言中的文件操作, 但那根本是不足以理解文件的,即站在语言角度是不可能理解文件的。像PCB一般,把一个文件打开就创建一个结构,然后将其用链表串起来,最后对打开文件的管理就。,什么都不写,此时这个文件会不会占据磁盘空间呢?---> 会的,因为其。一个进程是可以打开多个文件的,而系统内部也可以存在很多进程 ---> 因此。(因此可以大概猜到每一个被打开的文件,在OS内部,一定要存在。文件没有被打开的时候,那它存在哪里呢?2.若存在,默认打开文件的时候,就会先把目标文件清空。
2024-10-15 22:40:40
580
1
原创 Linux中的调度算法
为什么是[5]呢,因为它为long类型,一个则为4个字节,4个就是4 * 4 * 8 = 128个比特位,,比如智能汽车里面必须装有这种实时操作系统,要不然如果刹车还需要经过时间片的话,就来不及了。这里只会使用它下标的100 -- 139,前面0 -- 99我们不考虑,,下标为120时,就会把前面的空位置全部遍历,导致效率下降。当一个优先级为60的进程入队列的时候,实际上就是。若下标为100处有进程,则第一百个比特位为1。,也就是40个数字,优先级为。nice值的范围有限,即为。本质上是一个数组,内部有。
2024-09-22 13:04:17
478
原创 进程的地址空间(虚拟地址)
地址空间就相当于区域划分计算机语言来描述就是:int start;int end;用小时候的三八线来描述就是,我有一段区域的start和end,同桌也有一段start和end地址空间的本质就是内核中的一个数据结构,内部很多属性都是表示start,end的范围。
2024-09-19 12:39:22
1675
原创 Linux进程(3)(进程优先级 - 优先级 - 命令行参数 - 环境变量)
优先级是指定进程获取某种资源的先后顺序task_struct 进程控制块->struct->内部字段 ->int prio =??(task_struct作为进程控制块,内部包含了多个不同的结构体和字段,其中某个特定的struct中包含prio字段,用于存储默认优先级数字)prionice在Linux中,优先级数字越小,优先级越高关于优先级与权限之间的联系:1.权限表示这个资源能不能获取2.而优先级则是这个资源已经能获取了,只不过是获取资源的顺序。
2024-09-16 01:11:39
1006
原创 Linux进程(2)(进程状态 - 僵尸、孤儿进程)
已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct 会记录自己的退出信息,未来让父进程来进行读取。父进程如果先退出,子进程就会变成孤儿进程,孤儿进程一般都是会被1号进程(OS本身)进行领养的。直接在命令行中启动的进程,他的父进程是bash,bash会自动回收新进程的Z。CPU内部的数据,可以有多套,有几个进程,就有几套和该进程对应的上下文数据。入队列的不是进程的什么代码和数据 而是进程的task_struct。寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!
2024-09-12 16:17:49
889
原创 红黑树的实现及测试
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。对于红黑树来说,最重要的依旧是插入操作,与AVL树不同的是,一个是插入完后。来分析 -> 即 p 是位于左还是位于右,操作起来是一样的,只不过要分开写。3. 如果一个节点是红色的,则它的两个孩子结点是黑色的。5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)可以先记录最左边一条路的黑色节点个数,然后去递归每一条路,最后显示的结果也是平衡,那就大概率没有逻辑上的问题了。,若不相同,则返回false,递归同时,
2024-08-01 19:40:42
716
原创 栈和队列以及优先级队列
他的底层结构为堆,因此与堆的实现非常相似,无非就是加上了一层封装。栈的实现非常简单,因为所有函数都可以去调用,适配器默认为。在堆中最重要的两个结构无非就是。与栈的实现类似,只不过是。
2024-07-01 18:45:39
201
原创 二叉搜索树的实现与测试
BSTree(二叉搜索树)是一个神奇的数据结构,其的特点是,左子树的所有值比根小,而右子树的所有值比根大根据这种特性,我们可以从该结构中快速的搜索一个数的存在,速度则为树的高度次。
2024-07-01 13:10:26
531
原创 C++笔试强训day42
若种类的范围为 【1,x】的话,则满足条件的数组区间内方案数则为。每个值代表一种面值的货币,每种面值的货币可以使用任意张。,因此可以将种类范围想办法变为【1,x】,最后用。因为b >= a,所以可以在遍历数组的时候。滑动窗口遍历数组:(
2024-06-09 22:40:24
1320
1
原创 C++笔试强训day39
看输出描述即可知输出次数最多的那个字母即可。即为哈夫曼编码:与该篇中的模版题极为相似-》当然,也可以进行空间优化。搞清楚他的状态表示{
2024-06-05 20:13:47
1284
原创 C++笔试强训day38
dp[i][j] :从前i个中挑选,总和 % k == j时,最大总和为多少。有了这几点,状态转移方程就非常好推了,只需要注意一下非法值的初始化即可。一开始都可以想到将数组的前x个数拿出来排降序输出第二个数即可。因此就可以推出前一个状态为的 j 为 j - a[i] % k。1.顺时针旋转180° -》列对称一遍再行对称一遍。即(j - a[i] % k + k)% k(又因为可能会出现相减之后出现负数,因此可以用。2.关于行镜像 -》如题意一样,行对称即可。
2024-06-04 21:23:43
880
原创 C++笔试强训day37
如果 A 字符串能够旋转之后得到 B 字符串的话,在 A 字符串倍增之后的新串中,⼀定是可以找到 B 字符串的。因此,我们仅需让 A 字符串倍增,然后查找 B 字符串即可。
2024-06-01 15:37:56
962
原创 C++笔试强训day35
b[j]时,在这三种情况中取最小值即可,因为有重复,所以可以简化,最后变为。根据这个规律,找到最后⼀次删除的起始位置的下标即可。,一开始我就看错了题目,直接双指针搜索了。当然,也有更简便的方法:(找规律)通过⼀两个例⼦的模拟,我们发现,
2024-05-28 19:40:57
1100
原创 C++笔试强训day34
DFS:(我写的DFS目前还是没找到为什么有测试用例过不去)BFS / DFS(宽度 / 深度 优先遍历即可)BFS:(因为可以保证第一次找到的一定是最近的)提取题意,模拟一下即可。
2024-05-27 19:01:13
710
原创 C++笔试强训day33
若一个数从0 - > 1,那么则cnt++(cnt是窗口中字母的种类),若从1 - > 0,那么则cnt--。当cnt > 2时,就得出窗口了。然后就是找个合适的位置更新返回值。
2024-05-26 16:15:02
860
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人