自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 简易阅读器

我们先了解一下这个项目最终达到的一个目标,然后以这个来进行项目分析实现基本的HTTP/1.0版本的web服务器,客户端能够使用GET,POST方法请求资源 服务器将客户端请求的资源以html/js/pdf页面呈现,并能够进行差错处理(如:客户端请求的资源不存在时,服务器能够返回一个404页面) 服务器能够运行简单的cgi,比如客户端在表单中输入数据,服务器就能够将运行结果返回给客户 能够...

2018-08-27 18:38:20 1025

原创 【哈希面试题】海量数据

哈希切割top K问题给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址? 与上题条件相同。如何知道top k的ip文件太大。100g,肯定不能一次加载到内存进行处理,这里就必须将文件进行切割了,可是依据哪种方法进行切割呢,假设只是从前到后等份切割的话,将文件切割n份(切割的份数依据数据所给的内存大小),第一份中假设IP地址为a出现的次数最多...

2018-08-22 20:37:59 390

原创 【数据结构】各种排序算法

排序算法稳定性如果在元素序列中有两个元素R[i]和R[j],它们的排序码K[i] == k[j],且 在排序之前,元素R[i]在R[j]的前面。如果在排序之后,元素R[i]仍在R[j] 之前,则称这个排序算法是稳定的,否则称这个排序算法是不稳定的。内部排序:数据元素全部放在内存中的排序。  外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能 在内外存之间移动数据的排序...

2018-08-04 22:15:58 333

原创 【Linux】简单版UDP服务器和TCP服务器

一.UDP服务器端代码如下 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h...

2018-07-23 16:58:47 2193

原创 【Linux】深入理解HTTP协议

基本概念及作用首先HTTP协议属于应用层协议,应用层协议就是我们程序员自己定协议,但如果每次都自己定麻烦并且很容易出错,所以有了一些现成的(HTTP,DNS)等,所以大多是直接拿来用就行,而应用层的作用就是双方达成某种约定,一段按照约定的协议发送数据,另一端按照约定来解析数据,保证接收数据的一段可以正确解析数据,这就是应用层的作用,也是HTTP协议的作用之一。HTTP协议的格式HTTP...

2018-07-23 16:53:40 731

原创 【c++】模板总结

模板:模板的使用是为了适应泛型编程,泛型编程就是编写与类型无关的代码,是代码复用的一种手段,模板就是实现泛型编程的基础模板函数1.概念模板函数代表了一个函数家族,该模板函数与类想无关,在使用时被参数化,根据实参产生函数的特定类型版本。2.模板函数的格式:class =typename !=struct(尽量使用typename更明显)template<typename...

2018-07-22 19:28:42 286

原创 【Linux】网络编程套接字

IP地址 1.基本概念 IP地址是在IP协议中,用来标识网络中不同主机的地址 对于IPV4来说,IP地址是一个4字节,32位的整数(能表示2^32个主机) 对于IPV6来说,地址是一个16字节,128位的整数 我们通常也使用"点分十进制"的字符串表示ip地址,例如192.168.0.1:用点分割的每一个数字表示一个字节,范围是0-255 注:IP地址可以标识网络上所有主...

2018-07-22 15:20:50 124

原创 【c++】深入解析浅拷贝与深拷贝

