自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 golang 定时器

time.Aftergolang实现计时器:1.time.AfterotherTimeChan = time.After(refreshActiviryInterval * time.Second)case <-otherTimeChan: an.checkAndRefreshAcitivity() otherTimeChan = time.After(re...

2018-12-14 16:39:00 280

转载 redis一些笔记

base字典:hget/hset在redis字典中值只能是字符串,使用渐进式进行rehash。在rehash的过程中,会保留两个hash结构;查询时会同时查询两个结构;逐渐完成hash的迁移。如果大部分时候使用结构中的大部分数据,可以选择将整个结构序列化,使用string类型存储。如果大部分时候使用结构中的小部分数据,可以将结构进行拆分再序列化存储。当hash最后一个元...

2018-08-29 17:33:00 139

转载 Golang的一些学习

在 Go 中使用命名返回变量捕获 panic在下面代码中,如果pressButton发生panic,那么不会执行到return err,导致返回的err是nil。 func doStuff() error { var err error // If there is a panic we need to recover in a deferr...

2018-08-22 17:30:00 164

转载 等待队列(转)

转载:http://www.cnblogs.com/zhuyp1015/archive/2012/06/09/2542894.html突然想到epoll的内核实现,但是有点不明白设置了回调函数添加到等待队列后是如何唤醒的。所以找到了这篇文章。Linux将进程状态描述为如下五种:TASK_RUNNING:可运行状态。处于该状态的进程可以被调度执行而成为当前进程。TASK_INT...

2017-05-29 17:29:00 115

转载 可执行代码结构

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域.data,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.bss。程序结束后由系统释放。4、文...

2017-05-19 12:11:00 90

转载 brk和mmap(转)

进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap:1.brk是将数据段的(.data)的最高地址指针_edata往高地址推2.mmap是虚拟地址空间找一个空闲的虚拟内存如果malloc < 128K,那么会用brk进行分配,推动指针。实际上并没有建立映射关系,只有当第一次读写数据的时候,才会引起缺页中断,分配相应的内存。否则会直接使用mmap系统调用...

2017-05-19 12:08:00 253

转载 Linux 虚拟内存和物理内存的理解(转)

在学习内核之前,因为虚拟内存的关系看过这篇文章,但是有的地方不是很懂。现在对内核学习一段时间后,感觉这篇博客不错。虚拟内存:第一层理解1.每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task...

2017-05-19 10:17:00 56

转载 内存管理——linux内核学习

买了《深入Linux内核架构》这本书准备了解一下linux内核机制。但是最开始看了十几页感觉看着很累,本来都准备弃了过了段时间看见一个面经有linux内核的内容,于是就照着那个先把内存管理学习了下。静下心来看发现这本书还是不错,我跳过了很多细节部分,先对内核管理有个大致了解。水印+冷热页+伙伴系统+slab缓存通常用户和内核以3:1的比例划分虚拟地址内存组织:首先,内存划分为...

2017-05-19 10:12:00 79

转载 互斥量和条件变量

ps:参考了很多博客,但是当时没记下链接。。。互斥器和条件变量用法如下:pthread_mutex_lock(&lock);while (condition_is_false) { pthread_cond_wait(&cond, &lock);}上面那个while能换成if吗?答案是不能,否则会导致spurious wakeup虚假唤醒。因为不...

2017-05-19 09:56:00 80

转载 epoll源码分析(转)

在create后会创建eventpoll对象保存在一个匿名fd的file struct的private指针中,然后进程睡在等待队列上面。对于等待的fd,通过poll机制在准备好之后会调用相应的call_back函数。在函数中将当前fd加入对应eventpoll的队列中。然后唤醒等待队列上面的进程,进程执行相应的函数返回一个就绪队列即可。进程被唤醒后,调用相应的call_back函数...

2017-05-19 09:54:00 319

转载 Go学习——go+channel实战(转)

转载:http://studygolang.com/articles/2423背景在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及...

2017-05-06 15:02:00 88

转载 Go学习——defer、panic

defer:延迟到ret之前,通常用于IO的关闭 or 错误处理。在延迟出现的异常可以被后面的捕捉,但是只有最后一个。defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时将先被调用func f() (result int) { deferfunc() { result++ }() return 0}func test() e...

2017-05-06 13:48:00 97

转载 Go学习——new()和 make()的区别详解(转载)

这篇文章主要介绍了Go语言中new()和 make()的区别详解,本文讲解了new 的主要特性、make 的主要特性,并对它们的区别做了总结,需要的朋友可以参考下概述Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。new 的主要特性首先 new 是内建函数,你可以从 http://golang.org/pkg/b...

2017-05-06 13:43:00 58

转载 delete和delete[]的区别(转载)

一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为...

2017-04-04 20:04:00 55

转载 模板的非成员函数 和 类型转换

若所有参数都需要类型转换:如果是成员函数:Retional a(1,4);Retional result;result = a*2; //通过隐式转换retult = 2*a; //error因为上面的两局可以转换成:result = a.operator*(2);result = 2.operator*(a);如果构造函数是explicit的,那么两种都会失败...

2017-04-02 16:18:00 120

转载 weak_ptr解决shared_ptr环状引用所引起的内存泄漏[转]

转载:http://blog.csdn.net/liuzhi1218/article/details/6993135循环引用:引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下:#include<string>#include <iostream>#include <boost/s...

2017-04-01 22:03:00 117

转载 如何限制对象只能建立在堆上或者栈上(转载)

转载:http://blog.csdn.net/szchtx/article/details/12000867 在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象...

2017-04-01 17:38:00 60

转载 为了异常安全(swap,share_ptr)——Effecive C++

互斥锁:假设我们要在多线程中实现背景图片的控制:class PrettyMenu{public: …… void changeBackground(std::istream& imgSrc);//改变背景图片 ……private: Mutex mutex; //互斥量 Image* bgImage; //当前背景图片 ...

2017-03-27 21:26:00 130

转载 注意类型转换——Effective C++

注意类型转换:C++提供了四种新式类型转换:const_cast<T>(expression);static_cast<T>(expression);dynamic_cast<T>(expression);reinterpret_cast<T>(expression);static_cast 和 旧式转换在编程中我们经常使用...

2017-03-27 17:44:00 61

转载 http协议

http是一个面向事务的应用层协议。http规定http客户和服务器之间的每次交互都由一个ASCII码串和一个类似通用英特尔邮件扩充。访问一个网站:当点击一个链接时,会有一个URL(http://www.xxxxx.com/xxxx/xx.html)1.浏览器分析URL2.浏览器DNS请求解析IP地址3.获取IP后进行TCP连接4.发出文件提取命令xxx.ht...

2017-03-20 21:44:00 75

转载 tcp窗口滑动以及拥塞控制(转)

转自:http://blog.chinaunix.net/uid-26275986-id-4109679.htmlTCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。一、滑动窗口协议 关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议。 ...

2017-03-20 21:40:00 51

转载 以独立的语句将new对象置入智能指针

以独立的语句将newed对象置入智能指针:processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority());我们在这使用对象管理式资源,却可能造成资源的泄露。上面主要有3三件事情需要完成:priority()new Widgetshare_ptr的构造函数但是在C++中无法确定他们的调用顺序...

2017-03-20 19:06:00 80

转载 函数子可匹接

函数子可匹接:经常我们会同not1对函数返回进行转义:bool isInteresting(const node* p);find_if(c.begin(),c.end(),not1(isInteresting));但实际上isInteresting作为一个基本的函数指针,缺少not1所需要的函数定义。unary_function和binary_function:比较简便的...

2017-03-20 19:01:00 66

转载 函数对象

函数对象:通常我们可以将函数作为参数传入另一个参数,比如qsort中传递函数指针。STL函数对象则是函数指针的一种抽象形式。传递方式:由于标准库函数中,函数指针的传递是按照值传递的;所以函数对象在函数之间的传递也是 值传递。for_each示例:template<class InputIterator, class Function>Functionfor_...

2017-03-20 19:01:00 49

转载 插入迭代器

transform:通过transform函数我们可以将一个仿函数作用域[begin,last)的每个元素身上,然后将结果保存到目标区间。vector<int> results;transform(value.begin(),value.end(),results.end(),transmogrify());上述代码会将value中的元素调用transmogrify,...

2017-03-20 18:59:00 54

转载 operator[] 和 insert

operator[] 和 insert:map的[]操作和其他容器和内置[]没有关系如果我们通过[]向map中插入or更新值,需要考虑一些东西1.键已经存在,那么直接进行修改即可2.键不存在,那么需要 值的默认构造创建一个新的对象,然后返回引用进行赋值m[1] = 1.5;m.insert( widget::value_type(1,1.5));如果使用 operator[...

2017-03-20 18:56:00 91

转载 STL注意比较函数

可重复插入?:set<int ,less_equal<int> >s;s.insert(10);s.insert(10);第二次调用insert,集合回去确认10是否已经存在。因为我们代入的比较函数是 <=所以集合会检查下面表达式判断是否等价:!(10a <= 10b) && !(10b <= 10a)于是会判断出不...

2017-03-20 18:55:00 126

转载 remove、erase

remove:remove不是真正的删除,删除后数量并没有变化。它接收一对迭代器,而不是一个容器,所以不知道它作用于哪个容器。而且没有办法从一个迭代器获取对应于它的容器实现remove会用需要保留的数据覆盖掉前面需要删除的数据。然后返回一个需要被删除开始位置的迭代器。所以通常需要结合erase使用:v.erase(remove(v.begin(),v.end(),199...

2017-03-20 18:52:00 106

转载 reserve的使用

reserve:强迫容器将它的容量变成n可以避免不必要的重新分配如果n大于当前容量,那么正常。如果n小于当前容量,vector会忽略,string则是减小为 max(size(),n)。如果我们需要大量的向容器中添加数据:for(int i = 0 ;i < 1000;i++) v.push_back(i);该循环可能导致多次内存重新分配(当前容量不足时)。...

2017-03-20 18:50:00 246

转载 allocator

allocator:通常c++内存配置和释放操作是这样的:class Fo{};Fo *p = new Fo;delete p;new算式主要有三个阶段:调用::operator new配置内存调用Fo::Fo()构造函数返回一个对象的指针allocator为了精密分工将步骤分开1.allocate()和deallocatr()负责内存的配置和释放2.const...

2017-03-20 18:48:00 63

转载 区间成员函数的优势

为什么要使用区间函数:v.insert(v.begin(),data,data+num);//显示循环:for(int i = 0 ;i < num;i++){ insertLoc = v.insert(insertLoc,data[i]); ++insertLoc;}函数调用:如果是区间函数,那么只需要一次函数;循环插入则需要n次insert的函数调用...

2017-03-20 18:44:00 100

转载 empty()和size()的优劣

通常下面代码:if(c.size() == 0)if(c.empty())我们会觉得它们是是等价的。为何empty()比较好?主要是他们之间的效率有一定差距:empty对任意的容器都是常数时间对于有点list实现,size需要线性时间bool empty() const //list的empty操作{ return node->next =...

2017-03-20 18:42:00 736

转载 C++traits——STL源码剖析

有时候我们希望知道迭代器所指的元素类型。以迭代器所指声明对象:template<typename Iterator, typename T> void func_impl(Iterator iter, T t) { T temp;//这里就解决了问题 //这里做原本func()的工作 } template<typenam...

2017-03-20 18:38:00 73

转载 IO复用

IO复用:使得程序能同时监听多个文件描述符select:select在一段指定的时间内,监听用户感兴趣的文件描述符的 读、写、异常事件。select(int nfds,fd_set* readfds ,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout);当调用了select之后整个进程就会被block。同时ker...

2017-03-20 18:11:00 65

转载 深入理解-位置无关代码

位置无关代码:起因:当程序在多个不空地址空间运行时,操作系统通常会将程序加载到各个地址空间的相同位置,这样可以让链接期在程序加载时不用再重定位,将地址绑定到固定位置。对于动态库而言,如果如果我们不将动态库编译成PIC的也就是意味着loader一定要把动态库加载到某个特定的地址(该地址编译的时候就确定了)上它才可以正确的执行。--如果有ABCD四个库,,假设程序P1依赖A B...

2017-03-05 16:42:00 292

转载 内存映射文件原理探索(转载)

转载:http://blog.chinaunix.net/uid-20761674-id-3072683.html一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。原理首先,“映射”这个词,就和数学课上说的“一...

2017-03-04 16:35:00 56

转载 虚拟内存原理

本来最初是想知道共享库是怎么实现一个副本就行的,顺便拓展下。虚拟内存:当运行一个进程时,它需要的内存有可能大系统内存容量。通常一个进程会有4G独立的空间,那么n个进程就是n * 4G的内存,很明显系统内存不够。每个进程的4G只是虚拟内存,每次访问的时候都要转变成物理地址。虚拟内存主要是通过请求调用和置换功能,从逻辑上对内存扩容。页面请求/段:一般程序在运行时,只会将当前需要...

2017-03-04 16:31:00 156

转载 CSAPP-链接

主要任务:1.符号解析在声明变量和函数之后,所有的符号声明都被保存到符号表。而符号解析阶段会给每个符号一个定义。2.重定位:把每个符号的定义与一个内存位置关联起来,然后修改所有对这些符号的引用,让他们指向内存位置。符号解析:会将符号引用和可重定位目标文件的符号表中的确定符号定义关联起来。对于相同模块的局部符号(static属性),可以简单解决。对于全局符号的引用,如...

2017-03-04 16:26:00 126

转载 CSAPP-程序优化

代码移动:如果一个表达式总是得到同样的结果,最好把它移动到循环外面,这样只需要计算一次。编译器有时候可以自动完成,比如说使用 -O1 优化。一个例子:void set_row(double *a, double *b, long i, long n){ long j; for (j = 0; j < n; j++){ a[n*i + j] = b[j]; }...

2017-03-04 16:24:00 295

转载 CSAPP-过程调用,数据存储,缓冲区溢出

程序编译:1.预处理阶段:1.文件包含:将#include扩展成文件正文2.条件编译:根据#if和#ifdef将程序的某部分排除或者包含3.宏展开:将出现宏引用的地方展开成相应的宏2.编译阶段:检查代码的规范性、是否有语法错误等,然后将其转换成低级机器语言。(C会转换成汇编语言)3.汇编阶段:将汇编代码转换成二进制目标代码4.链接阶段:”printf”的函数并没有在代...

2017-03-04 16:22:00 117

空空如也

空空如也

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

TA关注的人

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