- 博客(39)
- 问答 (1)
- 收藏
- 关注
原创 Linux——进程状态
Linux对于进程组织起来的方式是双链表,但并不是直接将一个个PCB给连起来,而是通过在PCB里面建立一个结点,,这样的目的就是让,通过成员地址也是可以去取得该PCB的地址。比如成员变量c,我们现在是已经知道了该成员变量的地址的,那么我们需要知道c成员的偏移量,就可以知道该PCB的地址了。意思就是将0强转为结构体指针类型,那么此时在找c的地址就是成员变量c相对于0的地址,那么也就是偏移量了。在找到偏移量之后,用我们先前知道的成员变量c的地址去减去我们计算的偏移量就是该结构体的起始地址了。
2025-10-13 22:31:54
980
原创 Linux——进程优先级
cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大改善系统整体性能。查看进程优先级用命令ps -l或者ps -al其中PRI就是进程优先级,在Linux中初始值都是80,可以进行人为修改NI值来间接修改优先级。
2025-10-13 22:31:37
770
原创 Linux——冯诺依曼体系与进程概念
教材上对进程的定义是运行起来的程序或者加载到内存的程序,既然教材上进程的定义是一个程序,那么在操作系统中一定存在大量的进程,大家打开任务管理器就可以看见,而操作系统也需要对大量进程进行管理,根据上面我们对管理的解释,操作系统再管理进程时会先描述再组织,而描述进程数据的结构体就是PCB(Process Control Block)代码控制块,其中包含了进程相关的所有的属性信息,又将PCB称为内核数据结构,而具体在Linux下将其称为task_struct,仅仅名字不同而已,仍要包含进程的所有数据信息。
2025-10-03 00:35:47
832
原创 Linux——查看与创建进程
我们已经知道,在Linux中的PCB为task_struct,而其中的内容为• 标示符: 描述本进程的唯一标示符,用来区别其他进程。• 状态: 任务状态,退出代码,退出信号等。• 优先级: 相对于其他进程的优先级。• 程序计数器: 程序中即将被执行的下一条指令的地址。• 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针• 上下文数据: 进程执行时处理器的寄存器中的数据。
2025-10-03 00:35:39
483
原创 Linux初始——自动化构建
可以定义变量例如BIN=test.exe,SRC=test.c,在后续用$(BIN) : $(SRC)就可以代替之前的test.exe:test.c,在依赖方法中,可以使用gcc -o $@ $^来进行编译, $@代表目标文件, $ ^为依赖的文件,如果有多个依赖文件,就可以使用SRC= $(shell ls *.c)或者 $(wildcard *.c), $不仅可以引用变量,也可以代表系统内置的变量,还可以执行shell命令和内置函数,OBJ= $(SRC:.c=.o)即将后缀为.c的源文件替换为.o,
2025-09-08 17:13:34
508
原创 Linux初始——cgdb
gdb与cgdb都是调试工具,更推荐使用cgdb,其会把代码给显示出来,更加方便。但正常的gcc编译的文件是没有编译信息的,换句话说,gcc默认编译的可执行文件是release版本的,而调试需要debug版本。通过gcc -g就可以生成带有调试信息的可执行文件,可以通过来观察是否有调试信息。
2025-09-08 17:13:22
467
原创 Linux初始——Vim
在学习Vim之前,要先知道一些基本的概念,例如IDE是什么,编辑器,编译器是什么?IDE是集成开发环境,所谓集成就是将多种功能集中在一款软件上,例如微软的visual stdio系列,这系列的软件是集成了编辑代码,编译代码,调试代码等功能的。而像vscode工具,在严格意义上讲,他也只是一款编辑器,是加了各种插件才具备编译调试的功能。而Vim是一款具备多种模式的编辑器,即Vim只能进行代码编辑,无法进行代码编译运行的。vim一共有12种模式,常用的就上述三种,虽然命令很多,但熟则生巧,不必刻意记忆。
2025-09-02 00:09:30
913
原创 Linux初始——编译器gcc
原因就是人们很难去理解二进制,所以会出现汇编语言,使得一些指令被翻译成人类可以识别的语言,比如0111(加法),在汇编中变为了add,0101(移动),在汇编中变为了mov,这样相比于人们难以理解的二进制代码变为了一个个文字,使得计算机更加的能贴近人们的生活,也让程序员能够更加便捷的去编写代码,同样C语言的诞生也是如此。而CPU为什么能够执行二进制,编写的二进制代码其实是一个指令集,而CPU是能够识别并执行这些指令集的,每一个二进制序列都是一个命令,CPU的解码单元就是为此而生的。
2025-09-02 00:08:55
1063
原创 初始Linux——指令与权限
第一个字母即代表该文件为文件夹,后面的每三个字母为一组,分别代表:读,写,可执行,第一组代表自己,为u(user),第二组为所属组,为g(group),第三组为其他人,为o(other),在上述图片中,我们可以发现,其代表自己是有读,写,可执行的权限的,所属组与其他人是有读,可执行的权限,没有写的权限。命令时,由于普通用户是没有下载权限的,所以需要sudo来短暂提升自己的权限,输入的密码是当前自己用户的密码,并不是root账号的密码。◦ 执行(x/1):execute对文件而言,具有执行文件的权限;
2025-08-27 22:38:57
1117
原创 Linux初始——基础指令篇
mv即为move,用来移动文件或者给文件改名mv [选项] 源文件或目录 目标文件或目录,如果第二个参数是文件的话,就是给源文件进行改名,当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。cp即为copy,是复制文件的意思,cp 源文件/目录 [选项] 指定文件/目录,如果是复制整个目录,加上-r,与上述的rm一样。其中ls命令含有多种分支,例如ls -a,ls -l(可简写为ll),其中ls -a会显示出当前目录的所有文件包括隐藏文件。
2025-08-27 22:38:44
1675
原创 C++——异常
程序的执⾏从throw位置跳到与之匹配的catch模块,catch可能是同⼀函数中的⼀个局部的catch,也可能是调⽤链中另⼀个函数中的catch,控制权从throw位置转移到了catch位置。• 抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。捕获异常后需要重新抛出,直接。• 如果到达main函数,依旧没有找到匹配的catch⼦句,程序会调⽤标准库的。
2025-07-23 16:56:40
910
原创 C++11之智能指针
weak_ptr⽀持expired检查指向的资源是否过期,use_count也可获取shared_ptr的引⽤计数,weak_ptr想访问资源时,可以调⽤lock返回⼀个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是⼀个空对象,如果资源没有释放,则通过返回的shared_ptr访问资源是安全的。RAII在获取资源时把资源委托给⼀个对象,接着控制对资源的访问,资源在对象的⽣命周期内始终保持有效,最后在对象析构的时候释放资源,这样保障了资源的正常释放,避免资源泄漏问题。
2025-07-23 16:56:22
922
原创 C++11之一些小变化
默认⽣成的移动构造函数,对于内置类型成员会执⾏逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。如果能想要限制某些默认函数的⽣成,在C++98中,是该函数设置成private,并且只声明不定义,这样只要其他⼈想要调⽤就会报错。在C++11中更简单,只需在该函数声明加上=delete即可,该语法指⽰编译器不⽣成对应函数的默认版本,称=delete修饰的函数为删除函数。假设你要使⽤某个默认的函数,但是因为⼀些原因这个函数没有默认⽣成。
2025-07-17 16:36:39
339
原创 C++11之lambda表达式与包装器
在学习 lambda 表达式之前,可调用对象只有函数指针和仿函数对象,函数指针的类型定义起来比较麻烦,仿函数要定义⼀个类,相对会比较麻烦。如果包的是成员函数的话需要注意,由于类的成员函数的第一个参数是默认为this指针,所以function实例化的类型需要有类的对象的地址或者是对象,即使传的是对象,对象会使用。的实例对象可以包装存储其他的可以调⽤对象,包括函数指针、仿函数、 lambda 、 bind 表达式等,存储的可调用对象被称为。函数指针、仿函数、 lambda 等可调⽤对象的类型各不相同,
2025-07-17 16:36:27
980
原创 C++11笑传之引用
C++11是C++继98后的更新,其更新了许多内容,是非常重要的,除了我们前文所提到的范围for和auto,还有许多新的东西,对于C++11完全可以把它当成新的语言进行学习。
2025-07-12 18:04:44
721
原创 C++11之emplace
STL的容器都推荐使用emplace系列,虽然不是每次插入都会比push_back效率高。但是在传递参数的时候要传对象参数包,例如注意两者的区别,对于多参数的类型,如果有{}会识别成initializer_list,这就导致emplace是无法进行识别参数类型的,所以对于多参数类型,emplace是传递的对象参数包。
2025-07-12 18:04:29
388
原创 二叉搜索树——红黑树
红黑树本质也是一颗二叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。就进行右单旋+变色,将parent变为黑色,grandparent变为红色,其余情况就不一一列举,有右单旋+变色,有双旋+变色,旋转的情况和。首先,插入的结点一定是红色的,因为这才不会改变整体每条路径上的黑色结点数目,这里就需要进行分类了。如果N是红黑树的结点,h是最短路径长度,所以2。
2025-05-31 17:44:27
596
原创 二叉搜索树——AVL
AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。
2025-05-31 16:46:05
1177
原创 二叉搜索树
本文主要讲解二叉搜索树的功能作用及其底层实现。二叉搜索树的左子树的值小于等于根的值,根的值小于等于右子树的值,这样在走中序遍历的时候就是升序的,⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值。
2025-05-28 15:28:33
580
原创 C++STL——map与set的使用
关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。map是支持修改value的,但不能修改key,因为一旦修改就会破坏树的结构。以上代码功能:如果k在map中,就将k对应的value值++,如果k不在map中,就将k插入到map中,同时将value置为默认值,并且++。,),set与map都是不支持插入相同的值的,而multiset与multimap支持插入冗余值。set是key搜索场景的结构,
2025-05-28 15:28:14
357
原创 C++STL——stack,queue
本篇主要讲解stack与queue的底层,但并不会进行实现,stack的接口queue的接口,关于stack与queue的接口在这里不做讲解,因为通过前面的对STL的学习,这些接口都是大同小异的。
2025-05-10 20:03:05
1283
原创 C++STL——vector的常用接口
本文主要讲解vector的细节以及实现,因为在学习完string后,vector的接口理解起来较容易。vector本质就是一个顺序表,其提供了多种接口便于增删查改数据。capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STLreserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解
2025-05-07 22:12:53
308
原创 C++STl——list
list的细节之一就是其迭代器没有使用指针了,因为指针是无法达到迭代器的效果的,再补充下迭代器的类型,迭代器分为单向,双向,随机迭代器,单向迭代器的容器有forward_list,unordered_map等,单向迭代器只支持++,双向迭代器有list,map,双向迭代器支持++与–,随机迭代器有string,vector,deque支持++,–,+,-,迭代器的名字决定了其类型,list本身是有sort函数的,但是效率过低,不如将他粘贴到vector进行sort在粘贴回来,后续有代码证明。
2025-05-07 22:12:48
553
原创 C++三大特性——多态
继承下来的虚函数表如果存在基类有虚函数,但是派生类没有重写虚函数的情况,这个虚函数也会被继承到派生类的虚函数表里面,这就可以说明虚函数表是从基类继承过来的,因为其中仍有基类的虚函数。通过下图我们可以看到,满⾜多态条件后,底层不再是编译时通过调⽤对象确定函数的地址,⽽是运⾏时到指向的对象的虚表中确定对应的虚函数的地址,这样就实现了指针或引⽤指向基类就调⽤基类的虚函数,指向派⽣类就调⽤派⽣类对应的虚函数。即基类虚函数返回基类对象的指针或者引⽤,派⽣类虚函数返回派⽣类对象的指针或者引⽤时,称为协变。
2025-04-24 21:22:46
647
原创 C++——模版进阶
对于大多数类型,模版都可以正确得到结果,但是在一些类型,比如指针,在关于比较大小的函数模版中,指针的类型就无法得到想要的结果,所以这里需要对模版进行特化。如果将模版的声明与定义分离的两个文件,那么在调用的时候知道实例化成什么类型但是没有定义,在定义的地方不知道实例化成什么类型,无法生成对应的函数指令。在.h中定义了模版,本质是不需要链接,因为哪个.cpp需要使用模版,就可以直接实例化,在编译阶段就有地址,不需要链接。类的模版特化分为全特化与偏特化,全特化就是将模版参数全部确定,比如。这个T就是类型形参。
2025-04-22 08:27:41
559
原创 C++——STL简介
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。对于STL要做到能用能理解甚至可以扩充。
2025-04-13 19:35:06
193
原创 C++——模版初阶
模版顾名思义就是编译器根据这个模版可以自动推断类型,即当我们需要实现交换函数时,我们在形参中需要指定为一个类型,但如果我们需要交换的有多种类型就需要依靠函数重载,但一种类型函数就重载一次,显得过于麻烦,所以引进了模版。
2025-04-13 19:26:57
320
原创 蓝桥杯十二到十五届B,C++组签到题
本人是双非科班大一,马上第一次参加蓝桥杯,在参加之前只接触了三个月左右的算法,还是个蒟蒻,斗胆写下一些自己写真题的感受与方法,如有不对请指正。
2025-04-12 00:28:44
1335
原创 类和对象 --完结
之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。引⽤成员变量,const成员变量,没有默认构造的自定义类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没
2025-03-21 18:51:43
1074
原创 C++入门探微——类和对象基础
class修饰的即为类,{}中为类的主体,类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。定义在类⾯的成员函数默认为inline。class中存在限定符,被public修饰的成员能被外界直接访问,而protected以及private修饰的成员是不能被外界访问的,class默认为private而struct默认为public。C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。
2025-03-09 00:44:30
428
空空如也
为什么我无法读取已有整数数据的文件
2024-11-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