自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

努力学习C/C++

学习笔记

  • 博客(53)
  • 收藏
  • 关注

原创 网络基础 【发展、协议、传输、地址】

了解网络发展背景对局域网广域网的概念有基本认识;了解网络协议的意义重点理解TCP/IP五层结构模型;学习网络传输的基本流程理解封装和分用;

2024-07-15 23:13:03 983 6

原创 Linux 【线程池】【单例模式】【读者写者问题】

线程章节到此结束,从初始线程,如何控制线程,后面我们认识到了线程并发访问临界资源是有线程安全的问题,从而我们又学习了锁、条件变量、信号量。悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。线程池应用场景不止这些,线程池的应用场景非常广泛,关键在于根据具体需求合理配置线程池的大小和特性,以达到最佳的性能和资源利用率。:线程池通过预先创建一定数量的线程,避免了频繁创建和销毁线程的开销,从而提高了线程资源的利用率。

2024-07-02 23:51:29 1007 5

原创 Linux 生产消费者模型

生产者-消费者模型是一个经典的并发编程问题,它描述了两种角色:生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。这个模型通常用于处理多线程或多进程环境中的资源分配问题。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

2024-06-29 19:45:59 1535 2

原创 Linux 线程的同步与互斥

由于线程之间存在竞争,就导致了多线程有的线程涝的涝死,饿的饿死,就需要让线程之间保持某种平衡,让它们被CPU雨露均沾。这就是所谓的同步。由于临界资源只有一份,线程之间同时共享临界资源。为了防止临界资源的安全,线程之间需要互斥。1.资源共享问题在Linux 线程控制​​​​​​文章我们知道了一个进程中的所有线程,在地址空间中的代码区、未初始化区、什么堆区也好、栈区也好,还是共享区也好都是共享的。就好比下面这个代码int n = 0;return 0;

2024-06-21 20:23:36 709 1

原创 C++ 智能指针

借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效这里和互斥锁那里是一样的。

2024-06-17 21:52:12 882 2

原创 C++ 【异常】

为什么要自定义异常体系?

2024-06-17 21:50:26 674 1

原创 Linux 线程控制

在Linux 线程概念 ​​​​​​中 我们知道Linux中的线程是轻量级的,这就意味着Linux中是没有线程这种概念的。所以用户要想用线程,OS不会提供,Linux程序员在应用层给我们提供了第三方库pthread库在线程概念章节中,最后简单演示了创建线程的代码,这里就有个问题了?一个进程中什么是主线程,一个线程要被调度,cpu怎么知道该调度谁了?

2024-06-14 15:50:26 1050 1

原创 C++ 11 【线程库】【包装器】

在C++11之前由于没有线程库,这就导致了在Linux能跑的代码,在windows下就不行,反之也是一样。导致了代码的可移植性差!!!而C++11之后出现了线程库,并行编译时不需要依赖第三方库。而且在原子操作中还引入了原子类的概念。一、thread类的简单介绍。

2024-06-08 18:50:35 1215

原创 C++ 11 【可变参数模板】【lambda】

上篇重点讲解了右值引用,本篇的可变参数模板和Lambda也是11里面非常有用的。如果学会这两个以后编程会感觉非常的爽。废话不多说直接开始!!!一、新的类功能1.1默认成员函数——移动构造、移动赋值移动构造和移动赋值。针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类。

2024-06-06 15:43:59 739 1

原创 C++ 11【右值引用】

目录1.C++ 11 简介2. 统一的列表初始化2.1 {}初始化3.1 auto4.右值引用和移动语义4.2 左值引用与右值引用比较4.3 右值引用使用场景和意义4.4 右值引用引用左值及其一些更深入的使用场景分析5.完美转化5.1模板中的&& 万能引用(引用折叠)C++11是C++编程语言的一个主要更新版本,它在2011年被国际标准化组织(ISO)正式批准为ISO/IEC 14882:2011标准。这个版本引入了许多新特性和改进,旨在提高语言的表达能力、性能和易用性。自动类型推断(auto关键字)

2024-06-06 15:43:43 1041

原创 Linux 线程概念

