自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux操作系统学习之---初识网络

抛开计算机的语境 ,. 而每一个点就是一个个相互协作的计算机(人)。学习操作系统时 , 冯诺依曼体系结构是一切的基石 . 但是仔细想想 :数据从磁盘到内存,再到CPU , 处理完后又返回给内存 ,继而通过外设(如显示器)让用户觉察。这个过程 ,在一台本地笔记本电脑内部不就是一张网吗?其中的个体就是这一个个硬件,之间由线连接(比如IO总线)。各个硬件相互协作 , 通过这一条条线传输数据 , 就处理好了上层用户的数据!!!对于网络也是同理。。

2025-11-12 18:56:39 984

原创 Linux操作系统学习之---线程池

本文介绍了线程池的基本概念及其实现方法。线程池是一种池化技术,通过预先创建多个线程并复用它们来提高任务处理效率,避免频繁创建销毁线程的开销。文章通过水库和餐馆厨师等生活实例形象解释了线程池的工作原理,对比了有无线程池时的性能差异。在技术实现部分,详细说明了线程池的设计要点:采用固定数量的线程,基于生产者-消费者模型,使用互斥锁和条件变量保证线程安全。具体实现包括线程创建/启动/终止/回收等基本功能,以及任务队列管理、任务唤醒机制等核心逻辑。最后指出执行任务时不需要加锁,以保持并发执行的高效性。

2025-10-31 22:41:33 486

原创 Linux操作系统学习之---日志模块(为线程池做准备)

找一个日志的轮子哈哈哈哈^_^

2025-10-31 16:20:45 680

原创 Linux操作系统学习之---基于环形队列的生产者消费者模型(毛坯版)

Systme V标准中有信号量的概念 , POSIX标准中也有 , 他俩仅有细微的差别二者本质是相同的 , 都是一个, 代表有多少剩余资源可以使用 .

2025-10-27 12:19:12 764

原创 Linux操作系统学习之---线程同步(生产者消费者模型)

摘要:条件变量与生产者消费者模型 本文介绍了条件变量的基本概念及其在多线程编程中的应用。条件变量用于解决互斥锁无法保证线程执行顺序的问题,通过等待和唤醒机制避免线程空转造成的CPU资源浪费。 主要内容包括: 条件变量的基本接口(初始化、等待、唤醒、销毁) 条件变量与互斥锁的配合使用示例 基于阻塞队列的生产者消费者模型实现 使用互斥锁保证互斥访问 使用两个条件变量分别处理队列满和空的情况 实现了生产者和消费者的同步机制 该模型通过条件变量有效解决了线程间的同步问题,避免了资源浪费和饥饿现象,是多线程编程中的重

2025-10-25 10:49:55 647

原创 Linux操作系统学习之---线程互斥(互斥锁)

本文摘要: Linux多线程编程中存在数据不一致问题,通过黄牛抢票案例展示了线程安全问题。当多个线程并发访问共享变量ticket时,由于ticket--操作和if判断的非原子性,会出现数据冲突,导致票数变为负数。文章分析了问题根源:1)ticket--操作在底层分为载入、运算、写回三步,可能被中断;2)if判断也可能被中断,导致多个线程同时进入临界区。解决方案是使用互斥锁(mutex),通过全局锁或局部锁保护临界区代码。最后提出一个封装方案,使用RAII思想将加锁/解锁操作封装到LockGuard类中,实现

2025-10-23 19:12:08 801

原创 Linux操作系统学习之---线程控制

Linux系统下并不存在真正的线程 , 而是使用进程模拟出来的更小的进程(小主要体现在额外占用的资源少) .

2025-10-19 20:59:13 1262

原创 Linux操作系统学习之-线程概念

有一个神奇的现象 , 调度的英文单词是 , dispatch的常用含义的.因此 : 线程可以说是CPU用来派遣去执行任务的角色 .在此之前 , 进程已经是我们的老熟人 .这样来看 , 进程是一个很抽象的概念 , 就不太能执行具体的任务 .这样做的好处 :Linux下 , 进程和线程并非孤立的概念.再回到那句定义 — 线程:CPU调度的基本单位 , 以前我们说CPU对进程进行调度 , 但现在看来 , CPU就代表了一整个家庭的责任 , 而线程就是各司其职的执行者.这么多的页框在操作系统里是被描述和管理起来的

