自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 memcache和Redis

Redis是一款内存高速缓存数据库。MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页

2020-06-13 12:29:31 179

原创 常见数据结构应用场景

数组使用场景数组在以下三个情形下很有用:1)数据量较小。2)数据规模已知。3)随机访问,修改元素值。如果插入速度很重要,选择无序数组。如果查找速度很重要,选择有序数组,并使用二分查找。缺点1)需要预先知道数据规模2)插入效率低,因为需要移动大量元素。链表解决的问题链表的出现解决了数组的两个问题:1)需要预先知道数据规模2)插入效率低使用场景1)数据量较小2)不需要预先知道数据规模3)适应于频繁的插...

2020-06-13 12:29:14 385

原创 OSI七层模型和TCP/IP四层模型

OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。完成中继功能的节点通常称为中继系统。在OSI七层模型中,处于不同层的中继系统具有不同的名称。一个设备工作在哪一层,关键看它工作时利用哪一层的数据头部信息。网桥工作时,是以MAC头部来决定转发端口的,因此显然它是数据链路层的设备。

2020-06-12 22:01:12 196

原创 CPU密集型 vs IO密集型

任务分为CPU密集型和I/O密集型,CPU密集型任务需要进行大量的计算,消耗CPU资源,比如圆周率计算,对视频高清解码这些,所以使用的线程不能过多,因为一个进程获取CPU时间有限,如果该进程线程过多,导致每个线程执行时间过短,线程之间的切换次数就更多,最高效的利用CPU的话,线程数应该和CPU核数相等。I/O密集型任务大多数时间都花在等待I/O操作完成上,花在CPU上的时间很少,比如涉及...

2020-06-12 22:00:14 207

原创 互斥锁 读写锁 自旋锁 RCU锁

互斥锁 mutex:在访问共享资源之前对进行加锁操作,在访问完成之后进行解锁操作。加锁后,任何其他试图再次加锁的线程会被阻塞,直到当前进程解锁。如果解锁时有一个以上的线程阻塞,那么所有该锁上的线程都被编程就绪状态,第一个变为就绪状态的线程又执行加锁操作,那么其他的线程又会进入等待。在这种方式下,只有一个线程能够访问被互斥锁保护的资源。读写锁 rwlock(也叫作共享互斥锁:读模式共享,写模...

2020-06-12 21:58:04 261

原创 静态库 动态库 静态链接 动态连接

什么是库:预先编译好的二进制可执行文件静态库(static library)就是将相关的目标模块打包形成的单独的文件。使用ar命令。静态库的优点在于:程序员不需要显式的指定所有需要链接的目标模块,因为指定是一个耗时且容易出错的过程;链接时,连接程序只从静态库中拷贝被程序引用的目标模块,这样就减小了可执行文件在磁盘和内存中的大小。动态库(dynam

2020-06-12 21:56:49 212

原创 半同步半异步:高效的并发模式

结合考虑两种事件处理模式和几种I/O模型,半同步半异步存在多种变体,其中有一种变体是半同步半反应堆模式。 异步线程只有一个,由主线程来充当,它将监听套接字注册到epoll内核事件表中,如果监听套接字上有事件,主线程就接受它得到连接套接字,然后将连接套接字的事件也注册到epoll内核事件表中,如果连接套接字上有事件发生,就将该连接套接字插入到请求队列中,所有睡眠的工作线程通过竞争来获得任务的...

2020-06-12 21:56:18 115

原创 Libevent

Libevent是用c语言编写的一个轻量级的开源高性能I/O框架库。使用它的案例有:高性能的分布式内存对象缓存软件memcached,Netchat,VomitLibevent是一个典型的Reactor(反应器)模型。Reactor,是一种高效的事件处理模式。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序...

2020-06-12 21:56:01 322

原创 多线程 线程池优缺点

● 多线程多线程的概念很好理解就是多条线程同时存在,但要用好多线程确不容易,涉及到多线程间通信,多线程共用一个资源等诸多问题。使用多线程的优缺点: 优点: 1)适当的提高程序的执行效率(多个线程同时执行)。 2)适当的提高了资源利用率(CPU、内存等)。 缺点: 1)占用一定的内存空间。 2)线程越多CPU的调度开销越大。 3)程序的复杂度会上升。线程池的优点1)降...

2020-06-12 21:53:57 4651

原创 虚拟内存

虚拟内存是将系统硬盘空间和系统实际内存联合在一起供进程使用,给进程提供了一个比内存大得多的虚拟空间。在程序运行时,只要把虚拟地址空间的一小部分映射到内存,其余都存储在硬盘上(也就是说程序虚拟空间就等于实际物理内存加部分硬盘空间)。当被访问的虚拟地址不在内存时,则说明该地址未被映射到内存,而是被存贮在硬盘中,因此需要的虚拟存储地址随即被调入到内存;同时当系统内存紧张时,也可以把当前不用的虚拟存储空间...

2020-06-12 21:52:21 154

原创 socket网络编程流程

