自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Socket编程TCP

TCP ( Transmission Control Protocol 传输控制协议)传输层协议有连接(例如生活中双方打电话,此时首先双方确认对方是否听得见,此时就是在建立连接)可靠传输(如果丢包,再次发送,维持可靠传输,需要做更多工作,复杂,占有资源多)⾯向字节流(水流,连续的,如果要接水,自行分配如何接)

2025-09-25 19:52:38 583

原创 Socket编程UDP

UDP⽹络编程。

2025-09-24 16:01:02 1465

原创 Linux网络基础

⽽且这些协议都在本地主机各⾃的硬件中,通信的成本、问题⽐较少,其次,⽹络通信最⼤的特点就是主机之间变远了。⽬的IP是⼀种⻓远⽬标,Mac是下⼀阶段⽬标,⽬的IP是路径选择的重要依据,mac地址是局域⽹转发的重要依据,例如坐地铁,地铁有终点站和起始站,这就代表IP地址,在终点站和起始站之间有许多中间站,而中间站代表mac地址。两台主机在同⼀个局域⽹,类似学生上课,可以直接相互通信,但是相互通信的前提条件是,知道所在的位置,因此每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址。

2025-09-20 18:48:21 816

原创 Linux线程同步与互斥

对于多个线程,同样也会进行切换,当时间片耗尽,阻塞IO操作,sleep等陷入内核,当线程/进程从内核态返回到用户态时就会进行切换,CPU在进行切换时会保存上下文,现在有AB两个线程,A线程把ticket变量载入到CPU中,切换B线程,B线程把ticket这个变量减到1载入到内存中,切换A线程,CPU回复A线程的上下文,此时A线程保存的是它自己的ticket变量的数据,而A线程上次被切换时已经把加载做了,此时直接继续下一步,对ticket变量进行操作,此时载入到内存中,此时就会出错。

2025-09-16 19:43:03 602

原创 线程概念及控制

对于线程,是用户层的概念,它是由轻量级进程模拟的,在用户层进行封装轻量级进程,形成原生线程库,因此线程是在库中被维护的,对于线程库,它是一个动态库,是一个ELF格式的可执行程序,可执行程序加载,形成进程,动态链接和动态地址重定向,要将动态库加载到内存中并且映射到当前进程地址空间中。,翻译为软缺⻚错误/次要缺⻚错误,这时物理内存中是存在对应物理⻚的,只不过可能是其他进程调⼊的,发出缺⻚异常的进程不知道⽽已,此时MMU只需要建⽴映射即可,⽆需从磁盘读取写⼊内存,⼀般出现在多进程共享内存区域。

2025-09-09 19:40:13 1013

原创 Linux进程信号详解

当没有中断来时,OS是暂停的,什么也没做,此时中断向量表就会注册一个中断服务:进程调度,外设就有一个叫时钟源的硬件,它会以固定的,特定的频率,向CPU发送特定的中断,OS就在硬件时钟中断的驱动下,进行进程调度,因此OS就是基于中断,进行工作的软件。在进程地址空间上,用户和内核都在同一个[0,4GB]的地址空间上,对于用户态,只能访问自己的[0,3GB],内核态:以内核的身份,运行用户通过系统调用的方式,访问OS[3,4GB],对于内核区的地址,系统只有一份,所有进程共享。

2025-08-21 18:47:38 949

原创 Linux进程间通信

而这些工作则是有OS自己完成,在系统中可能存在多组进程,都在使用不同的共享内存进行通信,同样OS对这些多个共享内存需要先描述,再组织,因此内核中有一个结构体对象来描述对应的共享内存,进程和共享内存的关系转变成了内核数据结构之间的关系。共享内存区是最快的IPC形式。对于信号量,本身其实也是一个共享资源,每次申请资源,计数器--,代表P操作,释放资源,计数器++,代表V操作,都要保证原子性(要么做,要么不做)eg:子进程写文件很快,父进程读文件很慢,此时到一定程度,管道满了,子进程就会阻塞(等待父进程读取),

2025-08-18 17:07:18 1018

原创 库制作与原理

