- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 TCP的拥塞控制和流量控制
拥塞控制流量控制拥塞控制a)拥塞 计算机网络中的带宽,交换节点中的缓存以及处理机制,称这为网络资源,当某一时间段,网络资源的需求量超过其提供量,网络的性能就会变坏,称这样的状况为拥塞。其实可以对比生活中的公路行车,不管车道再多,再高峰期或者由于车祸总会导致堵车的现象。国家可以通过单双号去限制出行量,但网路用户显然是无法被限制的,因此在用户数量无法限制,资源又有限的情况下只能通过降低...
2018-05-07 08:59:36 615
原创 深入理解计算机系统-第八章(上)
异常->进程这部分异常简单认识 异常就是控制流中的突变,用来响应处理器状态的变化。 当处理器检测到事件发生时就会通过一张异常表进行跳转到相应的处理函数。 异常分为四类:中断(异步),陷阱,故障,终止 陷阱的最重要u哦那个都是在用户程序和内核之间提供一个像过程一样的接口,叫系统调用。 处理器提供了一条syscall n这样的指令,这条指令执行时会导致一个异常处理的陷阱,这...
2018-05-02 09:13:00 846
原创 HTTP协议
基本概念GET和POSTcookie和sessionHTTP长连接和短连接四次挥手断开连接一次url请求的完整过程基本概念HTTP协议是应用层协议,中文名称为超文本传输协议,用于WWW服务器传输超文本到本地浏览器的协议,由请求和相应构成。 请求响应模型: HTTP协议永远是有客户端发生请求,由服务端进行响应。 基本的工作流程 a)首先客户端和服务端需要建立连接 ...
2018-05-01 18:03:03 282
原创 多态
静态多态动态多态模板C++四种类型转换多态面向对象语言的三大特征之一,从C++的语言去认识多态。多态简单来说就是相同的函数实现出了不同的效果。静态多态静态多态的实现其实就是重载,就是允许函数名称相同但是参数不同的函数存在,这在C语言中是不允许存在的,究其原以是因为C++和C语言的编译规则是不相同的,这也是“extern C”存在的原因。 C++对函数编译的重命名生成符号表时...
2018-05-01 12:13:34 155
原创 socket网络通信的建立
socket文件描述符socket文件描述符在网络编程中socket通常被翻译为”套接字”,在Linux操作系统下,一切皆文件,所以套接字也称为一种文件描述符。 a)创建socket文件描述符 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int sock...
2018-05-01 10:53:41 226
原创 I/O多路复用
I/O多路复用的基本概念select,poll,epoll的认识前言 网络I/O的本质是对socket的读写(文件描述符),一般需要两个阶段 (1)等待数据 (2)数据从内核拷贝到用户空间 网络I/O可分为5种模型 (1)阻塞I/O (2)非阻塞I/O (3)I/O多路复用 (4)信号I/O (5)异步I/O 在多进程或者多线程的情况下,(1)(2)...
2018-04-27 19:02:11 151
原创 KMP算法
基本场景 核心思想扩展加深基本概念KMP算法用于字符串的匹配,假定现在需要在s1中查找s2,暴力解就是直接去遍历查看是否匹配,显然这样的时间复杂度显然是O(MN)的,而字符串通过引入前缀串和后缀串的信息,来进行一个匹配上的加速。个人觉得优秀的算法就是对已经获取的信息减少后续的重复获取,下面就让我们进入KMP算法的核心思想去体会如何有效利用已经获取的信息。核心思想前缀串...
2018-04-20 22:14:13 134
原创 生产者消费者模型
生产者消费者模型是一个多线程同步问题的经典案例。 从上图简单来看A,B,C为生产者D,E为消费者,生产者呢把数据放入缓冲区,而消费者呢从缓冲区拿走数据。生产者与生产者,消费者与消费者之间呢是互斥的,生产者与消费者呢又是同步的。 简单分析下生产者消费者模型的好处: 生产者与消费者两个‘’种族‘’间的耦合度降低,也就是说生产者是否生产取决于缓存是否满,消费者消费取决于缓存是否空。大家呢是独立...
2018-03-14 15:11:22 463
原创 僵尸进程和孤儿进程
首先简单认识下僵尸进程和孤儿进程: 僵尸进程 一个进程使用fork()创建子进程,在子进程死亡时,其父进程没有调用wait函数或者waitpid()函数获取子进程的状态信息,那么子进程的描述符会仍然保存在系统中,这种进程被称为僵尸进程。 孤儿进程 如果父进程退出,而它的一个或多个子进程仍然在运行,那么这些进程则会被称为孤儿进程,会被init(1号)进程所领养,并负责回收它们的状态信息。...
2018-03-12 16:04:07 192
原创 进程的退出方式
进程退出有8种方式: 三种正常的退出方式 1.从main函数退出 2.调用exit 3.调用_exit_EXIT 后五种为异常退出方式 4.最后一个线程从启动历程返回 5.最后一个线程调用pthread_exit 6.调用abort 7.接到一个信号并终止 8.最后一个线程对取消请求做出响应先来认识下exit()与_exit()的区别 区别1:清空缓冲区的设置...
2018-03-12 15:34:32 2597
原创 task_struct的简单认识
进程是一个正在执行的程序,在linux中每一个进程都有由一个task_struct结构体来定义,也就是我们平时所说的PCB,这个结构体包含了一个进程所需要的所有信息。它包含了关于进程的以下信息: 进程状态:volatile long state;#define TASK_RUNNING 0 //进程正在执行或准备执行#define TASK_INTERRU...
2018-03-11 21:26:01 223
原创 静态库与动态库
什么是库? 库从本质上来讲是一种可执行代码的二进制格式,可以被载入到内存中去执行。库可分为静态库和动态库两种,二者之间的区别在于代码被在不的时刻不同。静态库:这类库的名字一般是libxxx.a,xxx为库的名字,静态库在程序编译时会被链接到目标代码中,由于整个函数库的所有数据都会被整合到目标代码中,故此静态函数库编译成的文件会比较大。显然它的优点在于编译执行后不需要函数库的支持,整个函数库在...
2018-03-09 17:38:47 161
原创 再识Linux下的常见命令
1.文档查看:cat,tac,more,less,head,tail,cut,od,nl 2.文件权限:ls -l,chmod,umask 3.文件查找:find,whereis,locate,which 4.程序管理:jobs,bg,fg,kill,killall,ps,pstree,top,free,nice,renice 5.开关机:sync,shutdown,halef,power...
2018-03-08 10:56:59 160
原创 海量数据处理
1.给一个超过100G大小的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址。 显然可以明显看出这100G的日志文件是不能直接加载到内存中去处理的,所以首先可以想到的是对大文件需要进行划分,前提时需要保证同一个反复出现的ip会出现在同一文件当中。 假定我们将这个大文件分成1024,这样每个文件的平均大小在100M左右,利用hash算法对ip地址进行映射,得到的值模一个1
2017-12-07 10:32:18 269
翻译 centos 下安装gcc vim gdb
以下安装方式均为在虚拟机确认联网的情况下安装。首先让我们先简单了解一下什么事yum yum:便捷的添加,删除,更新RPM packages。yum能在线下载并安装rpm包,能更新系统,且还能自动处理包与包之间的依赖问题。在确认联网的情况下安装gcc,vim,gdb是很简单的 使用 yum -y install gcc 即可 which gcc 查看是否安装成功 其他原理相同。这里主要讲解v
2017-11-14 09:37:07 341
原创 map&set
STL中的map和set底层都是用红黑树实现的关联式容器。两者都是对红黑树做的封装去实现的。set(集合) set是一种key结构,key就是value,二者等价,进入set的数据会自动排序。不允许键值重复,无法通过迭代器去改变set的值。template <class Key, class Compare = less<Key>, class Alloc = alloc>class set {
2017-11-11 11:34:24 221
原创 Linux下的重要目录
/proc Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部的数据结构,改变内核设置的机制。 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。 它以文件系统的方式为访问系统内核数据的操作提供接口。/sys sysfs是一种基于ram文件系统,和proc一样 Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结
2017-11-08 10:26:10 202
原创 Linux命令
查看使用空间: du:对文件和目录磁盘的使用空间进行查看 du -a : 查看全部目录和其次目录下的每个档案所占的磁盘空间 du -h 指定目录: 查看指定目录没所有档案所占的磁盘空间 df:检查文件系统的磁盘空间占用情况(默认不显示0块) df -a:显示所有文件的系统的磁盘使用情况 df -T:列出文件系统的类型 df -h : 以易读的方式展开监控Linux的系统状况,比如cpu
2017-11-08 09:40:02 212
原创 从1到n中整数1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解题思路: 求出每位可以出现1的次数,然后把每位可以为1的次数加起来 这里取1个5位数为例:
2017-10-23 20:27:52 277
原创 定制删除器
定制删除器的产生:在实现智能指针的过程中,我们需要管理数据的构造以及析构,但不同的数据拥有不同的析构方式,例如文件,new出来的空间等等,在利用模板编程中,我们需要识别不同的数据类型,然后选择合适的删除机制,做到一一对应。定制删除器的实现利用了仿函数,如果你不知道仿函数的话,可以阅读下面的一小部分。仿函数:其原理是重载了(),让它可以像函数一样使用。 看一段简单的代码:#include <iost
2017-10-16 19:31:07 589
原创 类型萃取
初次接触类型萃取是在运用模板实现seqlist的时候,拷贝构造和赋值运算符重载时,单纯的使用memcopy(),函数进行拷贝,只是单纯的进行了浅拷贝,对于基本的数据类型是不会有任何错误的,但是如果是string类型时,单纯的值拷贝显然是不行的(超过了给定的buffer空间时),指向了同一块开辟的空间,然后析构时会出现问题。所以一开始直接调用赋值运算符的重载,这样显然不会出现问题,但是对基本的数据类型
2017-10-15 12:27:26 335
原创 模板为什么不能分离编译
为了实现泛型编程(即与类型无关的代码)在c++中引入了模板这一概念,在写一个项目的时侯我们通常将一个项目分为.h文件(写函数的声明),.cpp文件(函数的定义实现),.cpp(测试文件)。通常情况下普通函数这样是没问题的,但是模板这样写是不行的。 让我们看下会发生什么样的情况:#ifndef __TEMPLATE_H__#define __TEMPLATE_H__#include <iostr
2017-09-27 20:54:37 324 1
原创 list的简单剖析
前面介绍了库中的vector,下面来认识下list。主要与vector作比较。list:带头的双向循环链表。 相较于vector的连续线性空间,list的优势在于每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费,当然实现起来也更复杂,而且,对于任何位置的元素插入或元素移除,list永远是常数时间。list支持头插,头删,这就是结构带来的优势。
2017-09-20 17:32:42 194
原创 vector的简单剖析
vector(向量):顺序表,c++的一种线性数据结构,是一个类,包含于头文件vector.h中,更加简单的说,它就是一个动态的数组。下面简单认识下stl中所提供的关于vector的常用接口: 修改类: push_back: void push_back (const value_type& val); 尾部插入 pop_back:void pop_back(); 尾部删除 vactor
2017-09-20 16:48:15 249
原创 智能指针
在c++中,动态内存的的开辟与释放有人为的去管理的话,有时会出现问题(忘记释放,执行流的跳转…)从而导致内存的泄漏问题。为了解决这一问题引入了智能指针,即开辟与释放是自动完成的。 RAII 智能指针实现的基础,即通过一个类来管理,由对象的构造函数来获取资源(构造即初始化),析构函数去释放资源。 智能指针就是基于这样的机制,当然指针的基本功能智能指针也会拥有。 auto_ptr,带有严重缺陷
2017-08-13 18:28:32 191
原创 多态&多态对象模型
(动态)多态:当使用基类的指针或引用调用重写的虚函数,当指向父类调用的就是父类的虚函数,指向子类调用的就是子类的虚函数。 不难剖析出要实现多态: 首先要有虚函数的重写,其次要用基类的指针去调用。那么先简单认识下虚函数&虚函数的重写: 虚函数:类的成员函数加了 virtual 关键字。 虚函数的重写:当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的虚函数
2017-08-01 22:16:28 286
原创 继承
继承作为面向对象的三大特性之一,是面向对象复用的重要手段,通过继承定义一个类,继承是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。继承是一种复用手段,在继承关系里,基类继承派生类的成员,以此来达到复用的效果。先看一段简单的继承: 简单认识下继承实现复用, 成员访问限定符&继承关系 三种继承关系下基类成员的在派⽣类的访问关系变化 简单的总结下: 三种继承关系:public,
2017-07-28 22:26:38 309
原创 string类深拷贝,写时拷贝
在实现string类时不能用简单的浅拷贝去实现,因为浅拷贝会简单让两个对象指向同一块空间,这样的缺陷是两者指向同一块空间,析构时会出现程序崩溃的问题,两个对象管理同一块空间,一改都改,这显然是你所不期待的。 所以深拷贝就应运而生,所谓的深拷贝就是在用A对象拷贝B对象时,为B对象开辟与A对象一样大的空间,大家各自管理自己的空间。 下面简单的去实现一下深拷贝。#include<iostream>#
2017-07-25 20:56:25 361
原创 c++动态内存管理
在介绍c++的动态内存管理之前先简单的了解一下C语言是如何进行动态内存管理的。在C语言中动态内存的开辟依赖于malloc/realloc/calloc/free这几个函数对动态内存进行管理。malloc&calloc malloc的函数原型: void* malloc(unsigned int size) 从函数原型中可以看出,malloc函数的会在堆空间中开辟 size 字节的空间,并返回 vo
2017-07-21 11:24:49 244
原创 c++类的默认构造函数(前三个:构造,拷贝构造,析构)
在介绍c++的默认构造函数之前呢,先简单的说下this指针。 · this指针 1.每个成员函数都有一个指针形参,它的名字是固定的成为this指针,this指针是隐式的(构造函数比较特殊,它不含this指针)。 2.编译器会对成员函数进行处理,在对象调用成员函数时,它会将对象的地址作为实参传递给成员函数的第一个形参this指针。 3. this指针是成员函数隐含指针形参,是编译器⾃
2017-07-17 11:35:20 2018
原创 指针与引用
指针有能力指向一块内存,它有能力指向一个地址。 引用是一个对象的别名,本身并没有开辟一块新的空间,其实质上也是一个地址。下面介绍指针和引用的区别(1)指针可以为空,但引用是不可以的,因此在定义一个引用时必须为其初始化,否则连编译都无法通过。#include<iostream>using namespace std;int main(){ int a = 10; int& b;
2017-07-05 11:17:39 302
原创 c++函数重载的实现原理
函数重载作为c++的主要特性之一,有着广泛的用途。在此便简单剖析一下函数重载的实现原理。 要考虑这个问题,应从底层去探索。生成一个可执行的程序,主要经过编译和链接的过程,在C语言中是不支持函数重载的实现的,可以通过比较两者具体的编译过程中重命名来探讨这一问题。首先看一段简单的C代码#include<stdio.h>int Add(int a, int b){ return a + b;
2017-07-04 18:28:12 548
原创 数组指针,指针数组和函数指针
数组指针:首先呢他是一个指针,他有能力指向一个数组。 指针:其数值为地址的变量。int (*p)[3]; // p首先与*结合,所以他呢是一个指针,他可以指向一个数组,这个数组有三个元素,每个元素为整形。指针数组:首先呢他是一个数组,他的每一个元素为一个指针。 数组:由一系列类型相同的元素构成。int *p[3]; // []的优先级高于 *,所以p首先是一个数组,这个数组有三个元素,每个元素为
2017-06-08 22:51:07 446
原创 可变参数列表
可变参数列表的使用是很有必要的一件事情,在实现某个功能时,你可能不知道传几个参数。下面简单介绍一下可变参数列表的使用。可变参数列表是通过宏来实现的,定义与stdarg.h头文件中。void va_start(va_list ap, last); //va_start用来初始化参数列表t ype va_arg(va_list ap, type); //va_arg用来获取参数
2017-05-15 11:00:49 345
原创 strlen的使用
sterlen: 作用求取字符串长度,从内存某个位置开始扫描,直到‘\0’停止,不包含‘\0’.char arr[] = “abcdef”; printf("%d\n", strlen(arr));// 6 arr代表首元素地址,从'a'开始到'\0' printf("%d\n", strlen(arr+0));// 6 arr+0代表首元素地址 printf("%d\n",
2017-04-24 09:20:55 1016
原创 sizeof 的使用
sizeof() :关键字,并非函数,其作用为返回一个对象或者类型所占的内存字节数。 下面内容主要介绍sizeof()在一纬数组中的用法。 备注:*除sizeof(单个数组名)以及“”&数组名“”中数组名表示整个数组,其余所有数组名均表示该数组的首元素地址;在32位系统下。#include <stdio.h> int main(){ int a[] = { 1, 2, 3, 4 }
2017-04-15 17:34:32 243
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人