自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 Linux网络编程:网络基础

当我们形成计算机网络后,小明要给他的暗恋对象小红发一句“我喜欢你”,结果发给了小芳……,在计算机网络中会出现许许多多的主机,当我们进行网络通信时,我们要通过协议来找到指定的接收方。同理在单台主机中,数据从键盘中读入再转载到当前网卡也是需要协议的。简单来说:协议就是一种约定当计算机在读取数据时,发现数据中存在向网卡输送的标志(协议)时,就往网卡输送。当网卡读取到输送给小红,网卡就不会发送给小芳。

2024-05-20 20:42:03 861

原创 C++学习进阶:C++11线程库

操作系统:线程-CSDN博客不同的语言实现多线程的本质就是对不同系统实现的多线程的实现进行封装。// C++跨平台封装对应系统的thread的实现 ---#else#endif线程的学习我们已经在前面的几篇操作系统博客中进行了系统的学习了,接下来我们主要对C++11线程库提供的接口进行学习。在开始这篇博客的学习之前,我们需要回顾操作系统:线程互斥|线程同步|锁的概念-CSDN博客。

2024-05-09 23:57:11 941

原创 操作系统:线程相关知识

首先我们需要知道锁的本质就是信号量,也就是信号量的使用是为了将并发访问资源强制转化为串行访问,至于为什么我们已经很熟悉了,我们也知道锁又称为二元信号量,处理的是只有一块资源的问题。当我们多线程访问时,对于队列资源内部的每一个小资源可以存放数据,访问时需要加锁操作,那么这样子就需要许多把锁,显然是不合理的,所以就衍生出了多元信号量来处理多线程访问多块资源的问题。那么天然的,在环形队列的生产消费模型中,我们需要对队列资源进行同步和互斥的实现,共享的多个资源我们可以借助学过信号量来进行访问的控制……

2024-05-07 20:29:57 696

原创 操作系统:线程互斥|线程同步|锁的概念

死锁是指在一组进程(或线程)中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。简单来说:死锁就是程序员写的一个bug,在这个bug中线程、线程因为需要等待锁资源锁出现了互相等待资源的情况。// 定义全局锁// 全局使用锁// 给每个线程进行死循环抢票while (1)// 进行加锁else// 不进行解锁break;单个锁也可能出现死锁问题。

2024-05-03 01:49:25 1006 1

原创 操作系统:线程

在前面的学习中,我们知道进程是一种处理任务的执行流,操作系统中的大部分任务都由进程来处理,而进程的创建,需要开辟内存来产生进程PCB、进程虚拟地址空间、页表……,而这个进程的创建成本较大,于是操作系统实现了另一种执行流------线程。线程是比进程更加轻量化的一种执行流,线程是进程内部的一种执行流。线程是CPU调度的基本单位,进程是承担系统资源的实体。

2024-05-01 22:07:37 885

原创 操作系统:进程信号

信号是一种向目标进程发送通知信息的一种机制,也称为进程之间事件异步通知的一种方式,属于软中断。

2024-04-29 00:02:27 535

原创 操作系统:进程间通信 | System V IPC

System V IPC(系统5的进程间通信)是在Unix操作系统上实现进程间通信(IPC)的一种机制。它引入了一大类进程间通信方法,包括共享内存、消息队列和信号灯集等IPC对象。每个IPC对象都有唯一的ID,这个ID在创建时由系统分配,并且IPC对象在创建后一直存在,直到被显式地删除或系统关闭时自动释放。在这篇博客中,我们重点介绍System V IPC中的共享内存部分,以及学习消息队列、信号量的一些接口的使用和 Linux下实现的System V IPC统一的数据结构体系……

2024-04-25 21:19:44 999 1

原创 操作系统:进程间通信 | 管道