2025-10-18 15:57:35 698

原创 Linux操作系统学习之---进程信号的捕捉(version1)

信号处理函数表将产生的信号保存起来并最后抵达的工作是由操作系统来完成的 , 可是自定义捕捉的函数却是用户自己写的 . 这就引出了一个事实 :用户态内核态粗略理解用户态和内核态的概念]用户态就是美国公民大街上 , 大家可以在兜里塞把枪(系统调用) . 但是真的想用枪还是得到射击场去玩(内核态)

2025-10-16 22:43:25 576

原创 Linux操作系统学习之---进程信号的产生和保存

信号与信号量虽一字之差,但本质不同:信号量是进程间同步工具,而信号是操作系统通知进程的机制。信号处理方式包括默认终止、自定义捕捉(如修改SIGINT行为)和忽略(如SIG_IGN)。特殊信号SIGKILL和SIGSTOP不可被捕获。信号产生方式多样:键盘输入(Ctrl+C)、系统命令(kill)、函数调用(kill/raise/abort)、软件条件(管道关闭、alarm计时)及硬件异常(除零错误触发SIGFPE,非法写入触发SIGSEGV)。通过alarm实验可见,无IO操作时程序执行效率显著提升。核心转

2025-10-15 15:28:39 976

原创 Linux操作系统学习之---systme V共享内存(version1)

System V标准实现了三种进程间通信机制:共享内存、消息队列和信号量。共享内存通过在进程地址空间的共享区映射同一块物理内存实现高效数据交换,速度快但缺乏同步机制,需配合命名管道等工具实现同步。消息队列则通过内核维护的队列结构实现消息传递,提供更结构化的通信方式。这两种机制都使用ftok生成的key值和类似shmget/msgget的接口进行管理,体现了System V IPC的统一设计思想。

2025-10-11 21:06:54 944 1

原创 Linux操作系统学习之---匿名和有名管道(version 2)

本文摘要: 进程间通信(IPC)是解决独立进程间交互需求的关键技术,其中匿名管道是最基础的形式。匿名管道利用子进程继承父进程文件描述符表的特性,实现内存级的单向通信。文章详细解析了匿名管道的实现原理、基础实践代码及其五大特性:仅适用于父子进程、半双工模式、面向字节流、自带同步机制和与进程同生命周期。此外,还探讨了四种典型交互情况,并介绍了基于匿名管道的进程池技术,通过Channel类和ChannelManager类实现多进程管理,避免频繁创建进程的开销,提升系统效率。

2025-10-05 11:25:39 563

原创 Linux系统学习之---库的理解和加载(毛坯初版...)

他就类似于一种缓存机制 , 当一个库函数第一次调用时 , 用过其偏移量和动态库的首地址计算出的实际虚拟地址 , 然后存放到这个表里 . 下一次涉及动态库函数的调用时,优先到这个表里查找库函数对应的虚拟地址 , 免去了重复计算.当程序真的要加载了 , 就会由链接器查找共享区的这个库 , 获取相关库整体的虚拟地址 , 将其和代码里库函数的偏移量相加 , 就得到了实际的库函数的虚拟地址空间 .一个动态库里的函数 , 本身就会有各自的地址偏移量 , 于是在运行前程序代码中库函数调用处的地址其实是这个偏移量.

2025-09-28 21:42:30 781

原创 Linux操作系统学习---EXT文件系统

建立硬连接并非真的拷贝了一份文件,否则会浪费磁盘空间,而是建立一个硬链接就将对应文件的引用计数加一,删除文件就是删除引用计数,引用计数归零,文件系统才会真的吧这个文件对应的inode bitmap和data bitmap设置为0。毕竟每个区都有一个文件系统,因此。上面说到通过目录文件里面文件名和inode的映射关系就可以去文件系统开始真正的访问磁盘文件了,但是目录文件也是文件,同样需要在操作系统里找到。目录也是一个文件,有他自己的属性,但是内容里存放的都是这个文件夹(目录)里文件名和对应inode的映射。

2025-09-26 16:07:12 910

原创 Linux操作系统学习之---基础IO

