- 博客(41)
- 收藏
- 关注
原创 【Linux操作系统】进程间通信之匿名管道与命名管道
管道是操作系统中最古老的进程间通信的方式我们把一个进程连接到另一个进程的一个数据流称为一个“管道”
2024-10-30 20:51:45 1081 2
原创 【Linux操作系统】进程等待
"进程等待"是指一个进程因为某些原因暂时无法继续执行,而必须等待某个条件满足或某个事件发生后才能继续执行的状态,是操作系统进行资源管理、任务调度和同步协调的重要机制之一。通俗来讲就是我需要得到我想要的结果,我才能执行下一步本文主要讲解父子进程之间的等待关系。
2024-10-16 21:11:49 713
原创 【Linux操作系统】进程终止
errno是一个在头文件中定义的整型变量,当函数发生错误时,会设置errno为特定的错误码。main函数return返回的时候表示进程退出,return 的结果为退出码,我们还可以设置退出码的字符串含义。main、exit等函数的返回值,叫做进程的退出码,一般0表示进程执行成功,非零表示执行失败。函数的执行情况指的是函数在执行过程中是否遇到了错误或异常情况,以及这些错误或异常的类型和性质。我们可以通过退出码了解进程的执行结果,那么我们怎样知道函数的具体执行结果呢。
2024-10-16 21:09:32 596
原创 【Linux操作系统】进程的创建与替换
学习了Linux操作系统我们可以知道,进程是系统分配资源的基本单位,也是CPU调度的一个实体,它是程序执行的一个实例,Linux中提供了多种机制来创建进程,一般常用的是通过fork0()、clone()等系统调用,以及更高级的封装exec()系列函数()。在linux中fork函数时非常重要的函数,也是是最常用的创建新进程的系统调用返回值:自进程中返回0,父进程返回子进程id,出错返回-1当一个进程调用fork()时,系统会创建一个与当前进程几乎完全相同的子进程。
2024-10-01 17:13:49 917
原创 从底层理解为什么常量区中的代码不能被修改?
平时我们在编写代码时都会用到或遇到所谓的常量区或者不可修改的代码,比如说用双引号包起来字符串(“Hello World”)、C++中的 const、Java中的final等,平时我们在用或者见到时只知道这时语法规定的,但你有没有想过这到底 是为什么呢?本文将从操作系统底层分析常量区不可修改的原理。
2024-10-01 17:12:52 653
原创 【Linux操作系统】进程优先级
因此出现了优先级,我们的进程如果要访问某种资源,进程就要通过优先级以一定的方式进行排队,也就是享受资源的先后顺序。代表这个进程可被执行的优先级,通俗点说就是程序被CPU执行的先后顺序,其值越小越早被执行。优先级较高的进程会优先得到资源,后序还会有源源不断的进程产生,常规进程难以享受到资源。如果不加限制,将自己进程的优先级调整的非常高,别人的优先级调整的非常低。代表这个进程的nice值,其表示进程可被执行的优先级的修正数值。在优先级的修改中会介绍两者的用处。也体现出了进程的竞争性。,我们的进程之间需要。
2024-09-25 22:09:18 492
原创 有关main函数参数的理解与使用
在平时编写代码的过程中,我们会经常写main函数,这是一个程序必不可少的,main 函数是一个特殊的函数,它是程序执行的入口点,但我们往往都没有在意或使用main函数的参数,但main函数其实是有自己自带的参数类型的,只是我们一般没有用到。
2024-09-25 21:34:58 1167 2
原创 【Linux操作系统】系统进程状态与类型详解
于是为了保证某些正在干重要事情的进程不被杀掉,给这些进程加了一块“免死金牌” D状态,操作系统在杀进程时,如果进程只是一个普通的‘S’,操作系统可以杀,但如果是‘D’,那么因为有免死金牌,操作系统不能杀。进程一般退出的时候,它的代码和相关数据会被释放,但是,它的task_struct对象依然还在内存中,仍然占用内存,占用进程表,这些僵尸进程会累积起来,占用大量的进程表项。这可就麻烦了,信息丢失可是个大问题。一般系统中D状态的进程是很少见的,如果你看到了D状态的进程,那就说明你的系统里挂不远了,洗洗睡吧。
2024-08-07 12:14:46 1426 1
原创 有关Linux操作系统中僵尸进程与孤儿进程的理解
然而,在某些情况下,如果系统中产生了大量的孤儿进程,并且这些进程长时间运行而不结束,那么它们可能会占用系统资源,影响系统性能。进程一般退出的时候,它的代码和相关数据会被释放,但是,它的task_struct对象依然还在内存中,仍然占用内存,占用进程表,这些僵尸进程会累积起来,占用大量的进程表项。简单说就是父进程既然创建了子进程后,定然会给子进程布置了任务,子进程完成任务后需要将任务的完成情况报备给父进程,否则父进程怎么知道你有没有好好完成任务呢?前面我们知道,僵尸进程是能够恢复的,只要被父进程回收就行。
2024-08-07 12:14:37 592
原创 【Linux操作系统】进程的基本概念(PCB对象)详解
比如在学校在录取时,需要学生进行排队录取,会根据成绩的高低,也就是优先级来排队,在这里排队的肯定不是你本人过来排队,而是你的被学校导入的属性信息在排队,操作系统也是这样,也是要通过这种方式来进行进程的管理,比如我们以后会学到进程也要排队,这里排队的就是进程的PCB对象,而不是进程可执行程序的代码和数据。在一个学生被录取到学校时,先到学校的一定不是学生,而是这个学生所有的属性信息(也就是上面的结构体),学校会将这个学生的属性信息导入到学校的系统中,通过这些学生的属性信息通过这些属性信息来对学生进行管理。
2024-08-06 21:38:59 844
原创 【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解
S(sleeping)在本质上也是阻塞状态的一种,可以说是阻塞的一种分支S状态是Linux中可中断的睡眠状态,表示进程正在等待某个事件或资源S状态下的进程可以被信号或中断唤醒并继续执行。在这种状态下,进程无法继续执行,因为它需要等待的资源或事件尚未发生。此时进程不会占用CPU资源,操作系统会调度其他可执行的进程等待某个事件或资源的完成后或者接收到信号,又会自动回到运行状态例如我们平时的命令行等待我们输入命令时就是一个浅度睡眠状态。
2024-08-06 21:37:09 306
原创 【Linux操作系统】makefile文件操作详解
在Linux中,Makefile是一种用于自动化构建和编译软件项目的工具。它通常用于管理大型项目中的源代码文件,以及定义项目的编译、链接和其他构建过程Makefile是一种文本文件,其中包含了一系列的规则,这些规则定义了如何从源代码文件生成目标文件(如可执行文件或库文件),它用于自动化编译过程,提高开发效率,减少手动编译的繁琐和出错率。
2024-08-01 19:50:52 1350
原创 【Linux操作系统】关于系统中内存文件与进程的关系以及文件描述符fd、重定向的理解
我们如果想访问文件,第一步都是要打开它,想要修改文件,都要通过执行代码以进程的方式完成修改3.我们的CPU只能访问内存,因此文件必须被加载到内存中才能访问4.一个进程可以打开多个文件,在一定时间内,系统会存在多个进程,但可能同时会存在更多被打开的文件,我们的系统是如何对这些文件进行管理的呢?5.系统中是不是所有的文件都被进程打开了(内存文件)?并不是,没有被打开的文件在磁盘中(磁盘文件)
2024-08-01 19:01:35 904
原创 【Linux】有关Linux中进程地址空间及页表原理的理解
虚拟地址映射到物理地址的地址可能是这个区域一块,那个区域一块 ,物理内存里的存储可能是混乱无序的,但如果我们有了页表这个中间转化的结构,哪怕物理内存中的储存再无序,但虚拟地址是有序的,物理内存的有序或无序与进程没有任何关系,因此页表映射使得物理内存从无序变成有序,让进程以统一的视角看待内存。但是这个虚拟内存并不存在内存或外存(但可以一部分在外存中,通过一些算法等)中,它是由操作系统和硬件管理的,是每个进程的一个独立地址空间,虚拟地址空间的布局内容在进程的地址空间中定义。
2024-07-30 09:51:23 1211 1
原创 【Linux】vim编辑器使用详解
Vim(ViIMproved)是一种高度可配置的文本编辑器,用于有效地创建和更改任何类型的文本。Vim的设计目标是提供一种高效的文本编辑方式,通过键盘快捷键和命令来执行大部分编辑任务,从而减少对鼠标的依赖。Vim 的设计哲学是键盘优先,所以尽量使用键盘快捷键来完成操作,而不是鼠标。随着你对 Vim 的熟悉,你会发现使用 Vim 的效率远远超过其他编辑器愿我们都能玩转Vim。
2024-07-20 21:29:36 1678 1
原创 【C++11】initializer_list、可变参数模板详解
在C++98及这前的版本中类模版和函数模版中只能含固定数量的模版参数C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板模板参数包是一个特殊的模板参数,它表示零个或多个模板参数。在函数模板或类模板的定义中,可以使用省略号(…)来声明一个模板参数包。// Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。// 这里可以使用递归或循环来展开参数包。
2024-07-20 21:29:11 1084
原创 操作系统之shell命令(外壳)及其运行原理详解
但我们一般用户,不能直接使用kernel,而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。通过shell对我们的指令进行解析,解析指令给Linux内核。shell(外壳)只是一个统称,一切有类似功能都乐意被称为shell外壳,这里的bash就是shell外壳。我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作。(比如进入D盘的操作,我们通常是双击D盘盘符),因此图形接口就是shell外壳。为什么不能直接使用kernel呢?
2024-07-18 20:17:48 406
原创 Linux操作系统有关权限的深刻理解
第一个字符决定了Linux的文件类型,例如上面的d,除了d还有一些文件类型字符。但凡是都有例外,上述规则对root不管用,root具有超级权限,几乎无视权限。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”超级用户可以再linux系统下做任何事情,不受限制。我们创建一个新文件是,文件会有自带的默认权限。而普通用户只能做有限的事情。
2024-07-18 20:13:32 1364 1
原创 【C++11】 lambda表达式和包装器(function、bind)
lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。必写)(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。
2024-07-15 21:37:14 778
原创 【数据结构】布隆过滤器的原理讲解及其底层实现和海量数据问题
1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关2. 哈希函数相互之间没有关系,方便硬件并行运算3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算。
2024-07-13 11:33:50 1070
原创 【数据结构】深入理解哈希及其底层数据结构
桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端情况下,可 能会导致一个桶中链表节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容,那该条件怎么确认呢?开散列最好的情况是:每个哈希桶中刚好挂一个节点, 再继续插入元素时,每一次都会发生哈希冲突,因此,在元素个数刚好等于桶的个数时,可以给哈希表增容。闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有 空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。
2024-07-11 16:45:27 1028
原创 【高阶数据结构】红黑树详解
在前面我们学习了平衡二叉树,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现,除了AVL树,下面我们要学习的红黑树也是处理二叉树自身缺陷的一种方式RED,BLACK,_kv(kv),_col(RED){}
2024-06-12 21:47:26 1282
原创 【数据结构】AVL树(平衡二叉树)
AVL树是一个平衡的二叉搜索树,它的每个节点的左右子树高度差的绝对值不超过1,因此,哪怕最坏也只是查找高度次,保证了查询时高效的时间复杂度O(log_n)。但是它的缺陷也很明显:如果我们要对AVL树做一些修改方面的操作时,它的性能就十分低了,因为在修改时我们还要维护它的绝对平衡,旋转的次数比较多,而且在删除时,最坏情况可能会更新到根节点。所以,如果只是需要一种查询高效且有序的数据结构,且数据个数为静态(不改变),比较适合AVL树,但如果你需要经常修改的话,AVL树可能就不太适合了
2024-06-10 20:39:17 1328 1
原创 二叉搜索树(BST,Binary Search Tree)
为何学?1.二叉搜索树是一种树形结构,是一种查找效率非常高的结构,值得我们去学习2.map和set的底层也是二叉搜素树,学习二叉搜索树可以让我们更好的了解set和map的特性。
2024-06-06 21:38:32 884
原创 C++多态详解
在继承中构成多态有两个条件:1.必须通过基类的指针和引用调用虚函数 2.被调用的函数必须是虚函数 ,且派生类必须对基类的虚函数进行重写多态调用时在运行时在虚函数表找函数的地址,进行调用,所以指向父类调的是父类的虚函数,指向子类调用的是子类的虚函数而普通调用时是在编译时,通过调用者类型确定函数地址
2024-05-24 20:27:52 1225 5
原创 C++继承详解
Person是父类,也称作基类。Student是子类,也称作派生类。在C++中,出现类型转换时会产生临时变量。作为C++面向对象三大特性之一,继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。
2024-05-22 08:58:20 965 3
原创 C++泛型模板超详解
C++模版,泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础平时我们在编写代码的时候,都要十分在意函数或是类的参数类型,整形就只能调用整形的函数浮点类型就只能调用浮点类型的函数,而泛型编程是编译一种通用的代码,与类型无关下面举个例子:平时我们怎么写一个交换函数?因为数据类型有很多种,我们不知道要传的数据是什么类型,所以我们会用函数重载的方式写多个重载函数,但是缺点也很明显。
2024-04-25 12:19:09 1056 2
原创 【C++】STL之string 超详解
string是表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作,下面是C++的官方网站,若有疑问,可在网站中查询学习。
2024-02-12 18:36:51 1085 2
原创 数据结构 归并排序详解
归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定。
2024-02-01 20:21:09 550 3
原创 C++中的类的6个默认成员函数详解
内置类型就是语言提供的数据类型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。
2024-01-19 10:34:04 964 2
原创 C++初阶 入门篇
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机 界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言 应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一 种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。
2024-01-16 19:23:02 1043 1
原创 C语言 字符函数和字符串函数详解
目录1. 字符分类函数2. 字符转换函数 3. strlen4. strcpy 5. strcat6. strcmp7. strncpy 函数的使⽤ 8. strncat 函数的使⽤ 9. strncmp函数的使⽤10. strstr 11. strtok函数的使⽤ 12. strerror函数的使⽤C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 这些函数的使⽤⽅法⾮常类似,我们就讲解⼀个函数的事情,其他的⾮常类似:
2024-01-02 14:22:49 1005 3
原创 数据结构 队列的概念及队列的实现
只允许在一端进行插入数据操作,在另一端进行删除数据操作的,队列具有:进行插入操作的一端称为队尾:进行删除操作的一端称为队头。
2023-12-30 16:23:22 571 4
原创 C语言 动态内存管理
在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。分配⽅式类似于链表3. 数据段(静态区)(static);存放全局变量静态数据。程序结束后由系统释放存放函数体(类成员函数和全局函数)的⼆进制代码。
2023-12-29 18:05:29 1422
原创 C语言 内存函数详解
函数用于将src指针指向的内存块中的数据复制到 dest指针指向的内存块中,大小为n字节。该函数返回 dest指针。以下是一个示例代码,演示了如何使用memcpy函数memcpy从scr的位置开始向后复制n个字节的数据到dest指向的内存位置。• 这个函数在遇到 '\0' 的时候并不会停下来。• 如果src和dest有任何的重叠,复制的结果都是未定义的。对于重叠的内存,交给来处理。
2023-12-28 13:58:12 490 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人