静态链接的出现,提⾼了程序的模块化⽔平。对于⼀个⼤的项⽬,不同的⼈可以独⽴地测试和开发⾃⼰的模块。通过静态链接,⽣成最终的可执⾏⽂件。静态链接会将编译产⽣的所有⽬标⽂件,和⽤到的各种库合并成⼀个独⽴的可执⾏⽂件,其中用户会去修正模块间函数的跳转地址,也被叫做编译重定位(也叫做静态重定位)。⽽动态链接实际上将链接的整个过程推迟到了程序加载的时候。

2025-08-14 13:53:46 302

原创 Liunx文件系统详解

在Linux中,打开的文件保存在内存中,对于没有打开的文件则保存在磁盘里。

2025-08-12 16:18:16 634

原创 Linux文件操作及基础IO

⽂件相关概念。

2025-08-12 14:09:26 809

原创 Linux进程控制

函数在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核:分配新的内存块和内核数据结构给⼦进程将⽗进程部分数据结构内容拷⻉⾄⼦进程添加⼦进程到系统进程列表当中fork返回,开始调度器调度当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅,所以,fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。

2025-08-08 14:52:07 617

原创 Linux进程初识

对于子进程和父进程有一模一样的结构,有虚拟地址和一套页表,包括变量的虚拟地址和页表的映射也是一样的,当子进程对g-val进行改变,由于进程具有独立性,会重新在内存开辟一片空间,是子进程的页表映射到这个内存地址,因此,就会有父进程和子进程变量的地址一样,变量相互不影响。目录下,但是这种方式并不好,在有了环境变量后,对于一个文件的执行,系统会查询PATH环境变量,根据环境变量来确定这个文件是否可以被执行,因此想让自己的程序像命令一样执行,除了上述的方法,也可以修改环境变量。

2025-08-06 19:29:57 1030

原创 Linux基础开发⼯具

件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数, 但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。打比方说,小明在要在二个月内,在北京,上海,深圳。如果 text⽂件不存在,或是 text所依赖的后⾯的 text.o ⽂件的⽂件修改时间要⽐ text这个⽂件新,那么,他就会执⾏后⾯所定义的命令来⽣成text 这个⽂件。

2025-08-04 14:55:39 281

原创 Linux权限详解

(说明:这里对于文件有x(可执行)权限时,文件本身如果不可以执行,那这个文件还是执行不了,只有当文件本身可以执行并且有执行权限时,文件才可以执行)对于共享文件,所有的权限是开放的,在共享文件中,有多个用户创建的属于自己的文件,那如果此时有个用户删除了其他用户的文件怎么办?发现root在普通用户内创建的文件,普通用户居然可以删除,这里就可以了解,虽然对于以上文件,普通用户虽然无法rwx,但是可以删除,发现只有拥有者,才能对自己的文件,目录操作,任何用户无法进其他用户的家目录,但是对于root来说,没有限制。

2025-07-31 15:29:19 1055

原创 Linux初始及常见指令使用

Linux的版本从商业和技术两个角度来分析技术方面:Linux有许多内核的版本,如下图对于6.12.40这个版本,6代表主版本号,12代表次版本号,对于次版本号哦书代表稳定版本,奇数代表测试版本,而后面40代表修订次数商业方面:DebianDebian运⾏起来极其稳定,这使得它⾮常适合⽤于服务器。debian这款操作系统⽆疑并不适合新⼿⽤⼾,⽽是适合系统管理员和⾼级⽤⼾。UbuntuUbuntu是Debian的⼀款衍⽣版,也是当今最受欢迎的免费操作系统。

2025-07-30 17:20:50 902

原创 C++11智能指针

内存泄漏。

2025-07-28 16:55:19 672

原创 C++异常详解

1 异常的概念异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。

2025-07-28 15:01:03 929

原创 C++11特性详解(下)

数值n表⽰⽣成的可调⽤对象中参数的位置:_1为newCallable的第⼀个参数,_2为第⼆个参数,以此类推。捕捉列表是被const修饰的,也就是说传值捕捉的过来的对象不能修改, mutable加在参数列表的后⾯可以取消其常量性,也就说使⽤该修饰符后,传值捕捉的对象就可以修改了,但是修改还是形参对象,不会影响实参。对于⼀个参数包,除了能计算他的参数个数,能做的唯⼀的事情就是扩展它,当扩展⼀个包时,还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应⽤模式,获得扩展后的列表。