文章摘要 IO(输入输出)本质上是程序与硬件之间数据流动的过程,表现为进程与文件结构体之间的交互。文件操作可通过C语言库函数(如fopen、fwrite等)实现,这些函数实际封装了系统调用(如open、write等)。系统调用直接与硬件交互,以文件描述符(fd)作为操作标识。文件描述符是操作系统维护的指针数组下标,每个进程默认拥有0/1/2分别对应标准输入/输出/错误流。通过操作文件描述符可实现数据重定向,例如关闭标准输出后,新文件会占用其描述符位置,使输出流向文件而非屏幕。

2025-09-22 10:47:52 813

原创 快速生成SSH秘钥并配置Gitee,免去提交代码时的密码输入

【代码】快速生成SSH秘钥并配置Gitee,免去提交代码时的密码输入。

2025-09-08 08:41:05 168

原创 c++学习之---哈希表原理与实现全解析

本文介绍了哈希表的实现原理,重点分析了开放定址法和链地址法两种处理哈希冲突的方法。哈希表通过哈希函数将键值映射到数组特定位置,实现O(1)时间复杂度的操作。开放定址法采用线性探测解决冲突,但存在效率问题;链地址法则通过链表连接冲突元素,形成"哈希桶"。文章详细阐述了哈希函数设计、负载因子控制、扩容机制等关键技术点,并提供了两种方法的完整代码实现,包括插入、查找、删除等核心操作。最后还讨论了STL中素数扩容策略的应用。

2025-07-17 21:49:55 1164

原创 C++中map与set的底层红黑树实现

本文介绍了C++中map和set容器的底层实现原理及关键设计要点。主要包含以下内容:1. 底层红黑树实现:通过仿函数KeyOfVal解决map(键值对)和set(单键值)的模板参数兼容问题,统一比较逻辑;2. 迭代器封装:利用模板参数实现普通迭代器和const迭代器的代码复用,并详细说明begin()、end()和++运算符的中序遍历实现;3. map的[]运算符重载:通过改造Insert函数返回pair<iterator,bool>类型,实现查找/插入一体化操作;4. 完整代码结构:展示RBT

2025-07-14 17:29:40 775

原创 c++学习之---红黑树的实现

红黑树是一种自平衡二叉搜索树,通过颜色标记和特定规则确保近似平衡。其核心规则包括:节点非红即黑、根节点必黑、红色节点不能相邻、所有路径黑节点数量相同。插入新节点时默认设为红色,若与父节点同为红色则需调整,包括变色和旋转操作(单旋或双旋)。验证红黑树需检查四项规则,如通过递归遍历验证黑节点数量一致性。相较于AVL树,红黑树平衡要求更宽松,插入删除效率更高,适用于频繁修改的场景。代码实现包含节点结构、插入逻辑、旋转操作及验证函数,确保树结构始终满足红黑树性质。

2025-07-13 10:07:23 995

原创 探索AVL树:自平衡二叉树的奥秘

摘要:本文介绍了AVL树的基本原理与实现方法。首先分析了二叉搜索树的退化问题,指出有序插入会导致树退化为链表。AVL树通过平衡因子(右子树高度-左子树高度)和旋转操作来维持平衡,要求每个节点的平衡因子绝对值≤1。文章详细阐述了AVL树的结构设计,包括新增的平衡因子和父节点指针成员变量。重点讲解了插入操作的过程:先按二叉搜索树规则插入节点,然后维护平衡因子,并根据不平衡情况执行四种旋转操作(左/右单旋、左右/右左双旋)。最后简要提及了查找和中序遍历的实现。AVL树通过这种自平衡机制保证了O(logN)的查询效

2025-07-05 21:40:30 966

原创 c++学习之 --- set 和 map 的使用

摘要:本文系统介绍了C++关联式容器set和map的核心概念与使用方法。首先对比了关联式容器与序列式容器的区别,重点讲解了pair类型的使用方法及其在map中的重要性。随后详细阐述了set和map的构造函数、增删查操作,以及迭代器失效问题,特别分析了map独特的[]运算符实现原理。针对扩展容器multiset/multimap,强调了其允许重复元素的特性及相关函数差异。最后通过四个经典算法题目(数组交集、环形链表检测、链表复制、高频词统计)展示了这些容器在实际问题中的应用。全文结合代码示例,完整呈现了关联式