什么叫线程?我们认为:线程操作系统调度的基本单位!内核观点:进程是承担分配系统资源的基本实体。所以可以得出一个结论:线程就是我进程内部执行流资源!进程:进程 = 内核数据结构 + 代码和数据 +执行流(线程)3.再谈地址空间既然进程是承担分配系统资源的基本实体,地址空间又是进程的资源窗口,那地址空间的资源又是如何分配给线程的?线程资源的分配本质是分配地址空间范围那如何分配地址空间的范围?地址空间是虚拟地址,那虚拟地址是如何转化成物理地址?下面我以32位虚拟地址为例所以即使是每个物理地址。

2024-05-18 22:07:05 999

原创 Linux 信号捕捉与处理

信号产生到处理这是有一个过程的,从上篇信号保存我们知道了有一个handler表 里面存放的是对信号处理的方法。那什么时候调用这些方法?本篇就揭晓处理信号的时机。1. 信号的处理时机直接说结论:当我们用户从内核态返回到用户态时,进行信号的检测与处理。那什么是用户态?什么又是内核态?// 传统信号处理函数// SA_SIGINFO 标志设置时使用的信号处理函数// 信号掩码,定义了信号处理函数执行时哪些信号应当被屏蔽// 信号处理标志// 已废弃,不应使用。

2024-05-17 21:28:14 712

原创 Linux 信号保存

信号产生的篇章是帮助大家对信号的概念有一个了解,从上篇我们知道了产生信号4种方式,当今的社会中,每天都会有许多的信息产生,一些重要的信息都会被保存,那进程的产生的信号是如何被保存的?我们只需要用一个整型位图来表示就行了,一个整型32个比特位,从1号位开始一直到31,在比特位中1表示就是有信号,反之0就是没有。

2024-05-12 22:47:01 986

原创 Linux 进程信号【信号产生】

在前面的进程控制篇章里,父进程是怎么知道子进程退出了?并且回收子进程。以及我们之前写的代码报错之后,进程就终止了。这背后的一切都是基于信号,那进程中信号是什么?

2024-05-11 00:00:24 725

原创 Linux 进程间通信之共享内存

前面讲的匿名和命名都是基于文件看到同一份资源,那有没有不通过文件可以看到同一份资源?有的系统 V。

2024-05-07 22:58:18 735

原创 Linux 进程间通信之命名管道

书接上回,进程间通信我们利用管道可以通信,但是这些进程都是有血缘关系的进程,那有没有能让两个毫不相干的进程也能通信?有的,我们用命名管道,就能实现两个没有任何关系的进程进行通信。

2024-05-02 18:38:05 802

原创 Linux 进程间通信之匿名管道

从进程控制篇章,我们知道了进程是具有独立性,既然各进程具有独立性,它们之间是互不联系的,那它们是怎么通过一种方式取得联系?为什么要有进程间通信?进程间通信本质是什么?

2024-05-01 20:38:24 1123 1

原创 C++ 哈希

如果你会用map和set,那么你就会用哈希表这种数据结构底层实现的unordered_map 和unordered_set。看名字unordered无序,而map和set是有序的。数据结构也是不同,map和set是搜索二叉树,而unordered_map 和unordered_set是哈希表(哈希桶)。

2024-04-27 17:43:54 976 1

原创 【C】 初识C语言

从本篇开始,带你从不会C语言到精通C语言。这篇是让大家对C语言有个初步的了解。下面的内容会拆分不同篇幅单独进行详细讲叙。数据类型变量、常量字符串转义字符注释选择语句循环语句函数数组操作符常见关键字define定义常量和宏指针结构体1.什么是C语言?C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

2024-04-21 12:08:44 848 2

原创 C++ map和set模拟实现

前面我们实现了红黑树,本篇就讲map和set的底层是怎么用红黑树来进行封装的!!!我们要模拟实现map和set需要改造之前的红黑树,因为set只有一个K,而我们的红黑树模板参数是2个一个T和一个V。

2024-04-20 17:38:17 865

原创 C++ 红黑树模拟实现

