自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux高级IO_select、epoll

调用这些IO接口进行网络通信时,需要等待IO条件满足(IO事件就绪)才能正常拷贝数据。比如调用send/write需要等待TCP的发送缓冲区有剩余空间才能将数据拷贝到TCP发送缓冲区中,调用read/recv需要等待TCP的接收缓冲区有数据才能将数据拷贝到应用层,即IO=等+数据拷贝,而这些等待是由用户来完成的,高级IO就是降低用户等的时间以提高IO效率。常见的五种IO模型有:阻塞IO、非阻塞IO、信号驱动IO、多路复用/多路转接、异步IO(让操作系统进行IO)。

2024-03-15 23:50:45 1152

原创 数据链路层_以太网

IP协议确定数据跨网络从主机A到主机B的路径,即IP协议解决了路径选择问题,但在这之前,必须先解决数据在一个子网内的传输的问题。跨网络的本质就是跨多个子网,只要一个子网内可以通信,那么便可以跨网络通信。

2024-03-15 23:49:43 745

原创 网络层_IP

传输层解决的是传输控制,而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输,而传输层是可靠性传输。所以传输层+网络层就可以做到将数据可靠发送到对端。网络层的常见协议有:IP、ICMP等,其中最重要的是IP协议,IP协议有IP4v和IPv6两种,目前用的最多的是IPv4.

2024-03-15 23:48:52 1746

原创 传输层_TCP&UDP

应用层中调用这些系统接口,并没有将数据发送到网络中,而是向下交付到传输层协议,具体什么时候发送数据,由传输层根据一些策略进行数据的实际发送。传输层的主要功能就是数据的传输,包括如果数据丢失,重复,乱序,发送太快太慢等等一些数据传输可靠性问题。传输层就是根据用户的要求从而解决数据传输的问题。传输层的协议主要由TCP和UDP两种协议。TCP协议是可靠传输的,如果用户想要更可靠的传输就用TCP协议;如果用户追求效率,那么可以使用UDP协议,它是不可靠的,没有面向连接的,因此速度会比TCP协议快一些。

2024-03-15 23:48:15 1113

原创 应用层_HTTP&HTTPS

将一串文本经过hash算法后,形成固定大小的字符串,这个字符串具有很强的唯一性。这个字符串就是数据摘要,数据指纹。对数据摘要加密就得到了数字签名。可以通过数据摘要判断原始文本是否被篡改常见的摘要算法:MD5,SHA1,SHA512等。

2024-03-15 23:46:27 1107

原创 Linux_socket编程

根据ip地址我们可以定位一台主机,而根据端口号(port)可以定位一台主机上的一个进程。众所周知,服务器是需要一直运行的,所以服务器不能用用户进行命令行解释的会话来运行,而需要单独成一个会话,这个会话不能轻易退出。采用端口号而不是pid来标识进程的原因是降低网络和进程管理的耦合度,同时也更好的区分了网络进程。一个端口号只能对应一个进程,但是一个进程可以对应多个端口号。套接字通信主要编写的是应用层的程序,使用os提供的网络部分的系统调用进行发送和接收消息。一个会话内有许多进程组,一个进程组内有许多进程。

2024-03-15 23:44:51 688

原创 Linux_初识网络协议

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。说白了,协议就是通信双方的约定,建立协议是为了减少后期的沟通成本,提高通信效率,解决通信问题。比如购房时签订了协议,有了这份协议在发生纠纷时就很容易解决。在Linux中,协议就是一个c程序(软件)。

2024-03-15 23:43:31 1024

原创 Linux_线程

12 = 4KB)页目录共有1024行,每个页表项也有1024行,共可以映射2^20页地址,这恰好是内存中页的数量,页表映射出物理页号,物理页号和虚拟地址中的12位页内偏移组合,构成物理字节地址。由于程序不可能使用整个内存,所以页表不会一次全部创建,而是创建一部分。

2024-02-13 17:06:01 1182 1

原创 Linux_信号

综上所述,要学习信号,就要从信号的产生,信号的保存,信号的处理三个方面着手。在Linux中,可以用。

2024-02-13 17:05:16 1223

原创 Linux_进程间通信

创建共享内存:shmgetkey:一个整数,多个进程只要保证调用shmget时,传递相同的key,就可以保证打开同一个共享内存。获取key可以用ftok函数,其中参数是自己设定的size:共享内存的实际可用大小。操作系统分配是以4KB为单位的。shmflg:位图结构体,常用的宏:IPC_CREAT IPC_EXCL,也可以设置共享内存的权限返回值:返回一个shmid值shmid与key的关系。shmid和key的关系,类似于文件inode编号和fd的关系。

2024-02-13 17:01:43 1102

原创 Linux_动静态库

刚开始学编程时,需要下载一个环境(vs2019),这个环境包括编译器和标准库,标准头文件。那么什么是库呢,库和头文件有什么关系呢?在Linux中静态库通常命名为libxxx.a,动态库通常命名为libxxx.so,但库的名字是去掉前缀lib和后缀后的字符串。比如libc.so 这个库的真实名字就是c。