浅拷贝浅拷贝,也称位拷贝,编译器只是将对象中的值拷贝过来,如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进行操作时就会出现访问违规先看一段代码class String{public : String(const char *ptr="")//构造函数。默认放\0 ...

2018-07-21 22:17:39 938

原创 【Linux】POSIX信号量与读写锁

一.POSIX信号量1.基本概念POSIX信号量和SystemV信号量作用相同,都是用来实现同步或互斥机制,本质也是计数器,通常用它来保护的临界资源的资源数目,但POSIX可以用于线程间同步2.相关接口初始化信号量 #include <semaphore.h> int  sem_init(sem_t  *sem,  int  pshared,  unsigned ...

2018-07-21 18:20:50 287

原创 【Linux】线程互斥量与条件变量

一.互斥量(mutex)1.基本概念在线程之间,因为线程组内所有线程共享进程的地址空间,所以对于每个线程来说,它的绝大多数资源都是与其他线程共享的,所以在多线程程序中,极有可能因为多个线程同时访问临界资源,而造成数据的二义性问题。所以这里就引入了同步与互斥机制来保护临界资源大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归于单个线程,其他线程语法获得...

2018-07-20 15:48:30 151

原创 【Linux】线程

一.线程1.基本概念线程是比进程粒度更细的执行流,在一个程序里的一个执行路线叫做线程。一个进程至少有一个执行线程理解:每一个线程的数据代码都是目标进程的子集 线程于线程数据和代码大部分都是共享的 线程的创建和释放成本非常低 线程的调度成本很低线程是在进程内部的执行流,Linux下没有真正的线程,是进程模拟线程(操作系统没有专门为线程创建对应的结构体),Linux下的线程叫做...

2018-07-19 11:02:22 214

原创 【c++】深度解析new/delete以及new[]/delete[]

C动态内存管理方式1.堆上:C语言中使用malloc /calloc/ realloc/ free进行动态内存管理,但对上的内存需要用户自己来管理,动态malloc /calloc/ realloc的空间必须free掉,否则会造成内存泄漏2.栈上使用_alloca在栈上动态开辟内存,栈上开辟的内存由编译器自动维护,不需要用户显示释放CC++动态内存管理方式1.new操作...

2018-07-18 23:26:30 269

原创 【c++】内联函数和友元

一.内联函数1.内联函数:以inline修饰的函数叫内联函数,编译时c++编译器会会在调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率2.内联函数的效率:inline是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有递归/循环的函数不适宜使用内联 inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归...

2018-07-17 10:07:35 450

原创 【Linux】进程创建

1.进程创建分配新的内存块和内核数据结构给子进程将父进程部分的数据结构拷贝至子进程添加子进程到系统进程列表中fork返回,开始调度器调度创建子进程除了fork还有vfork:vfork 用于创建一个子进程,而子进程和父进行共享地址空间,fork的子进程有独立的地址空间vfork保证子进程先运行,在它调用exec或exit(return不行)之后父进程才可能被调度运行。vfork也有两个返回值注意:...

2018-07-16 16:56:51 677

原创 【Linux】进程

一.进程与程序的概念程序:程序就是放在硬盘中的文件。为了实现特定任务的一系列指令的有序集合进程:从用户角度:进程就是加载到内存上了,是程序的一次动态执行过程。(因为时钟中断,分时系统,时间片轮转的技术,CPU可以在没有执行完当前进程的情况下,执行其他进程)从操作系统角度看;进程是系统分配CPU,内存,时间片等系统资源的基本单位也是系统分配资源的基本单位每个进程都有自己独立的地址空间和运行状态二.P...

2018-07-16 08:49:28 238

原创 【c++】实现日期类

#include <iostream>using namespace std;class Date{public: Date(int year=1900,int month=1,int day=1) :_year(year) ,_month(month) ,_day(day) { if(!(year>=0 && month>0 ...

2018-07-15 11:27:22 190

原创 【c++】类的const成员和static成员

1.基本概念const 成员函数:在成员函数后面加const,const修饰this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会被改变

2018-07-15 09:35:15 530

原创 【c++】this 指针及类的六个默认函数

this指针一.this指针特性this指针的类型:类类型 * constthis指针并不是对象的一部分,不影响sizeof的结果this的作用域在类的“成员函数”的内部this指针是“非静态类成员函数”的第一个默认隐含参数,编译器自动维护传递,类编写者不能显示传递只有在类的非静态成员函数中才可以使用this指针。其他函数都不可以二._thiscall调用约定特点_thiscall只能够用在类的成...

2018-07-13 15:36:56 701

原创 【Linux】软硬链接和动静态库

软硬链接1.硬链接:让多个文件名对应同一个inode创建file的硬链接文件:ln   file  abc删除硬链接在目录中将对应的记录删除在硬链接中删除源文件,文件不会被真正删除,只是将硬链接数-1,如果为0,则将对应的磁盘释放2.软链接:有自己的inode,软链接创建的abc文件是如何找到file(即放的是file的路径,相当于windows下的快捷方式)是通过名字引用另外一个文件创建file...

2018-07-11 16:58:54 333

原创 【Linux】进程通信---信号量

基本概念为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任意时刻只能有一个进程访问代码的临界区域。而信号量就可以提供这样的一种访问机制,让一个临界区同时只有一个进程在访问它,也就是说信号量是用来协调进程对共享资源的访问的。信号量的本质是计数器,信号量里面记录了临界资源的数目,有多少数目,信号量的值就为多少。信号量是一个特殊的变量,进...

2018-07-11 11:31:40 304

原创 【Linux】进程间通信--共享内存

基本概念共享内存区域是被多个进程共享的一部分物理内存,如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种更快的方法,一旦这样的内存映射到共享它的进程地址空间,这些进程间数据传递不在涉及到内核,换句话说是进程不在通过执行进入到内核的系统调用来传递彼此的数据。一个进程向共享内存区域写入了数据,共享这个内存...

2018-07-10 21:15:20 304

原创 【Linux】进程间通信--消息队列

基本概念消息队列就是由操作系统维护的消息链表,存放于内核中并由消息队列标识符标识,有够权限的进程可以向队列中添加消息,消息队列的生命周期不随进程随内核消息队列提供了一个从一个进程向另一个进程发送一块数据的方法每个数据块都被认为是一个类型,接收者进程的数据快可以有不同的类型值消息队列也有管道一样的不足,也就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMN...

2018-07-10 17:16:42 226

原创 【Linux】进程间通信--管道

一.进程产生1.通信的目的让两个或多个进程实现实现数据传输,资通源共享,通知事件,进程控制2.进程间为什么不能进行直接通信在我们学完进程后,都知道每个进程是独立的都有自己的PCB,有自己独立的地址空间,就连父子进程也是数据写实拷贝,更别说其他进程了,因为在每个进程看来,自己享有所有的内存资源,所以两个资源是不可能直接通信的,所以我们就必须让两个或多个进程看到一份共同的资源,这样才能实现进程通信二....

2018-07-10 11:10:16 162

原创 【c++】多态

1.多态概念意思是同一事物具有多种形态静态多态(静态)静态多态是在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换)。可推断要调用哪个函数,如果有对应的函数就调用该函数,否则编译出现错误...