前面我们实现了AVL树,发明AVL树的人是天才,那发明红黑树的人就是天才中天才。AVL由于加入平衡因子,所以对树的平衡过于严格。这就导致了频繁的旋转。从而增加时间复杂度。这也是为什么map和set底层的封装没有用AVL树,而是用的红黑树!!!

2024-04-14 11:57:16 940

原创 C++ AVL树底层实现原理

这篇从了解到使用map,map也是搜索二叉树,因为搜索二叉树会出现歪脖子树的情况,本篇就讲如何解决歪脖子树。记住口令 旋转 旋转 旋转!!!重要的事说三边。搜索二叉树加入平衡因子 旋转 就成了传说之中的AVL树AVL树1.1 AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数G.M.Adelson-Velskii和E.M.Landis在1962。

2024-04-09 09:16:43 844 1

原创 C++ set&&map

C++二叉搜索树最后简单的讲解了搜索二叉树的应用场景,而本篇的set对应的就是K模型,map对应KV模型。set是C++标准模板库(STL)中的一个关联容器,它包含唯一元素的集合。以下是关于set的一些基本介绍:set中的元素都是唯一的,重复的元素在插入时会被自动忽略。set中的元素默认按照升序排序。如果需要自定义排序规则,可以通过提供比较函数或重载运算符来实现。set支持前向迭代器,可以用来遍历容器中的元素。insert():向set中插入一个元素。find():查找一个元素是否存在于set中。

2024-04-05 14:54:33 1183 3

原创 C++ 二叉树OJ题

C++二叉搜索树这篇讲解了搜索二叉树的实现的,本篇从实战出发,让大家更好的掌握和理解二叉树的!!!!1. 二叉树创建字符串。606. 根据二叉树创建字符串 - 力扣(LeetCode)找出规律,我们就好办了 直接代码演示。public:if(root == nullptr) //根为空 直接返回空串!return "";//外面解释这个函数//结合 刚才的3点总结 左右都为空不加括号,左为空是要加括号的。str += '(';str += ')';str += '(';

2024-03-31 14:47:48 1239 4

原创 Linux 基础IO [缓冲区&&文件系统]

基础IO讲了什么是fd,以及fd的本质是什么,系统调用接口。本篇重点缓冲区,理解文件系统,全面认识Linux下一切皆文件。

2024-03-28 20:03:33 970 2

原创 C++二叉搜索树

观察上图,我们可以发现根节点7的左边节点是小于右边的节点,左子树的上所有的节点都小于根节点,右子树的所有节点都大于根节点。而且根的左右子树也都是搜索二叉树二.二叉搜索树循环操作1.二叉搜索树的插入先定义出二叉搜索树结构//定义二叉树节点K _key;,_key(key){}public:private:二叉搜索树插入实现方法↓public://二叉搜索树插入实现if (_root == nullptr) //第一次就不用说了。

2024-03-24 23:09:17 1034

原创 Linux 基础IO

本篇非常重要,承上启下的作用,对linux一切皆文件和重定向从底层原理剖析,为什么要有缓冲区?以及什么是文件系统,为什么C语言有了文件操作的函数,操作系统还要有自己的一套操作文件的方式?

2024-03-24 19:34:37 933

原创 linux 模拟shell

💓⏪🚚🌹关注我🫵带你学习更多知识🔝🔝想想Xshell的命令解释器,我们在命令行输入ls命令,他的父进程是谁?bash。根据之前的讲的进程替换,根据这个原理父进程当个监工,让子进程去做一些其他事情。

2024-03-12 21:16:38 430

原创 Linux 进程程序替换

上篇等待函数里面还有一个参数option参数没有讲,以前演示的fork创建子进程,子进程继承父进程的代码,执行一样的代码,那如果子进程要执行其他的代码怎么办?

2024-03-10 22:21:28 745

原创 C++菱形继承_多态

继承还有菱形继承没有解决,会在这篇解决菱形继承。本篇重点多态,多态在面试和笔试经常考,重点中的重点。

2024-03-01 23:16:36 811

原创 Linux 进程控制