2024-02-13 16:59:24 441

原创 Linux_文件系统

假定外部存储设备为磁盘,文件如果没有被使用,那么它静静躺在磁盘上,如果它被使用,则文件将被加载进内存中。故此,可以将文件分为内存文件和磁盘文件。

2024-02-13 16:58:38 2231

原创 Linux_环境变量_命令行参数

在bash上运行的程序都是bash的子进程,在创建子进程时,父进程将它的环境变量表传递到子进程中,所以子进程可以访问环境变量表,这也说明了环境变量表具有全局属性,但是bash中的本地变量不能传递给子进程,只能在bash内部使用。像ls,touch这样的命令,它的路径已经存放在了对应的PATH环境变量里,我们自己写的程序的路径没有在PATH中,所以在查找时,找不到就报错了。在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。

2024-02-13 16:57:01 1189

原创 Linux_进程地址空间

进程地址空间,即虚拟地址空间。一个进程运行时,它所认为自己管理的空间就是虚拟地址空间,一个进程地址空间的大小取决于计算机系统架构,比如32位机,进程地址空间为4GB。

2024-02-13 16:55:42 955

原创 Linux_进程概念

但是仅仅知道该名学生的数据还不够,如果只有1名学生,这样的管理明显是可以的,但是如果有3万名学生呢,就算知道了这些学生的数据也不好管理,此时我们可以将这些学生的信息抽象成一个结构体,然后对于每一名学生构建一个结构体对象,然后使用链表,树等其他数据结构,组织这些结构体对象。操作系统对进程的管理,就转换为对这些PCB的管理。当一个进程状态是阻塞时,操作系统在内存不足的情况下,会将该进程对应的代码和数据,暂时交换到磁盘中,在磁盘中这块空间也叫做swap分区(外存),等资源就绪后,再将代码和数据交换回来。

2024-02-13 16:54:00 1100

原创 Linux_进程

execlpath:执行程序的路径,arg:表示执行程序名字,…:可变参数列表,同printf,写命令行选项,以NULL结尾返回值:当函数有返回值时,必定替换失败execlpfile:执行程序的名字,系统会在默认环境变量PATH中查找程序其余同上execleenvp :父进程可以将自己的环境变量表传递给子进程。execvargv:表示将上述的arg和可变参数列表,放入指针数组execvpexecvpeexecve。

2024-02-13 16:49:10 915

原创 c++异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了(基类与派生类的赋值兼容规则转换),通常这些还会实现为多态,在异常处理时,只要调用虚函数即可。1// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;

2023-08-02 08:30:17 355

原创 c++智能指针

c++98的做法是实现auto_ptr,但两个指针进行拷贝/赋值时,进行控制权转移,但是这样情况会导致被转移的智能指针悬空,但使用者不知道,如果使用者使用悬空指针,则会出现解引用空指针的问题,所以这种方法基本没人会使用。c++11的做法是对于不需要拷贝的智能指针实现unique_ptr,需要实现拷贝的智能指针实现shared_ptr/weak_ptr。解决了上述问题,但还不够,因为普通指针可以进行浅拷贝,我们上述的智能指针不能浅拷贝,会造成delete野指针问题。就会出错,如何解决这种问题呢?

2023-08-02 08:29:09 123

原创 c++特殊类的设计

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。常见的设计模式有:适配器模式,迭代器模式,工厂模式,观察者模式,单例模式(只能创建一个对象)2.如果两个单例对象有依赖关系,那么用饿汉模式就无法控制对象创建顺序。法一:饿汉模式,饿汉这里只能是对象指针,不能是对象,因为要禁用拷贝构造,所以不能返回。1.在main函数之前就会创建对象,会拖慢程序的启动速度。可以解决饿汉的缺点,但比饿汉复杂,并且有线程安全问题。懒汉模式:程序第一次调用对象时,创建对象。

2023-08-02 08:28:36 313

原创 c++类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换c语言的转换规则会导致:数据精度的丢失和代码不够清晰,所以c++提出了四种类型转换:static_case, reinterpret_cast, const_cast, dynamic_caststatic_cast功能和隐式类型转换一致,支持意义相近的类型转换。reinterpret_cast功能类似于强制类型转换

2023-08-02 08:28:06 113

原创 c++IO流

