自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux网络编程:多路转接|select|poll

多路转接(也称为IO多路复用)是一种网络通信的手段或机制,它允许一个进程同时监听多个IO事件,并在任何一个IO事件准备就绪时进行处理。这种机制可以大大提高程序的并发性能和响应速度。定义多路转接是一种IO模型,它允许单个进程或线程同时监听多个文件描述符(如套接字、管道等)的状态变化,从而能够处理多个IO事件。核心特点并发性:通过同时监听多个文件描述符,多路转接可以在单线程/进程的场景下实现并发处理。非阻塞:在监听过程中,进程/线程不会被阻塞,直到有文件描述符就绪。事件驱动。

2024-06-14 19:16:47 227

原创 Linux网络编程:五种IO模型

在我们过去的学习中,我们对于IO的认识局限于input、output,也就是输入和输出,即对外设的访问,与计算机外部设备(如键盘、显示器、磁盘等)之间的数据交换。但是这在我们过去对IO接口的使用,例如:recv、send、write、scanf等函数时,我们能够感受到IO的本质就是在不同的缓冲区之间做数据的拷贝,并且在这个过程中会“等待”,比如recv函数需要数据写入到缓冲区中,scanf需要等待键盘写入……IO的本质:等待数据的就绪 + 拷贝数据到相应的缓冲区。

2024-06-13 15:29:38 477

原创 Linux网络编程:回顾网络通信

这时我们就能够清晰的理解,除了在应用层需要拷贝到传输层,其他场景下我们都是对sk_buff指针进行偏移,然后不断向下交付,最终从网络中发送。那么我们在另一台主机对接收到的数据报文,那么是如何从数据链路层到应用层被我们看到的呢?所以数据的封装和解包分用的实现都是通过指针的偏移,这也是因为在传输层数据已经经过了应用层协议的序列化而形成了字节流数据,本质上就是char* 数组维护的一段数据,所以我们将不同形式的数据转化成了字节流,并且实现了不同主机的统一!!!

2024-06-05 18:09:12 992

原创 Linux网络编程:数据链路层协议

为什么需要数据链路层我们在之前的学习知道了网络层实现将数据报文从远端A主机经过若干个路由器的转发,最终到达目的主机B。本质上就是数据从不同的局域网间进行转发直到转发到终点,比如家用主机转发到局域网中的家用路由器,家用路由器转发到局域网中的运营商路由器,最终在广域网这个“局域网”中转发到服务器!!!那么再按照相同的方式转发到目标主机B那么我们如何进行局域网之间的转发呢?也就是实现家用主机转发到家用路由器呢?这时我们就需要构建数据链路层协议来实现数据报文在局域网内进行转发。

2024-06-05 14:56:28 1146

原创 Linux网络编程:网络层协议|IP

我们知道数据报文离开发送端后,并不是直接发送到接收端主机的,需要不断的通过中间节点(路由器)转发,不断路由直到到达接收端路由的过程,就是这样一跳一跳 “问路” 的过程。“一跳”就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间在智能手机未普及的时代,人们去一个很远的地方,是需要进行不断的问路,一步一步的从一个终点走到一个新的起点,再继续问路,直到最后走到目的地。当IP数据包,到达路由器时,路由器会先查看目的IP。

2024-06-04 01:21:48 1162

原创 Linux网络编程:传输层协议|UDP|TCP

历经4天,万字长文,传输层协议TCP/UDP学习参上!!!

2024-05-27 18:20:44 1289

原创 Linux网络编程:应用层协议|HTTPS

数据摘要是一种映射机制,并不是一种加密方式,我们知道一段数据可以通过hash函数映射为一个值,当这个值改变时所对应的hash映射值会产生改变。并且即使是一篇文章中,我们只修改了一个单词,最终hash映射值也会产生不同。

2024-05-26 17:51:55 1092

原创 Linux网络编程:应用层协议|HTTP

我们知道OSI模型上层分为应用层、会话层和表示层,我们接下来要讲的是主流的应用层协议HTTP,为什么需要这个协议呢,因为在应用层由于操作系统的不同、开发人员使用的语言类型不同,当我们在传输结构化数据时,会导致端到端之间有差异。为了抹去这种差异,我们需要对用户、开发人员使用的应用层进行协议的定制……在讲HTTP协议之前,我们知道“协议”是一种约定,“协议”是客户端、服务器定制的一种标准,“协议”的本质是一种结构化数据。那么HTTP协议本质上也是一种结构化数据,是客户端、服务器的一种对于多种场景的通用标准!

2024-05-25 22:53:26 1081

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

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

2024-05-20 20:42:03 1031

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

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

2024-05-09 23:57:11 953

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

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

2024-05-07 20:29:57 705

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

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

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

原创 操作系统:线程

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

2024-05-01 22:07:37 892

原创 操作系统:进程信号

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

2024-04-29 00:02:27 539

原创 操作系统:进程间通信 | 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 1019 1

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

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

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

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

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

2024-04-20 23:41:07 631

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

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

2024-04-19 20:20:00 1029

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

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

2024-04-18 23:14:15 813

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

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

2024-04-18 14:42:44 964

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

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

2024-04-16 13:12:45 1144

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

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

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

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

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

2024-04-11 21:06:41 508

原创 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 984

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

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

2024-04-08 21:17:18 853

原创 操作系统:动静态库

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

2024-04-03 12:42:05 668

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

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

2024-04-02 12:34:38 913

原创 操作系统:初识文件

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

2024-03-27 16:51:35 734

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

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

2024-03-18 13:59:40 1029

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

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

2024-03-13 15:37:28 550

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

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

2024-03-11 23:43:24 765

原创 操作系统:环境变量

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

2024-03-11 01:47:51 693

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

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

2024-03-08 21:23:00 494

原创 Linux:好用的Linux指令

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

2024-03-08 13:28:15 282

原创 操作系统:进程状态

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

2024-03-08 13:26:41 1134

原创 操作系统:进程

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

2024-03-06 21:13:40 798

原创 Linux:常见Linux指令

1。

2024-03-06 11:18:58 251

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

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

2024-03-05 23:34:21 319

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

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

2023-12-14 14:25:34 954

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

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

2023-12-07 14:40:44 902

空空如也

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

TA关注的人

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