MQTT5.0新特性(比对3.1.1) MQTT(MessageQueuingTelemetryTransport),即消息队列遥测传输协议,是一种基于发布/订阅的消息传输协议。其轻量、开放、简洁和易实现的特点能够适用于要求代码量小、网络带宽资源匮乏的情景,如机器间通信(M2M)、物联网等。...
Linux进程概念 进程概念进程简单点来说就是正在执行的程序,从内核看就是担当分配系统资源的实体。而程序则是一段有序指令的集合,根据冯诺依曼体系结构我们可以得到,程序员的代码存储在硬盘中,当其执行的时候代码会首先被加载到内存上面。当加载到内存上面时候,就需要操作系统对其进行描述与组织,也就是管理。而操作系统则是通过一个结构体对这个指令和数据进行描述然后组织,从而达到管理的目的。进程信息被放在PCB(进程控制块)中,Linux下的PCB其实是一个task_struct结构体;task_struct中的信息包括标示符
C++项目:云备份 项目简介实现一个类似于云盘的功能来备份客户端的文件,服务器根据客户端的请求进行处理,并根据热点管理进行压缩存储,客户端也可以自行下载文件,且服务器端支持通过浏览器进行查看与下载以及断点续传功能。环境配置linux,VS019,高版本g++ jsoncpp httplib和bundle库的安装工具介绍使用httplib库进行http服务器的搭建,我们更关注服务器的业务处理。使用bundle库进行压缩解压缩存储使用jsoncpp库对于内存中的文件进行持久化存储到我们的磁盘中项目模
C++ 智能指针 话不多说上代码!void div(){ int* p = new int; int m = 0; int n = 0; cin >> m >> n; if (n == 0) { throw exception(); } cout << "continue" << endl; cout << m / n; delete p;}int main(){ try { div(); } catch (exce
常见面试题(2) 1.进程间通信进程间通信有管道,共享内存,消息队列和信号量管道其实就是内存中的一块缓冲区,管道分为匿名管道和命名管道;匿名管道没有标识符,只能在具有亲属关系的进程间进行通信命名管道有标识符,可以被其它进程找到,可以用于一台主机上任意进程间通信...
常见的面试题(1) 1.malloc和new的区别?C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载的。 new分配内存成功后返回一个对象的指针,而malloc返回的是一个void*,需要通过强转成特定类型的指针。 new关键字申请内存时无需指定大小(这个由编译器计算对象的大小),而malloc需要指定大小;对于申请失败时,new会抛异常(bac_alloc
红黑树(RHTree)的结构与操作#/ 红黑树概念红黑树,是一种二叉搜索树,与一般二叉搜索树不同的是在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。性质它不仅仅具有二叉搜索树的特性,还必须满足以下特点:根结点必须是黑色 每个结点不是黑的就是红的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 每...
传输层(udp和tcp协议) Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是是TCP该协议几乎做了所有的事情。UDP协议Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。UDP协议格式16位源端端口 16位对端端口 16
应用层(HTTP协议、Cookie机制) 应用程序是我们自己写的,所以我们需要自己定制应用层的协议,它是直面我们程序员的一层自定制协议与典型知名协议自定制协议:也就是我们所说的自己根据应用程序的特点,定制的协议(数据格式);在我们的应用程序的数据传送中,一般需要对数据进行序列化和反序列化;序列化:按照指定格式将多个数据对象进行组织成为可持久化存储或者数据传输的二进制字符串反序列化:将二进制数据串根据指定格式进行解析得到多个数据对象(数据要尽可能短小,传输速度也要快)常见的序列化方式JSON(JavaScript Object
socket套接字编程 常见的socket API// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len);// 开始监听socket (TCP, 服务器)int listen(int socket...
力扣1002. 查找共用字符 class Solution {public: vector<string> commonChars(vector<string>& A) { vector<string> result; if (A.size() == 0) return result; int hash[26] = {0}; // 用来统计所有字符串里字符出现的最小频率 for (int i = 0; i ...
Hash#/(理解,实现与应用) unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经 过关键码的多次比较.顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2N),搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过 某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映..
多线程应用(线程池,单例模式) 线程池一堆线程进行任务处理,主要针对大量任务需要处理的场景,使用多执行流可以提高处理效率如果一个任务到来就创建一个线程来处理这有很大缺点:成本:总耗时=线程创建时间+任务处理时间+线程销毁时间,如果任务处理时间短,则大量时间被线程创建与销毁消耗了 风险:如果有大量线程进来,则在峰值压力下系统可能会有崩溃风险思想:线程池其实是一堆创建好的线程和一个任务队列,有任务来了就抛入线程池中,分配一个线程进行处理线程池中的线程与任务节点数量都有最大限制,避免资源消耗.实现:typedef
其他的锁#/(乐观锁,悲观锁,读写锁,自旋锁,CAS算法) 应用场景:读者—写者模型也就是读共享,写互斥的场景就比如,如果有多个线程和一个数据空间,而有的线程想要修改空间中的数据,有的只是想看一看有什么数据,这时候用互斥锁的话就只能串行进行,效率很低读锁:当前只要没有被加写锁写锁:既没有读,也没有写的时候才能加写锁实现:用两个计数器当加锁不成功时,则要阻塞进程/线程读写锁的阻塞是通过自旋锁来实现的自旋锁:一直占用cpu不释放,循环进行条件判断;适用于等待时间确定较短的场景...
Linux多线程理解---(线程安全(互斥锁,信号量,条件变量)#/) 线程安全概念多线程之间对同一个临界资源的访问操作是安全的,访问同一个临界资源可能会造成数据二义实现互斥:保证执行流在同一时间对临界资源的唯一访问,保证安全同步:通过一些判断实现对资源获取的合理序列操作互斥互斥锁本质:就是一个0/1的计数器,主要用于标记资源的访问状态;本身就是用来实现互斥,自己也就是一个临界资源.(同一个资源所有进程在访问的时候得加同一把锁)自身的安全---互斥锁是一个原子操作操作加锁(将状态置为不可访问状态)解锁(将状态置为可访问状态)一
Linux-信号(重入,volatile关键字) 信号概念:它是一种事件通知机制,通知进程发生了什么事件,打断当前进程的操作去处理这个事件种类:使用kill -l(查看linux信号种类)---62种非可靠信号/非实时信号: 1~31; 可靠信号/实时信号:34~64;信号生命周期产生产生方式:硬件中断ctrl +z(20)/c(2)/\(3)软件中断:int kill(pid_t pid,int sig)给指定进程发送指定信号int raise(int sig);给自己发送指定信号voidabort(void).
基础IO—(Linux下的库函数和系统调用以及重定向和动态静态库) 标准库文件IO操作FILE* fopen(char *pathname,char *mode);//打开文件pathname:文件路径名; mode:文件的打开方式mode 含义 r 只读打开文件,文件必须存在 r+ 读写打开文件,文件必须存在 w 只写打开文件,文件不存在则自动创建,存在则清空内容 w+ 读写打开文件,文件不存在则自动创建,存在则清空内容 a 追加方式打开文件,文件不存在则自动创建,存在则数据总是写入到文
进程控制(创建,终止,等待,程序替换) 进程创建pid_t fork()和pid_t vfork()进程本质上就是一个PCB,创建进程就相当于创建PCB;pid_t fork(void);pid_tvfork(void)功能:通过复制父进程创建一个新的进程(子进程)返回子进程id给父进程,对于子进程返回0,失败返回-1;pid_vfork(void) 特性:父子进程共用一个虚拟地址空间,父子进程数据共享任意一个进程对原有数据的修改都会影响到另一方,并且共用同一个栈,因此函数调用压得都是同一个栈,造成栈混乱,因此让子进程先.