自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP中的四个计时器

重传计时器(Retransmission Timer)当TCP发送报文后,就对此报文设置一个重传计时器,此时有两种情况在规定时间内成功收到对方的确认,就撤销该报文的重传定时器到了规定时间仍然未收到对方的确认,则认为该报文丢失,重新传送该报文,并将计时器时间复位坚持计时器(Persistent Timer)我们都知道TCP中有流量控制机制,当TCP的接收端宣布接收窗口为0时,发...

2018-07-30 12:05:13 803 2

原创 合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4创建一个新链表,循环比较两个原链表的值,每次将较小的值插入到新链表中,最后再将某个链表中剩余的部分整个插入到新链表中,这个方法好想...

2018-07-30 11:12:52 275

原创 重建二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路二叉树的前序遍历顺序是根节点、左子树、右子树 中序遍历顺序是左子树、根节点、右子树前序遍历结果中首元素肯定是二叉树的根节点,要...

2018-07-30 09:54:21 276

原创 Cookie和Session机制

会话跟踪会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。因为Http是无连接的,服务器并不能通过连接状态来确定用户信息,所以引入了Cookie和Session机制来确定用户,Cookie在客户端保存用户信息,Session在服务器保存用户信息。什么是Cookie和Session?Cookie机制:Cookie是客户端的解决方案,通过在客户端保存用户信息,方便下次访问某站点...

2018-07-28 11:01:11 279

原创 TCP提高性能的举措

滑动窗口对于每一个发送的数据段,都要给一个ACK确认应答,收到ACK后才可以发送下一个数据段,这样未免效率太差,所以TCP中引入了滑动窗口机制。 如上图所示,发送前4000字节数据的时候不需要收到任何回应,当收到一个ack后,滑动窗口就往后移动一个报文的长度,但是窗口大小是不变的窗口大小指的就是无需等待回应就可以发送数据量的最大值,上图中的窗口大小就是4000字节当发送完前4...

2018-07-06 01:31:56 473

原创 大量TIME_WAIT的解决方案

TIME_WAIT状态是主动断开连接的一方产生的,客户端处于TIME_WAIT状态的话问题不大,如果服务器产生大量TIME_WAIT状态的连接,就会大大降低服务器的响应速度等性能问题,根本原因是一些端口号以及socket地址被占用而得不到释放。方法一C/C++中提供了一个接口,如果服务器重启时需要对端口号以及socket地址进行复用,从而避免了TIME_WAIT状态#include &...

2018-07-05 14:46:26 4113

原创 TCP保证可靠性的举措

连接管理TCP是面向连接的,三次握手和四次挥手都是为了保证本次数据传送的可靠性,这里不做赘述 如果想了解具体的三次握手和四次挥手,请戳这里->TCP三次握手四次挥手详解序号保证数据段的按序到达TCP是面向字节流的,它对每一个字节都进行了编号,比如发送端发送了一个1~80字节的数据,接收端拿到数据段以后,就会回复一个ack为81的确认,表明81字节之前的数据都成功接...

2018-07-05 14:30:51 879

原创 TCP的三次握手与四次挥手详解

介绍TCP协议先来了解下TCP协议的报头信息

2018-07-01 21:18:36 370

原创 详解C/C++中的函数栈帧

函数栈帧就是进程在调用函数时为其在栈空间上开辟了一段空间,执行过程调用,一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。一个栈帧构建好后,会有两个寄存器标识该栈帧,即基址寄存器ebp(指向栈底)和栈顶寄存器esp(指向栈顶),两个寄存器中保存了栈顶和栈底的地址,对于栈帧中一些信息的访问...

2018-07-01 19:32:30 1231

转载 Linux--vim下打开多文件、多窗口

打开多个文件: 一、vim还没有启动的时候: 1.在终端里输入 vim file1 file2 … filen便可以打开所有想要打开的文件2.vim已经启动 输入 :e file 可以再打开一个文件,并且此时vim里会显示出file文件的内容。3.同时显示多个文件: :sp //水平切分窗口 :vsplit //垂直切分窗口...