上篇重点讲了什么是地址空间,地址空间重要性,有了这个概念我们就可以把之前遗留的僵尸进程在这篇进程控制来解决,以及写实拷贝的概念。本篇重点进程控制和等待。写实拷贝:顾名思义 数据要写入时再拷贝。你要用的时候,OS才会给你分配内存。这样内存使用的效率的就大大的提高了。看下图总结:写实拷贝使父子进程得以彻底分离!完成了进程独立性的技术保证。写实拷贝是一种延时申请技术,可以提高整机内存使用率。

2024-02-23 00:15:30 648 1

原创 Linux进程概念 (下) 地址空间

首先我先讲一个故事在一家公司里有小明小美和小红三个员工,有一天老板对这个三个员工分别单独在没有其他人情况下许下了承诺(PUA)"你今年努力干工作年底给你调职加薪"许下承诺后三个员工就继续干工作了,但是他们都以为自己是唯一一个被老板叫去谈话的且认为自己独享这福利待遇。故事到这里先暂停一哈我们先引出几个相对应的概念这里的老板就是操作系统三个员工就是进程调职加薪就是虚拟地址 ->(物理内存)看到这里你就会明白了 所有的进程都会有一份自己的虚拟地址。

2024-02-18 20:26:55 785

原创 Linux进程概念(中)环境变量

上篇进程写的是什么进程,演示了linux下进程的状态是什么样子的,本篇重点•孤儿进程•环境变量•优先级•地址空间。

2024-02-16 12:50:01 1149

原创 C++继承

继承?继承老爸的财产。1.继承的概念及定义2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承与静态成员2.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2024-02-12 23:22:45 663 1

原创 Linux 【进程概念】

六个字先描述再组织。

2024-02-07 22:17:43 600 1

原创 Linux项目自动化构建工具-make/Makefile

规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂。这样我们就不用再用g++ -o test.cpp mystest 这条指令了。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,,从一个侧面说明了一个人是否具备完成大型工程的能力。是一个文件,两个搭配使用,完成项目自动化构建。中指令的命令工具,一般来说,大多数的。译,极大的提高了软件开发的效率。命令,整个工程完全自动编。是一个命令工具,是一个解释。种在工程方面的编译方法。,一旦写好,只需要一个。

2024-02-06 20:45:27 278 1

原创 linux yum三板斧

如果你是普通用户需要添加信任列表先切换成root用户 执行下图命令用vim打开后找到下图内容在这内容下添加 用户名 我是李四 前面就是lisi 后面复制就行添加完后了 wq!退出就行了。

2024-01-23 20:15:29 364 1

原创 Linux编辑器-vim使用

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x windowmac os老式键盘是没有上下左右键的。vim是相当古老的文本编辑器,那时候的电脑还有没有鼠标,图形化界面。废话不多说直接开始实操打开你的云服务器 输入vim回车 如果是下面这个界面说明你的云服务器是安装了vim 没有这个界面你自己需要手动安装vim #

2024-01-23 12:07:48 893 1

原创 C&C++内存管理

表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如。这是是3个版本的介绍。建议自己手动翻译 ,鄙人网页自动翻译吃过亏。映射方式,用于装载一个共享的动态内存库。用于程序运行时动态内存分配,堆是可以上增长的。上面这段代码 这些变量初始化是放在什么地方的?的定义表达式进行显示调构造函数进行初始化。创建共享共享内存,做进程间通信。返回值等等,栈是向下增长的。果是自定义类型的对象,需要使用。,注意:匹配起来使用。全局函数来申请空间,全局函数来释放空间。[]的可以自行查看。

2024-01-21 20:28:15 844 1

原创 Linux 权限

但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。我把umask值设置成0777看看重新创建一个新的文件他们的默认是什么?个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)虽然都不属于我 但是在我的目录下 我就可以删除。目录的可执行权限是表示你可否在目录下执行命令。向权限范围增加权限代号所表示的权限。向权限范围取消权限代号所表示的权限。向权限范围赋予权限代号所表示的权限。,则实际创建的出来的文件权限是。

2024-01-14 18:05:43 908 1

空空如也

空空如也

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

TA关注的人

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