进程间通信(Inter-Process Communication,简称IPC)是指在不同进程之间传播或交换信息我们知道:进程之间是独立的,所以进程之间的进程间通信一定不是两个进程直接通信的,为了保证进程间的独立性和实现进程间通信,操作系统就设计了若干种进程间通信方式,来实现多进程之间的协同工作。

2024-04-23 16:04:15 546 1

原创 C++学习进阶:IO流

流(Stream)是计算机编程中用来处理输入/输出(I/O)操作的一种抽象概念。在编程中,流可以被视为数据的连续序列,这些数据从数据源(如文件、内存缓冲区、网络套接字等)流向数据接收者(如另一个程序、设备或内存中的数据结构)。IO流(Input/Output Streams)是标准库提供的一种用于处理输入和输出操作的机制。这些流封装了数据的读写过程,使得开发者可以更方便地处理文件、控制台、内存和网络中的数据。输入流(Input Streams):用于从数据源读取数据。例如,是所有输入流的基类,

2024-04-20 23:41:07 625

原创 C++学习进阶:C++11|智能指针

这是一篇又臭又长又精华的博客,需要每一个模块认真学习,仔细理解,这一部分也是C++面试常考的内容,那么废话不多说,just do it!

2024-04-19 20:20:00 1016

原创 C++学习进阶:异常

我们在C语言的学习中,了解了C语言的错误处理机制是通过终止程序和返回错误码这两种形式。而对于C++,是通过使用“异常”这一种错误处理机制,它允许程序在运行时遇到错误时,能够以一种结构化和可预测的方式进行处理。异常处理机制包括:抛出异常(throw)、捕获异常(catch)

2024-04-18 23:14:15 805

原创 C++学习进阶:C++11特性(下)

可变参数模板是C++11引入的一种特性,它允许函数或类模板接受任意数量的参数。通过使用可变参数模板,我们可以编写更加灵活和通用的代码。可变参数模板使用...表示参数的可变性。我们可以在函数模板或类模板中使用可变参数模板。我们在命令行参数的学习中,知道参数是通过argv这个指针数组获取的,而对于可变参数模版它的参数是通过函数形参参数包中获取的。而Args对应着很多类型,我们在进行args访问时,会进入对应的...中不断“递归”查找到参数,并进行操作。这个场景也可以这样子解析参数包!

2024-04-18 14:42:44 959

原创 C++学习进阶:C++11特性(上)

C++11是C++语言的一个重要版本,引入了许多新的特性和改进。接下来进行这些新特性的学习!

2024-04-16 13:12:45 1125

原创 C++学习进阶:哈希思想的进一步体现

我们在之前对哈希表的学习,明白了哈希的本质就是一种映射!!!只要是实现了映射关系我们就能够说这个是“哈希”。哈希:通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。在我们实际开发中,大部分场景是处理海量的数据,例如在博客中3.3中提及的如何在40亿数据中判断某个数据在不在的问题。因为哈希映射关系的这个思路,我们最终就可以通过更小的比特位来实现数据之间的映射。

2024-04-13 00:52:11 98 1

原创 C++学习进阶:二进制与位运算

这一部分本来是C语言的内容,当学习位图时,发现这一部分的只是有点欠缺,所以恶补了一下,望周知!!!

2024-04-11 21:06:41 479

原创 C++学习进阶:unordered_set和ma的实现

我们在上一篇博客数据结构与算法:哈希表-CSDN博客中学习了哈希表这个数据结构,也对哈希桶有了一定的了解,学习这个数据结构的本质是为了对STL容器unordered_set和unordered_map进行深入的学习我们在C知道中搜索“unordered_set和set 区别”,发现了这两个容器对应着不同的场景,为了更好的了解这个两个容器我们开始学习如何实现“unordered_set和map”把!!!C++学习进阶:map和set的实现-CSDN博客。

2024-04-10 00:27:40 966

原创 数据结构与算法:哈希表

