自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HTTP协议状态码部分整理

前段时间面试被问到HTTP协议的状态码,结果有一个没有回答上来,现在整理一下,虽然不一定能在后面的面试中能完整的说出来,但至少得保证能记得重点。 HTTP协议状态码在HTTP响应报文中出现,其职责是当客户端向服务器端发送请求时,描述返回的请求结果。用户可以借助状态码知道服务器是正常处理了客户端的请求还是出现了错误。 HTTP常见的状态码如下(HTTP状态码有很多,这里只列出常见的状态码): ...

2018-08-21 10:31:35 353

原创 求第N个丑数

原问题描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。这个题不是很难,基本上看完题就能想出解法,但是要想出时间复杂度为O(N)的解法还是有点难度的。我最开始的解法时间复杂度为O(NlgN),后来在网上看到更好的解法时间复杂度为O(N),感觉解法很好,因...

2018-07-16 20:55:35 986

原创 Linux下xargs工具的使用

xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它能够将标准输入或管道中的数据转换为特定命令的命令行参数,也可以将单行或多行文本输入转换为其他格式的数据,比如单行变多行或者多行变单行。xargs的默认命令是echo,默认分隔符是空格。通过xargs的处理,换行和空白都会被替换为空格。 使用效果:(默认为将多行转换为一行) 常使用选项: 1、-n 选项:指定列数...

2018-07-06 16:53:46 6145

原创 Linux下cut工具的使用

cut命令从文件的每一行剪切字节、字符和字段,并写至标准输出,如果不指定file参数cut命令将读取标准输入,使用cut命令时必须指定-b、-c或-f之一。常用选项: 1、-b 选项:以字节为单位进行分割 使用效果: 2、-c 选项:以字符为单位进行分割 使用效果: PS:-b与-c的区别: -b选项是以字节进行分割,因此在显示多个字节构成的符号时就可能会出错,比如用-b分...

2018-07-05 17:42:11 1036

原创 Linux下paste工具的使用

paste工具主要用于将多个文件的内容合并输出,合并动作为按行将不同文件的行信息放在一行,默认情况下不同文件的数据用空格或tab键进行分隔。 使用效果:paste file1 file2 ...常用选项: 1、-d 选项:指定域分隔符,即指定分隔来自不同文件或不同列的行的分隔符 使用效果: 2、-s 选项:将每个多行文件合并为一行,默认用空格或tab键分隔,可用-d选项...

2018-07-05 17:10:03 2516

原创 Linux下uniq工具的使用

uniq工具作用效果为消除相邻的重复行,如果重复行不在相邻位置则不会消除。因此uniq一般与sort工具一起使用,作用效果与sort工具的-u选项类似。 使用效果:uniq file常用选项: 1、-c 选项:输出时,在行首显示本行在文件中出现的次数。 使用效果: 2、-d 选项:只显示重复行,不重复的则不输出 使用效果: 3、-u 选项:只显示文件中不重复的行,重...

2018-07-05 16:38:08 512

原创 Linux下sort工具的使用

sort命令的默认作用是将文件以行为单位进行比较,然后按照升序输出。比较原则为从首字符向后,按ASCII码值逐个进行比较。 看效果:sort file常见选项使用: 1、-r 选项:将排序后的结果降序输出 使用效果: 2、-u 选项:在输出行中,去除重复行 使用效果: 3、-n 选项:sort默认以ASCII码进行比较,而-n选项则以每行中字符前的数字字符的数值进...

2018-07-05 15:51:31 1051 1

原创 网络基础大致框架

一、网络发展——从单机模式到网络互连模式 1、单机模式(独立模式):计算机之间相互独立 2、网络互联:多台计算机连接在一起,完成数据共享。 3、局域网(LAN):计算机数量更多,通过交换机和路由器连接在一起。 4、广域网(WAN):将距离很远的计算机连在一起。 二、网络协议 协议:某种大家都遵循的“约定”。 1、协议分层的优点 (1)各层之间相互独立。 ...

2018-06-22 21:19:42 10396

原创 多行打印二叉树

在此代码中,用到了两个队列,队列1用于进行打印、遍历操作,队列2用于临时保存数据,代码如下:vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > v; if(NULL == pRoot) return v; ...

