- 博客(86)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 对一个注册页面编写测试用例
这个题是我在面试的时候被问到的,当时回答的特别不好,现在总结一下: 需求:如下图所示(两个文本框,一个注册按钮) 首先,要对这个问题进行需求分析。要问清楚注册按钮点击后是进行跳转还是只在本页面之中进行显示。对于用户和密码的长度的限制是多少…… 功能测试 1. 用户为空,密码为空,能否注册。(边界值+等价类) 2. 用户为空,密码不为空,能否注册。 3. 用户不为空,密码为空...
2018-08-30 10:23:19
11619
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 解决频繁I/O之select以及select+TCP的服务器代码实现
select的特点:可监视的文件描述符的个数有上限,取决于sizeof(fd_set),每一个bit表示一个文件描述符. select的缺点(就是epoll的优点): 1. 每次调用select,都要手动设置fd_set的集合,使用很比方便. 2.每次调用select,都要把fd_set集合(3个集合,读,写,异常)从用户态拷贝到内核态,那么如果频繁的调用s...
2018-07-25 21:59:10
588
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 epoll的工作原理和使用场景
对比epoll和select,就会发现select的缺点恰恰都是epoll的优点.下面进行epoll的学习:epoll的相关系统调用的函数:1.创建一个epoll句柄(即是一个文件)int epoll_create(int size);返回值:epoll_create的返回值是一个文件描述符.参数:在现在的使用中,size没有什么意义,可以随便填写2.epoll事件的添加...
2018-07-24 21:59:16
3358
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 线程的同步与互斥,消费者生产者,POSIX信号量,读者写者
mutex(互斥量)在大部分情况下,线程使用的数据都是局部变量,那么变量的地址空间在线程栈的空间内,这样的变量属于单一线程,而其它的线程是无法访问的.那么,线程间通信就是要访问相同的资源,从而完成线程间的交互. 可是,很多个线程并发的操作某个资源时,就会带来一些问题: 例如:下面是一个简单的购票系统.#include <stdio.h>#include<stdl...
2018-06-30 17:35:48
477
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 进程间关系和守护进程
进程组,作业,会话进程组:是一个或者多个进程的集合。每个进程组有一个唯一的ID。每个进程组都有一个进程组组长。区分进程组组长:组长进程的ID与进程组ID相同。若kill了进程组长,并且如果该进程组中还有其它进程,那么该进程组就依然存在。 查看进程组的指令:ps axj | grep 可执行文件 例: fork(); while(1) {} 查看结果:将进程变...
2018-06-25 13:45:50
196
原创 shell学习笔记(一)
shell 是什么? shell 是用 C 语言编写的程序。它是用户与 Linux 之间的桥梁。是一种与内核沟通的外壳应用程序。什么是 shell 脚本? 是一种为 shell 编写的脚本程序。shell开发环境 shell与python相似,只要有一个文本编辑器和脚本解释器即可。 在Linux中使用的最广泛的shell解释器就是bash了。 shell与bash的关系?...
2018-09-02 00:10:59
288
原创 位图&&布隆过滤器
经典题【给40亿个无符号的且无序的不重复的整数,如何判断一个数是否存在于这40亿个整数之中。】 分析:40亿整数:也就是40*4 = 160亿字节,也就是需要16G的内存才可以将这40亿的整数存储。显然当代我们的计算机并不能达到这样的要求,为了解决这样的问题,我们就要想其它的方法。我们的目的是为了判断一个数是否存在,所以,我们就可以将问题简化,只需要1位表示0和1就可以判断一个数是否真正的存在。...
2018-08-04 20:49:48
277
原创 哈希之开散列和闭散列
目的:实现一种结构,不经过任何比较,一次直接得到想要的元素。通过某种函数使元素的存储位置与它的关键码之间建立一种一一映射的关系。那么就可以在查找时快速的找到需要的元素。哈希概念哈希之散列方法:插入元素时:根据需要插入元素的值,通过某种计算得出元素的存储位置,将该元素插入到其对应的位置。查找元素时:根据需要查找的元素进行某种计算得到其存储位置,将该位置的元素与查找的元素进行比...
2018-08-03 15:36:28
8315
原创 对于大数据的一些处理方法
问题:数据太大,在内存中无法一次性装入。题1:给定一个大小超过100亿的文件,该文件是用来存储IP地址,找到出现次数最多的IP地址。 分析:100亿就是大约就是10G,对于现在的计算机而言,内存中无法容纳这么大的文件。 解决:将一个大文件切分为多个小文件,例如:我们可以将该100亿的大文件切分为1000个文件,即每个文件的大小大约就是10M,那么就可以在内存中容纳得下了。 那么,我们要怎...
2018-08-02 16:17:55
4513
原创 非阻塞IO(将文件描述符设置为非阻塞)
我们知道,所有的套接字都默认是阻塞IO.那么怎么将其改为非阻塞呢? 有一个函数fcntl,就可以将其设置为非阻塞.#include &lt;fcntl.h&gt;int fcntl(int fd,int cmd,...);参数cmd一般有一下几种方式: - 复制一个现有的文件描述符(cmd = F_DUPFD) - 获得/设置文件描述符标记(cmd = FGGETFD/FSE...
2018-07-24 11:48:56
2385
2
原创 五种IO模型
IO:可以理解为将数据从外设到内存,从内存到外设的转移. IO通常分为两步:①等待数据准备好(可能大部分的时间都是在等待数据准备就绪的过程)②将数据进行拷贝. 所以提升IO效率:尽量减少等待数据的时间. 下面就是常见的5中IO模型. - 阻塞IO:在内核数据准备好之前,其系统调用函数会一直等待.(注意:所有的套接字,默认都是阻塞方式)阻塞IO中,调用者在等,也会亲自去调用.(同步IO) ...
2018-07-21 21:48:52
277
原创 软件测试之基础篇
软件测试的生命周期生命周期: 需求分析-&gt;测试计划-&gt;测试设计-&gt;测试开发-&gt;测试执行-&gt;测试评估 在这里与软件开发的周期进行类比学习,其实就是V模型.描述bug合格的bug包含: 1.发现问题的版本. 2.问题出现的环境(查看项目的支持版本,测试的环境不同可能结果也会不同). 3.错误重现的步骤(类比测试用例的步骤). 4.预期行为的描述(需...
2018-07-14 12:07:08
400
原创 快速排序算法(快排)
基本思想:快排也是一种分治的思想.从一个数组中选择一个数作为基准值(基准值一般为数组的最后一个元素或者第一个元素).遍历数组,如果大于基准值的放在基准值的右边,小于基准值的放在基准值的左边.对左右两个部分再执行第二步,直至每个区间只有一个元素为止.方法1:交换法遍历数组,找到第一个大于基准值的元素停下来;然后从数组的后面从前遍历,找到第一个小于基准值的元素停下来;然后交换找...
2018-07-10 11:37:33
352
原创 归并排序(递归与非递归实现)
归并排序:采用的是一种分而治之的思想. 过程:将一个数组进行二分,直到有每组有一个元素为止.然后进行合并元素,按照一定的顺序进行排序. 代码实现: ①:递归实现void Merge(int arr[],int left,int mid,int right,int tmp[]){ if(right - left &lt;= 1) { return; ...
2018-07-08 23:57:30
252
原创 堆的相关操作以及堆排序
堆:它的物理结构可以看做是数组,而逻辑结构可以看做一颗完全二叉树. 堆有大堆和小堆之分:大堆:根节点是当前所有元素中的最大值,而对于每一个子树,其子树也是一个大堆.小堆:根节点是当前所有元素中的最小值,而对于每一个子树,其子树也是一个小堆.堆的应用: 堆还可用来表示优先级队列.队列:即只允许队列的队首进行删除,而队尾进行插入.而优先级队列就是一组有序的队列.在堆中,进行插入和...
2018-07-06 14:44:38
340
原创 插入排序
对于插入排序,我理解的原理是这样的(假设是升序): 第一个元素不用排序,从第二个元素开始,与前面的元素比较,如果小于前面的元素就把前面的元素赋值给后面的元素. 前两个元素排好序以后,紧接着与第三个元素进行比较将这三个元素进行排序. …….. 如下图所示: 代码如下:void InsertSort(int arr[],int size){ if(size &amp;lt;= ...
2018-07-04 23:31:31
238
原创 传输层协议之TCP
TCP:传输控制协议 首先我们来看看TCP的协议格式: 源/目的端口号表示数据从哪个进程来去哪个进程.32位序号/32位确认序号:在数据传送时标识数据的发送端已发送的和接收端确认消息收到后确认的对应的数据.4位TCP报头,在图中已经给出解释.6个标志位 ①URG:紧急指针是否有效 ②ACK:确认号是否有效 ③PSH:提示应用程序接收端立刻从TCP缓冲区把数据读走. ④RST...
2018-07-04 21:59:05
399
原创 选择排序
原理: 比如现在是升序排序:那么每次都是在寻找当前剩余元素中的最小值,找到后与当前元素交换. 如下图所示: 代码实现: 是一个升序的代码: 3 void swap(int* a,int* b) 4 { 5 int tmp = *a; 6 *a = *b; 7 *b = tmp; 8 } 9 void SelectSort(int...
2018-07-03 20:24:47
177
原创 传输层协议之UDP
端口号端口号的范围划分: 范围 0~1023 知名端口号:一些著名的协议,它们的端口号都是固定的. 1024~65535 普通端口号:操作系统动态分配的端口号.例如:客户端程序的端口号,就是由操作系统从这个范围分配的常见的著名端口号:ssh服务器:22号端口ftp服务器:21号端口telnet服务器:23号端口http服务器:8...
2018-07-01 21:59:17
753
原创 应用层HTTP协议----超文本传输协议
HTTP是一个属于应用层的协议,它是基于TCP实现的服务器/客户端的模式,客户端发送请求,服务请响应请求.认识URLURL:网址. 例如:下面这个图中的网址其实是一个标准的网址 而我们现在的看到的网址基本都是这样的:https://www.baidu.com/s?wd=%E5%A4%A7%E8%92%9C%E7%9A%84%E8%8B%B1%E6%96%87&amp;amp;amp;amp;amp;rsv...
2018-07-01 15:53:59
802
原创 Python之基础语法(一)
语句1.一个语句如果过长,可以用\来换行 例如:x = 10y = 20if x == y \ or \ x &amp;amp;amp;amp;amp;amp;gt; y: print Trueelse: print False2.如果语句中由括号括起来,那么就可以用直接换行 例如:a = { 'like':'fruit', 'unlike'...
2018-06-30 09:11:15
399
原创 Python快速入门
Python是一门解释型语言. Python的特点: 1.语法简单,表达能力强. 2.解释运行:Python解释器一行一行的读取源代码,每读取一行就执行一行.实现过程:Python按行读取源代码,然后将源代码转为”字节码”供Python解释器执行,此时就会生成一个.pyc文件.所以当已经存在了.pyc文件后,如果删掉了.py文件同样可以执行程序. 3.跨平台:Python...
2018-06-26 21:58:35
478
原创 基于C++的单例模式
单例模式是一种设计模式. 单例模式表示在定义的某一个类中,只能有唯一的一个对象(即只能有一个实例). 优点:提高了封装性,外部不能轻易的改变实例.饿汉模式含义:程序启动后就会立即加载到内存. 缺点:启动比较慢. 代码如下:#include &lt;iostream&gt;using namespace std;template&lt;class T&gt;class...
2018-06-23 23:54:44
150
原创 C++之迭代器失效及解决
迭代器失可能会导致野指针,可能会引起漏删或者插入时出错.list中的迭代器失效在标准库中,list是带头双向不循环链表. 场景一:删除链表中所有的偶数节点 7 list&amp;lt;int&amp;gt; l; 8 l.push_back(0); 9 l.push_back(1); 10 l.push_back(2); 11 l.push_ba...
2018-06-20 21:59:33
2168
原创 C++之STL六大组件以及vector在标准库的使用以及模拟标准库的vector实现
STL六大组件: 1.容器(存放数据) 2.算法 3.迭代器(封装) 4.空间配置器 5.配接器(适配器) 6.仿函数 问题1:如何释放vector的空间? 解决:创建一个空的临时对象,然后将临时对象赋值或交换....
2018-06-20 13:28:22
311
原创 C++思维导图
C++大总结 基础知识请戳 基础知识 类和对象请戳 继承请戳 多态及多态的原理请戳 模板请戳 异常请戳 智能指针请戳智能指针 强制类型的转换请戳 动态内存管理请戳...
2018-06-18 21:59:02
1299
原创 C++中四种强制类型的转换
在C语言中,有隐式类型的转换和强制类型的转换. 隐式类型的转换:相关类型的转换,即意义相似的类型. 强制类型的转换:不类型类型的转换,比如:指针和整型. 例如:int i = 20;double d = i;//隐式类型的转换.int* p = (int*)i;//强制类型的转换.以下是C++的类型转换的四种类型.它们都是类模板.static_case(静态转换)不可以用...
2018-06-18 09:50:26
18313
1
原创 C++智能指针之Scoped_Ptr与SharePtr以及仿函数
Scoped_Ptr(防拷贝)上一篇博客中已经讲述了智能指针之AutoPtr,它存在很大的缺陷.所以有一种更粗暴的方法——Scoped_Ptr. Auto_Ptr出现的问题都是由于进行拷贝构造和赋值运算符重载引起的资源不能得到有效的释放.那么就直接不要进行拷贝构造和赋值运算符重载,那么就不会引起那些问题了. 下面是简单的代码实现: 1 #pragma once ...
2018-06-17 18:24:44
441
原创 C++智能指针之AutoPtr
在学习异常的时候,异常有一个很大的缺陷,就是异常会导致执行流乱跳.从而可能会导致某些资源没有被及时得到释放等等问题. 例如这样的问题: 1 #include &amp;amp;lt;iostream&amp;amp;gt; ...
2018-06-16 21:36:44
273
原创 Linux之进程间通信之消息队列,共享内存,信号量
消息队列消息队列的结构有很多,但在这里讲的队列的结构都是基于链表实现的.进程间通信的实质是:让不同的进程可以看到相同的资源.消息队列的特点:消息队列的通信是通过发送有类型数据块的方法.每个数据块都有一个类型,接收方接受的数据块可以有不同的类型值.所以:消息队列提供了一个进程向另一个进程发送了有类型数据块的方法.实现消息队列的相关函数:#include &amp;amp;lt;sys...
2018-06-14 21:59:05
824
原创 Linux之进程间通信(一)---管道
进程是一个独立的资源分配单位,每个进程的资源都是独立的,有独立的用户地址空间,当有多个进程同时存在时,当有一个进程突然出现异常时,其它的进程是不受影响的.那么,有时候就需要不同进程的信息进行交换或传递才可以工作.所以就出现了进程间通信.进程间通信的目的:数据传输:一个进程需要将它的数据发送给另一个进程.资源共享:多个进程之间共享同样的资源(比如:共享同一段内存).通知事件:一个进...
2018-06-12 00:08:12
345
2
原创 线程-----线程概念,线程创建,线程终止,线程等待,线程分离
线程的概念在生活中,我们在使用电脑时,可以同时使用多个软件,比如:在写代码的同时,还可以听着音乐.即使有一个CPU,也可以同时进行多个任务. 更充分的利用多核CPU:可以将一个任务分给几个CPU然后同时进行. 线程:是一个进程内部的”控制序列”. 任意进程至少有一个线程. 特点: 1.线程是操作系统进行调度的最小单位. 2.一条线程指的是一个单一顺序的控制流(一个进程...
2018-06-08 21:59:19
347
原创 Linux信号的产生,处理
信号的概念: 在日常的学习中,当一个进程在执行时,按下crtl-C时就会产生一个硬件中断.(这也是一种信号)整个过程如下: 信号的产生:通过键盘 Core Dump: Core Dump其实是指一个文件,当一个进程因为异常终止时,可以将进程的内存数据全部保存到磁盘中,文件名通常就是core,所以这就是Core Dump.并且可以通过调试这个文件来查看我们的错误原因,这种方式叫...
2018-06-08 21:59:01
694
原创 C++之异常
错误处理的方法: 1.程序终止.(例如assert断言,Linux中的段错误等) 2.返回错误码. 3.返回一个合法值,不至于让程序崩溃.(例如:服务器程序) 4.异常,返回错误信息. 异常:当一个函数发现自己无法处理的错误时就抛出异常,让程序员可以直接或者间接的去处理这个问题.#include&lt;iostream&gt;#include&lt;vector&gt;using...
2018-06-01 21:59:20
659
原创 文件的读写使用,重定向,文件描述符
调用系统函数进行文件的读写 打开文件: int open(const char* pathname,int flags); int open(const char* pathname,int flags,mode_t mode); //mode:当打开的文件不存在时,就要在打开文件的同时并创建文件,那么就需要设定文件的权限. flags:打开文件的选项:若同时需要...
2018-05-18 19:49:12
698
原创 浅谈模板函数和模板类以及不使用乘除,for,while,等循环和递归来计算1+2+3+4+....+n的值
模板函数概念:一种与类型无关的代码. 作用:复用. 下面通过一个实例来实现:template&amp;amp;amp;amp;amp;lt;class T&amp;amp;amp;amp;amp;gt; //类比函数参数,但是模板参数传递的是类型T Add(T a,T b){ return a + b;}int main(){ int a = 10; int b = 20; cout&amp;amp;
2018-05-14 13:05:01
694
1
原创 C++之多态的实现以及虚表
在C++中,多态:见名知意,就是多种形态.虚函数的主要作用就是实现多态,就是父类的指针/引用调用重写的虚函数,当父类的指针/引用指向父类对象时调用的是父类的虚函数,指向子类时指向子类的虚函数.多态的实现原理在有虚函数的对象实例中都存在一张虚函数表(简称虚表),而虚表中存放的则是实际应该调用的虚函数. 下面我们通过代码来模拟查找一下:...
2018-05-10 11:14:47
747
原创 进程创建,进程等待,进程终止,进程的程序替换
进程创建fork()函数: 在原来的博客中已经写过一次进程创建了,在这儿就详细讲解一下进程是怎么创建的. 已经知道,在Linux中,创建进程可以通过调用fork函数来实现,那么当我们在调用fork函数时,操作系统内部到底是怎样实现的呢?fork()函数在内部通过已经存在的进程创建出一个新进程,而新进程就是子进程.#include&amp;amp;lt;unistd.h&amp;amp;gt;pid_t for...
2018-05-05 16:55:45
305
原创 基于Linux的MYSQL,基本的操作
数据库的作用:高效的存储和处理数据的介质(主要指内存和磁盘). 1.连接数据库mysql [地址] [用户] [密码] [端口](-P,如果连接的是主机就可以省略)mysql -h 127.0.0.1 -u root -p //后面的可以省略mysql -h 127.0.0.1 -u root //可以连接mysql -h 127.0.0.1 //可以连接...
2018-05-02 10:40:57
233
原创 虚拟存储器
如果没有虚拟存储器,可能会带来这些问题: 1.所有的进程都共享CPU和主存资源。所以当进程太多,太大,而导致内存无法容纳时,就无法运行该进程。 2.存储器很容易被破坏,当一个程序不小心写了另外一个进程使用的存储器时,那么进程可能就会以一种奇怪的方式而终止。 为了更加有效的管理存储器且少出错,就出现了虚拟存储器。虚拟存储器为每个进程都提供了一个大的,一致的,私有的地址空间。 虚拟存储器:将内...
2018-04-30 17:57:30
433
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人