2025-06-29 08:41:25 958

原创 c++学习之---二叉搜索树

本文介绍了二叉搜索树(BSTree)的C++实现方法。主要内容包括:1. 采用面向对象设计,将节点(BsNode)和树(BsTree)分别封装为类;2. 实现核心操作接口:插入(Insert)、中序遍历(MidTrave)、删除(Erase)等,其中删除操作根据不同节点形态(叶子节点、单子节点、双子节点)采用不同处理策略;3. 完善特殊成员函数:析构函数采用后序遍历释放节点,拷贝构造函数实现深拷贝,赋值重载函数利用swap优化;4. 扩展键值对版本,实现简易英译汉词典和词频统计应用。文章通过代码示例详细展示

2025-06-25 17:28:48 749

原创 c++学习之---多态

多态 , 顾名思义就是多种形态 . 是c++三大特性封装 \ 继承 \ 多态中的最后一点 ,同样是极其重要的性质,值得我们深入学习。

2025-06-23 18:16:39 1149

原创 c++学习之---继承(下)

除了两个类继承自同一个类叫做多继承,一个类继承自两个类也是多继承。有一个关键字叫做 virtual ,用于修饰菱形继承结构中包含相同父类成员的类,避免让最终的子类继承多份相同的内容。的概念,而多继承在进一步满足现实事物之间关系的同时,又连带着引出了菱形继承这一问题。当然,只要吧Student类里的关于友元声明的注释去掉,让PrintInfo成为Student类的友元函数,就万事大吉了。很合理,但引出了菱形继承的麻烦。多继承指的是多个类继承同一个类,比如老师和学生就可以继承自人这一个类。

2025-06-22 16:23:48 819

原创 c++学习之---继承(上)

class Aclass B :public A // “:”后面的就是父类,前面的就是子类 , public就是继承的方式类型上面的只是最最基本的继承的定义格式 , 实际上通过“继承方式” 和 “父类的访问限定符” 还可以组合出不同的继承类型 ,子类对于父类成员的访问就有了不同程度的限制。引入protected: 隔离外人,不隔自己人首先来介绍类的成员访问限定符中public 、private 和 protected里的protected,他是专门为了服务继承而存在的。

2025-06-21 17:09:55 848

原创 MySQL学习之---索引

MySQL分为服务端和客户端。

2025-06-10 19:28:56 984

原创 c++学习之---模版

定义一个函数模版需要用到的关键字是然后结合class 或 typename就可以达到定义模版参数的效果。template<class T> //定义格式:template开头,用尖括号包围,里面用class搭配上形参名(比如此处的T)// template<typename T> //typename 和class在此时没有区别//这里函数中涉及相关类型的地方用模版参数T替代了。

2025-06-01 19:51:41 863

原创 c++学习之---stack,queue

继续认识STL里的三个容器,哦不,更准确的说是三个容器适配器——stack和queue以及de_queue。

2025-05-25 15:35:01 1293 2

原创 c++学习之--- list

list双向带头循环链表,结构复杂,但是用起来嘎嘎嘎香.

2025-05-18 17:11:43 1179 1

原创 Linux操作系统学习---进程地址空间

在学习c,c++这些偏底层的语言时,我们常常会对一个变量取地址,一遍对他进行一系列的操作 . 可是 , 这真的是真实的物理地址吗?其实并非如此 , 通过了解进程地址空间,我们就能解开这个困惑.了解了进程地址空间(虚拟地址空间)这一块的内容后 , 我们就可以从以往语言学习里对指针的理解发生一定程度的革新;此外 , 也可以理解诸如为啥会存在同地址却不同值的情况.这对于后续的操作系统的学习都是很有帮助的,当然了,这还只是皮毛,还有更多内容等着我们去探索!!!

2025-04-27 21:26:53 840 1

原创 c语言学习---自定义类型之枚举

宏定义常量只是简单的替换 ,而枚举时刻维护着值和变量的映射关系 . 编译器在预处理阶段就会将源代码里的宏定义替换掉,不留痕迹 , 不方便调试!!!

2025-04-22 07:31:36 485 1

原创 c++学习之---vector