2018-06-21 22:15:39 143

原创 TCP性能提高措施

1、滑动窗口 在确认应答机制中,接收方每接收到一个数据段,都要给发送方发送一个ACK应答报文,发送方在接收到应答报文后才继续发送下一个报文段,这样可保证数据传送的可靠性。但是这样做性能较差,尤其在数据往返时间较长的时候。 TCP中引入了滑动窗口机制,只要数据处于这个滑动窗口中,就可以在上一个数据段未收到确认时依然将后面的数据发送出去。这样就可以一次发送多条数据,就大大的提高了性能(其实是将多个...

2018-05-30 20:20:03 3553

原创 TCP可靠性的保证机制总结

TCP保证可靠性主要依靠下面7种机制: 1、检验和 TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正...

2018-05-28 23:33:44 30770 3

原创 TCP概略

一、TCP报头结构 源端口与目的端口:各占2byte,标识源进程与目标进程。 序号:占4byte,TCP连接传送的字节流中每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在创建连接时设置。这里的序号指本报文段所发送的数据的第一个字节的序号。 确认序号:占4byte,期望收到对方下一个报文段的第一个数据字节的编号。代表确认序号之前的数据都已经收到。 数据偏移:占4bit,实际上是...

2018-05-28 20:40:11 281

原创 http服务器的简单实现

server.c:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h...

2018-05-27 12:53:19 303

原创 多进程TCP服务器的简单实现

服务器端: server.c:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netin...

2018-05-27 12:47:35 472

原创 多线程TCP服务器的简单

以下为多线程TCP服务器端与客户端进行简单数据传输的实现: 服务器端:server.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <unis...

2018-05-27 12:44:10 1270

原创 一级空间适配器的模拟实现

一级空间适配器适用于申请空间超过128byte的情况,可以用包装malloc的方法申请空间,也可以用包装realloc的方式改变空间大小,同时也做出了内存空间不足时的措施——释放旧空间。 实现如下:template <int inst>class _Alloc{public: static void *Allocate(size_t size) { ...

2018-05-23 13:24:24 196

原创 UDP服务器的简单实现

服务器端:#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#include <sys/types.h>#define ERR_EXIT(m) \ ...

2018-05-23 13:12:10 1118

原创 UDP总结

一、UDP首部 端口号:用于标识收发进程。 UDP长度:包括UDP头部字节长度和UDP数据字节长度。最小为8字节,最大为64k,超过64k则分包多次发送。单位为字节。 UDP检验和:UDP检验和是可选的,当不用校验和时用0填充。二、UDP传输特点: a、无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;减少了开销和发送数据之前的时延。 b、不可靠:UDP使用尽最大努力...

2018-05-23 12:59:42 1001

原创 数据库的操作

在mysql安装好后,在命令行中可使用指令mysql -u root -p进行连接: PS:在mysql中建议关键字使用大写,因此文中的关键字都尽量使用大写。首先查看有哪些数据库:SHOW DATABASES; 进入某个数据库:USE db_name; 查看数据库中的表:SHOW TABLES; 接下来进程库的操作。 数据库的操作有...

2018-05-05 22:56:46 220

原创 图的深度优先搜索

图的深度优先搜索与广度优先搜索相对应,其思想是先在一条路径上走到终点,然后再回过头走其他路径。如果图中有n个节点,e条边,那么用邻接表存储的图的时间复杂度为O(n+e),用邻接矩阵存储的图的遍历时间复杂度为O(n^2)。 这里实现了用邻接表存储的图的深度优先搜索:void DFS() { size_t size = _v.size(); if(size...

2018-04-26 16:34:43 212

原创 图的广度优先搜索

图的搜索方法有广度优先与深度优先搜索方法。这里给出广度优先搜索。 广度优先搜索即先遍历完同一层次的元素,然后再遍历下一层次的元素。用邻接表存储的图的广度优先遍历时间复杂度为O(e),使用邻接矩阵存储的图的广度优先方法时间复杂度为O(n^2)。 给出广度优先搜索代码:void BFS() { size_t size = _v.size(); if(...

2018-04-26 16:21:38 340

原创 图的存储结构

这里实现图的两种存储结构——邻接矩阵与邻接表。 邻接矩阵 用邻接矩阵存储图需要用到两个数组——一个存储元素的一维数组和一个存储图关系的二维数组。其实现代码:template<typename V, bool IsDigraph = true>class Map{public: Map(const string str = "") { s...

2018-04-26 15:21:45 174

原创 死锁的产生及其解决方法

死锁的书面定义:一组相互竞争系统资源或进行通信的进程间的“永久”阻塞。 死锁原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他被阻塞进程才能触发该事件,这时就称这组进程发生了死锁。 一种死锁情况: 死锁的必要条件: 1、互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。 2、占有且等待:当一个进程等待其他进程时,继续占有已经分配的资...

2018-04-24 23:10:19 1950

原创 排序算法之基数排序_LSD

基数排序是非比较排序的一种,LSD是基数排序的一种,又称为最低位优先,其基本思想是先按最低位关键码的大小将元素放入一个桶中,然后取出再按次低位的大小执行前面操作,直到最高位为止。LSD的时间复杂度为O(MN)(M为最大的数的位数),空间复杂度为O(N)。 实现:#include <vector>int Pow(const int& left, const int&...

2018-04-21 10:46:38 1665

原创 排序算法之计数排序

计数排序的思想特别简单,就是记录下序列中每个元素出现的次数,然后根据保存次数的下标及出现次数将元素放回原数组。时间复杂度为O(N+数据范围),空间复杂度为O(最大数-最小数)。 代码实现:#pragma onceint FindMax(int *array, const int size){ assert(NULL != array && size >...

2018-04-19 16:59:07 201

原创 进程间关系

一、进程组:一个或多个进程的集合。通常,它们与一作业相关联,可以接收来自同一终端的信号。每个进程组有唯一的进程组ID。每个进程有一个组长进程,其进程ID就是进程组ID。 组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要进程组中有一个进程存在,进程组就一直存在,与其组长是否存在无关。 用代码创建一个进程组:#include <stdio.h>#include &...

2018-04-15 23:21:23 2759

原创 进程信号的捕捉

信号递达时有三种方式: 1、忽略。 2、按默认方式处理。 3、自定义处理。 如果信号的处理是自定义的,当信号递达时就调用某个用户自定义函数,这就是信号的捕捉。 当然,必须要用系统调用通过内核来实现信号捕捉。信号捕捉的整个过程: 要捕捉某个信号,首先要注册这个信号的处理函数,在以前通常会用signal函数,其函数原型为:void (*signal(int signo, void ...

2018-04-14 17:10:43 1325 1

原创 进程信号的阻塞

先给出几个与信号有关的概念: 1、实际执行信号的处理动作称为信号递达(Delivery)。 2、信号从产生到递达之间的状态,称为信号未决(Pending)。 3、进程可以选择阻塞 (Block )某个信号。 4、被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执⾏行递达的动作。 PS:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的⼀种处理动作。 ...

2018-04-13 20:33:40 1142

原创 读写锁与读写者模型

在多线程编程中,有时候修改公共数据的情况比较少,而读取数据的情况比较多,这就是读写者模型了。读写者模型中的“321”: 三种关系——写者与写者之间为互斥关系,写者与读者为互斥同步关系,读者与读者之间无关系。 两种角色——读者与写者。 一个公共场所。 用读写锁可以很好的解决读写者问题。读写锁是一种自旋锁,其行为有: 读写锁接口: 初始化与销毁:#include <pthre...

2018-04-13 17:50:08 322

原创 排序算法之归并排序

归并排序即用两两归并的方式进行排序,其基本思想是将数组两两划分,当划分到区域中只有一个元素时返回上一级进行两个区域的归并,这样反复归并就可得到一个有序序列。归并排序的时间复杂度为O(nlgn),空间复杂度为O(n)。 代码实现:#include "compare.hpp"template <typename T>static void _conflation(T *arra...

2018-04-12 22:28:47 160

原创 POSIX信号量实现生产者消费者模型

POSIX信号量与System V信号量作用相同,都用于同步操作,达到无冲突的访问共享资源的目的,但POSIX信号量可用于线程间同步。 初始化信号量:#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);参数:pshared:0表⽰示线程间共享,⾮非零表⽰示进程间共...

2018-04-12 21:35:42 1306

原创 生产者消费者模型

在生产者消费者模型中,生产者之间为互斥关系,消费者之间也是互斥关系,而生产者与消费者既有互斥关系又有同步关系。在这里用互斥量与条件变量来实现生产者消费者模型:#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <stdlib.h>#include &lt...

2018-04-10 17:52:36 112

原创 Linux多线程互斥与同步

有些变量被多个线程共享,这样的变量被称为共享变量,在程序中,可以通过共享变量来完成线程间的交互。但是多个线程在用共享变量进行交互时,常常会出现某些问题。来看下面代码:#include <stdio.h>#include <pthread.h>#include <sys/types.h>#include <stdlib.h>#inclu...

2018-04-10 16:26:33 342

原创 排序算法之选择排序2—快排

快速排序也叫分区排序,其基本思想是在特定范围内对于某个基准值,将小于这个基准值的元素全部移到这个值的前面,大于这个值的元素全部移到这个值的后面,然后再对前后范围的元素递归进行分区,最终得到一个有序序列。快速排序的时间复杂度为O(nlgn),空间复杂度为O(lgn),当数组元素数量较大时,快速排序要比其他排序都要好,但是当数量级较小时,快速排序的性能可能没有其他排序好。 下面给出快排的实现:...

2018-04-09 21:09:37 149

原创 Linux多线程之创建、终止、等待和分离

线程创建函数:#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);参数thread:返回线程ID。attr:设置线程的属性,attr为NULL表⽰示使⽤用默认属性。star...

2018-04-09 20:44:56 398

原创 Linux下的多线程概念

线程是进程内部的执行单位,一个线程即使进程内的一个执行流。对于线程,每个系统的实现可能不一样,在Linux中,线程也叫轻量级进程,操作系统没有把线程与进程明显的区分开,它们的数据结构是一样的,都是task_struct。在进程资源分配时,以进程为单位进程分配;而在调度时,则以线程为单位。可以这样理解,代码最初被加载进内存中时,系统会给这些代码分配一系列资源,这样就创建了一个“进程”,而进程内部可能...

2018-04-07 15:44:05 324

原创 进程信号的产生

信号是信息的载体,发送某种信号即是发送传递某种信息。这里的进程信号是指软件中断,它提供了一种处理异步事件的方法。 在Linux中,我们可以用kill -l 命令查看有多少信号: 可以看到有62种信号,其中1~31号信号是普通信号,34~64属于实时信号,这里仅讨论普通信号。 不同的信号有不同的产生方式,可分为这么几类: 1、用户在终端按下某些按键时,终端驱动程序会发送信号给前台进程,...

2018-04-05 23:49:46 672

原创 说说进程

进程表述 书上对进程的叙述有很多,程序的执行实例或者正在运行的程序等,这些都是关于进程的表述;而对于内核来说是当担系统资源分配的实体。 可以想一下,当我们为执行某个功能而写一个程序后,这个程序是怎么变成一个进程的呢? 当程序被加载到内存中,从第一条指令开始执行,仅仅有代码是不能完成指定功能的,在执行过程中它需要一系列的资源(比如CPU、内存等),而操作系统又是怎么保证程序按照顺序执行的呢?操...

2018-03-30 21:58:31 188

原创 fd与FILE的比较

Linux中一切皆文件,这句话我们都知道,可见文件的重要性,因此文件的管理在Linux中占据了很大比重,那么操作系统怎么管理文件的呢? 要管理一个东西,那么必须经历两个步骤——描述和组织。当我们打开一个文件时,系统就会生成一个叫做file的结构体,系统正是用这个file结构体来描述单个文件的;既然已经描述了那么就要组织起来了,系统就会用一个数据结构把所有的文件都组织在一起以方便管理,而我们的进程...

2018-03-30 11:16:51 1587

原创 排序算法之交换排序1——冒泡排序

冒泡排序算法是一种简单的排序算法,它是稳定的,其时间复杂度为O(N^2),空间复杂度为O(1),一般而言不会用到这种排序方法,但这是初学者必学的排序方法之一。 算法代码实现:template <typename T>void BubbleSort(T *array, const int size){ assert(NULL != array && ...

2018-03-29 10:13:26 246

空空如也

空空如也

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

TA关注的人

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