- 博客(54)
- 收藏
- 关注
原创 Edge-Triggered模式:反应堆
Linux: Linux Code - Gitee.comhttps://gitee.com/RuofengMao/linux/tree/master/Reactor
2024-09-10 10:57:50 181
原创 Linux:多路转接 select、poll、epoll
•调用 epoll_create 创建一个 epoll 句柄;•调用 epoll_ctl, 将要监控的文件描述符进行注册;•调用 epoll_wait, 等待文件描述符就绪;
2024-09-09 22:59:42 1206
原创 Linux:五种IO模型
阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认 都是阻塞方式。非阻塞 IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK 错误码。 非阻塞 IO 往往需要循环的方式反复尝试读写文件描述符(对于CPU会有较大的浪费), 这个过程称为轮询。 信号驱动 IO: 内核将数据准备好的时候, 使用 SIGIO 信号通知应用程序进行 IO操作。IO 多路转接: 虽然从流程图上看起来
2024-09-09 16:46:23 1401
原创 C++:异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;public:{}
2024-08-26 15:38:31 897
原创 Linux:网络基础概念
WAN vs LAN: Differences Between Networks | Built Inhttps://builtin.com/software-engineering-perspectives/wan-vs-lan路由器: "协议" 是一种约定 计算机之间的传输媒介是光信号和电信号, 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息, 要想传递各种不同的信息, 就需要约定好双方的数据格式。 光是制定好基本的协议是不行的! 完善的协议,
2024-08-24 11:06:37 999
原创 Linux:多线程
A:在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”B:一切进程至少都有一个执行线程。C:线程在进程内部运行,本质是在进程地址空间内运行。D在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化,也叫轻量化进程。E透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2024-08-23 12:03:48 925
原创 C++11:新特性一篇拿下!
在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数fn,args1,args2,...为线程函数的参数get_id()
2024-08-22 18:13:55 1682
原创 C++:哈希
红黑树O(logN)。然而,当树的高度较高时,即使是对数级查找也可能变得相对较慢,特别是当树的节点数量非常大时。O(1)然而,这种理想情况是在哈希函数分布均匀,且没有太多哈希冲突的情况下实现的。在最坏情况下,如果所有的元素都映射到同一个哈希桶(bucket)中,时间复杂度可能会退化到线性(O(N)O(N))。无序容器的主要优点更快的访问速度但是,与基于红黑树的有序容器相比,它们不支持有序操作,如有序遍历。不保证元素的顺序提供了快速的查找插入和删除操作使用哈希表来存储元素允许一定程度的哈希冲突。
2024-08-19 20:50:19 1030
原创 C++:map And set
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面一一对应关系的一种结构。
2024-08-15 22:12:08 703
原创 C++:二叉搜索树(binary search tree)
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: a:左子树(!=nullptr)中所有节点的值 < 根节点的值 < 右子树(!=nullptr)中所有节点的值。 b:它的左右子树也分别为二叉搜索树 7.4 二叉搜索树 - Hello 算法 (hello-algo.com)https://www.hello-algo.com/chapter_tree/binary_search_tree/ 1. 二叉搜索树的查找: a、从根开始
2024-08-15 12:21:18 769
原创 Linux:动态库和静态库
这是创建共享库(shared libraries)所必需的,因为共享库的代码在内存中的位置可能会在不同的程序中变化,而它需要能够在这些不同位置正常工作。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。选项可以确保编译出的对象文件既可以用于生成共享库,也可以用于生成静态库或直接链接到可执行文件中。编译生成的对象文件可以被重用,无需重新编译源代码,这可以加快编译过程。程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。)将负责加载这些库。
2024-08-14 07:53:47 854
原创 封装:C++中的面向对象编程基石
封装通过类(class)和对象(object)实现,提供了一种将实现细节隐藏起来,只暴露出一个可以被外界访问的接口的方式。
2024-08-13 08:24:07 656
原创 C++:模板
模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。注意: 1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。 2. 非类型的模板参数必须在编译期就能确认结果。 通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果
2024-08-13 07:59:35 733
原创 Linux:基础IO
a: C语言默认会打开三个输入输出流,分别是stdin, stdout, stderrFILE*FILE*FILE*b: 仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针filenamemodefopen成功时返回一个FILE*类型的非空指针,失败时返回NULL。这里要注意的是,虽然stdinstdout和stderr的类型都是FILE*,但它们不是通过fopen函数获得的,而是 C 语言运行时环境自动提供的。文件指针FILE*
2024-08-13 04:56:33 1764
原创 C++: priority_queue And deque
1.优先队列是一种容器适配器,根据严格的弱排序)标准,它的第一个元素总是它所包含的元素中最大的。2.此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3.优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2024-08-12 10:58:15 995
原创 C++:priority_queue queue stack的模拟实现
【代码】C++:priority_queue queue stack的模拟实现。
2024-08-12 10:56:54 283
原创 C++:List相关问题
1.2.3.4.5.在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
2024-08-12 08:55:06 702
原创 C++:Vector相关问题
2. 如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间的拷贝,因为memcpy是浅拷贝,否则可能会引起内存泄漏甚至程序崩溃。1. memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存空间中。
2024-08-11 20:52:10 1000
原创 Linux:进程控制
进程:内核的相关管理数据结构(task_struct + mm_struct + 页表) + 代码和数据在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核做:A:分配新的内存块和内核数据结构给子进程B:将父进程部分数据结构内容拷贝至子进程C:添加子进程到系统进程列表当中D:fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但是
2024-08-11 11:39:58 962
原创 Linux: 进程概念详解
截至目前,我们所认识的计算机,都是有一个个的硬件组件组成。【注意】这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。一句话,所有设备都只能直接和内存打交道。计算机就是为了完成指定的数据处理,而通过指令按指定流程完成指定功能,指令的合集就是一段程序。说白了计算机就是按照指定的指令执行流程完成对指定数据的处理。2. 操作系统(Operator System)先描述,再组织!
2024-08-11 06:58:57 901
原创 C++进阶篇:继承与多态一篇拿下
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。
2024-04-23 21:27:25 1086
原创 Linux:权限的概念与理解
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask。将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。对目录来说具有删除移动目录内文件的权限。可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.对目录来说,具有浏览该目录信息的权限。:execute对文件而言,具有执行文件的权限;可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
2024-03-22 22:45:07 974 1
原创 String类(C++)详解与应用
1. string是表示字符串的字符串类2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3. string在底层实际是:basic_string模板类的别名,typedef basic_stringstring;4. 不能操作多字节或者变长字符的序列。在。
2024-03-12 17:45:25 1095 1
原创 C++入门篇:命名空间
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;
2024-02-17 00:17:50 450 1
原创 C/C++重点解析:内存管理
int main()/* new / delete 和 malloc / free最大区别是 new / delete对于【自定义类型】除了开空间还会调用构造函数和析构函数*/free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;【注意】在申请自定义类型的空间时,
2024-02-16 16:49:01 1030 2
原创 C++入门篇:类与对象重点解析(中篇)
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。对于以下Date类:对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦。构造函数:是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一
2024-02-13 01:12:00 871 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人