2025-07-26 18:21:49 1009

原创 C++11特性详解(上)

列表初始化。

2025-07-26 15:54:38 591

原创 利⽤哈希表封装unordered_map和unordered_set

要利用哈希表封装unordered_map和unordered_set,发现unordered_map的参数是pair类型,而unordered_set只有key,正常的话可能会要实现两个哈希表分别对着两个结构进行封装,但是这两个哈希表的大部分接口都类似,此时就可以利用模版,根据传进去的参数,编译器进行实例化,这里用的时链地址法结构实现的哈希注意这里的后面两个模版参数所代表的意思,这里不在叙述Keyoft模版的意思请移步Hash模版的意思请移步。

2025-07-25 14:13:42 798

原创 哈希表模拟实现

当key是string/Date等类型时,key不能取模不能利用哈希函数,此时需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。两个不同的key可能会映射到同⼀个位置去,这种问题叫做哈希冲突,或者哈希碰撞。

2025-07-24 20:06:14 933

原创 利用红黑树封装实现map,set

要利用红黑树封装map,set,发现map的参数是pair类型,而set只有key,正常的话可能会要实现两个红黑树分别对着两个结构进行封装,但是这两个红黑树的大部分接口都类似,此时就可以利用模版,根据传进去的参数,编译器进行实例化。

2025-07-23 17:28:00 805

原创 红黑树详解及模拟实现

红⿊树的实现。

2025-07-22 16:44:47 1017

原创 AVL树的详解及模拟实现

旋转核⼼步骤,因为5 < b⼦树的值 < 10,将b变成10的左⼦树,10变成5的右⼦树,5变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵的⾼度恢复到了插⼊之前的h+2,符合旋转原则。本图1展⽰的是10为根的树,有a/b/c抽象为三棵⾼度为h的⼦树(h>=0),a/b/c均符合AVL树的要求。场景2:h >= 1时,新增结点插⼊在e⼦树,e⼦树⾼度从h-1增长为h,并不断更新8->5->10平衡因⼦, 引发旋转,其中8的平衡因⼦为-1,旋转后8和5平衡因⼦为0,10平衡因⼦为1。

2025-07-22 15:32:07 835

原创 map及set的相关使用

string、vector类似,有begin,end及rbedin,end,有了迭代器set⽀持范围for,不过set的迭代器是一个双向的迭代器,也不支持利用迭代器修改数据,无论是iterator和const_iterator,如果修改了数据,就会破坏了底层搜索树的结构。⽽value_type是红⿊树结点中存储的pair键值对值。set底层是⽤红⿊树实现,增删查效率是 O(log N),迭代器遍历是⾛的搜索树的中序,所以是有序的,同时set内时不允许有相同的数据,但是multiset支持有相同的数据。

2025-07-21 15:48:51 776

原创 ⼆叉搜索树的应用与模拟实现

找N左⼦树的值最⼤结点 R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的位置,都满⾜⼆叉搜索树的规则。场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。

2025-07-19 16:53:15 688

原创 C++三大特性——多态详解

本文系统阐述了C++多态机制,重点解析了运行时多态的实现原理。多态分为编译时多态(函数重载/模板)和运行时多态(虚函数机制)。运行时多态通过虚函数表实现,需满足两个条件:基类指针/引用调用虚函数,且派生类重写该虚函数。文章详细讲解了虚函数重写规则、协变、析构函数重写的必要性,并介绍了override/final关键字的使用。通过内存模型分析,揭示了虚函数表指针的工作机制,说明多态是通过运行时查虚函数表实现动态绑定。最后对比了静态绑定与动态绑定的区别,指出虚函数表通常存储在代码段。

2025-07-19 14:57:22 873

原创 c++继承详解