2018-06-24 01:07:19 709

转载 网络编程---服务器编程中CGI模式的运行机制

CGI概括: 定义 通用网关接口(Common Gateway Interface)是HTTP服务器与你的或其它机器上的程序 进行“交谈”的一种工具,其程序须运行在网络服务器上。 功能 绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使 网页具有交互功能。 运行环境 CGI程序在...

2018-06-16 17:46:41 515

原创 网络编程--IO多路复用之select,poll和epoll详解

什么是socket?什么是I/O操作?我们都知道unix(Linux)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话...

2018-06-16 17:04:42 2224

原创 网络编程---select、poll、epoll服务器编写

select服务器#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h> ...

2018-06-16 16:08:24 460

原创 网络编程---多线程/多进程版TCP套接字编程

TCP\IP协议我之后会放在一起进行解释,因为这块较UDP来说比较复杂,我需要分成两三篇博客来分几个部分详谈,如TCP中的三次握手,四次回收,超时重传等,IP协议的底层通信,路由,MAC帧等,都会讲到,我尽量总结点详细一点,以免遗漏。这里我就只放上TCP套接字编程的代码,接口和一些注意的点在之前的TCP/UDP套接字原理中都有讲到,看不懂的请戳这里->链接大家研究代码的时候也可以与UDP...

2018-05-28 15:36:05 1002 1

原创 编程题---分隔链表

题目介绍给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。示例输入:head = 1 -> 4 -> 3 -> 2 -> 5 -> 2 , x = 3 输出: 1 -> 2 -> 2 -> 4 ->

2018-05-27 12:33:53 542

原创 编程题---反转从位置 m 到 n 的链表

