- 博客(63)
- 收藏
- 关注
原创 网络子系统学习3:网络访问层
如果在分组等待处理时接收到新的IRQ,内核不会收到新的信息:在分组进入处理过程之前,内核是可以接收IRQ的,在分组的处理结束后,内核也可以接收IRQ,这些不过是“旧闻”而已。虽然对设备驱动程序(和一般意义上的内核代码)来说轮询通常是一个很差的方法,但在这里该方法没有什么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。在分组可以发送到下一个正确的计算机之前(通常不同于目标计算机,因为除非存在直接的硬件链路,否则IP分组通常通过网关发送),必须确定接收方网卡的硬件地址。
2023-07-20 11:36:45
412
原创 网络子系统学习2:套接字缓冲区
由于在此类体系结构上,整型变量占用的内存只有指针变量的一半(前者是4字节,后者是8字节),该结构的长度缩减了20字节。data 和head 仍然是常规的指针,而所有sk_buff_data_t 类型的成员现在都解释为相对于前两者的偏移量。由于网络子系统必须保证较低的内存占用和较高的处理速度,因而对struct sk_buff 来说,我们需要保持该结构的长度尽可能小。由于假定套接字缓冲区的内部表示对通用网络代码是不可见的,所以提供了如下几个辅助函数来访问struct sk_buff 的成员。
2023-07-19 11:18:50
565
原创 网络子系统学习1:网络模型
国际标准化组织)设计了一种参考模型,定义了组成网络的各个层。该模型由7层组成,称为OSI(Open Systems Interconnection,开放系统互连)模型,如图所示。其中将ISO/OSI模型的一些层合并为新层。该模型只有4层,因此其结构更为简单。这种模型称为TCP/IP**参考模型**,IP表示Internet Protocol(网际协议),而TCP表示Transmission Control Protocol(传输控制协议)。
2023-07-07 09:53:51
281
原创 protobuf序列化原理、安装与应用
protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多,毕竟google出品。
2023-04-19 17:11:17
577
原创 内存检测Valgrind与Gtest单元测试
TEST是gtest的测试宏,我们的测试用例必须按照这样格式写,isPrimeTest是测试套的名字,一个测试套下可以有多个测试用例,那么Positive、Trivial就是我们测试用例的名称,EXPECT_EQ、EXPECT_FALSE和EXPECT_TRUE等等,都是gtest提供的测试断言,比如 EXPECT_EQ(1, Factorial(1));用来检测c/c++程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。
2023-03-30 09:00:00
702
1
原创 Coredump 调试
程序异常退出时,会产生一个core文件,该文件记录了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。设置core文件生成的目录,其中%e表示程序文件名,%p表示进程ID,否则会在程序的当前目录生成dore文件;当前执行程序的用户对core目录有写权限且有足够的空间存储core文件;非法指针的访问,堆栈溢出。
2023-03-29 10:36:28
382
原创 多线程并发服务器
在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定。start_routine函数接收一个参数,是通过pthread_create的arg参数传递给它的,该参数的类型为void *,这个指针按什么类型解释由调用者自己定义。同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时“存在”的。
2023-03-28 10:16:37
798
原创 memcpy函数底层实现
在实现memcpy的时候注意源地址和目的地址是否重叠,当源地址的尾部与目的地址头部重叠时,要从尾部开始拷贝。发现上图重叠时,我们要从尾部开始复制。
2023-03-27 19:35:42
1286
原创 C++设计模式之工厂模式
抽象基类是不允许创建为对象的。但是代码4中ISplitter* splitter = factory.CreateSplitter()构建的新对象仍然违背了依赖倒置原则,因为splitter依赖于具体的factory,factory依赖与BinarySplitter()具体。工厂方法设计了一个设计了一个工厂的虚基类SplitterFactory,该类有一个返回基类指针的纯虚函数CreateSplitter(),当我们把这个创建对象的函数写成纯虚函数,可以由具体工厂的类(子类)确定生成哪一种对象。
2022-11-20 21:46:18
176
原创 C++设计模式之桥模式
基类Messager分为两个类,一个是Messager类,一个是MessagerImp类,平台的选择通过多态指针messagerImp实现,在运行时被确定。从上述子问题拆分方式进行业务代码实现,我们实现了很多类,基类1个,平台实现类2个,业务抽象类2*2个。然而在实际业务中,你的平台实现和业务抽象类将会更多,假设n个实现平台,m个业务抽象方法,那将会有1+n+m*n个类,如下代码是我们没有学习过桥模式写出的代码,下面代码通过功能分解的方法将一个复杂功能伪代码实现。桥模式也是设计模式中单一组件模式的一种。
2022-11-20 16:34:44
685
原创 Linux 信号量
信号量,是一种特殊的变量。只能对信号量执行P操作和V操作P操作, 如果信号量的值 > 0, 则把该信号量减1如果信号量的值 ==0, 则挂起该进程。V操作: 如果有进程因该信号量而被挂起,则恢复该进程运行如果没有进程因该信号量而挂起,则把该信号量加1。注意:P操作、V操作都是原子操作,即其在执行时,不会被中断。注意:此指的“信号量”是指System V IPC的信号量,与线程所使用的信号量不同。该信号量,用于进程间通信。
2022-10-18 22:07:00
464
原创 高并发内存池设计(实现高效的内存管理)
在设计高并发内存池之前我们先了解一下什么是高并发。高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。响应时间短吞吐量大每秒响应请求数QPS 并发用户数高设计逻辑应该尽量简单,避免不同请求之间互相影响,尽量降低不同模块之间的耦合 内存池生存时间应该尽可能短,与请求或者连接具有相同的周期,减少碎片堆积和内存泄漏。
2022-10-11 14:01:39
2168
1
原创 C++新特性 Type Alias, noexcept, override, final
typedef void(*func)(int,int)与using func = void (*)(int,int)使用方法是一样的,但是typedef void(*func)(int,int)不能突显出func是一个函数指针,是函数的类型。上图swap函数不抛出异常,是在大的红色方框里为true,也就是小的红色方框里不要抛出异常,小的红色方框不抛出异常,就需要保证小的红色方框里的x.swap(y)为true.我们在类的成员函数的后面添加final关键字,将会导致这个类不可被改写。......
2022-08-15 17:33:32
557
原创 左值引用与右值引用疑点总结
在C++11之前进行我们想要构造一个与A一样的B对象,我们需要重新分配一块内存,把A对象里面的资源拷贝到B里面,然后把A释放掉,这样就得到了一个与A一样的B对象。而在C++11 之后,通过移动构造和移动拷贝构造可以将A对象迁移为B对象,提高效率。想要右值引用引用左值,第一种方法可以将左值前加const,但是这样会有问题,我们希望通过引用可以修改变量值,如果左值前加上const,虽然能够被右值引用,但不能被修改。另外需要注意的是声明出的左值引用和右值引用都是左值。左值引用和右值引用区别。...........
2022-08-13 22:05:54
2012
原创 智能指针学习笔记
在C++ 11中引入智能指针的概念,使得C++程序员不需要手动释放内存智能指针的分类:unique_ptr, shared_ptr, weak_ptr注意:auto_ptr已经被抛弃C++指针包含两种原始指针智能指针:对原始指针的封装,其优点是自动分配内存,不用担心潜在的内存泄露。智能指针和原始指针的关系并不是所有的指针可以封装为智能指针,很多时候原始指针更方便各种指针中,最常用的是原始指针,其次是unique_ptr和shared_ptr。...
2022-08-03 22:28:11
1104
4
原创 C++ return语句不返回任何东西(不是void类型)
下面直接上return结论吧!return语句有两种形式:不带返回值的return语句return;//不带返回值的return语句中断返回值为void类型的函数的执行。return;的作用相当于break;用于中断循环的作用。#include <iostream> using namespace std; void func(){
2022-05-17 20:42:33
1751
原创 linux GDB调试工具常用知识点总结(如何debug你的代码)
linux GDB调试工具1 什么是GDBGDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。 一般来说,GDB 主要帮助你完成下面四个方面的功能: 1. 启动程序,可以按照自定义的要求随心所欲的运行程序 2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式) 3. 当程序被停住时,可以检查此时程序中所发生的事 ...
2022-05-03 17:28:38
1662
2
原创 Linux编程 Makefile常用知识点总结(项目管理)
目录Linux编程 Makefile(项目管理)1什么是 Makefile2 Makefile 文件命名和规则3 Makefile工作原理Linux编程 Makefile(项目管理)1什么是 Makefile一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也..
2022-05-02 12:00:00
1638
原创 五一也要学习:Linux 静态库与动态库的制作常用知识点总结(如何保密你的代码)
静态库与动态库的制作1、什么是库::库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供使用者可以直接拿来用的变量、函数或类。库是一种特殊的程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。库的好处:1、代码保密 2、方便部署和分发2、...
2022-05-01 12:59:18
2282
5
原创 GCC常用知识点
GCC常用知识点Ubuntu安装命令:sudo apt-get install gcc g++ 查看版本:gcc/g++ -v/--version要求版本大于4.8.5,不然不满足C++11新特性gcc编译命令:gcc test.c -o a.out//test.c为c代码文件,a.out为可执行文件其中可执行文件a.out后缀.out可以不要gcc test.c -o ag++编译器可以编译.c程序。gcc常用参数gcc编译选项说明-E预处理指定源文件
2022-04-27 21:43:38
2590
原创 linux开发环境搭建(VMware、Ubuntu安装,xshell安装与配置、VSCode实现远程开发)
linux开发环境搭建(C++)1、安装Ubuntu系统安装方法我就不说了,优快云上一大堆。1.1 首先安装VMware,点击此链接获取1.2 VMware虚拟机上安装Ubuntu,点击此链接获取2、安装xshell和xftp。xshell是远程登录服务器的软件,xftp是文本传输软件。2.1 安装xshell和xftp软件下载:链接:https://pan.baidu.com/s/1k67WHJzWjm_Moaw8swDvRQ提取码:dtq7第一步:安装XmanagerPowerS
2022-04-27 18:40:04
1837
原创 C++编程: 内联(inline)函数与常量成员函数
🌍内联函数引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。...
2022-04-12 18:59:16
516
原创 C++面对对象高级编程——复合、委托与继承
C++面对对象高级编程11——复合、委托与继承🌍复合、委托与继承本节主要探讨的是类与类之间的关系。包含Inheritance(继承)、Composition(组合)和Delegation(委托)三种关系。🌳**Composition(组合) **template<class T,class Sequence = deque<t>> class queue{......protected: sequence c; //底层dequed容器public: //
2022-04-05 10:25:53
753
原创 Python2.7完美安装OpenCV
Python2.7安装OpenCV第一步:下载OpenCV安装包opencv3.4.0网址:https://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.4.0/opencv-3.4.0-vc14_vc15.exe第二步
2022-04-03 16:10:15
5861
原创 Linux系统编程:进程控制1
🌍Linux系统编程2:进程控制🌳fork函数🍀作用与定义方式作用:创建一个子进程。 定义:pid_t fork(void); 失败返回-1;成功返回0:① 父进程返回子进程的 ID(非负) ②子进程返回 0;pid_t类型表示进程 ID,但为了表示-1,它是有符号整型(0不是有效进程 ID,init最小为 1) ;🍀 父子进程相同:刚fork后。 data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式相同。🍀父子进程不同:.进程id、返回值、各自的父
2022-03-14 16:01:22
1237
原创 C++之快速理解指针常量与常量指针
C++之快速理解指针常量与常量指针指针常量:int * const p //指针常量常量指针:const int *p ; //常量指针快速的分辨方法:指针常量:const修饰p,p是个常量。所以说是指针常量。常量指针:const修饰int(在本例中),指针指向的是一个常量,指针本身是变量。快速理解:指针常量:本质就是一个常量,是一个指针类型的常量。特点是指针指向的变量的值可以修改,但是指向的地址不可以修改。另在一个重要的坑是,定义指针常量的时候必须初始化。指针常量也是常量,常量在定义的时候必
2022-03-06 14:11:27
583
原创 Linux系统编程:进程1
进程进程相关概念程序和进程程序,是指编译好的二进制文件,在磁盘上。不占用系统资源(cpu、内存、打开的文件、设备、锁…)进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)程序 → 剧本(纸) 进程 → 戏(舞台、演员、灯光、道具…)同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)如:同时开两个终端。各自都有一个 bash 但彼此 ID 不同。并发并发,在操作系统
2022-03-03 16:41:17
661
原创 基于pyqt的nao机器人拍照+实时显示图像
nao机器人拍照Python实现2# -*- encoding: UTF-8 -*-## This is a tiny example that shows how to show live images from Nao using PyQt.# You must have python-qt4 installed on your system.#import sysfrom PyQt4.QtGui import QWidget, QImage, QApplication, QPaint
2021-12-12 20:08:36
714
原创 nao机器人拍照Python实现
nao机器人拍照,并且展示Visualize an image using PILGet one image from NAO, then display it using PIL.Python实现:# -*- encoding: UTF-8 -*-# Get an image from NAO. Display it and save it using PIL.import sysimport time# Python Image Libraryimport PIL.Image as
2021-12-12 18:30:02
829
原创 nao机器人配置pip
nao机器人配置pippip是Python中常用的包管理工具,在NAO机器人预装的Python2.7安装包中,pip不是默认安装的。(1)下载pip安装文件。下载地址:https://pypi.python.org/packages/source/p/pip/pip-10.0.1.tar.gz。(2)将下载到本地的pip-10.0.1.tar.gz利用WinSCP上传到NAO的/home/nao目录下。(3)登录Putty,使用su命令将用户由nao切换到root,密码为root。root用户对“/
2021-12-05 21:12:10
1731
原创 1、两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6
2021-11-23 17:58:54
90
原创 c++ map与unordered_map区别及使用
需要引入的头文件不同map: #include < map >unordered_map: #include < unordered_map >内部实现机理不同map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(
2021-11-23 17:44:37
119
原创 map/multimap容器
map/multimap容器map基本概念map中所有元素都是pair(成对)pair中第一个元素为key(键值),起到索引作用,第二个元素为value,是实值。所有元素按照元素的键值自动排序本质 : map/multimap属于关联式容器,底层实现通过二叉树实现优点:可以通过key值找到value值map和multimap区别:map不允许容器中有重复的key值元素multimap允许有重复key值元素map构造和赋值功能描述:对map容器进行构造和赋值操作构造:
2021-11-23 17:38:07
572
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人