- 博客(59)
- 收藏
- 关注
原创 非阻塞IO,fcntl,多路转接,select,poll,epoll,reactor
1.五种IO模型IO次数会影响程序的效率,在编程中往往会尽量减少IO次数,用以提高程序的效率,例如就是减少IO次数提高效率的一种方式;而IO影响效率的最大原因其实是因为,在进行IO时往往需要拷贝的数据就绪,或者其他资源就绪,才能进行拷贝,所以其中是占据了IO的最大时间的;1.五种IO模型IO模型大致可以分为以下五种:1.阻塞式2.非阻塞,非阻塞轮询3.信号激发式4.异步IO(操作系统做等待动作)5.多路复用/转接1.1。
2025-04-03 09:06:31
1037
原创 传输层协议UDP,TCP
所以1001-1050为紧急数据;以上就是TCP结构的基本内容,下面我们来看看TCP到底做了哪些工作来对通信进行控制保证通信效率与可靠性;
2025-02-18 16:54:06
1260
1
原创 https协议
数据指纹和数据摘要是一种东西,只是有两个名字;指纹/摘要,顾名思义就是数据的身份证明,数据可以是一个非常大的文档,也可以是很小的一个字符串;当将这些数据使用HASH算法解析成为一串固定长度的摘要,这个摘要就是数据指纹/摘要;这个数据指纹/摘要可以用来代表这份数据;当数据本身发生改变时,它的数据指纹//摘要也会发生改变;我们可以使用这样的方式来进行数据是否被篡改的判断;1.HASH算法是不可逆的,不用担心通过摘要获得原有数据的情况;2.我们前面讲的sessionID就是这样的数据摘要。
2024-10-31 11:24:35
1033
原创 http协议
我们今天讲解的是与http协议有关的内容,而我们又知道在我们使用浏览器访问网站时,我们总会看见网址带有https和http的前缀,那这究竟是什么意思呢?我们一般访问网站时一般都需要网站的网站,这个网址就是URL,通过URL我们可以通过浏览器访问相应的服务器;
2024-10-24 10:13:57
1022
原创 C++11 thread,mutex,condition_variable,atomic,原子操作CAS,智能指针线程安全,单例模式最简单实现方式
t1.join();t2.join();现象:相比较与linux底层的pthread_create,这里C++thread的使用更加方便,我们不需要固定线程函数的返回值,也不需要通过结构体来传递函数的多个参数,只需要通过函数的不定参数列表来传递多个不同的参数即可;此外,线程函数删除了拷贝构造,防止了线程的拷贝,但是我们可以使用thread()空构造来创建空线程,之后再通过移动构造的方式让线程接收到线程函数:std::cout << "我是线程函数" <<std::endl;
2024-10-21 08:44:04
1080
原创 应用层协议编写,序列化反序列化,网络版计算器,Json序列反序列化工具,条件编译,结合网络协议栈理解协议定制
我们前面说了tcp与udp传输层协议的使用,现在我们来看看传输层的上层应用层,我们是如何约定协议的,是如何让我们的数据封装的;
2024-10-17 15:32:37
909
原创 网络编程,tcp,守护进程化,前后台任务,bash与shell,会话
首先我们需要介绍一个名词——会话,在我们使用电脑时,电脑也可以创建多个用户,每个不同的用户登录上电脑就会生成不同的会话。而我们云服务器在登录远程主机时每次登录都会创建一个会话,我们可以这样理解:对于我们的会话,我们可以这么理解,会话是一个用户在使用主机时所产生的与主机交互的一个实体,我们运行的进程还有需要的数据都会显示在会话上,而大多数时刻一个会话在一个时刻是只能显示一个页面的,那么在这个页面上显示的就是我们的前台进程(任务),所以一个会话只能在一个时刻存在一个前台进程(任务)
2024-09-27 08:48:34
1361
原创 网络编程,端口号,网络字节序,udp
前面一篇我们讲了网络的基础,网络协议栈是什么样的,数据如何流动传输的;接下来这篇,我们将进行实践操作,真正的让数据跨网络进行传输;
2024-09-25 09:28:54
1164
原创 网络基础,协议,OSI分层,TCP/IP模型
数据的传输一定是基于硬件层面的,无论数据如何跳转,如何传递,都必须贯穿网络栈传递;最后再说两个命令:linux中查ip地址: "ifconfig"windows中查ip地址: "ipconfig"
2024-09-14 16:48:50
1282
原创 C++类型转换,特殊类设计,IO流
1.C++文件流操作中创建ofstream与ifstream对象,它们默认创建都是以文本读或者文本写的形式创建的,如果想切换为二进制读写需要向上面那样带上两个设置的 |(与)2.我们在进行文件操作的时候,如果创建了一个文件对象,我们使用完之后一定要调用close接口来关闭使用完了的对象,否则对象占用文件会导致其他对象无法打开这个文件完成操作;3.文件写入操作要记得带上分割符,我们可以自己设置也可以使用默认的空格,回车,制表符;
2024-09-12 17:54:39
1016
原创 C++智能指针
这可以说是第一版的智能指针,这一版的智能指针实现的是基本的数据随着智能指针对象的创建与销毁;智能指针封装成为了一个类,当在堆上申请数据时,智能指针类实例化出类对象,将堆上的数据的地址封装进了类中,当智能指针类的生命周期结束时调用析构函数,封装的堆上数据的析构函数也被一同调用,从而起到了自动释放空间的作用,我们叫这样的类似思想叫做RAII方式;(其实在我们前面的linux中的mutex锁的封装处,我们也使用到了RAII的思想进行了封装,与这里的智能指针的使用是相似的;这两个库成功的解决了拷贝所出现的问题;
2024-09-10 15:07:09
689
原创 C++异常
在c中进程出现错误时为了防止程序继续进行错误程序,提供错误的结果;程序会设置errno错误码,更有甚者会直接将程序终止掉;这是C语言的处理异常的方式;而在C++中,引入了throw抛异常,try catch捕捉异常的方式,可以捕捉我们所知道并且指明的错误,不让程序终止,提高用户的体验感,当然如果遇到了严重的错误依然会终止进程;那么相较与C语言处理异常的方式C++的优势究竟在哪里呢?首先C++是兼容C语言的,所以C语言的获取异常方式C++也是拥有的;
2024-09-08 13:44:16
960
原创 linux线程cp模型,posix信号量,线程池,线程封装,单例模型,懒汉饿汉实现方式,自旋锁,读者写者模型
前面的同步,我们并没有一个很好的场景来模拟同步,只是简单的将有序的现象输出出来;现在我们来讲解一个比较合理且常见的模型——生产者消费者模型;
2024-09-06 16:31:14
1084
原创 C++11,可变参数模板,lambda表达式,包装器
在C++11中模板也可以接收多个不定参数,就和int printf(const char *format, ...);函数一般模板也可以接收多个参数;看上面的testArgs函数接收了多个不同类型的参数(可变参数包),由于模板的参数包将这些类型打包,从而使得函数可以接收多个,且不确定的参数类型;模板定义了可变参数包类型,函数接收可变参数包类型的参数;
2024-09-06 11:01:37
842
原创 linux线程的同步与互斥
1.互斥是一种解决由于线程并发访问临界资源时锁产生问题的一种解决方式2.互斥是一种用时间换安全的方式3.互斥使得临界资源的使用代码串行执行4.lock与unlock之间的代码越少越好,因为它们之间的代码是串行执行的,这里的太多会影响线程的效率5.线程在执行lock与unlock之间的代码时是可以进行上下文切换的,因为线程线程的切换是持有锁切换的。
2024-06-06 08:48:33
1063
原创 linux线程,线程控制与线程相关概念
线程概念线程这个词或多或少大家都听过,今天我们正式的来谈一下线程;在我一开始的概念中线程就是进程的一部分,一个进程中有很多个线程,这个想法基本是正确的,但细节部分呢我们需要细细讲解一下;什么是线程1.线程是进程执行流中的一部分,就是说线程是进程内部的一个控制序列;2.线程是操作系统调度的基本单位;3.在linux中没有真正意义上的线程,也就是操作系统中说的tcb(thread ctrl block),但是其他的操作系统是有的不同的操作系统实现不同(如windows就是在pcb下再
2024-05-28 15:48:53
1140
3
原创 C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充
在c++中有右值与左值之分,一开始就是是用在赋值符号的作用来作为区分的;但是现在对于左右值不能这么区分;
2024-05-06 19:19:17
1353
1
原创 信号,信号列表,信号产生方式,信号处理方式
这就是我们上面进行了那么多次使用signal函数进行的catch捕捉信号;然后自定义函数,回调函数给signal,进行我们定义函数的行为;
2024-05-01 17:44:27
984
2
原创 unordered_map, unordered_set, bitset位图(表),布隆过滤器
前面我们就说明了unordered_map与unordered_set的底层容器是hash表;现在我们就来看看它们究竟是如何实现的:和map与set一样,因为RBTree为了适配两种容器,需要一些改造;所以这里的hash表也需要改造;
2024-04-29 10:21:31
721
原创 哈希表功能及底层讲解与实现
hash表的结构有开散列和闭散列两种,这两种结构都可以减轻hash冲突的问题,开散列通过增加hash桶高度来解决,而闭散列通过控制荷载因子,使得hash表中总是存在部分空闲空间提高,数据存储的命中率来减轻hash冲突;这两种方式中,由于闭散列总是要留出一部分空闲空间的原因,使得开散列的平均空间利用率还是高于闭散列的(优化算法也发挥着作用),而且开散列增加的是指针,但闭散列增加的是节点,节点的空间是远大于指针的;hash表的哈希函数有很多;
2024-04-19 10:57:43
831
原创 map与set oj题
本题要求复制随机链表;本题有两种写法;方法1:(使用C语言)思路:因为我们在复制链表的时候,还需要将复制的随机节点的指针也复制到复制节点中;所以重点是如何知道某个复制节点是我们复制的随机节点;我们可以改变原有链表,将复制的节点链接在原有节点的后方,这样我们的原有节点和复制节点就是一一对应的了:形成这样的链表之后,我们就可以通过原链表节点的cur->random->next找到我们cur->next的复制的随机节点位置,从而更新复制节点随机节点值;
2024-04-18 09:41:23
656
原创 进程间通信,管道,匿名管道,共享内存,信号量
在我们的命令行上输入的 | 符号就是匿名管道,通过它可以实现我们进程之间的数据交流;首先我们需要明白管道的存在是为了进行进程间通信,而想要进程间通信,我们首先需要进程可以有数据交流,而想要让进程有数据交流,就得让进程看到同一块内存空间;而管道就是那块被双方进程都可以看到的内存空间;所以叫管道的进程间通信我们首先要创建出我们的管道;上图中的管道就是创建出来供进程交流的内存,这个内存的生命随着交流双方的关闭会自动消失;
2024-04-17 08:57:16
1034
原创 map与set
set在我们就是我们前面学习的k模型,它可以用来比对数据,增删查的时间复杂度都是O(logn)效率非常高,由于它底层的原因,它也可以实现排序,通过中序遍历可以输出我们的有序的数据;又因为它的T值在插入的时候具有唯一性的原因,set还有去重的作用;
2024-04-14 16:23:02
868
原创 红黑树实现及原理
前面我们学习了AVL树,而AVL树对于树高度的检查非常严格,这样的好处是我们树的查找效率非常高,但是这样严格的检查,会导致我们树的插入,删除这些操作效率会低一些(因为AVL树的旋转非常的频繁);所以因为这个原因,出现了一种对数高度检查相对于AVL树要开放一些的树——红黑树;红黑树的效率分配较为均匀,使得插入,删除,查找都具有不错的效率;红黑树也好二叉树也罢它们本质都是搜索树,只是通过不同的方式和标准来平衡我们的二叉树,使得我们的搜索二叉树不会出现歪脖子树的情况;
2024-04-11 16:22:22
855
原创 C++ AVL树(旋转)
我们之前学习了搜索二叉树,我们知道普通的搜索二叉树会有特殊情况出现使得二叉树的两枝极其不平衡形成我们通俗说的歪脖子树:这样的树一定会使得我们的增删查的效率变低;为了避免这种极端的情况出现,在1962年有两位伟大的俄罗斯数学家和发明的;它们通过旋转使得我们的树的任意节点的左右子树高度差不超过2;使得搜索二叉树总会是一颗平衡的搜索二叉树;我们怎么知道我们的左右子树的高度差呢?
2024-04-02 11:06:01
1145
原创 搜索二叉树
搜索二叉树是接下来要学习的map和set的基础,它和我们之前学习的priority_queue的二叉树结构相同;当搜索二叉树进化为平衡搜索二叉树的时候,时间复杂度可以优化为O(logn);效率非常高;
2024-03-19 15:38:18
891
原创 C++多态
了解了这些之后,我们来对比一下我们学的一些概念:重载:在同一区间内,通过符号表中的命名规则(参数不同)可以使得同名函数存在;重写(覆盖):在子类虚函数和父类虚函数返回值,名字,参数都相同(除开两个例外);重定义(隐藏):在子类继承了父类的成员函数时,如果子类写了同名函数(重写除外)就会形成隐藏,从而显示调用只会调用子类的成员函数;
2024-03-12 17:30:40
712
原创 磁盘,Linux文件系统,动静态库,软硬链接
在我们前面的学习中,我们知道了我们进程是如何打开文件的,如何将数据写入我们的文件中的;现在我们拓展我们的思维,我们的数据写入我们的文件中,而文件在我们的磁盘中存储着,那数据是怎么进入我们的磁盘中的呢?
2024-03-11 19:05:22
776
原创 C语言文件操作,linux文件操作,文件描述符,linux下一切皆文件,缓冲区,重定向
为什么我们可以把文件创建在进程当前路径中,当前路径到底是什么意思?我们在运行可执行程序后程序变成了进程,而进程在我们之前的学习中,我们知道进程有进程的pcb结构体,这个结构体中存放了进程的各种信息,那么我们运行进程时所在的路径也会被记录下来,这个路径就是当前进程所在的路径,也就是当前路径的根本意义;下面我们通过实际现象来证明我们思路:由此我们可以清楚的明白所谓的当前路径就是存储在进程的pcb结构体中的进程信息,我们只要通过查找进程的结构体就可以找到我们的当前路径;
2024-03-04 17:06:40
1315
原创 C++继承
因为我们的子类和父类是两个类中的所以是处于两个不同的作用域中,所以子类和父类相同名字的成员(成员名字相同即可,成员函数也是函数名相同即可)不是重载行为而是重定义/隐藏行为;class Apublic:cout << "我是A的print函数" << endl;public:cout << "我是B的print函数" << endl;cout << "b._a输出了 " << b._a << endl;
2023-12-21 23:21:15
907
原创 进程控制:进程创建,进程终止,进程等待,进程替换,模拟实现shell
而代码和数据都是我们在写父进程的代码的时候所输入或者说所产生的,这些东西是我们写的,而pcb结构体是操作系统创造出来的,所以子进程的pcb结构体必定是独立的,是自己独有一份的(进程独立性也满足),而代码一般我们是只读不修改与写的所以我们的代码一般子进程与父进程是共享的,剩下的数据数据是可读可写的,我们进程分流的时候,当数据发生改变时才会分离(写时拷贝);上面我们学习了怎么创建怎么等待进程,这些其实都是为了让我们的进程为我们做事,我们需要做的事情在子进程中实现,这样我们的父进程就可以去做其他的事情;
2023-12-18 15:56:21
1051
原创 栈,队列,优先级队列(堆),deque
我的博客起到的是指引思维的作用(也就是为什么这个容器要这么做),而基础的对stl容器的讲解(也就是容器是做什么的)你应该直接去看权威的文档会的了解的更透彻;看不懂就用翻译软件一个一个的翻译。
2023-11-20 16:34:11
84
原创 模板参数,模板特化,模板的的分离编译要求
模板的存在促进c++的泛型编程,优化了编写代码的效率,stl容器也是因模板而生的;但是同时也提高了我们学习的成本,让c++难度迈上一个新台阶;2023.11.19。
2023-11-19 18:54:37
103
原创 可执行程序是如何运行的,进程地址空间(虚拟/线性)
地址空间这一概念,我们在以往的学习中肯定是有这么一个概念的,如果记忆有点模糊,那看看下面这个图也应该懂了:现象:我们使用代码证明出来了我们这些数据的地址;这些地址确实是按照我们上面的图片所示排布的,我们的地址空间也确实可以这么划分!
2023-11-17 20:31:30
153
原创 stl_reverse_iterator反向迭代器
我们可以看到反向迭代器的模板参数有三个,后面两个在我们讲list的迭代器的时候我们就讲过了,我们现在就看这个第一个模板参数iterator,这个模板参数就像它的名字一样,它就是迭代器,我们的模板参数居然是一个迭代器!而我们传递迭代器作为模板参数,这样我们就是对我们的迭代器进行操作了,既然是对迭代器进行操作,那这样的话所有容器都有迭代器,而且迭代器提供的接口都是一样的(因为迭代器是所有容器都有的,通用的工具的实现的接口一定是相同的)所以我们反向迭代器的实现以迭代器为底层也可以实现通用!
2023-11-16 15:40:38
68
原创 C++stl_list 链表
链表早在我们学习数据结构的时候就已经学习过了,我之前在学习数据结构的时候和我上一篇vector一样是用c语言实现的,那个时候写的代码又臭又长,要满足许多接口;打开链接就可以找到我的stl模拟实现代码实现因为我们上一篇就讲了为什么要有stl容器的原因,这次我们就直接进入正题,我们直接来看我们的stl_list;打个预防针:我们list中迭代器的运用非常巧妙要做好心里准备;stl_list文档:使用文档辅助学习效率更高哦!
2023-11-10 10:52:18
172
原创 环境变量linux;main函数的三个参数
相信环境变量这个词,我们或多或少都听过,我记得我第一次听到环境变量这个词是在java课程中老师让我们为我们的java命名配置环境的时候;有了这个环境变量,我们在任何地方都可以使用我们的java命令;那为什么会出现这种情况呢?我们将我们的java命令的路径放到了这个变量中,而我们运行命名就是通过环境变量PATH这一变量中存储的路径找到我们命令所在的文件,以此我们就可以运行我们的命令了;接下来我们做一下实验来论证我们的理论:这是我创建的test.c文件的代码我们将它编译成可执行程序。
2023-11-09 11:11:38
70
原创 C++STL_vector顺序表
我们在之前学习数据结构的时候一定是接触过vector的它就是我们数据结构中的顺序表,我们之前使用C语言实现过C语言模拟实现vector · 小六/my_road - 码云 - 开源中国 (gitee.com)这是我使用C语言实现vector的代码;我们在实现vector的时候要写一大堆东西;每次要使用顺序表这样的数据结构的时候我们都需要自己手搓一个顺序表出来,或者是复用自己写过的顺序表;这样的过程一定是麻烦的;
2023-11-08 09:35:56
71
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人