解题思路代码实现(以上图来解释)/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* reverseBetween(struct ListNode* head, in...

2018-05-26 14:13:05 2656

原创 网络编程---UDP协议解析以及UDP套接字编程实现

认识UDP协议  UDP协议全称是用户数据报协议[1],在网络中它与TCP协议一样用于处理数据包,但不同于TCP的是,UDP是一种无连接的协议。。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。  简单来说,U...

2018-05-26 13:15:21 2121

原创 网络编程---TCP/UDP套接字编程原理

本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的介绍网络编程套接字(socket)也是进程间通信的一种方式,但是不同于管道,消息队列,共享内存的是socket不仅可以实现本机内不同进程间的通信,也可以实现网络中两台不同主机间的进程通信。socket相当于是一个文件描述符,我们将数据写入socket中,再发到目标主机,目标主机接...

2018-05-24 20:17:13 1848 1

转载 atexit函数和on_exit函数

atexit函数(设置程序正常结束前调用的函数)相关函数 _exit,exit,on_exit函数原型 #include<stdlib.h> int atexit (void(*function)(void)); 返回值 如果执行成功则返回0,否则返回-1,失败原因存于errno中。函数说明 atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用e...

2018-05-22 16:51:52 1869

原创 Linux---进程终止和进程等待

进程终止进程终止场景代码运行正常,结果正确代码运行完毕,运行不正确代码异常终止Linux下,我们可以通过echo $?命令查看进程退出状态,命令的实际作用是查看离它最近的一条命令的退出码#include <stdio.h> ...

2018-05-22 16:42:59 268

原创 操作系统---进程调度算法实现

本次实现的是模拟在单处理器情况下的处理器调度,目的是设计一个按优先数调度算法实现处理器调度的程序。内容(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为: 进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“...

2018-05-22 13:06:24 22865 5

转载 操作系统---fork函数解析与例题详解

fork的基本知识函数原型:pid_t fork( void);    返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值,而父进程中返回子进程ID。...

2018-05-20 21:58:43 2964

原创 Linux---进程创建

我们在执行一个可执行文件时,操作系统便为我们创建了一个进程,而我们今天要讲的是从已创建的进程中再创建一个进程,称为当前进程的子进程。子进程有着和父进程一样的代码,数据也同样写时拷贝了一份。 要想创建一个子进程,我们就要学习 fork()/vfork()两个函数。认识fork函数函数原型#include <unistd.h>pid_t fork(void);返回值:子进...

2018-05-20 20:52:14 582

原创 C语言实现简单网络版五子棋(服务器与客户端)

本小游戏是在Linux下实现的(因为我不会Windows网络编程),这次实现的仅仅是服务器与客户端之间进行互动,彼此只要互相发送下点的坐标就ok,用结构体存放坐标,各自收到坐标后进行下子,以及判断结果。 本篇文章里只涉及部分代码,更多是步骤介绍,实现方法以及思路 源码在这里()->https://github.com/Xiaoyejun/learngit/commit/44caec515...

2018-05-20 12:46:20 6515 7

原创 数据结构---C语言简单实现哈希表

当你看这篇的时候我认为你已经懂得哈希表的基本原理和一些具体方法实现了,如果你是想清晰的理解哈希表原理,点这个哈希表(散列表)原理详解闭散列我们往哈希表中插入数据时往往会发生哈希冲突,即两个不一样的 key 通过散列函数求出的下标 offset 是一样的,这时候就要给后插入的数据重新找位置,就诞生了两种形式,闭散列和开散列闭散列又称线性探测,即如果当前往哈希表中插入数据产生哈希冲突,...

2018-05-20 11:35:24 4065 3

转载 数据结构--哈希表(散列表)原理

介绍哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。记录的存储位置=f(关键字)这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间...

2018-05-20 09:50:41 687

原创 数据结构---二叉搜索树基本操作(插入,删除,查找)

介绍二叉搜索树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点。插入拿到插入的元素,从根节点开始遍历二叉树,如果小于当前结点的值,就移动到当前结点的左...

2018-05-17 13:54:54 370

转载 内存池、进程池、线程池

池的概念由于服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是以空间换时间,即“浪费”服务器的硬件资源,以换取其运行效率。这就是池的概念。池是一组资源的集合,这组资源在服务器启动之初就完全被创建并初始化,这称为静态资源分配。当服务器进入正式运行阶段,即开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取,无需动态分配。很显然,直接从池中取得所需资源比动态分配资源的...

2018-05-17 09:18:17 276

原创 数据结构---堆的基本操作及堆排序

介绍首先我们要将数据结构中的堆和内存中的堆区区分开来,内存中的堆区是操作系统管理的,和数据结构中的堆没有半毛钱关系。堆只有两种,大堆和小堆。大堆(大根堆):父节点的值大于左右孩子结点的值,也就是说大堆的根节点是整个堆中的最大值,左右孩子结点的值毫无关系小堆(小根堆):父节点的值小于左右孩子结点的值,也就是说小堆的根节点是整个堆中的最小值,左右孩子结点的值毫无关系堆的表示我...

2018-05-15 20:17:55 482

原创 数据结构---还原一个二叉树

要求给出一个二叉树前序的遍历结果(数组),结果中包含有空结点(空结点用’#’表示),还原这个二叉树。给出一个二叉树前序和中序的遍历结果,不包含空结点,还原这个二叉树。思考1.给出带有空结点的前序遍历结果还原二叉树我们用递归的方法实现实现//@brief 根据先序遍历结果(带有空字符标记)// ...

2018-05-15 18:50:59 1113

原创 数据结构---二叉树的基本操作

何为二叉树概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成特点:每个结点最多有两棵子树二叉树的子树有左右之分,其子树的次序不能颠倒基本操作介绍二叉树的遍历(递归和非递归),可以说是所有操作中最重要的求树的结点个数求树的叶子结点的个数求第K层结点的个数求树的高度在树中查找指定元素给定一个结点,查...

2018-05-14 18:45:16 1687

原创 关于C语言switch case语句中定义变量的问题

今天在完善通讯录项目的时候发现一个小问题,就是在switch case 语句中定义变量时会报错,出现下面的问题函数中当时我是这样写的 问题处在哪里呢?很简单,大家看下面的例子 switch(num){ case 1: int a = 1; case 2: printf("hello world\n");...

2018-05-14 10:31:15 9882 2

原创 数据结构---链式队列实现

顾名思义,链式队列就是用链表的形式实现。与顺序队列的区别就是避免了空间溢出的问题。还有就是顺序队列基本操作的空间复杂度都是O(1),而链式队列中插入操作的时间复杂度为O(n),因为要通过尾插和头删或头插和尾删来实现先进后出的规则。结构体声明typedef char LinkListType;typedef struct LinkListQueue{ LinkListT...

2018-05-12 23:41:11 218

原创 数据结构---顺序队列实现

队列即为只允许在一端进行插入数据队列,在另一端进行删除数据操作的特殊线性表。但也有一些例外,如优先级队列。队列具有先进先出的特性,即最先进入队列的元素将被最先出队列有时也需要把进入队列中的元素分优先级(比如线程调度),出队列时首先选择优先级最高的元素出队列,对于优先级相同的元素则按照先进先出的原则出队列基本操作同栈类似,具体注意的点我就在代码中细说了结构体声明typed...

2018-05-12 22:08:07 429

原创 数据结构---链式栈实现

链式栈,顾名思义,就是规定一个只能头插头删或者尾插尾删的链表,来实现栈结构先进先出原则在这里我们选用头插和头删的方法,因为尾插和尾删都需要遍历链表,时间复杂度较高。不多比比,直接通过代码演示结构体定义typedef char LinkListType;typedef struct LinkListStack{ struct LinkListStack* next;/...

2018-05-12 21:36:04 791

原创 数据结构---动态顺序栈实现

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除操作,进行数据插入和删除操作的一端被称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,内存中的“栈区”也是通过这样的栈结构实现的,即通常所说的数据先进先出动态顺序栈我们通过一个简单的数组来进行数据的存储,我们规定只能从数组的尾部插入与删除数据,这样就实现了一个简易的栈结构,静态数组实现的栈是由存储上限的,数组存储满元素后,就不能...

2018-05-12 21:22:54 709

原创 Linux---守护进程

什么是守护进程守护进程也称为精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。例如Linux的大多数服务器就是用守护进程实现的。比如,ftp服务器,ssh服务器,Web服务器等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。Linux系统启动时会启动很多系统服务进程,Windows系统也是如此,这些...

2018-04-26 12:07:21 310

原创 Linux---进程组/作业/会话

1、进程组每个进程除了自己本身的ID之外,还属于一个进程组。进程组(Process Group)是一个或多个进程的集合。进程组ID等于组长进程的进程ID,组长进程可以创建一个进程组每个进程组都有一个组长进程,如果组长进程终止,只要该进程组内还存在至少一个进程,则该进程组就存在,与其组长进程是否终止无关进程组通常与作业相关联,同组内的进程可以接收来一同一终端的同一信号 ...

2018-04-25 18:10:55 286

原创 Linux---死锁

什么是死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁产生的四个条件互斥条件:指进程对所分配的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的...

2018-04-25 12:35:46 253

原创 Linux---Linux系统下的进程间通信详解

进程间通信(IPC)介绍进程间通信的本质就是让两个毫不相关的进程看到一份共同的资源,大概意思就是实现不同进程间的传播或交换信息进程间通信的主要方式有管道,消息队列,共享内存,信号量,Socket,Streams等,这篇博客主要详细讲解前四种通信方式。(因为后面两个还没学,嘿嘿)一、管道管道是UNIX中最古老的进程间通信方式 我们把从一个进程连接到另一个进程的一个数据流称为...

2018-04-25 10:37:05 331

空空如也

空空如也

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

TA关注的人

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