值得注意的是,这里的删除我们只是修改了“状态”和减少了“key”的个数,这个位置上的数据并没有删去,再结合“增”中的逻辑:不为空就可以插入,那么这里的删除只是为了将状态从存在转为删除,是一种伪删除,目的是通过插入来实现覆盖式的插入。我们在上面讲过我们需要控制哈希表中 “空” 位置的数量,一般来说我们通过负载因子来实现,随着数据的插入,num的就会增加,随之空位置数目就减少,负载因子增加,所以哈希表会设定一个负载因子的最大值,当超过这个值时,哈希表会进行扩容!那么到了这里哈希桶我们也实现了!

2024-04-08 21:17:18 847

原创 操作系统:动静态库

当我们从文件的代码区出发,运行代码的本质就是地址的跳转,但是代码区相当于只存储了代码的声明,实现在库中,所以我们就需要代码区进行到某个函数时跳转到对应共享区的部分,通过偏移量,映射到内存中代码的实现!在Linux中可执行文件一般以ELF的格式出现,符号表中存放着调用某些库的方法的地址,那也就是当可执行文件加载进内存时,进入内存的只有文件中对应库方法的地址,而没有库中的实现,也就对应了我们之前没有将动态库加载进内存中会出现报错!而运行动态库是和可执行程序分离的,所以需要将动态库加载到内存中。

2024-04-03 12:42:05 658

原创 操作系统:浅谈文件系统

我们知道文件可以分为:已被打开文件(被进程加载) 和 未被打开文件(在磁盘中保存)这两种文件,而我们对文件的学习也不能只局限于 对被进程打开的文件,因为大部分文件都不是被打开的,而是在磁盘中。这就引申到了操作系统是如何管理未被打开文件,并如何将他们从磁盘中加载到内存,并被进程调用的呢?这就是我们接下来要讲的文件系统的知识了。

2024-04-02 12:34:38 896

原创 操作系统:初识文件

对于一个描述文件的结构体,不仅存放着关于文件的所有内容和属性,还拥有着一块属于自己的缓冲区。当我们在进行对文件的读取时,需要将文件数据加载到内存。如果需要进行写入时也是需要加载数据到内存中。而这这些数据一般存放在文件定义的这一块文件缓冲区中!那么用户在应用层进行数据读写的本质就是:在内存进行数据的读写后,再进行内存与外存之间的拷贝,也就是 将内核缓冲区的数据进行来回的拷贝!!!

2024-03-27 16:51:35 729

原创 操作系统:进程控制(下)

这里我们发现了一个很有意思的东西,我们之前讲过fork函数给父进程返回子进程的pid,而这里的进程等待判断关系 rid 和 id也是相等的,这也就说明了,fork函数给父进程返回子进程的pid的本质就是为了方便对子进程进行进程控制,在这里表现为等待子进程,并回收!如图是:一个进程在创建过程中的示意图,我们知道对于一个进程会创建一份的代码和数据,当我们使用execl函数时,本质上就是加载另一个程序,用新程序的代码和数据来替换这一份的代码和数据,这时进程的属性不发生改变,发生改变的只有加载到物理内存的部分!

2024-03-18 13:59:40 1017

原创 操作系统:进程控制(上)

发生写入之后,操作系统就会发现权限冲突,于是修改权限,接着写入新的数据并开辟一块新的空间,将对应数据的页表连接新的物理内存。当父进程形成子进程后,子进程为了写入,发生写时拷贝,重新申请空间,然后修改页表。如图我们代码中返回11,外部bash进程接收这个进程的退出码11并返回,同理第二次接收的是echo这个指令,正常并返回0(return 0正常终止,并完成)。进程终止后,它的相关信息会从操作系统的进程表中删除,资源会被回收,以便其他进程可以使用,确保系统资源的有效利用和进程间的良好协作。

2024-03-13 15:37:28 547

原创 操作系统:进程地址空间

