- 博客(60)
- 收藏
- 关注
原创 【程序地址空间】页表的映射方式
进程就是一个运行起来的执行流,一个被加载到内存中的程序,同时进程等于内核数据结构加上自己的代码和数据对于一个操作系统而言,创建进程是一个成本比较高的事情,比如创建进程我们要创建进程的地址空间、创建虚拟地址和物理地址的映射关系、维护进程的信号、维护标准输出标准错误、维护与进程相关的文件、加载对应的代码和数据、进行缺页中断、写时拷贝等技术进程是操作系统分配资源的基本单位为了解决进程占据操作系统资源较多的这一问题,线程应运而生,那么什么是线程呢?
2025-12-31 22:13:38
872
原创 【单例模式】深入理解懒汉与饿汉模式
本篇文章我们主要来剖析程序设计当中比较常用的一个设计模式——单例模式,我将带领大家从单例模式的定义开始学习,然后介绍两种实现单例的方法:懒汉模式和饿汉模式,了解了原理后我将用一段简单的C++代码让大家体会单例模式单例模式是一种创建型的设计模式,它的核心思想是:保证一个类在整个程序运行过程当中只实例化出一个对象,并提供一个全局访问接口来访问类中定义的方法。
2025-12-30 22:06:11
782
原创 【CMake工程应用场景】发布程序以及构建静态库
本篇文章着重带领大家一起学习cmake在实践中的应用方式,我会带领大家一起学习如何用cmake来管理一些复杂场景的需求,例如:软件的发布、动静态库的生成、引入第三方开源的动静态库等,我会针对每一种应用场景选一个最典型的例子带领大家一起熟练使用cmakestep2:运行cmake构建工程,执行下载操作:以上就是我们执行完下载操作的全部流程,此时我们的可执行程序是被安装在了/usr/local/bin/这个路径下面,这个路径是由文件当中的指定的默认安装路径CMakeLists.txt所用的函数介
2025-12-27 16:38:59
625
原创 【CMake快速上手】看完秒懂CMake的各种指令
本篇文章我将带领大家一起学习CMake的指令,我们将从以下几个方面介绍CMake,首先是CMake的安装,我们将演示两种安装方式,分别在vscode和Linux系统下安装;其次我将介绍CMake常用的指令以及它们的作用,这一块是这篇文章的重点,我将深入浅出详细的介绍cmake各种指令的用法以及它们的底层作用,相信看完本篇文章你会对CMake有一个整体的认识。
2025-12-24 21:11:41
723
原创 【从0开始带你玩转项目】——高并发内存池原理及代码实现
内存池是池化技术的一种,所谓池化技术就是通过程序提前向操作系统申请过量资源,然后对过量资源进行管理。计算机当中有许多需要用到池化技术的地方,如线程池、对象池等等,而采用池化技术就是为了提高程序的运行效率,避免频繁申请资源造成的性能损失。内存池实际上是预先向操作系统申请一大块内存,并对这个大块内存进行管理,当上层需要内存时,内存池会根据需要分配内存,当上层需要释放内存空间时,则直接将内存释放到内存池,直到内存池程序退出时才真正将内存释放回操作系统。
2025-11-02 14:06:11
591
原创 【HTML教学】成为前端大师的入门教学
简单来说HTML是一种超文本的标记语言那么为什么会叫它超文本标记语言呢?我们可以将其分为两个方面来解释超文本:例如文本、视频、声音、图片、表格、链接等这种不仅仅局限于文字的东西我们称为超文本标记:HTML语言是由许许多多标签组成的因此可以这么说,HTML是一种由许许多多标签组成的,可以表示文本、音频、链接等内容的超文本标记语言所谓表单简单来说就是可以让用户输入信息,与用户做交互的,同时可以让后端服务器拿到用户的输入表单域:包含表单元素的区域表单控件:输入框、提交按钮、复选框等等。
2025-10-28 20:33:50
1122
原创 【git教程-成为git大师的必经之路】简单易上手版
相信大家在生活当中会遇到这么一个问题,情况一:我们发一篇论文,我们将论文初稿交给导师审核,导师觉得你的这篇文章需要加以修改,于是你在初稿的基础上加以修改,但是修改之后的文章依然不符合导师的要求,于是你又在原来的基础上再次加以修改,经过后面几次的修改,你导师还是觉得第一版更符合他的要求,但是此时你已经不知道之前修改了哪些内容本篇文章我们将一起学习版本控制器-git,情况二:有了这次的教训,在今后你的修改当中,你都是提前将原来的文章进行备份,然后在备份的文章当中进行修改,但是长此以往,你需要管理的文章变得越来越
2025-10-13 16:07:24
1084
原创 【MySQL在Ubuntu系统下的安装方法】保姆级教程
本篇文章我们开始介绍MySQL数据库的用法,俗话说的好,“工欲善其事必先利其器”,我们在学习MySQL之前首先要学会他的安装教程,由于本博主宝宝用的系统是Ubuntu系统,所以我将以Ubuntu系统为例,介绍MySQL的安装方法,话不多说我们直接开始。
2025-10-10 17:33:00
531
原创 【markdown文档使用教程】简单易上手版
首先我想来说一下为什么我要给大家来介绍markdown文档的使用教程,最近本博主宝宝正在面临找实习的问题,但是找实习之前我们都需要一份拿得出手的简历,于是我就在网上去找简历的模板,后来我转头一想,我在用模板制作简历,别人也在用模板制作简历,那么很大的概率就会出现两张相似的简历,因此就无法在众多简历当中脱颖而出,所以本博主宝宝决定自己制作简历。那么怎么才能制作出一份像样的简历呢?这就需要我们的markdown文档了markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。
2025-10-09 19:44:47
650
原创 【文件IO】认识文件描述符和内核缓冲区
hello各位佬,本篇文章我们将聚焦于文件IO的知识,在介绍这部分内容之前,我想先和大家回顾一下我们在C语言部分学习的操作文件的知识,以这个知识为基础我将引出文件描述符的概念,基于文件描述符的概念我们将来学习文件重定向,最后我们来学习文件缓冲区的概念。
2025-07-20 14:21:59
848
原创 【程序地址空间】虚拟地址与页表转化
既然我们所申请的空间都是虚拟地址,那么为了将我们所定义的变量写入内存必然存在虚拟地址到物理地址之间的转换,我们将虚拟地址到物理地址的转换过程称之为页表映射。那么页表映射是一个什么样的过程呢?我们通过一张图来简单理解:通过这张图我们可以看到,虚拟地址空间实际上是PCB结构体当中定义的一个结构体指针,通过这个结构体指针,指向虚拟空间这个结构体,我们在C语言上面申请的内存空间实际上是在这个虚拟空间上面开辟,然后通过页表映射到物理内存,最后加载到磁盘当中。
2025-07-17 22:29:14
994
原创 【命令行参数与环境变量】理解main函数的三个不同的参数
我们在前面的学习过程当中知道,有些指令我们可以不用指定路径就可以直接运行,而我们自己写的程序在运行时就必须加上对应的路径,我们之前对此的解释是,这些不用带路径就可以直接运行的指令是位于系统中/user/bin路径下的指令,那么我们不禁疑惑,为什么位于/user/bin路径下的指令就可以不用带路径直接运行呢?我们可以看到,argc的值是1,而argv数组当中的字符串竟然是我们在,命令行当中输入的命令,那么此时我们猜测:argc表示我们在命令行中输入的命令的个数;那么我们此时不禁疑惑,这些参数有什么用处呢?
2025-07-17 16:17:49
923
原创 【进程的优先级】带你学习进程的调度顺序及调度方法
前面的一篇文章我们学习了进程的状态,我们知道,操作系统在调度进程的时候会给进程设置一个状态,这个状态决定了当前进程接下来应该执行的工作,那么进程的调度顺序是什么呢?这将是我们这篇文章将要学习的内容。如果本篇文章对您有所帮助的话,希望您能够留下点赞关注加收藏,您的支持就是我创作的最大动力。当我们想要了解一个新知识之前我们就要了解这个概念诞生的背景,也就是说,为什么要有优先级这个概念?当我们知道优先级诞生的原因后,接下来我们就应该来探讨什么是优先级?那么优先级在哪里呢?那么我们如何查看进程的优先级呢?以Linu
2025-07-13 08:54:50
344
原创 【进程的优先级】带你学习进程的调度顺序及调度方法
当我们知道优先级诞生的原因后,接下来我们就应该来探讨什么是优先级?简单来说,优先级就是进程获取某种资源的先后顺序。优先级越高的进程有优先执行的权力那么优先级在哪里呢?在前面的学习中我们知道,进程等于进程的内核数据结构+代码和数据,而操作系统对进程的操作实际上是对内核数据结构PCB进行的操作,也就是说,这个内核数据结构包含了进程的一系列信息,而优先级作为操作系统调度进程的一个依据,进程的PCB里面当然包含了进程的优先级,也就是说,进程的优先级保存在进程的PCB当中那么我们如何查看进程的优先级呢?
2025-07-13 08:00:00
639
原创 【进程状态】带你玩转进程的阻塞、运行、挂起状态
前面的一篇文章我们介绍了什么是进程,我们知道进程实际上等于内核数据结构+代码和数据,这个内核数据结构就是PCB,里面包含了进程的各种不同的属性,而我们今天要介绍的进程状态就是PCB当中的一个属性,我们称之为进程状态。
2025-07-10 12:55:30
883
原创 【进程状态】带你玩转进程的阻塞、运行、挂起状态
前面的一篇文章我们介绍了什么是进程,我们知道进程实际上等于内核数据结构+代码和数据,这个内核数据结构就是PCB,里面包含了进程的各种不同的属性,而我们今天要介绍的进程状态就是PCB当中的一个属性,我们称之为进程状态。
2025-07-10 11:56:57
629
原创 【进程的概念】由浅入深带你了解进程的概念
我们翻开任何一本教材,都会告诉你,加载到内存中的程序就是进程,这对于我们来说是无法理解的,接下来我将从另一个视角带你了解进程的概念。首先我们要知道什么是程序?程序员通过代码编译形成的磁盘二进制文件就是程序但是这个程序仅仅存在于磁盘当中,因此我们不能称之为进程,我们需要将这个程序运行起来才能称之为进程,但是我们应该怎么加载到内存里呢?
2025-07-09 11:50:28
1140
原创 冯诺依曼体系结构及计算机硬件的介绍
如上图所示,就是冯诺依曼体系结构的主要组成部分,我们可以看到,它主要由以下几个部分组成:输入输出设备、存储器、运算器和控制器。一台最简单的计算机只需要由上面几个部分组成如今,运算器和控制器被集成在一起以cup的形式存在,也叫中央处理单元,仔细观察我们不难发现,这几个设备之间存在数据信号以及控制信号的交换,其中cpu之和存储器进行数据交换,输入设备将数据传送给存储器,再由存储器传递给输出设备;而控制信号则只由cpu的控制器发出。这里我们不禁出现疑问,为什么cpu之和存储器进行数据交换呢?
2025-07-08 10:49:49
654
原创 自动化编译脚本makefile的构建
我们先来看以下现象:我们可以看到,当我们想要编译形成一个程序时,我们需要使用gcc/g++来编译,如果我们想要看到代码是编译时错误还是链接时错误,我们需要分别写出相应的命令,如下图所示:我们可以看到,如果我们想要看到是编译中那些具体的步骤出现问题,我们就需要依次使用gcc/g++的各个选项然后进行编译,如果文件过多或者需要重新编译,这对于使用者来说十分不方便,我们仔细观察上面的指令,我们发现,它们之间存在依赖关系,即:test.i文件需要依赖test.c文件才能形成;
2025-07-08 08:00:00
990
原创 Linux编译器的使用及编译过程的剖析
前面的文章当中我们介绍了Linux系统中多模式的代码编辑器vim的使用方法,当我们用vim编写好代码之后,我们需要对代码进行编译,因此Linux的编译器gcc/g++就是我们本篇文章所要了解的,同时我们在了解编译器的使用方法时,我们也需了解底层的运行原理,也就是代码的编译过程是一个什么样的过程。相关文章。
2025-07-07 16:03:20
589
原创 代码编译的过程
我们所书写的代码实际上是一个文本文件,对于计算机而言,它只能看懂二进制程序,那么我们该如何把一个文本文件转化成计算机能够识别的二进制可执行程序呢?这就需要编译器来完成,而编译器在进行代码的编译时是通过以下几个步骤:预处理——编译——汇编——链接那么为什么会有这几个步骤呢?这就要结合计算机的发展史来说明了。在计算机刚刚诞生之时,我们要对计算机进行操作只能通过简单的开关来对计算机进行操作,也就是通过二进制的01代码进行编程,这对操作人员来说十分不方便;
2025-07-07 15:44:54
1096
原创 多模式编译器——vim的使用
什么是vim?简单来说,vim就是一个编辑器,类比于windows的记事本,我们可以在上面编辑代码、文字等,但是它又不同于记事本,它可以支持各种功能,例如:语法高亮、显示行数、代码提示、代码补全等。同时,它还支持各种不同的模式,在各种不同的模式下,我们可以完成各种不同操作。所以,总的来说,vim就是一个功能强大的文本编辑器。由于它的功能十分强大,因此被很多程序员,乃至公司运用广泛,所以vim是一个很基础的开发工具。前面我们说vim有许多种模式,总共有多少种模式呢?
2025-07-07 13:26:17
1320
原创 Linux基本指令(保姆级教学)
前面的文章当中我们介绍了Linux的发展史以及操作系统的基本概念,有了这些认识之后我们就要开始访问Linux操作系统,而Linux操作系统的操作都是指令,接下来的文章当中我将介绍Linux系统的基本操作指令所谓指令就是Linux指定bin目录下的可执行文件,其本质就是别人写的可执行程序或脚本,放在系统特定路径下,安装软件核心就是把目标软件拷贝放到指定路径下。
2025-04-26 21:15:59
874
原创 Linux系统的介绍及操作系统的基本概念
hello各位佬啊,本篇文章我们将开始学习Linux操作系统,在开始学习之前我将介绍Linux的发展历程,操作系统的基本概念以及Linux的常用命令,当我们学习完这些基本指令之后我们将用Linux系统来学习计算机网络,进程通讯等,下面就让我们一起进入Linux的世界吧。
2025-04-21 19:11:52
992
原创 STL——红黑树的封装及map/set的模拟实现
前面的文章当中,我们介绍了红黑树的模拟实现,我们了解到红黑树是一颗不完全平衡二叉搜索树,我们之所以要学习红黑树,不仅仅是学习它实现的思维逻辑,更多的是通过红黑树去学习map和set的底层,前面我们介绍map/set的使用中我们提到,他们的底层是用红黑树去封装实现的,那么具体是怎么完成的呢?我们将在这一篇文章当中介绍。
2025-04-19 17:00:32
1048
原创 数据结构(六)——红黑树及模拟实现
在前面的文章我们介绍了AVL这一棵完全二叉搜索树,我们分析后发现AVL树查找的时间复杂度是O(logN),说明这是一个很优秀的数据结构,但是在底层实现我们发现,AVL树为了维持它的性质,是需要进行频繁的旋转的,这样会造成不必要的消耗,那么有没有一种数据结构既可保证它的时间复杂度为O(logN),又能避免频繁的旋转呢?这就是我们今天要介绍的红黑树,学习了红黑树之后我们将用红黑树作为底层,去封装实现一个模拟的map和set,下面让我们一起来学习吧。
2025-04-15 17:04:01
1219
3
原创 数据结构(五)——AVL树(平衡二叉搜索树)
前面我们在数据结构中介绍了二叉搜索树,其中提到了二叉搜索树的缺陷:极端情况下时间复杂度会坍缩成O(N),如何解决它不够稳定这个问题呢?我们发现,只要让二叉树成为一个满二叉树,就可以很好的控制它在查找的过程中的时间复杂度为O(logN),接下来就让我们一起来学习平衡二叉树当中的AVL树吧。据结构(四)——二叉搜索树的实现(C++版)int _bf;
2025-04-10 20:55:27
1166
原创 STL——map和set的介绍
前面我们介绍了二叉搜索树的实现以及key/value模型的模拟实现,基于上述知识点,我们可以引入C++的两个关联式容器:map/set,其中set的底层是key模型,map的底层是key/value模型,有了这两个容器,可以帮助我们解决诸如去重、排序等问题,那么废话不多说,接下来就让我们一起来学习map和set的使用吧。数据结构(四)——二叉搜索树的实现(C++版)二叉搜索树与Key/Value模型。
2025-03-30 12:50:11
804
原创 二叉搜索树与Key/Value模型
前面的文章我们介绍了二叉搜索树的简单实现,对于二叉搜索树而言,它的最大作用是用来查找数据的,那么根据这一特点,我们可以设计一个Key/value模型,这个Key/Value模型就是根据一个值去找另一个值,例如:简单的字典实现、门禁系统、图书管理系统等,那么接下来我们将以二叉搜索树为底层,去介绍Key/value的原理。
2025-03-20 22:02:16
454
1
原创 数据结构(四)——二叉搜索树的实现(C++版)
在我们认识了C++的封装、继承、多态原理以及二叉树的结构后再来学习二叉搜索树的实现会显得比较轻松,同时通过二叉搜索树的实现,我们就了解到了STL库中比较重要的两个容器map/set的底层,这将为我们后面的学习提供一些帮助,接下来就让我们一起来学习二叉搜索树的实现吧。
2025-03-18 14:57:05
1149
原创 C++从入门到入土(八)——多态的原理
在前面的文章中,我们介绍了C++三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将着重介绍C++多态的实现原理。
2025-03-17 23:06:17
1713
原创 C++从入门到入土(七)——多态
C++一共有三个特性,封装、继承和多态,在前面的文章中,我们分别介绍了封装和继承的概念,现在本篇文章将完成C++特性的最后一块拼图——多态。在实际生活中我们会看到这种情况,一个人有不同的身份,比如在学校的时候是老师,在家是孩子,工作了是老师;我们在买票时,成人全票,儿童半价;动物的叫声,狗是“汪汪”,猫是“喵喵”等这些都是多态的实例,多态通俗将就是一个事物的多种状态,那么有了这个认识,我们将开启多态的世界。1.必须是基类的指针或引用调用虚函数2.被调用的必须是虚函数,并且完成了重写/覆盖。
2025-03-13 20:12:30
871
原创 C++从入门到入土(六)——继承的介绍
本篇博客我们继续来介绍C++的语法及相关概念,今天我们将来介绍继承的概念。在编写代码的过程中我们往往会遇见这种情况,我们实现了两个类,一个是学生,一个是老师,学生类中包含了学生的姓名、性别、年龄、成绩、学号等,老师类中包含了老师的姓名、性别、年龄、教授的学科等,我们发现这两个类的成员有很多重复的地方,如果我们将其分别写在一个类中,那么就会造成代码冗余,C++为我们提供了一个解决方案——继承,我们可以将姓名、性别、年龄等信息写在一个公共类中,然后其余类去复用这个类,然后增加相关的成员函数去完善这个代码。
2025-03-13 17:33:42
1023
原创 STL——priority_queue优先级队列的介绍和模拟实现
仿函数实际上是重载了operator()的类,通过重载operator()可以让类的对象像函数一样访问C++提供了一个关键字Comapre,这个关键字就是用来传仿函数的,用户在使用过程中通过传不同的仿函数从而实现不同的功能那么对于优先级队列有什么用处呢?我们查看C++标准库中的定义:我们可以看到,类模板中有三个参数,分别是参数T,适配器以及仿函数,默认的适配器是vector<T>,那么这里的仿函数的功能我们就可以知道是实现大小比较的,用户在使用过程中通过传不同的仿函数可以轻松实现大堆/小堆的建立。
2025-03-06 08:00:00
763
原创 STL——stack与queue的介绍及模拟实现
前面我们介绍了那个库里面的链表以及顺序表两个容器,通过这两个容器作为底层,我们可以去实现一些其他的数据结构,比如说今天我们要介绍的stack和queue,通过一个容器作为底层去封装实现另一个容器,这个过程在C++里面是适配器原理,这也是C++的一种设计模式。接下来的这篇文章,我们将着重介绍容器适配器以及stack和queen的模拟实现。
2025-03-05 11:47:40
862
原创 STL——list的介绍和模拟实现
list的底层是带头双向循环链表,可以在任意位置完成插入删除的功能,了解其迭代器我们将更加深入了解C++封装的特性。与vector相比,list的最大缺陷是不支持随机访问,但由于其底层封装了迭代器,因此list是可以通过迭代器访问的。
2025-03-03 17:51:41
784
原创 STL——vector的代码分析及模拟实现
前面我们介绍了string的模拟实现,本期我们将对vector的使用以及模拟实现进行介绍,vector作为我们接触的第一个标准模板库中的容器有着它独特的特点,通过vector的模拟实现,我们将更加直观地体会到C++的封装特性。string常用接口的模拟实现1.vector是表示可变大小的数组序列容器,就像数组一样,vector也采用连续存储空间来存储元素2.vector使用动态分配数组来存储它的元素,它会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间大。
2024-12-02 16:20:55
987
1
原创 数据结构(三)——双向链表的介绍以及实现
前面两期数据结构的文章我们介绍了顺序表和单向链表,那么本篇博文我们将来了解双向链表,作为最好用的一种链表,双向链表有什么特殊之处呢,接下来就让我们一起了解一下吧。数据结构(一)——顺序表的介绍数据结构(二)——链表的介绍以及单链表的实现目录前言双向链表的概念双向链表的实现1.定义2.双向链表接口定义1.初始化2.销毁4.打印5.尾插/尾删6.头插/头删7.任意位置插入/删除8.查找小结}LTNode;双向链表的定义如上所示,我们发现,在这个结构体内,
2024-12-01 19:24:28
1216
原创 string常用接口的模拟实现
上一篇文章我们介绍了string类中常用接口的使用方法,但是string底层是如何实现这些接口函数的呢?下面我们将开始探讨string类的模拟实现,希望通过本篇文章能够加深您对string类的理解。我们在.h文件中定义好了之后,创建一个string.cpp文件,我们将在这个文件中实现上述定义的接口,需要注意的是:在.cpp文件中要指定类域。分析上述代码,我们为_str开辟了一个新的空间,再将str的值拷贝放进_str中,其中我们多开了一个空间,这是为什么呢?
2024-11-23 17:46:37
843
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