服务器端编程的步骤:1:创建套接字 int socket(int domain,int type,int protocol); domain告诉系统使用哪个底层协议组,PF_INET或者PF_INET6,对于本地域协议设置为PF_UNIX; type指定服务类型,流式SOCK_STREAM,数据报SOCK_DGRAM;protocol一般设置为0成功返回一个文件描述符,...

2020-06-12 21:51:53 1845

原创 内存泄漏

glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数 分配内存(如malloc, alloc...):1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息. 在需要内存泄漏检查的代码的结束调用void muntrace(void).注意:...

2020-06-12 21:49:55 137

原创 C++多态

多态可以使我们以相同的方式处理不同类型的对象,我们可以使用一段代码处理不同类型的对象,只要他们继承/实现了相同的类型。这样我们没有必要为每一种类型的对象编写相同的逻辑,极大的提高了代码的重用。其实,用简单的一句话来形容就是:多态性,允许将子类类型的指针赋值给父类类型的指针,多态性在C++中是通过虚函数实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”,或...

2018-10-08 13:57:49 129

原创 C++ static关键字作用

1.static修饰全局变量当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。未加static的全局变量,在符号表中是global符号,其他目标文件可见,这样的符号是要参与符号解析的。加了static之后,是local符号,其他目标文件不可见,只在当前文件中可见,不参与符号解析过程。所以多个源文件可以定义同名的static全局变量,不会产...

2018-10-08 13:56:44 168

原创 tcp和udp区别

tcp是面向连接的,可靠的,流式数据。面向连接是tcp在传输数据之前要通过三次握手建立连接,结束后要四次挥手断开连接,可靠体现在数据传输时,1:确认机制,每个tcp报文段发送之后都必须得到接收方的应答,才能认为这个报文段传输成功。2.超时重传机制:发出一个tcp报文段后启动定时器,如果在定时时间内未收到应答,则重发。3.校验和:TCP将始终保持首部和数据的校验和,如果收到的报文段的检验...

2018-10-08 13:56:14 127

原创 5种I/O模型

 一、关于I/O模型的引出  我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。如下图所示:     整个请求过程为: 用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数据后再...

2018-10-08 13:55:53 541

原创 sementation fault

段错误主要指访问的内存地址超出了系统给这个进程的内存空间。通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度...

2018-10-08 13:55:19 1434

原创 STL容器

容器有顺序容器和关联容器。前者包括vector,list,deque等;后者包括set,map,multiset,multimap等。1.vector用数组实现,在内存中是一块连续的内存空间,所以支持随机访问。    支持尾端高效插入/删除操作,但其他位置的插入/删除操作效率低下,因为需要移动大量元素。    当添加的数据超过vector默认分配的大小时要扩容,分配一块更大的内存,...

2018-10-08 13:54:25 438

原创 buffer和cache

Buffer和cache都是用在解决2种设备读写相差大的问题上。Buffer是缓冲区,主要用来缓冲数据,比如你每秒向磁盘写100次,这样很多时间都浪费在等待上,用Buffer可以先缓存一些要写入的数据,然后再一次写入磁盘,比如变成10秒写一次磁盘,这样写入效率就高了。cache作为CPU和内存之间的一块存储区域,根据程序局部性原理,程序短时间运行所需数据通常在用到的数据周边,这样把一些下次可...

2018-10-08 13:53:32 130

原创 STL空间配置器

为什么要有空间配置器呢?这主要是从两个方面来考虑的。1、小块内存带来的内存碎片问题  单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。 2、小块内存频繁申请释放带来的性能问题。  关于性能这个问题要是再深究起来还是比较复杂的,下面我来简单的...

2018-10-08 13:52:47 104

原创 Json和XML、protobuf

Json:是一种数据交换格式,他源于JavaScript。它的格式很简单,对象是一个无序的'键/值'对集合,一个对象由{开始,}结束,每个键后面跟一个冒号;‘键/值'对之间用逗号分隔,并列数据的集合用中括号[]表示。交换原理:1.客户端将数据打包成Json对象2.转成Json字符串之后发送给服务器端3.服务器端收到Json字符串后需转化成Json对象4.读取Json对象中数据内容优点...

2018-10-08 13:52:28 447

原创 进程和线程的区别