我们在学习C/C++时,对于各组分的地址分配在程序地址空间的不同模块如图我们能够验证各组分的对应的地址排布位置,但是我们可以看到堆是向上排布,栈是向下排布这个怎么验证呢?所以我们验证了堆的开辟是有下到上,栈的开辟是由上到下,堆栈相对而生,并且我们可以发现堆栈之间有一块大的空白(这也是栈溢出发生的原因)另外,在栈区中,我们知道地址是由高到低排布的,然而一个整型变量 int a;

2024-03-11 23:43:24 757

原创 操作系统:环境变量

如图:在Linux操作系统中我们跑这一段程序,发现结果分别打印了,程序名 + 我们写的一段话的每一部分(这里有以空格为分隔符,分割几份子串),数一数恰好从0-8一共有9份,我们再看回这一段代码,我们可以猜到argc = 9,也就是九个字符串,并且对应着这个指针数组,那么我们可以抽象出来。答:首先环境变量里在系统中以“脚本配置文件”的形式存储,当我们启动时会重新生成对应的环境变量信息,也就是就算修改了bash的环境变量,也只是修改了加载在内存时的环境变量表,并不影响磁盘中存储的“脚本配置文件。

2024-03-11 01:47:51 689

原创 操作系统:进程优先级

就是进程在运行队列排队时,当第一次被CPU调度,会产生一份进程上下文,当在这个时间片完成调度后,这段上下文会被保存在进程PCB相关的结构体tss_struct中,然后再把排队的下一个进程PCB的上下文放入寄存器中,这样CPU通过读取放入的上下文就知道从哪里开始继续将这个进程运行下去。以上是进程相关的一些概念,一般情况下,多个进程都是在一个CPU上被调度,并且多进程场景下在任意时刻,都会出现多个单进程在某一个时间片内快速切换,CPU进行运算,进行高频切换进程,这时候处于进程的“并发”NI:优先级的修正数值。

2024-03-08 21:23:00 474

原创 Linux:好用的Linux指令

创建一个进程后输入上述代码,会打印进程信息,当我们在code.exe中写入打印pid,ppid,这里也和进程信息一致。这个是循环打印进程信息,便于动态观察。

2024-03-08 13:28:15 280

原创 操作系统:进程状态

进程状态是指一个进程在其生命周期中所处的不同状态。

2024-03-08 13:26:41 1104

原创 操作系统:进程

再结合我们进程会有相应的PCB,那么创建子进程后会以父进程为模版,为子进程创建PCB,并且和父进程共享代码和数据(当数据修改时,需要进行写时拷贝,各自拥有一份,防止破坏进程之间的独立性),并且在不同的时间片各自被CPU调度,继续往后执行,这里也体现了进程的独立性。我们在实际使用计算机的场景中,操作系统会同时运行多个程序,也就是拥有多个进程,我们从操作系统的思想“先描述再组织”中可以知道,为了便于管理,就需要描述个体程序,然后用数据结构串联,这里也就是进程和程序的差别。接下来我们用一个程序的场景来描述一下。

2024-03-06 21:13:40 795

原创 Linux:常见Linux指令

1。

2024-03-06 11:18:58 249

原创 操作系统:初识操作系统

操作系统是一款“进行软硬件资源管理”的软件。即链接用户与计算机底层的桥梁。

2024-03-05 23:34:21 318

原创 C++学习进阶:map和set的实现

我们知道set和map的底层其实是红黑树,在学习完红黑树这个数据结构之后,我们开始简单模拟实现一下这两个STL容器。

2023-12-14 14:25:34 939

原创 数据结构与算法:红黑树

这里引入一下NIL节点的概念:NIL节点也称为空节点或外部节点,是红黑树中一种特殊的节点类型。NIL节点不存储实际的数据,它们的作用是协助维护红黑树的结构和性质,同时也简化了一些操作的实现。在红黑树中,每个节点要么是红色的,要么是黑色的,而每个节点都有左子节点和右子节点。NIL节点是所有叶子节点的虚拟父节点,它们都是黑色的,且不包含任何子节点。这意味着,如果一个节点没有左子节点或右子节点,那么它的对应子节点就是一个NIL节点。