我们很容易就可以实现内置类型转换为自定义类型,只要有对应的构造函数即可,那么我们如何实现自定义类型转换为内置类型呢?参考仿函数那里,只要重载()即可实现,但是仿函数已经重载了()所以不能用。operator 内置类型()不需要指定返回值,如果内置类型为int,该函数会将自定义类型转为intclass A {public :return _a;int _a;A obj;//如果A的类没有重载operator int 这里会报错 int i = obj;return 0;

2023-08-02 08:27:34 75

原创 哈希_c++

应用链地址法处理溢出,需要增设链接指针,似乎增加了存储开销。事实上:由于开地址法必须保持大量的空闲空间以确保搜索效率,如二次探查法要求装载因子a <=0.7,而表项所占空间又比指针大的多,所以使用链地址法反而比开地址法节省存储空间。

2023-07-25 11:34:54 77

原创 红黑树实现

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

2023-07-22 10:58:16 86

原创 c++多态

多态是指不同的对象完成某个动作产生不同的状态。比如买车票,普通人买不打折,学生买有折扣。多态是建立在继承上的虚函数:被virtual修饰的函数叫做虚函数,(这里的virtual和菱形虚拟继承中的virtual没有关系)重载:两个函数必须在相同作用域,且函数名相同,参数不同覆盖(重写):两个函数分别在基类和派生类作用域中,且满足返回值,参数,函数名都相同(协变,析构函数是例外),两个函数必须是虚函数。

2023-07-21 19:24:01 61

原创 c++继承

继承是oo语言的三大特性之一。通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。c++语法复杂,原因之一就是有多继承,有了多继承就有了菱形继承,也就有了虚拟继承,这会导致底层实现很复杂多继承可以认为是c++的缺陷之一,后续的oo语言,很多都没有多继承。

2023-07-21 19:03:20 72

原创 AVL_树

不管H等于几,B,C必为满二叉树,从而在B或者C插入时,必会引起subRL树的高度变化,从而使subR->bf = -1,parent->bf = 2,所以插入后,如果符合subL->bf = -1,parent->bf = 2,就需要对这一颗树进行右左双旋转。不管H等于几,A必为满二叉树,从而在A插入时,必会引起A树的高度变化,从而使subL->bf = -1,parent->bf = -2,所以插入后,如果符合subL->bf = -1,parent->bf = -2,就需要对这一颗树进行右单旋。

2023-07-20 19:33:08 78

原创 STL_priority_queue

标准vector和deque都满足上述要求,但是vector作为底层适配容器更好,所以stl库里默认的底层容器是vector。在stl六大组件中,优先级队列是一个容器适配器,它在底层实现的是堆。其底层容器可以是具有随机访问且具有以下功能的容器。仿函数,也叫做函数对象。在priority_queue中,仿函数作为类型模板参数传入,通常重载();

2023-07-18 21:01:59 66

原创 STL_list

从外部接口来看,用户都是使用iterator来创建迭代器,但是它们的底层却并不简单,像string,vector之类底层是连续的空间,那么迭代器可以用原生指针,因为指针加1指向下一个有效元素,解引用指针也可得到正确的值,但是像list这样由一个一个节点构成,并不能将节点的地址作为迭代器,因为它们节点之间并不是连续的空间,将当前节点的地址+1也并不能指向下一个节点,将节点的地址解引用得到一个节点,但是我们需要的是节点内部的数据,所以list的原生指针并不能作为迭代器使用。任意位置插入删除效率都很高。

2023-07-18 20:52:23 66

原创 STL_vector

vector<vector> 会实例化两个类看源代码不能一行一行看有了模板之后,内置类型也需要有默认构造函数,所以可以认为内置类型有默认构造函数迭代器引用不能insert之后迭代器失效,有可能野指针erase之后迭代器失效,结果未定义匿名对象生命周期只在一行,const&可以延迟生命周期。

2023-07-18 20:39:40 64

原创 二叉搜索树

c. 要删除的节点有两个孩子,在删除时,必须保证树结构不变,所以不可以直接删除,只能间接删除,找到该节点左树中的最大节点或者右树中的最小节点,然后交换两个节点,此时就转换到了a或者b这两种情况。树为空,则直接新增节点,赋值给root指针,树不空,按二叉搜索树性质查找插入位置,插入新节点。从根开始比较,比根大的往右边查找,比根小的往左边查找。K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。

2023-07-18 20:29:36 55

原创 c++泛型编程-模板

c++泛型编程——模板

2023-02-15 16:56:31 95

原创 c_c++内存管理

c/c++内存管理

2023-02-15 16:29:07 77

原创 c++类的特殊语法

c++类的特殊语法:内部类,友元,explicit关键字

2023-02-14 14:41:43 195

原创 c++默认成员函数

c++的六个默认成员函数

2023-02-13 14:49:16 128

原创 c++类的定义与使用

c++类的定义和使用

2023-02-11 13:23:02 7150 2

原创 c++预备知识【简单了解】

c++的预备知识,简单了解

2023-02-10 15:14:52 143

原创 Linux环境基础开发工具

Linux环境基础开发工具

2023-02-06 12:35:34 81

原创 Linux中基本指令以及权限理解

Linx基本指令以及权限理解

2023-01-27 13:16:51 411

原创 c语言实现-排序

c语言实现九种排序

2023-01-24 17:35:07 320

原创 c语言实现数据结构--树

C语言实现树

2023-01-17 19:37:28 2222

空空如也

空空如也

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

TA关注的人

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