- 博客(51)
- 收藏
- 关注
原创 计算机网络(基础概念)
计算机网络基础概念摘要 本文介绍了计算机网络的基础概念,重点围绕协议分层和TCP/IP协议族展开。主要内容包括: 协议分层:协议本质是一种约定,采用分层设计实现模块化解耦,增强可维护性。OSI七层模型从物理层到应用层各司其职,实际主要关注1-4层。 TCP/IP协议:作为通信解决方案,其分层对应不同问题域。协议栈各层通过结构化数据类型实现通信,网络代码作为操作系统的一部分运行。 网络传输流程:局域网通过MAC地址识别设备;跨网络传输依赖IP地址标识主机,路由器连接不同网络。数据封装/解包过程贯穿各协议层。
2025-07-14 14:42:24
951
原创 计算机系统概述(2)
我们知道计算机执行的过程其实就是一串串指令执行的过程,指令的执行都是需要相应的控制信号进行控制,这时问题来了,这些控制信号什么时候发出?这些都需要相应的定时信号作为同步的,cpu产生得时钟信号就可以作为同步的定时信号,用来统一各个步骤的控制信号,在执行指令时,每个时钟周期内执行一定数量的指令操作。当我们使用cmd时他也会加载到内存中,然后我们输入.exe文件,这个文件也会加载到内存,然后会调用操作系统的系统调用服务,才能将内容显示到显示器。这里需要使用最上面七个思想中的第二个:加速经常性事件。
2025-05-26 17:00:16
36
1
原创 计算机系统概述(1)
1、例如最简单的hello world程序,它被编译为汇编就如上图右侧,而汇编在计算机存储时本质上也是被翻译为一串二进制,所以一串二进制在计算机中所三种解释。现在我们要实现上图的操作:将主存地址为7的数据加载到1号寄存器中,我们可以设计指令如上图。(1)当程序被加载到内存时,首先程序的第一条指令的地址会被加载到PC寄存器中。(6)控制单元给IR和MDR发送控制信号,将MDR中的指令存放在IR寄存器中。(8)控制单元分析IR中的指令,然后做出对应指令的操作。(3)MAR中的地址会通过地址总线发送到内存中。
2025-05-26 15:31:41
919
原创 python基础语法(2)
基于缩进的方式表示代码块, 带来的好处就是强制要求程序猿要写明确的缩进, 来明确代码之间的相对关系. 如果缩进书写的不对, 则直接报错.在代码1 中, print(“world”) 有一级缩进, 这个语句属于 if 内的代码块, 意味着条件成立, 才执行, 条件。执行结果一定为 “123”, 而不会出现 “321” 或者 “132” 等. 这种按照顺序执行的代码, 我们称为 顺序语句.python 的 for 和其他语言不同, 没有 “初始化语句”, “循环条件判定语句”, “循环变量更新语句”, 而是。
2025-05-06 19:42:24
465
2
原创 再识动静态库
6、程序最终在磁盘上存储的其实是二进制,将文件内容加载到内存中时,其实是加载到内存的物理地址,文件内容也就是一句句指令,它是不是也要有自己的物理地址,所以一个程序被加载到内存中时,不光它内部有互相调用的虚拟地址,还有被加载到内存的物理地址。main函数并不是第一个执行的函数,所以它的地址并不是0,其次指令它是二进制,也有自己的长度,两个地址之间的差值就是一个指令的长度,逻辑上只需要找到起始地址,就可以运行该程序。1、首先可执行程序是有自己的格式的,它的格式我们称为ELF,上面这张就是ELF的具体组成。
2025-05-04 16:52:17
819
原创 磁盘文件系统
1、文件可以分为打开的文件和没有被打开的文件,之前我们谈的进程中的文件就是打开的文件,这一节的内容我们要讲的就是没有被打开的文件2、首先我们需要明白对于所有的文件,其实没有被打开的文件占大多数,所以对没有被打开的文件的管理是非常重要的,其次我们需要知道打开的文件是被加载到内存的,那没有被打开的文件在哪里?—很显然就是磁盘3、磁盘上的文件被打开的前提是什么?
2025-05-03 15:18:58
1142
原创 进程控制(linux)
当程序要创建子进程时,父进程就会将当前页表的执行权限全部改为只读,当子进程数据需要修改时,操作系统就会马上识别到我们当前操作是对只读区域进行修改(触发系统错误),然后系统进行缺页中断进行系统检测,然后系统判断发生写时拷贝,然后系统再申请内存、发生拷贝、、、、6、我们上面已经知道了当我们使用execl时,该进程的代码和数据就已经全部被替换,那要是我们让子进程去执行execl这一操作,父进程仍然完成自己的操作,例如命令行提示,这不就是一个简单的shell嘛。如,子进程运行完成,结果对还是不对,
2025-04-21 14:37:06
1044
2
原创 python基础语法的学习(1)
a = 10创建变量的语句非常简单, 其中a 为变量名. 当我们创建很多个变量的时候, 就可以用名字来进行区分.= 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中.注意: 变量的名字要遵守一定规则.硬性规则(务必遵守)1.变量名由数字字母下划线构成.2.数字不能开头.3.变量名不能和 “关键字” 重复.4.变量名大小写敏感. num 和 Num 是两个不同的变量名.软性规则(建议遵守)1.变量名使用有描述性的单词来表示, 尽量表达出变量的作用.
2025-04-15 20:31:26
699
原创 动态规划算法
https://www.luogu.com.cn/record/2081482932.2 数字三角形https://www.luogu.com.cn/record/2081590913、基础线性dp线性dp 是动态规划问题中最基础、最常⻅的⼀类问题。它的特点是状态转移只依赖于前⼀个或前⼏个状态,状态之间的关系是线性的,通常可以⽤⼀维或者⼆维数组来存储状态。我们在⼊⻔阶段解决的《下楼梯》以及《数字三⻆形》其实都是线性 dp,⼀个是⼀维的,另⼀个是⼆维的。https://www.luogu.co
2025-04-12 16:27:55
1210
原创 linux环境变量
5、子进程也有地址空间,子进程直接继承父进程的页表,代码与数据,所以子进程也会直接映射父进程的物理地址,在不修改时物理地址也会共享,但一旦发生写入,操作系统会申请一个同样大小的物理空间,然后操作系统直接更改子进程页表里的物理地址,但虚拟地址不会发生变化(写时拷贝机制)4、一个进程的地址空间由自己的struct mm_struct(虚拟地址),但总归这个程序的数据还是要存放于内存当中,所以操作系统引入页表,页表左边存放着虚拟地址,右半部分存放着物理地址,程序员对虚拟地址的操作会映射到物理地址。
2025-03-25 22:55:34
1113
1
原创 linux下的进程
2、阻塞:每一个硬件设备也被一个结构体所管理,这个结构体内有着该设备的准备情况,例如一个程序需要键盘读入,但是我们一直不向键盘写入,那么该runqueue里所有的进程岂不是都会卡在当前这个进程,这是不被操作系统所允许的,故此设计师就在硬件的struct device中设计一个队列,专门来存放这些还没有准备好的进程,当我们再次输入后,操作系统就会将这个进程重新放入运行队列。在runqueue中存在一个queue,这个队列存放的是每一个进程的优先级,0-100(实时进程),100-140(我们的进程),
2025-03-15 15:38:44
1011
1
原创 数据结构--算法篇
单调栈,顾名思义,就是具有单调性的栈。它依旧是⼀个栈结构,只不过⾥⾯存储的数据是递增或者递减的。这种结构是很容易实现的(如下⾯的代码),但重点是维护⼀个单调栈的意义是什么?单调栈解决的问题单调栈能帮助我们解决以下四个问题:• 寻找当前元素左侧,离它最近,并且⽐它⼤的元素在哪;• 寻找当前元素左侧,离它最近,并且⽐它⼩的元素在哪;• 寻找当前元素右侧,离它最近,并且⽐它⼤的元素在哪;• 寻找当前元素右侧,离它最近,并且⽐它⼩的元素在哪。虽然是四个问题,但是原理是⼀致的。
2025-03-14 22:56:11
1150
原创 搜索算法总结
搜索,是⼀种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。搜索⼀般分为深度优先搜索(DFS)与宽度优先搜索(BFS)。
2025-03-11 19:24:32
960
原创 基础算法总结
模拟,顾名思义,就是题⽬让你做什么你就做什么,考察的是将思路转化成代码的代码能⼒。这类题⼀般较为简单,属于竞赛⾥⾯的签到题(但是,万事⽆绝对,也有可能会出现让⼈⾮常难受的模拟题),我们在学习语法阶段接触的题,⼤多数都属于模拟题。当数据的值特别⼤,各种类型都存不下的时候,此时就要⽤⾼精度算法来计算加减乘除:• 先⽤字符串读⼊这个数,然后⽤数组逆序存储该数的每⼀位;• 利⽤数组,模拟加减乘除运算的过程。⾼精度算法本质上还是模拟算法,⽤代码模拟⼩学列竖式计算加减乘除的过程。
2025-03-06 23:40:56
1017
原创 Linux下的git与gdb
协作:首先在gittee新建仓库然后点击克隆/下载然后复制HTTPS里的网址将远端仓库拉取到本地:进入这个目录之后.git就是隐藏的本地仓库(里面包含的是所有的修改记录).gitignore:后缀过滤,远程仓库只提交源文件(.c/.cpp/.h)当我们需要提交代码到本地仓库时:但是这个时候其实还并未直接添加到git里,而是先添加到临时仓库里查看当前git仓库状态当我们需要将临时仓库里的文件提交到git需要我们称为日志信息/提交日志信息那我们如何将本地仓库提交到远程仓库:需
2025-03-05 20:29:04
893
1
原创 _make_进度条
去掉前面的lib和后缀,剩下的就是什么的库静态链接,相当于我们将库中的这一个方法下载到本地链接使用,例如一个文件如果使用静态库中的一个方法,那么就会将文件与库方法结合形成一个新的文件动态链接,相当于这个方法在库(共享库)中存着,我们需要使用再去库中找它,但是共享库一旦缺失会导致全部程序无法执行。
2025-03-03 09:20:43
911
原创 Linux开发工具
1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.3、软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.4、yum。
2025-02-27 22:41:32
1082
原创 权限(1)
在两个普通用户需要进行文件交互时,我们需要在 / 目录下的一个叫做tmp目录下操作(不能在私人账号下操作),这个时候我们需要打开other的rwx权限,但此时别人也可以删除我们所拥有的文件,2、系统确定用户时,只会匹配一次,也就是如果自己为拥有者,但关闭了拥有者的读写权限后,就算所属组里也有自己,也不会让自己读写。那么现在就出现一个问题,如果普通用户只需要自己的密码就可以提权为root,那么岂不是人人root?例如:安装软件,需要root权限-----所有软件其实只安装了一份,允许大家使用。
2025-02-26 19:32:45
914
原创 linux指令2
less /var/log/messages 跟more功能一样,但它支持向上翻找(推荐),/内容,自动定位包含该内容的那一页日志。2、echo “内容” > test.c :将指定内容写入指定文件,如果该文件不存在,会创建文件并写入,再次写入时,先清空,再写入。more /var/log/messages 只打印满一屏幕日志,如果需要继续查看,点击回车。echo ‘内容’ >/dev/pts/0 向0号终端设备写入内容,也就是在0号设备打印。cat /var/log/messages 查看日志。
2025-02-23 17:07:46
662
原创 linux初识
用于Debian的所有Binary软件包都可以安装到Kali Linux上,而Kali的魅力或威力就来自于此。Fedora是一款非常好的发行版,有庞大的用户论坛,软件库中还有为数不少的软件包。Ubuntu侧重于它在这个市场的应用,在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。毫无疑问,Kali Linux是一款渗透测试工具,或者是文明黑客(我不想谈论恶意黑客)青睐的操作系统。,此时任何选项都接收即可,在输入密码时,如果出现密码框是灰色的,那么此时我们需要在云服务器上重置密码。
2025-02-22 09:10:14
663
原创 蓝桥杯准备训练(lesson5 ,c++)
上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要。printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d。上⾯⽰例中, %s 表⽰代⼊的是⼀个字符串,所以 printf() 的第⼆个参数就必须是字符串,这个例。++ 是⼀种⾃增的操作符,⼜分为前置 ++ 和后置 ++ , – 是⼀种⾃减的操作符,也分为前置 –⼦是 zhangsan。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这。
2024-12-10 20:07:13
3219
53
原创 蓝桥杯准备训练(lesson4 ,c++)
意识到数据类型的取值是有其范围的,那么我们在编程的时候就要选择合适的数据类型,才能得到正确的结果。在写代码时候,⼀定会涉及到计算。上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是。链接:https://ac.nowcoder.com/acm/contest/18839/1031。链接:https://ac.nowcoder.com/acm/problem/21990。• / 除法的操作符,除数不能为0,如果除数为0,程序会崩溃的。
2024-12-07 20:23:38
4355
74
原创 蓝桥杯准备训练(lesson1,c++方向)
• main 函数是程序的⼊⼝• main 函数有且仅有⼀个• ⼀个项⽬中可以有多个 .cpp ⽂件,但是只能有⼀个 main 函数(因为程序的⼊⼝只能有⼀个)关于函数, 这⾥不做过多描述,我们后⾯有专⻔的函数章节来讲解。
2024-12-03 16:15:32
14964
70
原创 优选算法精品课--滑动窗口算法(一)
这道题也需要我们转换一下思路,如果我们来按照题目中的方法来左右一个一个删除的话,情况太多了,所以我们可以来找反面,正所谓“正难则反”嘛,所以我们就去找中间的区间,让中间的区间元素和为数组总元素和与x之差相等,再用一次滑动窗口求解出这个区间即可。这道题需要我们转换一下思路,如果我们老老实实的按照题目中的那样先将一个0翻转为1,再找一个0翻转为1,那就太复杂了,那我们转换一下思路,我们是不是可以找一个区间,这个区间里0的个数为题目中的k,然后求这个区间最大的长度即可。解法二:根据规律,使用滑动窗口来解决问题。
2024-11-04 21:33:31
2889
95
原创 高阶数据结构--图(graph)
邻接顶点:在无向图中G中,若(u, v)是E(G)中的一条边,则称u和v互为邻接顶点,并称边(u,v)依附于顶点u和v;在有向图G中,若<u, v>是E(G)中的一条边,则称顶点u邻接到v,顶点v邻接自顶点u,并称边<u, v>与顶点u和顶点v相关联。E = {(x,y)|x,y属于V}或者E = {<x, y>|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫。是无序的,顶点对(x,y)称为顶点x和顶点y相关联的一条边,这条边没有特定方向,(x, y)和(y,x)
2024-10-31 21:04:10
2694
97
原创 优选算法精品课--双指针算法(2)
1、双指针常用于数组中元素的操作,但其他地方例如快乐数也可以使用,总的来说看到数组我们可以优先考虑双指针是否可行,然后考虑其他算法2、在数组中对元素操作我们尽量都要画图,一定要考虑特殊情况,否则会把我们坑得死死的。
2024-10-28 18:09:12
4076
103
原创 用哈希表封装unordered_map与unordered_set
但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中。这⾥的难点是反⽽是结构设计的问题,参考上⾯的源码,我们可以看到iterator中除了有结点的指针,还有哈希表对象的指针,这样当前桶⾛完了,要计算下⼀个桶就相对容易多了,⽤key值计算出当前桶位置,依次往后找下⼀个不为空的桶即可。
2024-10-25 16:44:57
2593
90
原创 哈希表的实现(开放定址法与链地址法)
• 线性探测的⽐较简单且容易实现,线性探测的问题假设,hash0位置连续冲突,hash0,hash1,hash2位置已经存储数据了,后续映射到hash0,hash1,hash2,hash3的值都会争夺hash3位置,这种现象叫做群集/堆积。开放定址法中所有的元素都放到哈希表⾥,链地址法中所有的数据不再直接存储在哈希表中,哈希表中存储⼀个指针,没有数据映射这个位置时,这个指针为空,有多个数据映射到这个位置时,我们把这些冲突的数据链接成⼀个链表,挂在哈希表这个位置下⾯,链地址法也叫做拉链法或者哈希桶。
2024-10-22 21:58:53
1864
90
原创 封装红黑树实现Myset与Mymap
• end()如何表⽰呢?如下图:当it指向50时,++it时,50是40的右,40是30的右,30是18的右,18到根没有⽗亲,没有找到孩⼦是⽗亲左的那个祖先,这是⽗亲为空了,那我们就把it中的结点指针置为nullptr,我们⽤nullptr去充当end。具体参考迭代器–实现。• 如果当前结点是⽗亲的右,根据中序左⼦树->根结点->右⼦树,当前当前结点所在的⼦树访问完了,当前结点所在⽗亲的⼦树也访问完了,那么下⼀个访问的需要继续往根的祖先中去找,直到找到孩⼦是⽗亲左的那个祖先就是中序要问题的下⼀个结点。
2024-10-20 16:51:03
1165
63
原创 数据结构之红黑树的实现
红黑树相较于AVL树抽象许多,但实际代码实现并不复杂,所以这一块的难点在于理解插入的过程,而插入的过程与uncle节点紧密相关,如果想要学好红黑树,uncle使我们必须要掌握的。
2024-10-16 11:00:59
2244
74
原创 AVL树的实现
• AVL树实现这⾥我们引⼊⼀个平衡因⼦(balance factor)的概念,每个结点都有⼀个平衡因⼦,任何结点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等于0/1/-1,AVL树并不是必须要平衡因⼦,但是有了平衡因⼦可以更⽅便我们去进⾏观察和控制树是否平衡,就像⼀个⻛向标⼀样。• 旋转核⼼步骤,因为5 < b⼦树的值 < 10,将b变成10的左⼦树,10变成5的右⼦树,5变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵的⾼度恢复到了插⼊之前的h+2,符合旋转原则。
2024-10-14 12:23:08
1470
78
原创 数据结构之二叉搜索树(key模型与key_value模型)
今天我来介绍的是二叉搜索树,这一块我希望大家如果有不会的地方下来好好理解,这一节课与下一节的set/map关联挺大的。
2024-10-11 09:51:11
2172
71
原创 c++之多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。•必须指针或者引⽤调⽤虚函数•被调⽤的函数必须是虚函数。说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向派⽣类对象;第⼆派⽣类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派⽣类才能有不同的函数,多态的不同形态效果才能达到。
2024-10-09 14:48:46
1218
62
原创 c++继承(下)
1、继承在生活中常见的只有公有继承,所以公有继承一定要弄明白。2、派生类的默认成员函数与之前学的普通类的是一样的,如果我们需要显示的去写构造函数等等,需要将父类作为一个整体,去调用父类的构造等函数。3、继承这块是先构造父类再构造子类,析构是先析构子类再析构父类4、菱形继承目前阶段我们把握不住,并且用到的场景也可以通过其他方式解决,所以最好不要写菱形继承,但是学校可能会考,所以也是需要简单了解下的。5、如果我们需要设计一个不能被继承的类,我们有两种方式:(1)将基类构造函数变为私有。
2024-10-07 09:23:15
1333
61
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人