- 博客(85)
- 收藏
- 关注
原创 leetcode贪心算法题总结(一)
此系列分三章来记录leetcode的有关贪心算法题解,题目我都会给出具体实现代码,如果看不懂的可以后台私信我。
2023-12-27 11:29:23
1083
原创 Linux之进程替换
fork()之后,父子各自执行父进程代码的一部分,父子代码共享,数据写时拷贝各自一份,如果子进程想就执行一个全新的进程呢?进程的程序替换,来完成这个功能。程序替换:是通过特定的接口,加载磁盘上的一个权限的程序(代码和数据),加载到进程的地址空间中。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exex函数以执行另外的一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新进程替换,从新程序的启动例程开始执行。
2023-03-29 21:52:50
434
原创 Linux之进程等待
另外,一旦一个进程变成僵尸状态,那就刀枪不入,“杀人不咋眼”的kill -9也无能为力,因为谁也没有办法杀死一个已经死去的进程。如果子进程已经返回,调用wait/waitpid后,wait/waitpid会立即返回,并且释放资源,获得子进程的退出信息。最后,父进程派给子进程的任务完成的如何,我们需要知道,如,子进程运行完成,结果对还是不对或者是否正常退出。之前讲过,子进程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏。父进程通过进程等待的方式,回收子进程的资源,获取子进程退出信息。
2023-03-15 12:05:23
287
原创 Linux之进程终止
0表示success,非0表示允许的结果不正确,非零值有无数个,不同的非零值就可以标识不同的错误原因,给我们的程序在运行结束之后,结果不正确,方便定位错误的原因。***比如程序内出现数组越界啦,野指针啦等,程序直接崩溃,此时它们的退出码是无效的,没有执行return语句。我们发现这个缓冲区一定不在操作系统内部中,如果在_exit函数应该也能将数据刷新出来,但它不能,exit函数可以,所以,缓冲区是C标准库的,C标准库给我们维护的。main函数的返回值?return语句,就是终止进程的,return退出码。
2023-03-15 08:47:37
436
原创 Linux之进程创建
创建一个子进程,则系统里面多了一个进程,进程 = 内核数据结构+进程代码和数据,进程的代码和数据一般是从你的C/C++程序中来,也就是从磁盘而来。新进程叫做子进程,而原进程叫做父进程。创建子进程,给子进程分配对应的内核数据结构,必须子进程独有的,因为进程具有独立性!理论上,子进程也要有自己的代码和和数据,虽然父子进程给自调度,各自修改EIP,但是已经不重要了,因为子进程已经认为自己的EIP,就是fork之后的代码。从结果可以看出,fork之前,父进程独立执行,fork之后,父子进程两个执行流分别执行。
2023-03-14 09:12:49
511
原创 虚拟地址空间
我们将我们的代码和数据加载到内存中,加载本质是创建进程,那么是不是非得立马把所有的程序的代码和数据加载到内存中,并创建内核数据结构和建立相关映射关系?答案是否定的。在最极端的情况下,甚至只有内核结构(task_struct结构体、地址空间、页表,)被创建出来了,映射关系一个都没有。此时进程的状态就叫做新建状态。当真正调度这个进程的时候,才将进程的代码和数据加载到内存中,设置好映射关系。理论上,可以实现对进程的分批加载,那是不是可以分批换出呢?当然可以。
2023-03-01 20:05:50
721
1
原创 二叉树超级经典OJ题
通过题目意思和输入输出的方式,我们可以使用队列,先入队列的先出队列,当前一层的节点都出队列时,下一层的的节点都进队列,此时下一层的节点个数即是levelSzie = q.size(),通过levelSize控制一层一层出,使用vector对出队列的节点进行保存即可。给你二叉树的根节点root,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。可以知道:一个是它左子树的节点,一个是它右子树的节点,那么它就是最近公共祖先。思路一:时间复杂度:O(H*N),H是树的高度。
2023-01-25 23:41:51
863
1
原创 Linux之孤儿进程、进程优先级、环境变量
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境变量字符串。
2023-01-01 22:13:52
491
原创 Linux进程状态
创建成功一个子进程后,操作系统会在内存中生成一个描述它的属性的task_struct结构体,它的内部属性,要以父进程为模板,当在fork函数内部子进程已经创建成功后,fork函数后面的代码都是父子进程所共享的,比如这里的return id,每个进程得到它们自己的id返回值,继续下面的代码执行。这里的+号表示此进程是一个前台进程,当它在运行的时候,此时再在bash上输入命令如ls,pwd等会发现无效,此时此进程占用了整个bash。为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。
2022-12-29 11:57:14
344
1
原创 C++之多态(中篇)(最全总结)
在虚函数的后面写上 =0,则这个函数为纯虚函数,包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。public :};public :cout
2022-12-21 11:54:39
437
原创 C++之多态(上篇)(最全总结)
需要声明的,这两篇文章(C++之多态(上下篇))的运行环境都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要在其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等。虚函数:即被virtual修饰的类成员函数称为虚函数。ps: 普通函数不能用virtual修饰,会报错。public :cout
2022-12-19 23:40:34
350
原创 C++中的继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性基础上进行扩展,增加功能,这样产生新的类称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类层次的复用。public ://姓名 int _age = 18;//年龄 };//学号 };//工号 };s . _name = "张三";t . _name = "赵老师";return 0;}
2022-12-18 22:37:33
285
原创 Linux之vim编辑器
编辑/插入模式:你是不是遇到过用vim打开一个文件后,想直接开始写代码却写不了而产生一大堆问号?这说明此刻还不在编辑/插入模式。vim打开一个文件后,默认进去的是命令模式,输入i,进入到编辑/插入模式,此时可以开始编写你的代码了。底行模式:同样,在命令模式输入shift + :(即 :),跳转到底行模式。底行模式的常见命令:w:保存 q:退出 w!: 强制保存 q!: 强制退出 w!q!:强制保存并退出。
2022-10-02 14:30:25
872
原创 Linux权限总结
目录的可执行权限是表示你可否在目录下执行命令如果目录没有x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录仍然有 -r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有x权限,但没有 r 权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。linux权限的总结就到这里了,我们下次再见!!!
2022-09-28 22:02:08
1073
原创 C++之string类的使用
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本。但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可。都使用string类,很少有人去使用C库中的字符串操作函数。replace替换,需要挪动数据,效率较低,一般不建议使用。功能:可以在任意位置插入字符或字符串。功能:为字符串赋值,替代当前字符串。
2022-09-04 15:35:57
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人