摘要:本文系统介绍了面向对象编程中的继承机制。首先阐述了继承的概念,通过Person、Student、Teacher类示例说明继承实现代码复用。详细分析了三种继承方式(public/protected/private)对成员访问权限的影响,指出基类private成员在派生类中不可见。讨论了派生类默认成员函数的实现规则,包括构造函数、拷贝构造、赋值运算符和析构函数。针对多继承引起的菱形继承问题,介绍了虚继承解决方案。最后比较了继承(is-a)与组合(has-a)的特点,建议优先使用组合以降低耦合度。

2025-07-18 20:30:10 744

原创 模版的类型及特化方式

【模版的优点】1.

2025-07-17 21:22:39 921

原创 stack,queue,priority_queue的模拟实现及常用接口

在上文,发现stack和queue容器的缺省值是deque,为什么用这个容器呢?deque(双端队列:是一种双开口的连续空间的数据结构,双开口的含义是:可以在头尾两端 进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高,相当于vector和list的缝合怪stack是一种后进先出的特殊线性数据结构,因此只要具有和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和。

2025-07-17 17:40:46 997

原创 list类的常用接口实现及迭代器

list代表的是双向链表,常见的有创建,增,删,改几个接口(功能),对于list类来说,复杂的是它的迭代器,本章则会讲解list类的常见接口实现以及list类的简单实现。

2025-07-16 18:36:45 672

原创 vector的简单实现及常用接口

vector类代表的是大小可以变化的数组,常见的有,增,删,查,改几个接口(功能),以及vector迭代器的使用。

2025-07-15 20:40:46 983

原创 string类的简单实现以及常见接口

string代表的是字符串,string类则代表的是有关字符串的使用和功能,常见的有字符串的创建,增,删,查,改几个接口(功能),使用string类时,必须包含#include头文件以及using namespace std,string类也是学习STL库的一个重要的内容,本章则会讲解一些string类的常见接口实现以及string类的简单实现。在了解string类之前,首先要了解auto和范围for的内容auto的作用就是用来推导某一类型变量,当一个变量的类型太复杂的时候,就可以使用,不过还有一些限制用a

2025-07-14 17:19:41 644

原创 初识模板及常见模板应用

类模板实例化与函数模板实例化不同,

2025-05-06 17:19:10 335

原创 详解内存管理及new

对于自定义类型,B类型可以运行,而A类型运行崩溃,这里引出一个性质,当自定义类型开辟空间时,会在前面多开4个字节的空间,而用delete释放多个空间时,会把前面4个字节忽略,而delete[]则会把前面4个字节包括,对于B类型来说,由于它没有析构函数,编译器会进行优化,对前面的4个字节空间不开辟,因次B类型可以运行,而A类型运行崩溃。char2代表‘a’这个元素,但此时*char2并不在代码段上,数组char2开辟在栈上开辟了一定大小的空间,把“abcd”拷贝到数组里,因此此时。

2025-05-06 16:42:16 991

原创 类与对象(下)

2. 类型转换4.友元7.对象拷⻉时的编译器优化现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传参 过程中可以省略的拷⻉。

2025-05-04 17:44:44 995

原创 类与对象(中)

用Stack举例。

2025-05-02 20:24:24 756

原创 类与对象(上)

1. 类的定义1.1 类定义格式类的定义格式和结构体定义格式类似的,只不过结构体的关键字struct,类的关键字为class,类中不止能定义变量同样也能定义函数,类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,这个只是建议。

2025-04-30 19:21:14 783

原创 初识c++

命名空间。

2025-04-28 18:14:16 952

原创 详解常见的七大排序算法

把keyi的值记录,把kyei的位置当做一个坑,right开始走,把小于a[key]的值填入坑中,此时right的位置就成为了新的坑,left走,把大于a[key]的值填入坑中,此时left的位置就成为了新的坑,如此重复,直到相遇,此时相遇的位置为坑位,把记录的a[keyi]值填入即可。对于递归的快排,利用栈来存储每次排序的区间,栈是先进后出的,因此,可以先存储右区间,再存储左区间,进入排序,删除栈内数据,然后二分区间,存储右区间,左区间,进入排序,直到,栈为空,此时所有区间都遍历过了。

2025-04-26 18:52:54 921

空空如也

空空如也

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

TA关注的人

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