进程和线程的区别? (1)调度:        在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位(2)拥有资源:      不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,他可以拥有自己的资源。一般地说,线程自己不能拥有资源(也有一点必不可少的资源...

2018-07-24 13:19:50 126

原创 设计模式六大原则

    设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。设计原则则是设计模式所遵循的规则,设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。单一职责原则:一个类应该只负责一个功能领域中的相应职责。即一个类只能有一个引起他变化的原因。开放-封闭原则:一个软件应该对扩展开...

2018-07-13 11:51:38 116

原创 C++四种强制类型转换

 C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是s...

2018-07-13 11:49:09 122

原创 c++11新特性

1.nullptr主要是为了代替NULL,传统C++会把NULL,0视为同一种东西 这会产生问题,将导致了 C++ 中重载特性会发生混乱,考虑:void foo(char *);void foo(int);1 2对于这两个函数来说,如果 NULL 又被定义为了 0 那么 foo(NULL); 这个语句将会去调用 foo(int),从而导致代码违反直观。 2.类型...

2018-07-13 11:48:41 103

原创 C和C++区别

1.C是面向过程语言,C++是面向对象语言,面向对象思想,包括类和对象,对象是类的实例化,在我们身边,每一样事物都是一种对象,对象包括静态属性和动态行为。类是封装对象属性和行为的载体,反过来说就是具有相同属性和行为的对象被视为一类,是对象的抽象化。面向对象有三大特性:封装,继承,多态。C++中有很多设计模式可以使用。因此设计大型软件的时候,通常采用面向对象的语言,而不采用面向过程,可以更好的进行模...

2018-07-13 11:48:19 127

原创 指针和引用区别

1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

2018-07-13 11:47:59 152

原创 C++容器迭代器失效

迭代器失效,指迭代器指向错误的元素或无效的内存地址。要理解迭代器失效,首先要知道为什么会造成迭代器失效。不同容器内部数据结构不一样,插入、删除容器中元素的操作会导致内部数据结构内存布局的改变,那么就可能引起迭代器失效。vector内部数据结构:数组(一段连续内存空间) 插入操作: 1. 插入(push_back/insert)操作在vector中加入新的元素,但vector中元素总数仍不大于cap...

2018-06-06 11:24:49 282

原创 函数调用约定

在参数传递中,有两个很重要的问题必须得到明确说明:当参数个数多于一个时,按照什么顺序把参数压入堆栈函数调用后,由谁来把堆栈恢复原装。在高级语言中,通过函数调用约定来解决这两个问题。常见的调用约定有:stdcall,cdecl,fastcall,thiscall,naked call1, __cdecl(C调用约定.The C default calling convention)C/C++ 缺省调...

2018-05-25 12:22:02 128

原创 五种进程调度算法

1、时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。2、先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调...

2018-05-15 21:03:26 5070 1

原创 malloc和new区别

1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存

2018-05-05 15:06:25 121

原创 进程虚拟地址空间分布

  进程地址空间中分为各个不同的部分: (1)由于系统内核中有些代码、数据是所有进程所公用的,所以所有进程的进程地址空间中有一个专门的区域存放公共的内核代码和数据,该区域内的内容相同,且该虚拟内存映射到同一个物理内存区域。 (2)进程在执行的时候,需要维护进程相关的数据结构,比如页表、task和mm结构、内核栈等,这些数据结构是进程独立的,各个进程之间可能不同。这些数据结构在进程虚...

2018-05-02 21:26:54 3007

原创 fork创建进程过程(底层实现) 和 写实拷贝

linux系统中提供了三个系统调用可以创建新进程:clone()、fork()、vfork()。实际上,不管是我们比较熟悉的fork()还是剩下的两个在linux中都是通过clone()实现的。clone()是在c语言库中定义的一个封装函数,它负责建立进程堆栈并且调用对程序员隐藏的clone()系统调用。       进一步观察发现,linux内核中又是用do_fork()来处理这三个系统

2018-04-29 09:54:32 846

原创 send 和 recv底层原理

send函数工作原理:  send函数只负责将数据提交给协议层。 当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR; 如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据; 如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的

2018-04-28 23:11:48 1067 1

原创 线程间同步三种方法

一、互斥锁(mutex)通过锁机制实现线程间的同步。初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, c

2018-04-24 15:41:48 1614

原创 Linux系统最大进程数和单进程最大线程数

一、linux系统支持的最大进程数       限制1:既然系统使用pid_t表示进程号,那么最大进程数不能超过pid_t类型的最大值吧       限制2:使用命令ulimit -u查看系统中限制的最大进程数,我的机器上是65535。/etc/security/limits.conf里面是硬限制,ulimit -u是软限制,内核参数kernel.pid_max也做了限制。

2018-04-18 20:42:39 1858

原创 TCP长连接和短连接

长连接:       所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。            连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信);       这就要求长连接在没有数据通信

2018-04-17 14:10:37 175

原创 在浏览器输入网址到显示页面发生了什么

1. 在浏览器中输入域名网址2.应用层DNS解析域名   客户端先检查本地是否有对应的IP地址,若找到则返回响应的IP地址。若没找到则请求上级DNS服务器,直至找到或到根节点。3.应用层客户端发送HTTP请求 请求报文包括请求行,请求头部,空行和请求数据四部分。 请求行包括请求方法、要访问的资源和版本号。请求头部包括服务器要使用的附加信息。即使正文为空,也要加空行。 请求方法有GE...

2018-04-14 23:46:34 144

原创 C++ inline 关键字

1. 引入inline关键字的原因在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

2018-04-13 12:41:59 82

原创 页面置换算法

在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存中已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据到磁盘的对换区中。但应将哪个页面调出,需根据一定的算法来确定。---- 通常,把选择换出页面的算法称为页面置换算法(Page-Replacement Algorithms)。置换算法的好坏,将直接影响到系统的性能。---- 一个

2018-04-12 12:12:32 252

空空如也

空空如也

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

TA关注的人

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