与网络编程有关的部分内核参数 几乎所有的内核模块,包括内核核心模块和驱动程序,都在/proc/sys 文件系统下提供了某些配置文件以提供用户调整模块的属性和行为。通常一个配置文件对应一个内核参数,文件名就是参数的名字,文件的内容是参数的值。 我们可以通过命令sysctl -a 查看所有这些内核参数。下面说明与网络编程关系较为紧密的部分内核参数。 一、 / proc/sys/fs 目录下的部分文件 ...
HTTP中GET和POST的区别 我们通常在讨论 GET vs POST 的时候,实际上讨论的是 specification,而不是 implementation。什么是 specification?说白了就是相关的 RFC。implementation 则是所有实现了 specification 中描述的代码/库/产品,比如 curl,Python 的 requests 库,或者 Chrome。POST 请求怎么发...
C++的String类 String类 string类本不是STL的容器,但是它与STL容器有着很多相似的操作,可以被看成是以字符为元素的一种容器。标准的string类提供了STL容器接口,如begin()、end()。 在C++中使用string类,先必须包含头文件#include<string>.相关函数构造函数: string s; // 生成一个空字符串s strin...
libevent 总结 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库。 主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select...
进程间通信的五种方式 进程间通信的意思就是在不同进程之间传递信息。它是一组编程接口,让程序员协调不同进程,使能够相互传递消息。IPC目的1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程...
哈希简介 Hash主要应用于数据结构中和密码学中。用于数据结构时,主要是为了提高查询的效率,这就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。1. 数据结构使用Hash的数据结构叫做散列表,主要是为了提高查询的效率。也有直接译作哈希表,也叫Hash表,Hash表是一...
C语言进程的内存分区、变量作用域和生存期 1.内存分区 C源代码进过预处理、编译、汇编和链接4步生成一个可执行程序。 程序在没有运行之前,也就是说程序没有被加载到内存前,可执行程序内部已经分好3段信息,分别是代码区(text)、数据区(data)和未初始化数据区(bss)三个部分。(部分人直接把data和bss合起来叫做静态区或全局区)。 运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出...
STL容器比较和基本操作 stl不同容器的优缺点verctorvector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效...
面向对象思想、特征等 面向对象思想面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。起初,“面向对象”是专指在程序设计中采用封装、继承、多态和抽象等设计方法。可是目前面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向...
常见数据结构的应用场景 常见数据结构应用场景通用数据结构可以简单的按照速度将通用数据结构划分为:数组和链表(最慢),树(较快),哈希表(最快)。增、删、改、查是四大常见操作,不过其实可以浓缩为两个操作:增和查。删除操作和和修改操作都是建立在查找操作上的,所以完美的数据结构应该是具有较高的插入效率和查找效率。通用数据结构关系可以根据下图选择合适的通用数据结构:数组使用场景数组在以下三个情形下...
B-tree与B+tree B-treeB-tree是一种适用于外查找的树,它是一种平衡的多叉树,称为B-树(或B树、B_树)。一棵m阶B树是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:1、根结点至少有两个子女;2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;(┌m/2┐为大于m/2的最小整数)3、除根结点以外的所有结点(不包括叶子...
BSTree、AVLTree、RBTree、 二叉排序树BSTree二叉排序树,又叫二叉搜索树。 性质:二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;(3)左、右子树也分别为二叉排序树;插入:...
C++的cosnt、static、宏定义、内联函数 constC++中const的用法,C++是怎么处理的【在编译期间对于使用常量的地方用常量初始化的值直接替换】①const是定义常量的,不能做左值被修改; 必须初始化;②const常量的初始值如果是明确的值,那么常量在编译期间被常量初始值替换。③const修饰常变量(C语言)时,不能做左值,其他与普通变量一样,比如不能定义数组大小;没有编译期替换规则。④const修饰成员变量,成为...
C和C++的区别 C与C++的区别:1数据类型:bool类型。C语言没有2函数参数问题。 1、无名的函数形参。2、函数的默认参数(允许函数参数被初始化)3.inline函数。C语言只有宏4.函数重载:函数名相同,参数形式和参数个数不同。C语言没有5.c和c++代码的相互调用。C调用C++、和C++调用C不一样。6.const。C语言中可以不初始化,只是常变量。即只是不能做左值,其他和普通函数...
new和malloc的区别 主要区别如下:1.new分配在自由存储区,malloc分配在堆区。甚至可以不为对象分配内存!定位newnew (place_address) type。 不分配任何的内存,它只是简单地返回指针实参,然后右new表达式负责在place_address指定的地址进行对象的初始化工作。2.返回类型安全性new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转...
TIME_WAIT过多的解决办法 执行主动关闭的那端经历了这个状态,并停留MSL(最长分节生命期)的2倍,即2MSL。TIME_WAIT存在的两个理由:1 可靠的实现TCP全双工连接的终止2 允许老的重复的分节在网络上的消逝第一个:如果客户端不维持TIME_WAIT状态,那么将响应给服务端一个RST,该分节被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确的处...
TCP相关面试题 Q1:TCP报文长度是在TCP三次握手中那一次确定的?这个是关于TCP报文的最大报文段长度mss的相关问题。在TCP连接的前两次握手中(SYN报文中),通信双方都会在选项字段中告知对方自己期待收到最大报文长度(mss值),以双方两个SYN报文中最小的mss最为本次数据传输的mss值。通信双方以“协商”的方式来确定报文长度的,前两次握手是告诉对方自己的mss值,在第三次握手确定mss值Q2:...
TCP和UDP、流量控制和拥塞控制 URL访问网站时的网络传输全过程,归纳起来就是:首先要通过域名找到IP,如果缓存里没有就要请求DNS服务器;得到IP后开始于目的主机进行三次握手来建立TCP连接;连接建立后进行HTTP访问,传输并获取网页内容;传输完后与目的主机四次挥手来断开TCP连接。整个过程基本分做下面几个部分:1、域名解析成IP地址; 2、与目的主机进行TCP连接(三次握手); 3、发送与收取数据; 4、与...
快排和归并排序的非递归实现 快速排序:是一种交换排序,当完全有序时退化为冒泡排序,时间复杂度为O(n^2)。正常情况下为O(nlogn).非递归:其实就是手动利用栈来存储每次划分后两个序列的起始点和终止点。栈非空时获取栈顶两个值:起始点和终止点,然后再根据两个点划分获得中轴,将两个序列中没划分完的起始点和终止点入栈。重复这个过程,直到栈为空时完成排序。 void quicksort(int *arr, int l...
C++实现迭代器模式 迭代器模式:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示(将对聚合对象的遍历封装到一个类中进行)。属于行为型模式优点: 1、它支持以不同的方式遍历一个聚合对象(容器)。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。Iterator(迭代器)【迭代器类定义访问和遍历元素的...
C++实现观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。完美的将观察者和被观察的对象分离开。【有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或为发布-订阅模式(目标就是通知的发布者,观察者是通知的订阅者(接受通知))。】 Observer 的一个实例 Model/View/Control(...
C++实现工厂模式(简单与抽象工厂模式) What is it?工厂模式:是一种很常见创建型模式,是用工厂代替new操作的模式。在java程序中很常见,但C++同样可以实现和使用。因为工厂模式就相当于创建对象时的new,如A a = new A();所以用我们在用new时要考虑能不能用工厂模式。虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。。工厂模式可分为“简单工厂模式”和“抽象工厂模式”。Wh...
快速排序的5种优化方法 三种快速排序以及快速排序的优化 1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,递归地以达到整个序列有序的目的。2、快速排序的三个步骤:(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)(2)分割操作:以该基准在序列中...
Linux下的互斥锁、自旋锁、读写锁浅谈 自旋锁概念:何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。在任何时刻最多只能有一个执行单元获得锁,即任何时刻只有一个线程访问对象。如果自旋锁已经被别的执行单元保持(资源被占用)调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。自旋锁不会引起调用者睡眠,"自旋"一词就是因此而得名。原理:跟互斥锁一样,一...
C++实现单例模式(快加载与懒加载) 单例模式:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”它是一种常见的面向对象的设计模式,属于创建型模式。可以保证应用单例模式的类只有一个对象实例。优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。缺点:没有接口,不能继承应用实例: 1、Windows 是多进程...
Linux内存管理机制(最透彻的一篇) 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。力求从外到内、水到渠成地引导网友分析Linux的内存管理与使用。在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理。前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市...
github命令大全 一、 Git 常用命令速查git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git@192.168.1.119:ndshowgit push...
glic内存管理ptmalloc之原理 概述 3.概述3.1内存管理一般性描述当不知道程序的每个部分将需要多少内存时,系统内存空间有限,而内存需求又是变化的,这时就需要内存管理程序来负责分配和回收内存。程序的动态性越强,内存管理就越重要,内存分配程序的选择也就更重要。内存管理的方法3.3.1.C 风格的内存管理程序C 风格的内存管理程序主要实现 malloc()和 free()函数。内存管理程序主要通过调用 brk()或者...
glibc内存管理ptmalloc之基础知识 2.基础知识2.1 X86 平台 Linux 进程内存布局Linux 系统在装载 elf 格式的程序文件时,会调用 loader 把可执行文件中的各个段依次载入到从某一地址开始的空间中(载入地址取决 link editor(ld)和机器地址位数,在 32 位机器上是 0x8048000,即 128M 处)。如下图所示,以 32 位机器为例,首先被载入的是.text 段, 然后是.dat...
STL之迭代器 3.1迭代器设计思维—STL 关键所在 STL 的中心思想在于,将数据容器( containers)和算法( algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。容器和算法的泛型化,从技术角度来看并不困难, C++ 的 class templates 和 function templates可分别达成目标。如何设计出两者之间的良好胶着剂,才是大难题。 3.2迭代器...
STL空间配置器原理解析 为什么不说allocator是内存配置器而说它是空间配置器呢?因为,空间不一定是内存,空间也可以是磁盘或其它辅助储存媒体。是的,你可以写一个 allocator,直接向硬盘取空间1。以下介绍的是 SGI STL 提供的配置器,配置的对象,呃,是的,是内存!2.2具备次配置力(sub-allocation)的SGI 空间配置器SGI STL 的 配 置 器 与 众 不 同 , 也 与 标 准 规...
常用字符串处理函数总结 我们学习过C语言的都肯定用过头文件里的函数,例如strlen, strcmp, strcpy, strcat,strtok它们是使用字符数组时的常用函数。除此之外,还有常用的itoa和atoi函数。。。 今天,我们就逐一实现这些库函数。 函数原型:size_t strlen(const char *str); 计算但不包括终止空字符\0的字符串str的
线性表之链表 我们学习数据结构时,除了顺序表,接触更多的另一种线性表就是“链表”。链表是一种物理存储单元上非连续、非顺序的链式存储结构,数据元素的逻辑顺序是通过链表中的指针的连接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储其他结点地址的指针域。相比线性表的顺序结构,操作更复杂。 链表的种类由节点类
八大排序之交换排序 冒泡排序:顾名思义,即每趟排序通过对相邻两个元素比较,越大的元素会因交换“浮”到数组的顶端处。算法思想:对于一组数据,依次将两个相邻元素比较,若前者大于后者元素,则将两者位置交换,直到最后的待排序元素位置。重复进行上述操作,最后数组完全有序。排序过程如图所示:具体代码如下: C++ Code 1234567891011121314151
C语言可变参数编程之Avg、Myprinf… 可变参数函数(Variadicfunctions)是stdarg.h内容典型的应用。stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准)arguments(参数)简化而来,主要目的为让函数能够接收可变参数。 可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。可变参数函数最少要有一个命名的参数,所以char *wrong(...) 在c中是
八大排序之归并、基数排序 归并排序:将两个或两个以上的有序表组合一个新的有序表称为“归并”。先使每个子序列有序,再归并使子序列段有序,最后得到完全有序的序列。算法思想:我们通常用递归实现,先把待排序区间[startindex,endindex]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[startindex,endindex]。归并过程:比较a[i]和b...
Linux学习知识框架 linux的系统编程和网络编程一、基础(Redhat) 文件系统: Linux文件层次结构 文件类型 根目录下各子目录的作用 Ext2文件系统 基础操作: 文件操作命令 touch mkdir rm cp mvmore less cat head tail chmod 进
前缀、中缀、后缀表达式 我们都知道数学上有前缀,中缀和后缀表达式。前缀表达式(波兰式)是一种没有括号的算术表达式,运算符在写在前面,操作数写在后面,从右向左运算。而后缀表达式与此相反,不包括括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,从左向右运算。中缀表达式是最常用的算术或逻辑公式表示方法,运算符在位于操作数中间。虽然中缀表达式被人们所通用,但在计算机里很复杂,不易被解析。所以我们在计算...
八大排序之选择排序 选择排序的基本思想是:每一趟在n-i-1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。我们主要学习的是简单选择排序、堆排序。 1、简单选择排序 算法思想:①一趟排序操作为:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个交换。 ②再令i从1至n-1,进行n-1趟选择操作。 算法实现:
小游戏---2048 大家都知道2048是一款流行的数字游戏,玩法也比较简单。我们每次可以选择上下左右其中一个方向去滑 动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相 同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。哈哈,只要掌握相应的 技巧相信大家都可以赢。 同时,这也是C语言老师留给我们的一个小项目作业,用C语
八大排序之插入排序 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们所谓的八大排序就是内部排序。首先我们学习插入排序,即直接插入排序和希尔排序。1.直接插入排序算法思想:把一个数组分为已排序和未排序部分,从未排序部分获取关键字作为待排序数,从已排序部分找到合适位置插入。要点:设置哨兵,作为临时存储
线性表之顺序表 我学习数据结构的第一天,从顺序表开始。线性表是最基本、最简单、也是最常用的一种数据结构,一个线性表是n个具有相同特性的数据元素的有限序列。主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像。并且顺序表由数组是否动态分配又分为定长顺序表和不定长顺序表。顺序表的基本操作