- 博客(28)
- 资源 (3)
- 收藏
- 关注
原创 算法常见面试问题
常用排序堆排序void heapAdjust(vector<int>&v,int parent,int length){ for (int j = parent*2; j <=length; j*=2) { if(j+1<=length && v[j+1]>v[j]) j++; ...
2018-03-12 23:14:41 230
转载 linux信号实现机制
进程p2向进程p1投放信号,需要经过linux内核,投放的时候,linux内核向p1的task_struct中的信号向量表中添加相应的未决信号,然后等到p1陷入内核要回到用户态时,检查这个信号向量表,检查到里面有未决信号,就从内核态跳到相应的用户态的处理函数,处理完后,又从用户态跳回到内核,再从内核跳到正常执行的用户态位置继续执行。 上面所说的在内核的检查时机,包括用户的系统调用,中断而...
2018-03-04 20:05:28 302
转载 linux的零拷贝技术
情景:将服务端主机磁盘中的文件不做修改地从已连接的socket发出去,我们通常用下面的代码完成:while((n = read(diskfd, buf, BUF_SIZE)) > 0) write(sockfd, buf , n); 使用零拷贝技术 零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任...
2018-02-27 15:47:49 226
原创 iterator_traints原理
algorithm.h中的distance函数原型如下: template <class Iterator> typename iterator_traints<Iterator>::difference_type distance(Iterator first,Iterator last){ typedef typename itera...
2018-02-27 15:36:41 451
原创 数据库常见面试题
1一张数据库表,存储的是班级学生的名字,如何检索出同名的人 select * from class in (select name from class group by name having count(*)>1)2 数据库四种隔离级别事物并发会导致三种问题: 1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 2. 不可重复读:事务...
2018-02-25 23:01:28 1553
转载 linux内核内存管理
linux内存分布整个linux虚拟内存发布如下:3G以上是内核地址,0~3G是进程地址空间。 在x86结构中,内核地址分为三种,这三种类型的区域如下: ZONE_DMA 内存开始的16MB ZONE_NORMAL 16MB~896MB ZONE_HIGHMEM 896MB ~ 结束进程地址空间的3G,通过MMU,随机映射到物理地址896M...
2018-02-02 17:47:47 290 1
转载 孤儿进程,僵尸进程
孤儿进程 如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的僵尸进程有如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息.一旦父进程得到想要的信息,僵尸进程就会结束.
2018-02-02 11:57:54 158
转载 信号量以及可重入与线程安全
信号量内部实现原理:举个例子,前台运行某个程序的时候,我们在键盘输入 Ctrl+C,就会终止这个进程,这是因为前台进程捕捉了这个有键盘传送过来的信号,并执行了相应的处理程序,那么什么又是信号捕捉呢?如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SIGQUIT信号的处
2018-02-01 14:07:20 787
原创 动态链接
1 动态链接的简介动态链接,其实就是把程序的链接这个过程推迟到运行时再进行。、1.1 动态链接库的好处:各个进程共享同一个动态链接库,不仅仅节省内存,而且还可以减少物理页面的换入换出,也可以增加CPU缓存的命中率,因为不同进程间的数据和指令访问都集中在了同一个共享模块上。可以使程序的升级变得更加容易,当我们升级共享模块时,只需要重新编译共享模块,而不用再将共享模块和程序重新链接。这
2018-02-01 13:28:43 451
原创 c/c++ static和const的用法
C语言中static作用如果作用于局部符号,如全局变量或者全局函数上,就是将全局符号的作用范围限定于该文件,而其他文件不可访问。如果作用于局部变量,则是将局部变量变为静态局部变量。const将变量变为常变量,即初始化后,其值就不可变。 ps :const与指针 以*为分界,const在*左边则表示内容不变,在*右边,则表示指针不变。 eg const int*a; /
2018-01-31 11:07:22 258
原创 fopen open函数的区别,联系,即相互转化
FILE *fopen(char *filename, char *mode); int open(const char *path, int access,int mode);fopen open区别1 open函数是linux系统调用,而fopen函数是标准c库函数,所以fopen函数可移植性更好。 2 fopen函数作为标准c库函数,在不同操作系统下要借助相应的系统调用实现,在l
2018-01-30 21:46:52 1117
转载 fopen的按文本读写和按二进制读写
二进制读写和文本读写的区别: 1. 二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的時候,也是把內存缓冲区的內容原封不动的写到文件中。而‘\n’ 在ascii码中是’0x0A’。 2. 而文本方式就不一样了,在写文件时,会将换行符号‘\n’会转化为系统相应的ascii码,所以,在linux下,会把换行符转化为linux 的换行 ‘0x0A’ ;在windown下,会把换行符转化
2018-01-30 21:31:26 4176
转载 c/c++中内存泄漏的检查与避免
1 valgrindvalgrind支持的工具:memcheck addrcheck cachegrind Massid helgrind Callgrind 运行时必须指明想用的工具,如果省略工具名,默认运行memcheck 检测原理: 1,当要读写内存中的某个字节时,首先检查这个字节对应的A bit。如果该A bit显示该位置是无效位置,memcheck则会报告读写错误。
2018-01-30 20:35:40 245
原创 强弱引用以及common段
强符号:编译器默认函数和初始化的全局变量为强符号 弱符号:未初始化的全局变量为弱符号。也可以通过atrribute((weak))来指定。 编译器关于强弱符号的规则有: (1)强符号不允许多次定义,但强弱可以共存; (2)强弱共存时,强覆盖弱; (3)都是弱符号时,选择占用空间最大的,如选择double类型的而不选择int类型的。 假如有文件a.clong int i = 5
2018-01-30 17:35:44 949
转载 B+树以及非聚簇索引和聚簇索引
1 B树以及B+树1.1 B树 是一种多路搜索树,假设为M叉树 1. 每个节点中的关键字,比指向儿子的指针少一,即每个节点最多有M-1个关键字和M个指针 2. 关键字集合分布在整棵树中,任何一个关键字出现且只出现在一个节点中,即是说,有可能在非叶子节点命中。1.2 B+树 B+树是B树的变种,也是一种多路搜索树,假设为M叉树 ...
2018-01-29 21:10:46 3140 1
原创 exit,return ,_exit退出函数关系
main函数并不是程序运行的第一个函数,在main之前,还有初始化函数init() ; main函数之后还有fini()函数收尾。result=main(argc,argv);exit(result);所以其实在main()函数最后调用return 0,result=0,然后再调用exit(0)。和在main()函数最后直接调用exit(0)是一样的。 exit()函数大致实现如下
2018-01-29 16:34:30 256
原创 FAT32格式理解
1 硬盘结构 由上面可知,主引导记录MBR中的分区表有4个分区项目,每个分区项可以放一个主分区,也就是表中的基本分区,或者放一个基本分区。所以系统最多有四个主分区,但是如果我们想要更多的分区的话,我们可以放扩展分区,一个扩展分区可以扩展无限个逻辑分区。上图有三个主分区,一个扩展分区,扩展分区扩展为2个逻辑分区。 扩展分区是如何扩展的呢,其实,每个逻辑分区的头部都有一个字段指向下一个逻辑分区
2018-01-27 19:53:37 7124 2
原创 c++ stl内存分配
STL源码剖析SGI stl中stl 的内存分配不是采用allocator类,而是采用自己写的类alloc 这个alloc类中主要有四个函数 construct : 用于调用新建类的构造函数,其实现就是依靠placement new destroy : 用于调用新建类的析构函数 allocate : 用于分配新建类的内存,用operator new ,或者malloc deallo
2018-01-27 15:56:20 1100
原创 在多线程中fork时的问题
假设现在有一个进程A,它有三个线程,如下: 现在在线程1中fork,操作系统只会复制线程1,而线程2,线程3都会被抛弃而消失, 在进程A中的线程1 fork()后产生的进程B,如下: 可以看到在fork之后,线程2,线程3都消失了,只有线程1,这就存在问题了。 加入在进程A的线程1 fork之前,有一个锁,被线程2持有,然后fork之后,线程2又消失了,相当与这个锁被一直持有了,如
2018-01-27 14:27:00 353
转载 数据库三大范式
第一范式(1NF):符合1NF的关系中的每个属性都不可再分。 这张表中,进货属性,销售属性就都不是原子的,应该再拆分。如下: 第二范式(2NF):2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。码就是主键的意思,非主属性就是除去码之外的属性。这种情况一般来说,码中两个或两个以上的属性,然后存在一些属性只是依赖码的部分属性,而不不整个码的属性。例如有一张如下: 这
2018-01-27 11:24:54 561
原创 对称加密,公钥加密,报文鉴别,https,
加密方面有两种加密体制:对称密钥密码体制,公钥密码体制。公钥加密定义公钥密码体制分为私钥SK(secure key)和公钥(public key),私钥加密的可以用公钥解密,用公钥加密的可用私钥解密,一般私钥服务器自己拥有,公钥发给其他人客户端。这样客户端将信息用公钥加密后,发给服务器,就算被黑客截取到了,由于没有私钥,依然不知道信息。公钥加密作用用于客户端将对称加密算法
2018-01-26 17:30:09 1373
原创 死锁原因,解决,避免方法及哲学家就餐问题
死锁的四大条件: 互斥:资源不能共享,只能由一个进程持有 占有且等待:当一个等待另外进程而阻塞时,资源不主动释放 不可抢占:操作系统不能强行抢占被进程持有的资源 循环等待:存在一个封闭的进程链,使得每一个进程都至少占有下个进程所需要的资源。这个四个资源中,前面三个,基本所有操作系统都是可以满足的。所以一般产生死锁,第四个是关键。关于死锁的解决方法,有三种 1. 死锁预防 2.
2018-01-25 19:29:52 8586
原创 elf格式详解
elf是linux下一种常见的可执行文件格式。其内容如下: 主要包括一个64byte的elf header,一个程序头表,一个段头表,其余真实有用的东西,如code section,data section等等。 先说elf 头 先说段头表(section header table) 这个段头表位于位于上面位置呢?其实刚刚elf头中的start of section headers
2018-01-25 11:17:28 1354
原创 extern c作用
extern “c” 这个是为了cpp文件能够调用由c语言生成的.o文件c++源程序调用c库这是因为c编译出来的.o文件的函数命名和cpp编译出来的函数命名不一样, 如下,cfile.c中int foo(int x,int y){ return x+y; } gcc cfile.c -o cfile.o -c执行上面命令生成cfile.o时,我们...
2018-01-24 16:28:46 902
原创 海量数据处理专题
100亿个数排序先将数分为100份,即分到100个小文件中,然后逐个文件排序,最后采用多路归并排序,写入一个大文件中。 1 但是,这种朴素做法每次都要比较100次,才能确定当前最小值,所以,这部分可以优化,即建立一个最小堆,每个值为pari(num,fd),每次将堆顶元素踢出,从踢出数所属的文件中再读入一个元素。 2 前面逐个文件排序的时候,可以并行,排序是耗cpu,读写数据耗io...
2018-01-23 21:50:43 144
原创 c++ 单例模式
单例模式主要要两种实现,一种是饿汉模式,另一种是懒汉模式。 饿汉模式就是在类一开始生成时就产生,而懒汉是要等到调用时,才生成。 下面分别讲解这两种模式。懒汉v1: not thread safeclass Singleton{private: static Singleton*instance; Singleton(){ cout"S
2018-01-23 17:35:45 258
原创 自己实现printf
int printf(char * fmt,…)由此可见,printf为不定参数,难点在于如何获取后面参数。根据函数压栈顺序: 假设参数压栈顺序为从右到左,那arg_1为fmt,我们从参数可以得到fmt,那么为了得到其地址,只要&fmt就可以了,即我们可以通过&fmt得到arg_1的位置。得到了arg_1的位置,我们就可以通过&fmt+offset得到arg_2位置,然后依次就可以得到
2018-01-23 16:41:20 1008
原创 C++写HTTP服务器
这个项目底层是用Boost.Asio库,通过正则表达式reg解析http,然后做出响应。 具体做法文末链接有详细介绍,在这里说一下这个项目得到的知识点,首先是reg正则表达式的用法regex/regex_match/smatchregex是用来定义正则表达式的,smatch是用来局部匹配的,regex_match是用来寻找的。具体用法如下:string fnames[]= {"foo.txt
2017-11-01 15:51:45 2385
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人