- 博客(36)
- 收藏
- 关注
原创 位运算实现简单算数运算
1.用位运算实现加法int Add(int a, int b){ if(b == 0) return a; int sum = 0; int carry = 0; sum = a^b; carry = (a&b)<<1; return Add(sum, carry);}2.写一个函数,判断数是否为0int IsZero(int nu
2017-08-10 21:40:03
557
原创 为什么epoll比select更高效?
1.select和epoll有什么不同? <1>**select可以监听文件描述符是有限的**,由FD_SETSIZE设置,默认是1024,可以通过修改这个宏来增加可监听文件描述符的个数,但资料同时指出这样修改将导致不可预期的效果。**epoll可监听的文件描述符的个数为进程可打开的文件的个数**。<2>select中,当有事件就绪时,内核修改参数以通知用户,用户需要遍历所有的fd判断是哪个fd就绪,**
2017-08-04 15:57:25
4311
1
原创 select源码剖析
select只有一个系统调用 select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *expectfds, struct timeval *timeout);nfds指定被监听文件描述符的总数,一般为socket监听的所有文件描述符中的最大值+1。readfds, writefds, expectfds分别指向可读可写异常事件的文件描
2017-08-04 13:52:47
639
原创 epoll源码剖析
epoll的实现主要依赖于一个文件系统eventpoll。 epoll使用中有三个重要的函数:epoll_create(), epoll_ctl(), epoll_wait epoll有四个重要的数据结构:struct eventpoll, struct epitem,struct epoll_event, struct eppoll_entrystruct eventpoll{ rw
2017-08-02 22:35:10
796
原创 fork源码剖析
大家一定听过这样一段话: 调用fork(),创建子进程; 调用pthread_create()创建子线程; 如果你要创建一个立刻执行exec()函数的进程,就使用vfork()。说法没有错误,在我平时编写多进程/多线程项目时的确是这样使用的。那请问:为什么?它们有什么区别?既然在Linux系统上有进程、内核线程和用户线程之分,那调用不同的函数,分别创建的是什么?如果你能回答这些问题,本文章不是
2017-07-29 22:31:34
769
原创 系统调用
系统调用(system call)是内核提供给应用程序的一系列函数接口。系统调用将应用程序的请求通知内核,调用相应的内核函数处理请求,处理完成后,将处理结果返回给应用程序,user space 只能通过系统调用来访问kernel提供的函数。中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector
2017-07-28 13:04:26
517
2
原创 Nginx解决惊群现象
惊群现象:所有的工作进程都在等待一个socket,当socket客户端连接时,所有工作线程都被唤醒,但最终有且仅有一个工作线程去处理该连接,其他进程又要进入睡眠状态。Nginx通过控制争抢处理socket的进程数量和抢占ngx_accept_mutex_held锁解决惊群现象。只有一个ngx_accept_mutex_held锁,谁拿到锁,谁处理该socket的请求。如果当前进程的连接数>
2017-07-27 21:02:25
2160
原创 设计模式——单例模式
你肯定被面过这样一个问题:C++中如何实现一个类只能实例化一个对象?单例模式可以保证一个类只能实例化一个对象!单例模式的核心数据结构中只包含一个被称为单例的特殊类。防止用户随意的调用构造函数,将类的构造函数写成私有的,给用户提供返回对象的方法,在调用时不能依赖对象。版本一: 懒加载(不论是否使用,都要初始化)class Singleton{public: static
2017-07-27 18:48:17
391
原创 socketAPI
1.创建套接字```#include <sys/types.h>#include <sys/socket.h>int sockfd = socket(int demain, int type, int protocal);```domain参数告诉系统使用哪个底族协议,IPV4为AF_INET,IPV6为AF_INET6。type参数指定服务类型,主要有SOCK_STREAM(流服务),SOCK_UG
2017-07-27 16:54:51
327
原创 TCP/IP——传输层
本文章通过对以下几个问题的解答,增加对传输层的理解。 1.传输层的作用是什么? 答:传输层作为底层数据的最高层,应用程序的最底层,要保证为两个应用程序提供无差错的端到端的通信。2.传输层如何区别不同应用程序之间的数据? 答:传输层对TCP报文经行分装或解析,在TCP报头中,有16位的源端口号,通过对源端口号可以唯一标识数据是哪个应用程序的。3.传输层有哪些协议? 答:TCP(传输控
2017-07-27 13:25:06
863
原创 拥塞控制
1.拥塞控制:提高网络利用率、降低丢包率、保证网络资源对每条数据流的公平性。2.拥塞控制的方法: <1>慢启动 TCP连接建立好后,拥塞窗口CWND被设置成初始值IW,此时,发送端酶促最多发送IW字节的数据。此后,发送端每接收到一个接收端的确认,就将CWND+1,CWND呈指数形式增长。慢启动的理由:刚开始发送数据时并不知道网络真正的情况,需要用一种试探的方式平滑的增加CWND的值。<2>拥塞避
2017-07-26 00:18:06
516
2
原创 TCP常见面试题
1.画出TCP的报头 2.说一下TCP的三次握手过程3.为什么TCP握手需要三次?TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。如果TCP的握手是两次: <1>如果client发给server的SYN报文因为网络原因,延迟发送。由于client没有收到server对SYN的确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,
2017-07-25 21:51:32
25255
原创 运输层协议——TCP
1.TCP和UDP是传输层两个重要的协议。 TCP提供面向连接、可靠的字节流服务。使用TCP协议的两端必须先建立连接,才能开始数据的读写,双方必须都为连接分配必要的数据结构。TCP有发送缓冲区和接收缓冲区,TCP模块发出的数据报的个数和应用程序执行的写操作次数之间没有固定的关系。TCP的连接是全双工的。UDP提供面向无连接,不可靠的数据报服务。发送端每执行一次写操作,UDP模块就将其封装成UDP数
2017-07-25 20:29:12
2439
原创 IP协议
1.IP协议是网络层的协议,为上层提供无状态、无连接、不可靠的服务。 无状态:IP通信双方不同步传输数据的状态信息,IP数据报的发送、传输、接收都是独立的。 无连接:IP通信双方都不长久地维持对方地任何信息。上层协议每次发送数据的时候,都必须明确对方的IP地址。 不可靠:IP协议不能保证IP数据报准确的到达接收端。使用IP协议的上层协议需要自己实现数据确认、超时重传等机制以达到可靠传输。2.I
2017-07-25 14:30:12
580
原创 网络基本知识
1.OSI七层协议模型 2.TCP/IP四层协议模型 3.TCP/IP四层协议模型,各层常用的协议。 应用层:HTTP/DNS/SMTP/POP3传输层:TCP/UDP网络层:IP/ICMP数据链路层:ARP/RARP各层协议会对上层的数据包加上自己的报头信息,再发给下一层。解析时,各层对收到的下层数据包进行解析,再发给上一层。4.ARP工作原理:主机向自己所在的网络广播一条ARP请求,该请求
2017-07-25 13:06:16
2399
原创 死锁
1.死锁 (1)死锁:一组进程中的每个进程都在等待某个事件,而只有这组进程中的其他被阻塞的进程才可以触发该事件,这是就称这组进程发生死锁。死锁是永久性的。(2)可重用资源:不会因为使用而被耗尽和消耗的资源。如I/O通道或一块内存(3)可消耗资源:当被一个进程获取时就消耗了的资源。如缓冲区中的消息(4)死锁产生的条件: 互斥。有一次只有一个进程可以使用的资源,其他进程不能访问已分配给
2017-07-21 22:30:24
405
原创 Linux基础总结
1.linux版本 内核版本 1991,芬兰大学生 www.kernel.org 发行版本 公司对内核版本进行软件/操作集成,更方便使用 选最稳定的版本2.linux基本命令 目录: cd 切换目录 pwd 显示当前路径 mkdir 创建目录 rmdir 删除目录 文件: cp 拷贝文件 mv 粘贴/重命名文件 vi 打开文件编译器 more f
2017-07-21 16:58:45
641
2
原创 排序、树和图
本文章只对解释基本知识,数据结构的代码以后的文章会着重总结1.排序 <1>插入排序 稳定 基本思想:每次从待排序列中找到最小的,插入到已排序好的对列中。 时间复杂度:O(n^2) 空间复杂度:O(1) 特点:完全有序时,时间复杂度为O(n)<2>希尔排序 不稳定 基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录
2017-07-20 01:05:28
720
原创 进程与线程
1.进程和线程进程是伴随着操作系统被提出的,随着计算机技术的发展,进程暴露出一些弊端。一是,**进程是资源分配的单位,创建、切换等过程中的时空开销较大**,因此需要引进轻量级进程;二是由于多对称处理机(SMP)出现,可以满足多个运行单位,但是**多个进程并行运行的开销过大**。因此,线程作为能独立运行的基本单位而出现。在OS中,通常将进程作为资源分配的基本单位,将线程作为独立运行和独立调度的基本单位。
2017-07-19 16:40:29
362
1
原创 单链表常见笔试面试题总结
1.单链表逆置#include <iostream>using namespace std;typedef int KeyType;typedef struct Node{ KeyType value; Node *next;}Node, *List;void Reserver(List plist){ //链表尾NULL /只有一个头节点/链表只有一个头节点和数据
2017-07-18 17:57:21
596
原创 C++总结8——shared_ptr和weak_ptr智能指针
智能指针的提出:智能指针是存储指向动态分配对象指针的类,用于生存期控制。能够确保正确销毁动态分配的内存,防止内存泄露。1.智能指针的分类:不带引用计数的智能指针auto_ptr unique_ptr scoped_ptr 带引用计数的智能指针shared_ptr:强智能指针weak_ptr:若智能指针
2017-07-17 21:59:35
1097
原创 C++总结7——STL基本原理和用法
1.STL的三种类型容器 顺序容器:vector 向量容器 deque 双端队列 list 链表 容器适配器:stack 栈 queue 队列 priority_queue 优先级队列 关联容器:set
2017-07-17 16:18:56
1397
原创 C++总结6——继承与多态的笔试题
1———————————————-#include using namespace std;class Base{public: Base(int data):_ma(data) { cout"Base()"<<endl; } virtual ~Base() { cout"~Base()"<<endl; }
2017-07-17 02:01:45
3228
1
原创 C++总结5——继承与多态
1.C++的继承 继承有3种形式:私有继承、保护继承、公有继承,缺省的继承方式是私有继承。不论哪种继承方式,派生类都是显示的继承类基的保护成员变量和函数和公有成员变量和函数,继承方式只是限定在派生类中这两种成员变量的访问方式(即访问权限)。私有的成员变量和函数也被继承到派生类中,但是不能被访问,它是隐藏的,在派生类中不可见。 派生类继承基类,除基类的构造函数和析构函数不外,其他的所有都继承
2017-07-16 22:49:47
3502
3
原创 C++总结4——内存泄露/资源泄露
内存泄露/资源泄露现象 1.malloc/new动态申请的内存,忘记写free/delete,导致内存泄露; 2.调用默认的赋值运算符重载函数,发生浅拷贝现象,导致内存泄露 3.在构造函数中new,但是程序运行过程中抛出异常,未调用析构函数。4.构造函数中调用new开辟内存后,抛出异常。对象未构造成功,不会调用析构函数,导致new的堆内存没有释放。
2017-07-16 15:21:37
3049
原创 C++总结3——volatile、explicit、mutable关键字
1.volatile关键字 volatile是类型修饰符(一致性、原则性、可见性) <1>防止多线程对共享变量进行缓存,保证各线程实时从内存中读取变量值; <2>防止编译器对指令顺序进行调整。 防止CPU对指令顺序进行调整,用barrier()。volatile关键字保证内存可见性,不保证代码段的原子性。保证代码段的原子性要使用信号量或者互斥锁。2.explicit关键字 防止隐式生成临时
2017-07-16 13:54:28
545
原创 C++总结2——函数的重载
1.C++函数的重载 重载的原理: C和C++都是编译性语言,编译过程中函数要产生符号生成符号表。C中,函数的符号只与函数名有关,C++中,函数的符号由函数名和参数列表构成,所以C++支持函数的重载。 重载的条件: <1>函数名相同,参数列表不同(参数类型或参数数量不同) <2>函数必须处在同一作用域 特殊情况: 当const不和指针或引用使用时,不参与类型的识别
2017-07-16 11:55:09
320
原创 C++总结1——指针和引用/数组的区别
1.指针和引有什么区别?(从反汇编角度回答) a.其实引用和指针本质上是一样的,他们的汇编指令都是两行。 int a = 10; int *p = &a; //lea eax,[a] 将a的地址放在eax寄存器中 //mov dword ptr [p], eax 将eax寄存
2017-07-15 20:37:02
915
原创 大华技术股份笔试题重点总结
题型:选择25道 填空5道 问答5道1.USB2.0的最大传输速度是480MB/S,大约每秒可以读60MB的数据(理论值),实际速度要考虑硬件等各方面。2.const和指针的结合 const int *p; const 修饰的是*p,*p不能改变(p指向的内容不能改变),p可以改变(p指针的指向可以改变)int const *p;//同上int *const p; const修饰的是p,
2017-07-15 19:05:02
13507
2
原创 C语言重点知识复习2
1.指针的算术运算 (1)指针之间不允许相加,但允许相减 指针相减表示两个指针之间间隔的单元格数(1.先计算出字节数 2.再除以权重) (2)指针运算需要调整 p+数字(n) 加n单元格的权重 权重为指针变量去掉一个*,求sizeof(),乘n 数字之间不需要调整,直接加或减#include <stdio.h>#include <stdlib.h>int main(){
2017-07-15 17:20:14
372
原创 C语言重点知识复习1
1.进制之间的转换 %d 十进制输出 %0x 十六进制输出 %08x 十六进制输出,输出8位,如果不够,补0编程题:将十进制的数字转换成n进制的数字#include <iostream>#include <stack>using namespace std;//使用stack,将得到的数字压栈,最后逐一出栈void MyTenToN1(int num, int n)//n表示进制
2017-07-15 17:09:40
423
原创 GFS
1.GFS的架构先来对这张图,也就是读取流程做一下解释。<1>client在把应用程序要读写的文件根据文件名和偏移量,根据chunk的大小转换成文件的chunk index;<2>client将filename和chunk index发送给master,master通过查找,返回相应的chunk handle(chunk标识/chunk句柄)和位置;<3>client使用filename和chunk hand
2017-07-12 22:17:53
621
原创 Ceph架构剖析
分布式存储系统——Ceph 1.Ceph的架构 Ceph是统一的存储系统,支持统一的接口 (1)object(对象存储):有原生的API,并且兼容swift的API。 (2)block(块存储):支持快照、克隆 (3)file(档案存储):支持posix,支持快照 2.Ceph的结构 从下到上将Ceph结构分为4层,分别介绍如下: (1)基础存储系统——可靠的自动化分布式对象存
2017-07-11 17:04:18
2361
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人