2018-07-09 15:49:59 168

原创 【c++】继承体系下派生类的对象模型

1.单继承class Base{public: int _b;};class Derived:public Base{public: int _d;};int main(){ Derived d; d._b=10; d._d =20;}单继承对象模型如下:2.多继承class B1{public: int _b1;};class B2{publi...

2018-07-08 22:38:07 179

原创 【c++】继承

1.继承概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类,继承体现了面向对象程序设计的层次结构,体现了有简单到复杂的认知过程2.继承格式#include <iostream>using namespace std;class Base{public: void TestFunc1(...

2018-07-08 10:30:19 121

原创 【Linux】进程信号

一.信号1.基本概念信号是操作系统通知某个进程有异常或有某种事件发生的通知机制注意:ctrc+c产生的信号只能发送给前台进程,一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束,就可以接受新的命令,启动新的进程Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像ctrl+c这种控制键产生的信号前台进程可以在运行过程中用户随时可能按下ctrl+c而产生...

2018-06-28 10:24:56 392

原创 【Linux】进程间关系与守护进程

一.进程间关系1.进程组进程组就是一个或多个进程的集合,它们与同一作业相关联,可以接收来自同一终端的各种信号,每个进程组有一个唯一的组id,每个进程组都可以有一个组长id,组长进程的标识是:其进程组id等于其进程id,组。组长进程可以创建一个进程组,创建该组中的进程,然后终止,注:只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关...

2018-06-26 22:05:18 173

原创 【c++】类

类1.类的定义在c语言中,结构体就是将相同或不同属性的类型数据放在一起,而里面并不能定义函数,但是c++中,结构体里不仅可以定义变量,也可以定义函数,在c+中更喜欢用class代替struct.注意:class定义的结构体,成员默认是private,struct定义的结构体,成员默认是publicstruct student{ char name[20]; char gender[3]; ...

2018-06-25 16:03:19 97

原创 【Linux】基础I/O--文件系统

文件系统每行包含7列模式硬链接数文件所有者组大小最后修改时间文件名ll  -i 查看文件inodestat可以看到更详细的信息iode超级块:存放文件系统本身的结构信息i节点表:存放文件属性,如:文件大小,所有者,...

2018-06-17 23:05:28 189

原创 【Linux】基础I/O 文件描述符

文件描述符1.文件I/O操作函数

2018-06-17 22:34:10 839

原创 【c++】获取函数运行时间的两种方法

1.GetTickCount()GetTickCount是windows下的API 函数,检索自系统启动以来经过的毫秒数,最多为49.7天//头文件#include <windows.h>//函数原型DWORD WINAPI GetTickCount(void);//返回值 系统启动后经过的毫秒数测试代码:#include <iostream>#include ...

2018-06-17 16:02:33 5540 1

原创 【c++】命名空间

命名空间1.命名空间概念在c++中,变量,函数和类都是大量存在的,这些变量,函数和类的名称将都存在于全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的...

2018-06-17 15:25:24 141

原创 【c++】引用

引用c语言中,函数传参有两种方式1.传值void swap(int left,int right){ int tmp=left; left=right; right=tmp;}传值:在函数调用过程中会生成一份临时变量,最终把实参的值传递给新分配的临时变量的值优点:避免了函数调用的...

2018-06-15 23:19:26 103

原创 【C++】缺省参数与函数重载

1.缺省参数    在c语言中,函数没有指定参数列表时,默认可以接受任意多个参数    但在c++中,因为严格的参数类型检测,没有参数列表的函数,默认为void,不接受任何参数void test(){}int main(){ test(10); test(10,"hello world"); return 0;} 在c语言中可以通过编译c++对于函数参数检测更加严格,如果函数没有参...

2018-06-15 16:53:24 551

原创 堆的基本操作及应用--优先级队列和堆排

Heap.htypedef int DataType;typedef int (*Compare)(DataType, DataType);typedef struct Heap { DataType* _array; int _capacity; int _size; Compare _com;}Heap; #define MAX_SIZE 10void Ini...

2018-05-22 16:37:04 122

原创 二叉搜索树的基本操作

BinSearchTree.htypedef int DataType; typedef struct BSTreeNode { struct BSTreeNode* _pLeft; struct BSTreeNode* _pRight; DataType _data; }BSTNode,*PBSTNode; // 初始化二叉搜索树 void InitBSTree(BSTN...

2018-05-22 16:21:04 101

原创 队列的基本操作

Queue.htypedef int DataType;typedef struct Node{ struct Node *_PNext; DataType _data;}Node,*PNode;typedef struct Queue{ PNode front; PNode rear;}Queue,*PQueue;//初始化队列void QueueInit(PQue...

2018-05-10 09:16:26 87

原创 链表的面试题

SList.h#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef int DataType;typedef struct ListNode{ struct ListNode* pNext;//指向链表中下一个结点 DataType data;//当前结点所保存的元素}...

2018-05-10 09:09:48 80

原创 单链表的基本操作

SList.h#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef int DataType;typedef struct ListNode{ struct ListNode* pNext;//指向链表中下一个结点 DataType data;//当前结点所保存的元素}...

2018-04-16 20:24:00 162

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除