- 博客(64)
- 收藏
- 关注
原创 sk_buff数据结构详解
sk_buff 简介封包存储于struct sk_buff中,所有网络分层都会使用这个结构来储存其报头、有关用户数据的信息,以及协调其工作的其他内部信息。从第二层到第四层都会使用这个数据结构。L4附加一个报头传给L3,L3附加自己的报头传给L2,L2附加自己的报头传给L1转发出去。设备收到sk_buff之后,每层都只处理自己的报头,并将其呈交给上层。sk_buff数据结构内核使用一个双向链表来维护sk_buff,链表的开端使用了一个哑元元素sk_buff_head,如下图所示为sk_buff链表
2022-04-14 09:36:53
3190
原创 Linux系统调用
系统调用系统调用是用户空间访问内核的唯一手段;除了异常和陷入外,他们是内核唯一的合法入口。系统调用主要是为用户空间提供一种硬件的抽象接口,保证系统的稳定与安全,为应用程序实现多任务和虚拟内存提供接口。要访问系统调用,通常通过C库中定义的函数调用来进行。大多数系统调用都会产生某种副作用(使系统的状态发生某种变化)。getpid()系统调用的内核实现为:SYSCALL_DEFINE0(getpid) { return task_tgid_vnr(current);}而只是一个宏,定义了一个无参数
2022-04-06 18:57:12
6514
2
原创 [Linux内核设计与实现]Linux内核简介
内核是操作系统的内在核心。系统的其他部分必须依靠内核这部分软件提供的服务,想管理硬件设备、分配系统资源等。内核有时候被称作是管理者或者操作系统核心。通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。应用程序在用户空间执行。他们只能看到允许他们使用的部分系
2022-04-01 21:25:21
488
原创 [C++ Effective]第3章 资源管理
条款13:以对象管理资源void f(){ InvestMent* pInv = createInvestment(); ... delete pInv;}对于上述情况,可能存在很多时候无法调用delete进行资源的释放。1、过早的遇到一个return语句;2、delete在循环中提前遇到break或continue;3、遇到抛出异常的情况。因此为了确保createInvestment返回的资源总是被释放,需要将资源放进对象内,当控制流离开函数f,该对象的
2022-03-10 21:18:44
918
原创 [Effective C++]第2章构造/析构/赋值运算
条款05 了解C++默默编写并调用那些函数如果自己没有声明,那么C++会为类声明一个构造、一个copy构造、一个析构和一个赋值运算符重载。这些函数都是public inline的。default构造函数和析构函数主要是给编译器一个地方来放置调用基类和non-static成员变量的构造函数和析构函数。编译器产出的析构函数是non-virtual。而copy构造和=运算符重载只是单纯的将源对象的每一个non-static成员变量拷贝到目标对象。当遇到一下三种情况,必须自定义=赋值重载运算符:1、类中
2022-03-03 23:40:55
488
原创 [C++ Primer Plus]第14章C++中的代码重用
私有继承使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不再成为派生类对象公有结构的一部分,但可以在派生类的成员函数中使用他们。私有继承将对象作为一个未被命名的继承对象添加到类中。//包含版本//初始化列表进行对象初始化Student(const char* str, const double* pd, int n):name(str), scorts(pd,n){}double Student::Average()const{ i
2022-03-03 19:05:55
626
原创 [C++ Primer Plus]第13章 类继承
class TableTennisPlayer{private: string firstname; string lastname;public: TableTennisPlayer(const string &fn="none", const string& ln="none");};TableTennisPlayer::TableTennisPlayer(const string &fn="none", const string& .
2022-03-03 17:15:01
510
原创 [Effective C++]
1、除非有一个非常好的理由允许构造函数被用于隐式类型转换,否则应该把它声明为explicit2、如果一个新对象被定义,那一定有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义,就不会有构造函数被调用,那么就是赋值操作被调用Widget w1; //调用默认构造Widget w2(w1); //调用拷贝构造w1 = w2; //调用赋值Widget w3 = w2; //调用拷贝构造...
2022-03-02 22:59:51
167
原创 [C++ Primer Plus]第十章使用类
以下运算符只能通过成员函数进行重载:=、()、[]、->class Time{ int val;public: friend Time operator* (const Time &t, int const val);};类的自动类型转换和强制类型转换:使用ecplicit可以关闭构造函数的自动类型转换函数,但是任然允许强制类型转换class Stonewt{ explicit Stonewt(double lbs); //不允许隐式类型
2022-03-02 10:32:59
145
原创 [C++ Primer Plus]第十章 对象和类
作用域为类的常量:第一种方式是在类中声明一个枚举:class Dog{private: enum{ Months = 12}; double cost[Months];}第二种方式是在类中定义常量的方式——使用关键字static:class Dog{private: static const int Months = 12; double cost[Months];}作用域内枚举:enum egg{Small, Medium};e
2022-03-02 00:34:50
199
原创 [C++ Primer Plus]第九章内存模板和命名空间
单独编译不要将函数定义或变量声明放在头文件中。例如如果在头文件包含一个函数定义,然后在其他两个文件中包含该头文件,则同一个程序将包含同一个函数的两个定义,除非函数是内联的,否则这将出错。头文件中常包含的内容为:1、函数原型;2、使用#define或const定义的符号常量;3、结构声明;4、类声明;5、模板声明;6、内联函数。结构声明不创建变量,只是在源码文件中声明结构变量时,告诉编译器如何创建该结构变量.模板声明不是将被编译的代码,他们指示编译器如何生成与源代码中的函数调用相匹配的函数
2022-03-01 23:35:10
272
1
原创 [C++ primer plus]第七章 函数和数组
指针常量与常量指针指针数组与数组指针指针函数与函数指针函数指针数组指向“指向函数指针的指针“的指针使用typedef简化函数指针
2022-03-01 10:48:24
146
原创 [C++ Primer Plus] 第五章 循环和关系表达式
表达式:任何值或任何有效的值和运算符的组合都是表达式。副作用:指的是计算表达式时对某些东西进行了修改;顺序点:程序执行过程的一个点, 在C++中,语句中的分号就是一个顺序点。++i与i++的区别
2021-12-30 19:20:13
276
原创 [C++ Primer Plus] 第四章 复合类型
1、数组的声明与初始化:2、字符串cin的getline()和get()函数C类字符串为char类数组或指针在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区C++有四种管理数据内存的方式:自动存储、静态存储、动态存储
2021-12-30 18:45:18
239
原创 [C++ Primer Plus] 第三章 处理数据
变量名:以两个下划线打头或以下划线和大写字母打头的名称被保留给实现使用;以一个下划线开头的名称被保留给实现,用作全局标识符。整型:C++的基本整型有十种,其中无符号跟有符号各五种:char 至少8位short 至少16位int 至少跟short一样长long至少32位,至少跟int一样长long long至少64位,至少跟long一样长sizeof()函数可以返回变量的长度,如sizeof(num)或sizeof num
2021-12-29 18:24:07
415
原创 使用动态规划求解杨辉三角
/** * 从0开始出发,走过所有点,因为是无环的,所以不会存在重复的路径 * 可以利用一个栈, * 如果达到了节点4 * * * 示例 1: * 输入: numRows = 5 * 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] * */ public List<Integer> getRow(int rowIndex) { Integer[] dp = new Integer[rowIndex + 1];.
2021-08-30 23:10:43
209
原创 Tengine安装
从tengine.taobao.org下载tengine将其上传到Linux1、解压:tar -zxf tengine-2.1.0.tar.gz将tengine解压到当前目录2、配置tengine打开解压后的tengine使用命令./configure进行配置信息的设置,直接使用./configure是使用默认的配置信息。配置tengine需要预置gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel3、编译安装ma
2021-06-23 20:52:39
164
原创 Hadoop HA原理与搭建
CAP(一致性Consistency,可用性Availability,分区性Partitions) 既要提升系统的可用性 又要保证数据的实时可见 还有提升系统的容错能力 在分布式系统中,无法保证同时满足CAPHadoop 2.x版本Federation和HA分离,HA只能有两个NameNode用于解决单点故障HDFS HA:通过主备NameNode解决如果主NameNode发生故障,则切换到备NameNode上。解决内存受限问题HDFS Federat.
2021-06-23 16:02:45
205
原创 Linux下rpm安装jdk,mysql并设置
将jdk的rpm包拷贝到./opt/apps目录下输入命令进行安装:rpm -ivh jdk-7u80-linux-x64.rpm输入whereis javavim /etc/profile在最后一行添加:export JAVA_HOME=/usr/java/jdk1.7.0_80export PATH=$PATH:$JAVA_HOME/bin最后输入命令使配置文件生效:source /etc/profile最后输入jps或者java -version可查看是否安装..
2021-05-25 14:00:27
122
原创 IDEA如何打包项目
打开Project Structure,点击artifacts,在Available Elements选择需要导出的项目打开双击需要导出项目的out项,点击Apply,然后点击OK最后bulid一下就可以在项目路径那找到jar了
2021-05-19 13:55:33
1842
原创 Hadoop 完全分布式环境搭建
节点部署:需要1个NameNode,1个SecondaryNameNode,3个DataNodenode1 node2 node3 node4 NameNode DataNode1 DataNode2 DataNode3 SecondaryNameNode 首先四台主机进行免秘钥登录设置:在每台主机上输入命令,生成公钥和私钥:ssh-keygen -t dsa -P '' -f ~/....
2021-05-16 20:54:22
172
原创 Hadoop伪分布式搭建
首先将jdk-8u221-linux-x64.rpm和hadoop-2.6.5.tar.gz上传到NameNode(四台虚拟机中的第一台)上tar -zxvf hadoop-2.6.5.tar.gz -C /opt/rpmrpm -ivh jdk-8u221-linux-x64.rpm进入/etc/profile文件在最后一行插入:export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64export PATH=$PATH:$JAVA_HOM...
2021-05-16 14:35:29
123
原创 nginx实现动静分离
Nginx动静分离简单来说就是把动态和精通请求分开,不能理解成知识单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现方式大致分为两种:一是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。二是动态和静态文件混合在一起发布,通过nginx分开。通过location指定不同的后缀名实现不同的请求转发。本次简单实现了nginx1作为负载均衡服务器,no...
2021-05-10 22:17:44
260
原创 nginx使用memcached实现session同步
首先两台real server需要有jdk和tomcat首先安装JDK:node2 与 node3 下:将jdk的rpm包上传到/opt/apps上使用rpm -ivh jdk* 命令进行rpm安装会安装到/usr/java/jdk*目录下然后将在/etc/profile文件的最后一行加上export JAVA_HOME=/usr/java/jdk1.7.0_80/export PATH=$PATH:$JAVA_HOME/bin保存并关闭source /etc/p
2021-05-10 21:12:26
238
原创 NGINX通过一个IP搭建多台服务器,实现反向代理
将nginx安装目录下的conf目录下的nginx.conf文件修改成如下:#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { use epoll; #使用epoll worker_connec
2021-05-07 16:28:46
1509
原创 NGINX安装
Nginx ("engine x") 是一个高性能的 静态HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较
2021-05-06 19:00:22
169
原创 LVS(Linux 虚拟服务器)与keepalived的搭建
LVS/NAT:网络地址转换方式1、客户端请求数据,目标IP为VIP2、请求数据达到LB负载均衡服务器,LB根据自己的调度算法将目的地址修改为RIP地址及对应端口,并连接HASH表中记录下这个连接3、数据报从LB负载均衡服务器到达RS服务器RS34、然后RS3进行响应。RS3的网关必须是LB负载均衡服务器的内网IP也就是DIP,然后将数据返回给LB服务器5、LB收到RS的返回后的数据,根据连接HASH表修改源地址VIP和目的地址DIP缺点:NAT模式中请求的报文和响应报文都需要通
2021-04-30 21:47:53
293
原创 Linux(CentOS 6)网络及yum源配置
/etc/sysconfig/network 文件中保存了是否连接互联网,和主机名配置网络打开/etc/sysconfig/network-scripts/ifcfg-eth0 将文件修改为如下,IP地址跟VMware的vmnet8在一个网段输入service network restart若出现3个OK,则表示网通了打开/etc/hosts文件,修改为如下:由于2020年底各大厂的centOS 6版本的yum源已经不能用了,可以将/etc/yum.repos.d/CentOS-
2021-04-15 13:37:40
528
原创 CentOS安装
打开VMWare Workstations,点击创建虚拟机,下一步选择workstations 12.x -> 下一步点击下一步选择Linux的CentOS 6 64位->下一步选择虚拟机安装位置,并设置虚拟机的名字根据自己电脑情况设置CPU内核数量,我的电脑是6核12进程->下一步根据自己电脑情况设置内存数量,我的电脑是32G->下一步选择NAT -> 下一步下一步下一步下一步一般分配20
2021-04-07 16:16:22
120
原创 TensorFlow2.0 学习笔记(01)
conda create -n TF2.1 python-3.7conda activate TF2.1conda install cudatoolkit=10.1conda install cudnn=7.6pip install tensorflow==2.1python //进入pythonimport tensorflow as tftf.__version__ //显示2.1.0表示安装成功打开pycharm,点击NewProject...
2021-03-02 18:43:18
123
2
原创 蚁群算法
1、蚁群算法自组织算法:组织力与组织指令来自于系统内部。即在没有外界作用下是系统熵减少的过程(系统从无序到有序的变化过程)并行算法:每只蚂蚁搜索过程彼此独立,仅通过信息激素进行通信。在问题空间多点同时开始进行独立的解搜索,不仅增加了算法的可靠性,也使算法具有较强的全局搜索能力。正反馈算法:蚂蚁能够最终找到最短路径,直接依赖于最短路径上信息激素的堆积,而信息激素的堆积却是一个正反馈的过程。正反馈是蚁群算法的重要特征。1.1、参数设置: 过大 过小 蚂蚁数量m 随机每.
2021-02-26 03:05:14
9750
原创 [论文阅读]Discovering Conditional Functional Dependencies
摘要:本文研究了条件函数依赖关系的发现问题。CFDs是最近对函数依赖(FDs)的扩展,它支持语义相关常量的模式,可以用作清理关系数据的规则。然而,寻找CFDs是一个昂贵的过程,涉及大量的手工工作。为了有效地识别数据清理规则,我们开发了从样本关系中发现CFDs的技术。我们提供了CFD发现的三种方法。第一种方法称为CFDMiner,它基于挖掘闭合项集的技术,用于发现常量CFD,即只有常量模式的CFD。第一个算法称为CTANE,是一个扩展了TANE的水平算法,TANE是一个用于挖掘FDs的著名算法。另一种称为
2021-02-19 20:59:16
1304
3
原创 [论文阅读]TANE: An Efficient Algorithm for Discovering Functional and Approximate Dependencies
发现函数和近似依赖关系的有效算法1、函数依赖性和近似依赖性函数依赖是数据库关系内属性之间的一个关系:函数依赖表示属性的值是唯一被其他属性值所决定的。例如:在一个地址数据库中,邮编是被城市和街道地址所决定的。函数依赖关系的发现引起了人们极大的兴趣。当然,自动化数据库分析对于知识发现和数据挖掘(KDD)来说是很有趣的。例如,考虑一个包含化合物及其在各种生物测定中的结果的数据库。发现一种化合物的基本性质,如致癌性,在功能上依赖于某些结构属性是非常宝贵的。函数依赖在数据库管理、逆向工程和查询优化[.
2021-02-19 16:12:28
1798
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人