2023-12-07 14:40:44 895

原创 数据结构与算法:AVL树

首先还是介绍一下什么是AVL树AVL树是一种自平衡二叉搜索树,它的每个节点都保存一个平衡因子(balance factor),用于判断是否需要进行旋转操作来保持树的平衡。平衡因子是右子树的高度减去左子树的高度(有时相反),因此它的值只可能是-1、0或1。如果插入或删除一个节点后,某个节点的平衡因子的绝对值大于1,就需要进行旋转操作来重新平衡这棵树。AVL树的插入、删除和查找操作的时间复杂度都是O(log n),其中n是树中节点的数量。

2023-11-28 16:51:20 398

原创 C++学习进阶:set 和 map

C++中的set是一种基于红黑树实现的关联容器,用于存储唯一且已排序的元素集合。set中的元素按照一定的顺序排列,插入和删除操作的时间复杂度为O(log n),查找操作的时间复杂度也为O(log n)。set中的元素必须是可比较的,因此需要重载运算符或者提供自定义比较函数。如图set分为普通set以及multiset,普通set就是上面所说存储唯一且已排序的元素结合,而multiset就是可以存储多个相同key的set那么我们先开始进行set的学习。

2023-11-21 12:23:35 328

原创 数据结构与算法:搜索二叉树

如图二叉搜索树的特点,由于是一个数据结构,并不是STL容器,那么我们就是实现搜索二叉树的增删查改功能,哈哈其实这一章要放在数据结构进阶上,那废话结束开始上代码。

2023-11-20 17:19:45 38

原创 C++学习进阶:多态

在类与对象中重载一般出现在同一个类中的同名函数,参数不同 ,比如若干个构造函数重写一般出现在基类和派生类中的同名函数,且为虚函数,函数名/参数/返回值都需要一致,协变即为返回值分别为基类对象和子类对象重定义就是在基类和派生类的同名函数,但是不为虚函数,并且函数参数和返回值不做要求下面是3个例子初步稍微修改一下传入参数!

2023-11-03 19:30:54 43

原创 C++学习进阶:继承

继承的示意图,我们在设定一个学生类和老师类的时候发现会有一部分代码复合,于是乎我们为了让两个类内部代码不要太多符合,设定了一个语法叫做继承,通过创造一个父类Person然后让Student和Teacher来继承那一部分共有的数据,来达到复用的目的。一般只能子类对象赋值给父类对象,而父类对象不能赋值给子类对象,并且中间过程不产生临时对象,就是子类的部分,父类会有,直接就赋值相等内容即可。2.默认情况下,对同名成员的访问,是直接访问子类,但是通过父类名以及域操作符 :: 来访问父类。

2023-10-20 20:12:38 51

原创 重生之C++学习:模版进阶

前面我们已经开始了模版的学习,但是学习的内容比较容易,和单一,现在我们继续加强模版的学习吧。

2023-10-18 13:12:44 32

原创 重生之C++学习:stack and queue

在我们完成基础的几个数据结构,顺序表,链表后,STL容器里面也有栈,队列,还有一个新的容器deque,与栈,队列容器的实现有关。那么我们开始吧。

2023-10-13 19:43:42 51

原创 重生之C++学习:list

在之前的学习中我们访问对象的成员主要有两种方式 . 操作符 以及 -> 操作符在C语言中,访问对象成员的方式取决于对象的类型。如果对象是一个结构体(structure),可以使用点操作符(.)来访问成员。如果对象是一个指向结构体的指针,可以使用箭头操作符(->)来访问成员。假定一个场景,我们定义一个AA结构体然后在迭代器中运行,通过迭代器来访问AA里面成员重载->代码如下// 自定义类型 -> 读取重载问题可能出在于迭代器对象无法直接对应到AA对象实际上是。

2023-10-11 00:19:13 49

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除