自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 求一组整数的第二大数

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;const int MINNUM = -32767;int find(int array[],int size){ if (size < 0 || size == 0)

2017-06-13 12:52:05 511

原创 多态(静态、动态、函数、宏)

静态多态 静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数。对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系,必须存在必需的同名成员函数。 优点:1、由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化; 2、静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。缺点:由于是模板来实现静态多态,因此模板的不足也就是静多

2017-06-13 12:47:55 526

原创 I/O多路转接之poll

poll采用了一个单独的结构体pollfd数组,由fds指针指向这个组。pollfd结构体定义如下: struct pollfd { int fd; //文件描述符 short events; //当下文件描述符关心的事件 short revents; //文件描述符关心的事件就绪 }; 每一个pollfd结构体指定了一个被监视的文件描述符,可以传递多个结构体,指示poll()监视多个文

2017-06-11 15:47:14 291

原创 I/O多路转接之epoll

epoll工作原理: epoll同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表就绪描述符数量的值,你只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可。epoll的相关系统调用:1、 int epoll_create(int size):创建一个epoll的句柄,size可忽略。当创建好epoll句柄

2017-06-09 18:25:12 245

原创 文件描述符重定向---dup&dup2

dup和dup2都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的原形及描述如下: 输出重定向#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>int main(int argc,char *argv[]

2017-06-07 17:05:02 372

原创 I/O多路转接----select的服务器实现

多路:多条独立的i/o流,即读是一条流(称之为读流,比如输入流),写是一条流(称之为写流,比如输出流),异常也是一条流(称之为异常流),每条流用一个文件描述符来表示,同一个文件描述符可以同时表示读流和写流。select:系统提供select函数来实现多路复用输入/输出模型。select系统调用是⽤用来让我们的程序监视多个文件句柄的状态变化的。 程序会停在select这里等待,直到被监视的文件句柄有

2017-06-07 15:33:12 439

原创 五种I/O模型

一个I/O分为两步:1、等待数据就绪 2、数据搬迁阻塞I/O:应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待。数据准备好了,从内核拷贝到用户空间。例:一个人去钓鱼,等待鱼钩的同时什么都不做,如果鱼上钩就亲自把鱼放到桶里。非阻塞I/O:我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/

2017-06-05 23:05:17 343

原创 TCP建立连接与释放时管理的定时器

TCP建立连接与释放时管理的定时器如下:重传计时器:Retransmission Timer 坚持计时器:Persistent Timer 保活计时器:Keeplive Timer 时间等待计时器(2MSL Timer):Time_Wait Timer FIN_WAIT_2定时器(FIN_WAIT_2 timer)重传计时器:Retransmission Timer 对于TCP发送出去的数

2017-06-03 17:31:25 625

原创 软件测试中的V、W、H模型

V模型 主要反映测试活动与分析和设计的关系。 V模型的策略既包括低层测试又包括了高层测试,低层测试是为了源代码的正确性,高层测试是为了使整个系统满足用户的需求。 是一种最基础的模型,其他模型都是从这个模型演化来的。缺点:把测试作为编码之后的最后一个活动,需求分析等前期产生的错误直到后期的验收测试才能发现。W模型 测试与开发同步进行,有利用尽早的发现问题。 测试的对象不仅仅是程序,需

2017-06-03 16:56:03 866

转载 linux下线程池原理及实现

什么是线程池? 诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对

2017-06-03 10:47:32 1521

原创 套接字编程(四)-----多线程

服务器端:#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/in.h>#include<string.h>void* handleRequest(void* arg)

2017-06-03 10:23:44 407

原创 套接字编程(三)----多进程

服务器端:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/in.h>static int startup(const char *_ip,int _port){

2017-06-03 09:58:40 329

原创 套接字编程(二)-----基于UDP协议

服务器端:#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<stdlib.h>int usage(const char *proc){printf("usage:%s [lo

2017-06-03 09:54:36 334

原创 套接字编程(一)----基于TCP协议

套接字(socket):可以看做是不同主机之间的进程进行双向通信的端点,即通信的两方的一种约定,用套接字中的相关函数来完成通信过程。**socket=Ip Address+TCP/UDP+port三次握手建立连接 当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户

2017-06-02 17:29:52 924

原创 白盒测试与黑盒测试的比较

白盒测试是穷举路径测试,黑盒测试是穷举输入测试,这两种方法是基于完全不同的观点,反应了事物的两个极端,它们各有侧重和优势,但不能彼此替代。在现代的测试理念中,这两种测试方法不是截然分开的,而是交叉使用。白盒测试的优点 1、能仔细考虑软件的实现。 2、可检测代码中的每条分支和路径。 3、揭示隐藏在代码中的错误。 4、对代码的测试比较彻底。白盒测试的缺点 1、昂贵。 2、无法检测代码中遗漏的

2017-05-30 21:24:07 13837

原创 白盒测试

白盒测试 又称为结构测试或逻辑驱动测试,通过分析程序内部的逻辑与程序执行路线来设计测试用例的测试方法。属于穷举路径测试。白盒测试的方法 逻辑覆盖、符号测试、程序变异等。被测试模块及流程图如下Begin if(A>1 and B=0) then X=X/4; if(A=2 or x>1) t

2017-05-29 22:07:49 1618 1

原创 TDD

TDD:测试驱动开发(Test Driven Development),是通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD的基本思路 通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析、设计、质量控制量化的过程。TDD的原理 在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD的目的 不仅是测试软件,测试工作保证

2017-05-29 14:37:57 1851

原创 TCP首部中URG与PSH的联系与区别以及6个控制位

URG与PSH的联系与区别联系: 都是一种对数据的处理方式。区别:URG交付给进程的数据: 1、只有紧急数据; 2、紧急数据不进入接收缓冲区而直接交付给进程,余下数据要进入接收缓冲区; 3、URG是处理在前端(收到数据后立马对真正意义上”数据”进行操作,所以说”紧急”。PSH交付给进程的数据: 1、缓冲区排好序的数据及当前报文中的数据; 2、PSH是在处理的后端,告诉内核,不用等待”满了

2017-05-20 10:00:13 1586

原创 网络端口号的类型

端口 在网络技术中,端口(Port)大致有两种意思: 1、物理意义上的端口:比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等; 2、逻辑意义上的端口:一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。端口的查看 查看端口可用NETSTAT命令,以下为在win

2017-05-20 08:48:36 2304

原创 路由表条目生成算法

路由表:路由表(routing table)存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。linux下路由表的查看: Destination:目的网络地址 Genmask:子网掩码 Gateway:下一跳地址 Iface:发送接口 Flags中的U标志表示此条目有效(可以禁用某些 条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的⽹

2017-05-19 09:27:33 4604

原创 NAT技术与代理服务器

NAT技术:英文全称:Net Address Translation,即网络地址转换技术。它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。简单的说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关(可以理解为出口,打个比方就像院子的门一样)处,将内部地址替换成公用地址,从而在外部公(internet)上正常使用,NAT可以使多台计算机共享

2017-05-18 17:12:13 598

原创 链表面试题---删除倒数第k个结点、逆置单链表

要删除链表倒数第k个结点,需满足下述条件: 1、链表不能为空; 2、k不能等于0; 3、k不能大于链表的结点总数(链表长度) 删除时,应先找到倒数第k个结点,并标记该结点的前一个结点和后一个结点。 找倒数第k个结点: 1、aNode指向头结点phead,aNode在链表上走k-1步 2、bNode指向头结点phead 3、两个指针一起沿着链表走 4、aNode指向链表的尾结点时,b

2017-05-16 13:47:50 571

原创 黑盒测试

**黑盒测试:**又称功能测试。黑盒测试仅考虑程序外部结构而不考虑程序的内部逻辑结构,针对软件的功能和界面进行的测试,目的是发现软件需求或者设计规格说明中的错误。**注意:**黑盒测试仅在程序接口处进行测试,只检查被测程序功能是否符合规格说明书的要求,程序是否能适当地输入数据并产生正确的输出信息。**黑盒测试主要检测下述几类错误:**1、是否有不正确或遗漏了的功能。

2017-05-15 21:53:42 1598

原创 软件测试的定义、对象及原则

软件测试的定义:为了发现错误执行程序的过程。 软件测试的对象:需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序。 软件测试的原则: 1、尽早不断测试的原则:错误发现的越早,修正它所需的费用越少。 2、IPO原则:测试用例由测试输入数据和与之对应的预期输出结果两部分组成。 3、独立测试原则:程序员应避免检查自己的程序

2017-05-13 14:07:54 2373

原创 红黑树

红黑树:红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近视平衡。 性质: 1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 如果一个根节点是红色的,则它的两个叶子结点是黑色的(没有两个连续 的红色结点) 4. 对于每个结点,从该结

2017-05-12 20:46:08 288

原创 如何进行CRC校验

为了保证数据传输的可靠性,计算机网络传输数据时,必须采用差错检验措施,数据链路层广泛应用了循环冗余检验CRC(Cyclic Redundancy Check)的检错技术。基本原理: CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果

2017-05-11 16:52:25 21966 1

原创 精灵(守护)进程及其实现

精灵进程:也称守护进程,是运行在后台的一种特殊进程。它独⽴立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不属于任何一个会话,它自成会话,自成进程组。一般而言,后台进程永远不能退出。所有的精灵进程的父进程都是1,即所有的精灵进程都是孤儿进程。精灵进程一般以d结尾。 用ps axj 来查看精灵进程,如下: Linux大多数服务器都是用精灵进程实现的,比如 Internet服

2017-05-11 11:04:16 543

原创 链表面试题----判断一个单链表是否带环,若带环,求入口点和环的长度

题目:不用标志位,最多只能用两个指针,如何判断一个单链表是否带环? 分析:定义两个指针slow和fast,slow每次递增一步,fast每次递增两步,如果两者相遇(相等),代表该链表带环,否则没环。 具体实现: .h#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<stdio.h>#include<stdlib.h>us

2017-05-07 12:10:13 458

原创 软件错误与软件缺陷

软件错误:编写代码时有可能出现错误,这种错误叫做bug。错误在整个软件开发周期很可能扩散,需求阶段发生的错误在设计期有可能被放大,在编写代码时还会进一步扩大。 软件缺陷:缺陷是错误的结果(缺陷是错误的表现)。缺陷很难捕获。 缺陷分为错误缺陷和遗漏缺陷 错误缺陷:把某些信息输到不正确的表示中。 遗漏缺陷(更难检测和解决):在设计过程中没有输入某些正确且必要的信息。 软件错误的类型: 1、需

2017-05-06 23:25:43 5621

原创 链表面试题--两种方法逆序打印单链表(栈和递归)

方法一: 我们可以遍历链表,可是遍历链表的顺序是从头到尾,而打印(输出)链表的顺序是从尾到头。即第一个遍历到的结点最后一个输出,最后一个遍历到的结点第一个输出。这正号符合栈“先进后出”的思想,所以我们可以用栈来实现。每经过一个结点的时候,把结点放到栈中,当遍历完整个链表后,从栈顶开始逐个输出结点的值,这样就可以逆序打印出该链表了。 具体实现如下:void List::ReversePrint2(

2017-05-04 20:42:29 1558 1

原创 布隆过滤器

Bloom Filter 是一种空间效率很高的随机数据结构,Bloom filter 可以看做是对 bit-map 的扩展, 它的基本思想是: 如果判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定,但是随着集合元素的增加,需要的存储的空间越来越大,检索的速度聚会越来越慢,这时我我们会想到散列表(哈希表hashtable)的数据结构。通过一个hash函数将一个元素映射

2017-05-04 20:13:20 319

原创 面试题之位图及其相关操作

腾讯面试题: 题目:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 如果直接存储,40亿int数据如果存起来大概需要16G的空间,显然是不可能一次性存储完。 如果采用位图这种存储结构,因为一个数存在不存在只需要用两种状态就可以表示出来(1存在,0不存在),所以一个int数据有32个位,可以表示32个数据存在不存在,因此16G的数据用位图来存在

2017-05-04 17:47:23 1070

原创 Linux信号(signal)----信号产生的条件及信号的处理

信号是一种通知机制。一个进程或操作系统或用户向另一个进程发送通知事件的方式。 进程如何知道自己收到信号了,PCB里多了一个信号。 进程在没遇到信号之前就已经知道如何处理信号了,就比如小孩子在没见过红绿灯之前就已经知道红灯停绿灯行的道理。(因为记住了)。 Linux中有62个信号: 1-31号:普通信号 34-64号:实时信号 9号进程永远不会被捕捉到 键盘组合只能向前台进程

2017-04-27 16:58:38 1741

原创 Linux中的mysleep函数

第一个版本: 1、 main函数调用mysleep函数,后者调用sigaction注册了SIGALRM信号的处理函数handler。 2、调用alarm(timeout)设定闹钟。 3、调用pause等待,内核切换到别的进程运行。 4、timeout秒之后,闹钟超时,内核发SIGALRM给这个进程。 5、从内核态返回这个进程的用户态之前处理未决信号,发现有SIGALRM信号,其处理函数是h

2017-04-27 16:08:25 992

原创 二叉搜索树的插入、查找、删除等操作

二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3、它的左右子树也分别为二叉搜索树查找(key为要查找的值):if(pRoot==NULL) return false  else  若pRoot->key==key,

2017-04-20 20:30:08 433

原创 AVL树的插入以及四种旋转

AVL树:即平衡二叉搜索树。平衡因子bf=右子树的高度-左子树的高度,bf为0,-1,1时,此树即平衡。AVL树的前提是该树为二叉搜索树。 中序遍历只需遍历一次,且是有序的。 以下为四种旋转的图解 左单旋(RotateL): 右单旋(RotateR): 左右双旋(RotateLR): 右左旋(RotateRL): 具体代码如下:#de

2017-04-20 13:23:05 2035

原创 Linux环境下如何终止后台进程

这里提供两种方法来终止后台进程。 一、打开另一个终端,用kill命令发送9号信号给当前进程(已经终止,还需Ctrl+C退出)。具体如下: Ctrl+C不能终止后台进程, 如图: 使用kill命令终止该进程( kill -9 4451),如图: 二、用fg 1将该进程放到前台,然后用组合键Ctrl+C终止。具体如下: 注:如下图所示,&在这里表示该

2017-04-18 22:50:50 12154

原创 线程安全和可重入函数

线程安全: 如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和 单线程运行的结果是一样的,而且其他的 变量的值也和预期的是一样的,就是线程安全的。 在单线程运行的情况下,如果Size=0,添加一个元素后,此元素在位置0,而且Size=1;而如果是在多线程情况下,比如有两个线程,线程A先将元素1存放在位置0。但是此时CPU调度线程A暂停,线程B得到运行的

2017-04-18 21:57:33 300

转载 多线程中的并发、并行、同步、异步

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发

2017-04-07 21:27:31 325

原创 经典读者写者问题

读者:只读数据区中的数据 写者:只往数据区中写数据 要求: (1)允许多个读者同时执行读操作; (2)不允许读者、写者同时操作; (3)不允许多个写者同时操作。 在编写多线程的时候,有种很常见的场景,就是公共数据被修改的机会比较少(即写的几率小),相对写,读的几率反而高,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极⼤大地降低我们程序的效率。故引入读写锁来解决多

2017-04-07 18:49:37 571

空空如也

空空如也

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

TA关注的人

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