- 博客(43)
- 收藏
- 关注
原创 进程控制(linux+C/C++)
因为如果父进程对子进程不进行管理,子进程会成为僵尸进程,造成内存泄漏,僵尸进程无法杀死,只能靠父进程回收。本质是检测子进程状态,不会卡住父进程,让父进程可以在等待事件间隙中做其他事情,所以非阻塞等待会更高效。就是让父进程通过等待的方式,回收子进程的PCB,如果需要,获取子进程的退出信息。1.在未创建子进程时,父进程页表对于数据权限为读写,对于代码权限为只读。wait成功,返回子进程pid,失败返回-1(该进程无子进程)。1.一个父进程希望复制自己,使父子进程同时执行不同的代码段。1.系统中有过多进程。
2025-04-20 11:02:19
566
原创 命令行参数·环境变量·进程地址空间(linux+C/C++)
本质上是PCB内的内核数据结构(mm_struct,叫内存描述符)。进程创建时,操作系统会给其分配一块虚拟的空间,大小为整个内存的大小,mm_struct中会有指向各个分区的开始和结束地址的指针。但,实际上,操作系统不会真的直接给一个进程全部的内存空间,毕竟还有其他进程,只是通过一个页表来将虚拟的地址映射到物理地址上,映射到物理空间上,只占一块空间,所以说是虚拟地址空间。所以进程在访问内存时,要先进行虚拟地址到物理地址的映射,找到物理内存,然后访问。
2025-04-20 09:37:24
648
原创 进程II·优先级、切换
上面的蓝框和红框为同一种结构体,具体实现中是一个大小为2的结构体数组,使用active指针指向第一个数组(活跃进程队列),expired指针指向第二个数组(过期进程队列)流程注意事项见下图。PRI = PRI(固定位开始的值,80)+ NI NI(nice):-20~19,所以优先级一共40个级别。进程优先级有范围原因:linux操作系统为分时操作系统,要尽可能保证公平公正,优先级要变,也要在可变的范围内变。存在的本质原因:资源少,进程多。一个CPU,一个运行队列。
2025-04-13 16:22:03
721
1
原创 进程I·介绍、查看、创建与状态
进程:PCB(process control block)(内核数据结构)+ 代码和数据进程创建:操作系统将其相关属性信息为基,创建PCB结点,放到进程双链表中,存在内存里。以下都以linux为例。
2025-04-13 15:12:02
849
1
原创 冯诺依曼体系·操作系统简介
操作系统,也称OS,就是一款软件,管理软硬件资源的软件,本质是数据结构,由大部分的C语言和少部分的汇编语言构成,内部存在大量数据结构和与其匹配的算法。广义上操作系统 = 内核+外壳程序+预装系统软件glibc、原生库等操作系统内核任务:进程管理、文件管理、内存管理、驱动管理。
2025-04-13 08:33:21
359
1
原创 C++·包装器
包含在<functional>头文件中,是一个类模版,但本质还是仿函数。包装各种可调用对象对于仿函数FUN,一搬使用struct,而不用class map映射string和function这种方式可拓展性强,并且比较省力。
2025-04-05 11:11:39
457
1
原创 C++11·部分重要语法III
C++11以后STL容器新增了emplace系列接口,均为模版可变参数,功能是插入,但总体而言比push和insert更高效,而且有更新的玩法,假设一个容器container<T>,emplace可以支持直接插入构造T对象的参数,可以直接在容器空间构造T对象。:_val(std::forward<Args>(args)...) //使用完美转发,否则右值表达式变左值。C++类中原本有6个默认成员函数:构造函数/析构函数/拷贝构造函数/拷贝赋值重载/取地址重载/const取地址重载。
2025-03-29 15:20:40
767
1
原创 C++11·部分重要语法II
C++ 中不能直接定义引用的引用,但可以通过模版或typedef中的类型操作构成引用的引用,也就是引用折叠。参数包分为两种:模版参数包(表示0或多个模版参数)、函数参数包(表示0或多个函数参数)传左值引用时引用折叠成左值引用,传右值引用时引用折叠成右值引用,所以叫万能引用。C++支持可变数量参数的函数模版和类模版,可变数量的参数被称为参数包。上篇文章提过,右值引用表达式依旧是左值。像这样的只是普通右值引用。
2025-03-29 15:17:31
426
原创 C++11·部分重要语法
本质是类型转换,中间产生临时对象,不过优化后是直接构造。将2025,3,27按照Date类的构造函数来产生临时对象,然后赋给d1对象,优化后就成了直接调用Date类的构造函数构造d1对象。
2025-03-29 09:29:42
1204
原创 哈希桶封装unordered_map和unordered_set
使用结点类型指针遍历元素,当结点类型指针走到末尾时(该桶遍历结束),通过另一个指向哈希表类型指针寻找下一个非空的桶,实现++。C++中的哈希表就是unordered_map和unordered_set。两个指针,一个是结点类型的,一个是指向哈希表类型的,方便++操作实现。思路在上一篇博客哈希(散列)表中。unordered:无序的。
2025-03-27 16:31:10
618
原创 哈希(散列)表
哈希【hash】又称散列,是一种储存和管理数据的方法。本质就是通过哈希函数计算把关键字key映射到储存的位置,查找时再通过哈希函数计算出位置,进行快速查找。
2025-03-27 15:50:18
808
原创 gdb/cgdb:调试器
gdb(GUN Debugger):是一个命令行调试工具,主要用于C/C++语言编写的程序。cgdb:gdb的增强版,提供了一个友好的用户界面,上部显示源代码,下部为gdb命令行。
2025-03-22 10:32:28
583
原创 封装红黑树->map&set
2.java/c++中 负数 % 整数 = 负数 a%p = n ----》修正 = (a%p+p)%p 使结果为正。由于我们在使用树时,key值是不允许修改的,所以要在构造红黑树对象时,传入constkey。1.C++可以使用范围for来遍历数组,相当于使用指针(特殊的迭代器)来遍历。获取key值,用来实现比较逻辑,在set和map中要分别实现一个。和list中的封装类似,++和--的逻辑不同。这里使用带头结点的红黑树。迭代器实现后这个重载很简单。
2025-03-16 19:46:52
557
1
原创 红黑树(带头结点)
bool blacknum(node* root, int sum,int num)//用来检测每个路径的黑色节点个数是否相等。bool singlered(node* root)//用来检测是否有连续的红色结点。bool IsBalanceTree()//检测函数。node* rightmax()//树的最右节点。node* leftmin()//树的最小节点。
2025-03-16 18:02:40
571
1
原创 AVL树
AVL树是最先发明的自平衡二叉查找树,为空树或具备以下性质的二叉搜索树:1.左右子树都为AVL树。2.左右子树高度差的绝对值不超过1。
2025-03-09 13:26:30
993
1
原创 map(图)和set(树)
map和set底层都为红黑树(平衡二叉搜索/排序树)。序列式容器:string、vector、list、stack、queue、deque、priority_queue关联式容器:map、set。
2025-03-02 14:54:48
900
3
原创 linux下软件安装、查找、卸载
yum与apt分别为Centos与Ubuntu中的软件包管理器(相当于手机和电脑中的应用商店),使用可以自动解决依赖关系。
2025-02-23 20:53:49
702
原创 C++语法·食二
因为list底层结构为双向带头循环链表,所以插入数据是不会导致迭代器失效的,只有在删除时迭代器才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。(6)sort list的sort底层为归并排序,效率不如算法库中的sort。为了不暴露容器的底层结构,让使用者无需关心容器的底层结构,让使用变得简单。返回最后一个元素的reserve_iterator,即begin()的位置。返回第一个元素的reserve_iterator,即end()的位置。返回list的最后一个节点的值的引用。
2025-01-25 10:12:39
1131
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人