c++的三大特性之一就是封装 , 在STL里迭代器iterator就把这点体现的很好 , 即便每个容器(string,vector...)底层的迭代器实现不同 , 但通过运算符重载和定义内部类的方式 , 对于外部的使用层来讲都是一个iterator(通过限定类域来区分) , 都有begin()和end() , 都可以++和解引用 , 也就是对上层提供了一个统一的接口.刚学完string后转到vector可能会因为没有 下标访问操作符[]的重载而不太习惯 , 起始有一个完美的平替----那就是迭代器!

2025-04-21 22:24:41 1155 1

原创 linux操作系统学习之---进程优先级和进程切换与调度

之前我们已经大致了解了进程的一个属性 --- 进程状态 , 这是针对一个进程而言 .那操作系统如何合理的管理各个进程以此保证大多数进程都能正常运行 , 就是这一章要探讨的内容了.

2025-04-19 16:26:33 974 1

原创 Linux操作系统学习之---进程状态

系统的内存资源是有限的 , 因此操作系统会在系统资源告急时采取一些策略 , 将不那么重要的进程的大部分内容给暂时移走。

2025-04-17 21:36:13 718 1

原创 C++ 学习之---string

虽然是两个名称不同的成员函数,但在功能上一模一样. 以后使用size()就可以.由于string设计的时间比较早 , 所以length()这一名称(长度)是符合字符串的描述风格的.但随后的许多容器,尤其是树形结构的map,set等等无法用长度来描述元素个数的容器使用size()更为合适. 所以为了保持接口的一致性,又给string加上了size()函数接口.所以这是一个历史的包袱,知道就好.

2025-04-06 09:10:04 1106 1

原创 linux系统下的实用小工具 --- screen

相信不少人和我一样需要到处奔波,因此使用终端软件(比如pc端的xshell和手机端的termux)来连接云服务器进行代码实践是一个很常见和便捷的操作 , 但有时候会出现这样的问题 :当我们因各种事情必须中断连接时(比如平板在熄屏后可能就中断了终端软件和云服务器的连接) , 过一会儿再连接云服务器就会发现默认在家目录下, 而想要继续上次的操作就必须一步一步的回去,很闹心,那怎么办呢?有一个叫做screen的小工具可以解决这个问题。

2025-03-26 16:56:51 1000 1

原创 初始操作系统---Linux

想必计算机专业的学生都经受过<<计算机组成原理>>这门课程的拷打 , 让人感到折磨的关键在于这门课程只是提炼出所有操作系统设计的通法,而我们无论是日常使用还是以后从事相关的操作系统开发工作,接触的都是具体的操作系统---比如windows,Linux,macOS等等 . 理论指导实践,实践反哺反过来加深对理论的认识.操作系统是作为一款软件存在于硬件层之上的,所以先粗略的计算机底层的硬件结构有一个宏观认识对后续的学习是大有裨益的.

2025-03-21 09:08:58 658 1

原创 Linux基础开发工具---make

在初学编程语言的时候,我们更多的是使用集成开发环境(IED),写好代码后点击一个按钮就可以等待代码运行了,如下可是来到学习Linux操作系统时,更推荐偏底层一些的做法,就是使用gcc(针对c语言)等编译器,此时在编译一个程序的时候就麻烦很多,至少也得是下面这样可这还是最普通的针对一个源文件的编译链接,倘若以后面对的是有更多文件的大项目,这样老实本分的命令行指令就显得有些捉襟见肘了,因此要了解一个自动化构建工具---Linux系统下的make。

2025-02-24 09:25:43 636 1

原创 Linux基础开发工具---gcc

为了加深对系统运行原理的认知,通常我们会在学习Linux操作系统的初期使用命令行来执行操作和编写代码,在使用诸如vim的代码编辑器编写好c语言的代码后,困住我们的第一个问题可能就是程序没法用,毕竟我们习惯了使用visual studio 2022之类的具有便捷图形化界面的集成开发环境,点按运行就可以生成可执行文件。因此,了解gcc对我们。

2025-02-20 15:50:19 1010 1

原创 认识数据结构之——排序

初识排序!!!(附源代码)

2024-12-23 16:31:53 1586 2

空空如也

空空如也

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

TA关注的人

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