自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP协议及编程流程

TCP协议报头三次握手关于三次握手:A端发送请求后,B端确认后,还要A端也回复B确认,因为网络的拓扑结构,有时候发送的包会在网络中滞留,延迟到达,A要是一段时间收不到回复,会再次发送一个,B收到第二个包回复确认,如果此时A不回复确认,当第一个包到达B,B会认为有两个请求连接,但实际只有一个连接请求,但是在B端会为两个请求分配资源,会浪费资源;或者一个端不断发送SYN请求报文段,但是是恶意行为,做第二次确认回复,如果没有第三次确认,服务器每收到一个请求就分配资源,服务器资源就会被耗费最后奔溃;至于更

2020-10-13 17:32:47 417

原创 I/O复用 之 epoll

在I/O复用中,epoll的性能就比select和poll要更好了,但是epoll仅Linux独有epoll有三个接口int epoll_create(int size);创建一个epoll内核事件表(记录文件描述符和事件类型),底层是一颗红黑树,size象征性的给一个大小,但是具体并不由size限制,知识提示内核大概需要这么大int epoll_ctl(int epfd, int op, struct epoll_event * event);操作内核事件表,op操作对应插入EPOLL_

2020-10-10 19:23:21 154

原创 I/O复用 -- poll

在I/O复用中,相比较select,poll就要聪明一些,先看一下poll原型int poll(struct pollfd * fds, int nfds, int timeout);fds:传入的是数组nfds:数组长度timeout:定时时间,设为-1,永久阻塞返回值>0表示就绪文件个数,为零说明无就绪,<0表示出错从参数可以看出,poll传入的文件描述符个数并不受限制struct pollfd{int fd//文件描述符short events;//事件类型sho

2020-10-10 18:53:34 157

原创 I/O复用 -- select

在TCP服务编程模块,在处理客户端连接时候,仅能一次处理一个连接,而且当一个连接建立后,就不能和其他连接交互(仅一个进程),若连接的客户端并没有交互,但是其他客户端需要发送数据,此时就不能和服务器进行交互,所以逻辑处理性能并不好。我们通过I/O复用技术,来改善TCP服务编程I/O复用技术:在一定时间内可以将很多个套接字进行统一监听,每次只处理有事件发生的套接字从图中可以看出,我们在服务器端需要一个容器来放置所有需要监听的套接字,每次只对有事件发生的套接字进行处理select方法本身是一个系统调用

2020-10-10 15:29:21 133

原创 TCP -- 面向连接

面向连接面向连接,在服务器与客户端通信之前需要三次握手建立连接,通信之后需要四次挥手断开连接为什么建立连接:要使每一方能够确知对方存在要允许双方协商一些参数能够对运输实体资源进行分配三次握手过程关于三次握手:A端发送请求后,B端确认后,还要A端也回复B确认,因为网络的拓扑结构,有时候发送的包会在网络中滞留,延迟到达,A要是一段时间收不到回复,会再次发送一个,B收到第二个包回复确认,如果此时A不回复确认,当第一个包到达B,B会认为有两个请求连接,但实际只有一个连接请求,但是在B端会为两个

2020-09-26 20:42:08 1074

原创 排序实现与分析-- 堆排序

堆排序描述说实话,描述这一块一点头疼,感觉我会说的很乱,但我尽力0.0;堆排序,又是一个性能很棒的排序这个排序,我个人感觉好高级,速度很快,但是原理要烦躁一些,下边我们慢慢来说。如下是我们这次的待排序数据:我们把它换成树的样子,就变成了这样:这里我们黑色是数据,红色代表他在原数据中的索引,也就是下标,这是未调整的初始状态,接下来我们打断一下,说另一点,堆的问题:堆有大根堆和小根堆,大根堆就是指整个树中,所有的父节点的值都比孩子节点值大即为大根堆,反之则为小根堆,示例我们下图中“ 7,2,4

2020-09-10 16:54:46 133

原创 排序实现与分析 -- 选择排序

选择排序描述选择排序,也是一个很简单易实现的算法,顾名思义,选择即选出符合要求的数据,然后排序。大概过程如图:待排序数据“ 5,3,9,1,6 ”第一趟:设5为最小值,然后再后边序列选择出比5小的最小值,然后跟5交换;第二趟:设3为最小值,在后边序列找出比3小的最小值,然后跟自己交换;第三趟:设9为最小值,在后边序列找出比9小的最小值,然后跟自己交换;第四趟:设9为最小值,在后边序列找出比9小的最小值,然后跟自己交换;最后只剩一个数据,即在最后为最大值,五个数据跑四趟,每趟开头多一个有序

2020-09-09 14:38:10 94

原创 排序实现与分析 -- 快排

快速排序描述快速排序,是一个很重要的排序算法,当然其平均性能也比较高,他的思想我借鉴纪磊在啊哈算法中的形容来描述。在快排中,我们把待排序数据(如上图)中的第一个数据拿出来,称他为基准,就是拿接下来的数字都跟他进行比较,如下图所示,我们假设有两个炮兵(此处红五角星标识),一个在数据的最左边,一个在数据的最右边,刚开始我们右炮兵拿起他的数字7跟基准比,此数字大于基准6,所以炮兵往前走,9大于6,再往前走,3小于6,找到第一个小于基准6的数字,把3放到基准原位置,然后左炮兵往后找,5、4、1、2小于6,炮

2020-09-08 19:02:06 103

原创 排序实现与分析 -- 冒泡

冒泡排序描述冒泡排序算是比较简单的排序了,原理简单易实现。顾名思义,冒泡,将某个数据像冒泡一样“冒”在最高处,在排序过程中就像冒泡一样,每一趟将一个最大值“冒”到最后,然后下一趟。如下数列举例:6、5比较,6大于5,交换;6、7比较,6小于7,不交换;7、1比较,7大于1,交换,第一趟结束,结果如下:7有序,再从头开始,5、6比较,5小于6,不交换;6、1比较,6大于1交换,结果如下:6、7有序,5、1比较,5大于1,交换,结果如下:最终1自我有序,最终结果:代码实现void

2020-09-08 17:47:46 73

原创 排序实现与分析 -- 希尔排序

希尔排序按理解的话,其实希尔排序就是插排的升级版,他的思想是:对需要排序的数据进行分组,通过每组的插排使得组内有序,从而整体接近有序,此时对整体进行插排就很快(在插排中说过,插排,数据越有序速度越快)但是要注意的一点是,分组不是常规的认为那样分组(如上所示),上图在红蓝组内有序后,整体数据如下如此一看,整体并非有序,所以应该如下进行分组组内有序后 ,整体如下整体接近有序,达到要求希尔排序是结合了一定的数学问题的,数学问题给出了分组的方式,原理这里不做探讨,给出,尽量以素数分组,且最后一次分

2020-09-08 13:28:07 114

原创 排序实现与分析 -- 插排

插入排序思想插入怕排序是一种简单的排序方法,他的基本操作是将一个数据插入到已有序的序列中,从而得到序列数加一的新的序列插入排序中,我们先将最初始的有序序列数定为第一个数字,即在下列数据中为1,从第二个开始,当前有序列为“1”5和有序序列从头开始比较,发现5应该在1的后边,所以新的有序序列为“1,5”然后第三个数字3,和有序序列从头开始比较,发现3应该在1后边,所以我们把1后边的数据后移腾开位置,将3插入进来,此时有序序列为“1,3,5”第四个数字6,比较后找到位置,插入到5之后,新的序列

2020-09-07 15:49:37 313

原创 Linux--线程下

信号量 – 线程级信号量类似于一个特殊的计数器,当信号量值大于零,表示可以访问的临界资源的个数,等于零,对信号量执行P操作会阻塞对信号量的P,V操作不一定非得在同一线程中信号量方法:#include <semaphore.h>信号量类型:sem_t 全局定义一个sem_t类型的信号量初始化:int sem_init(sem_t *sem, int shared, int init_val);shared:设置信号量是否在进程间共享,Linux不支持,一般给零init_val:信

2020-09-04 14:23:35 111

原创 Linux--线程中

线程间的数据共享:.data和.bss .heap 文件描述符(无论哪个线程打开一个文件,其他线程只要能够获取到对应的文件描述符,就可以访问这个文件)线程同步 --进程同步需要同步的原因:1.访问临界资源2.相互配合执行同步的方式:1.互斥锁(互斥量)2.信号量 – 线程级信号量3.条件变量4.读写锁互斥锁只有加锁和解锁两种状态;使用临界资源之前,对互斥锁执行加锁状态,如果锁是加锁状态,则加锁操作阻塞,直到有对其加锁过程的线程进行了解锁操作;使用临界资源后,需要对互斥锁进行

2020-09-03 21:52:01 91

原创 Linux--线程上

多线程编程线程概念:进程内部的一条执行序列,一个进程可以包含多条线程,至少一条线程,就是main方法所代表的这条执行流 – 主线程进程中的线程仅仅占一个栈帧线程的实现方式:内核级线程:优点:用户程序简单,一个线程阻塞可以切换到另一个线程。缺点:切换较慢,每次切换都得从用户态陷入内核态;内核需要维护线程的控制信息,比较消耗内核的内存资源。用户级线程:优点:在任何操作系统上都可以使用,比较灵活;切成块,切换在用户态下完成,不需要陷入内核;不需要修改操作系统,实现相对比较容易。缺点:用户程序编写比

2020-09-03 18:20:53 133

原创 Linux--进程间通信

系统是以进程进行工作的的,进程的地址空间是独立的,进程之间有可能需要数据交互进程间通信:1.管道:有名管道 无名管道2.信号量3.消息队列4.共享内存管道1.有名管道(半双工通讯)单工通信半双工通讯全双工通讯有名管道:在磁盘空间会有一个管道文件标识(inode节点),只要是有权限操作这个管道文件的进程,都可以利用其和其他进程进行数据交互有名管道虽然在磁盘上有管道文件标识,但在使用管道文件来进行进程通信时,数据会被缓存到内存上,并不会占据磁盘的block区域有名管道的使用创建

2020-09-02 19:24:03 217

原创 信号量习题

题目:三个进程分别打印A,B,C,要求输出的结果必须是“ABCABC”顺序执行设置三个信号量:sem1:初始值设置为1,保证进程可以执行,对sem1执行P操作,进程3输出C后,对sem1进行V操作sem2:初始值设为0,进程2执行后对sem2进行P操作,进程1输出A后对sem2进行V操作sem3:初始值设为0,进程3执行后对sem3执行P操作,进程2输出B后对sem3执行V操作sem.h#pragma oncetypedef union semun{ int val;}SemUn;in

2020-09-02 18:25:27 437

原创 Linux--进程替换

进程替换:替换的是进程所执行的指令集合和数据exec系列方法:示例:test程序代码:main程序代码:执行结果:两个代码由一个进程执行,并且execl成功,exel之下的代码全部被替换;失败的话,执行原代码一般是和fork配合使用,fork之后,通常子进程使用exec做进程替换...

2020-08-31 16:37:58 129

原创 Linux--信号

信号信号就是系统预先定义好某些特定的事件,信号可以被发送,可以被接收,发送和接收的主体都是进程。如果一个进程接收到了一个信号,就表示他接收到了一个发生的事件键盘上输入ctrl+c – > 就会给当前终端上执行的进程发送一个信号信号的定义:/usr/include/bits/signum.h1.修改信号的响应方式当进程接收到SIGINT信号后,打印“hello world”实现代码:实现结果:ctrl+c是终端前台接收signal修改了信号的响应方式,在下一次修改前都有效利

2020-08-31 15:41:43 74

原创 Linux--僵死进程

僵死进程及其处理概念:父进程未结束,子进程结束,而且父进程未处理子进程的结束孤儿进程:父进程结束,子进程未结束,那么子进程就是一个孤儿进程,孤儿进程会被系统的init进程接管示例如下:模拟代码如下在子进程打出“child over”后,dead的子进程还是未结束(defunct标识)此为僵死进程僵死进程的处理:在父进程中调用系统调用方法:pid_t wait(int *status)调用时,是此时传递一个变量的地址,返回子进程的退出状态返回处理子进程的PID,如果失败,返回-1一个父进程存

2020-08-31 14:59:57 176

原创 Linux--库函数和系统调用

文件操作的系统调用 – open read write close lseekfork库函数:fopen fwirte fclose fread fseek库函数和系统调用的区别:库函数:调用在用户态,实现也在用户态,但是有可能需要转调系统调用系统调用::调用在用户态(权限相对较小),实现在内核态(计算机的最高权限)系统调用过程:1.每一个系统调用都有唯一的一个与其相对应的系统调用号,调用方法时,将其系统调用号保存在exa寄存器中2.产生0x80中断调用其对应的中断处理

2020-08-31 14:19:36 220

原创 Linux--文件操作

open

2020-08-29 11:39:38 86

原创 Linux--进程复制

进程复制 – fork方法pid_t fork(void);程序执行结果:fork方法调用成功后,就会有两个进程储存在,调用fork进程为父进程,新复制的进程为子进程fork有两次返回,父进程中返回子进程pid,子进程中返回0fork之前代码只有父进程会执行,fork之后父子进程分别执行,子进程只执行fork之后的代码在上述代码中可以将想父进程执行的代码块放在else中,想子进程执行的代码块放在if块中fork之后,父子进程并发执行,先后并不依赖代码的先后顺序思考1:程序分析:

2020-08-28 16:43:31 478

原创 Linux--内核对进程的管理

进程管理进程:描述进程西南西的结构或者进行进程管理和控制 --PCB进程实体部分 – 有序指令 数据系统管理进程(可执行程序代码+各种资源及处理器状态等等)是通过PCB(进程描述符)来记录这些数据,从而管理进程。操作系统管理PCB是通过双向循环链表管理,链表中每一项都是task_struct,该结构在32位机器中大小约17k1.执行程序时,要生成一个进程,先申请PCB,然后加载程序部分2.一个进程结束时,先释放实体部分,再释放PCB僵尸进程:进程实体释放与其PCB释放有时间差(PCB释放需

2020-08-28 13:29:33 147

原创 Linux--库文件

库文件:静态库:功能模块的源代码:list.c vector.c set.c map.c stack.c queue.c1.将所有的源码文件编译成中间文件2.ar crv libxxxxx.a 所有的中间文件使用:gcc -o main main.c -L 库路径 -l库名称共享库(动态库):Linux: .so Windows:.dll生成:gcc -shared -fPIC -o libxxxxxx.so 功能代码的源文件使用相同于静态库静态库:程序在链接阶段会将静态库内容合并到最终

2020-08-27 13:21:31 127

原创 Linux--makefile文件

makefile --> Linux上的工程管理工具工程中的源文件可以根据模块、功能等存储在不同的目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile如同一个shell脚本一般,其中也可以执行操作系统的命令。具体操作这里仅以简单代码进行示例:以下三个文件,math.h math.c main.cmath.h如下:三个相加函数实现math.c如下测试如下:我们可以通过gcc

2020-08-27 12:48:47 238

原创 Linux--gcc,g++区别;gdb调试

gcc,g++区别误区:gcc编译c语言,g++编译c++区别1:gcc编译c++代码需要加-lstdc++,gcc默认只链接c库,并不会链接c++库,需要手工指定g++默认链接c库和c++标准库区别2:gcc如果编译c语言文件,用c语言方式编译,编译c++用c++方式编译,g++不管编译c还是c++都用c++标方式编译可执行文件的两种版本1.debug版本,调试版本,编译阶段会加入某些调试信息编译时,加入-g选项,可生成debug版本2.release版本,发行版本,没有调试信息gcc默

2020-08-27 10:04:51 660

原创 Linux--编译链接

gcc完成编译链接的大概过程:预编译,编译,汇编,链接gcc如何完成:预编译:gcc -E main.c -o main.i1.#include展开2.宏替换3.删除注释4.处理预编译指令编译:gcc -S main.i —> main.s1.进行词法语法的解析2.代码优化3.汇总符号 数据(全局 静态)函数会生成符号4.源码转成汇编指令汇编:gcc -c main.s -----> main.o1.汇编指令翻译成二进制2.生成各个secti

2020-08-26 18:44:01 201

原创 Linux--系统进程相关管理命令,用户管理命令

程序:指令+数据进程:执行结果:

2020-08-26 17:34:53 100

原创 Linux--vim使用

普通文件编辑vim 文件名(普通文件)命令行模式:ESC。插入模式:a i o O进入插入模式。末行模式::进入末行模式。q退出 q!强制退出 w保存 wq保存退出 w newfile另存vim使用进阶命令行模式下的命令:1.对于光标的快速移动shift+6当前行的首列shift+4当前行的尾列shift+g将光标移动到文件的最后一行gg 将光标移动到文件的在第一行num shift+g将光标移动到num行ctrl+f向下翻页ctrl+b向下

2020-08-25 15:34:19 156

原创 Linux--相关基础操作命令

pwd :显示当前所在位置的绝对路径cd :cd+路径 切换工作位置路径可给相对路径或者绝对路径cd+… 退回上一层目录cd+~直接进入当前用户的家目录cd±切换到上一次目录ls :显示当前目录下的内容ls+ -l 显示当前目录下文件的详细信息clear :翻页reset :清屏...

2020-08-25 14:56:56 87

原创 Linux--文件系统

Linux基础篇连看带学习了很久了,最近一直除了学习就是玩,好久好久没有总结学习内容了,现在总算是迈开总结第一步,争取开学前,把内容总结的差不多。第一篇就从文件系统开始,Linux系统和Windows类似,都是操作系统,只不过Linux没有Windows那么好的图形化界面,Linux上的操作基本都是通过终端来完成,可能有些人看过Linux系统的操作界面后会质疑,明明可以通过窗口完成相关操作啊,其实Linux真正操作起来,都是通过其他方式登入系统进行操作,接下来说的就是Linux与Windows最大的不同

2020-08-11 15:53:41 107

原创 关于链表的一些总结(上)

六月份了,步入考试周,复习有点晕头转向,总结一次拖一次,哎,难顶,只能后边加油补,不过也算是一直保持练习,后边继续温习,也算好事。这次先对普通顺序表(定长以及不定长),单链表,循环链表,双向链表以及静态链表(这里我还写了一个静态链表的小改造,改的也不多,做了一个不定长的,hhh)先是顺序表,定长就不说了,下边是结构体typedef struct List{ int *elem; int len; int size;}List,* PList;结构体,这里elem是接收后边创建动态内存的指

2020-06-14 11:08:00 137

原创 关于链表的相交、环判断问题

这段时间玩的有点多,好几周没写了,中间落下了好多内容没有总结,今天之后陆续抽时间补起来,不过学校的课也都相应的要结束,面临考试,所以速度会慢些。其余的不多说,这次先总结一下,比较常见的关于链表的相交、环的问题。第一个是普通的环检测问题,判断一个链表是否有环,解题思路就是,定义两个指针,一个快指针一个慢指针,这两个指针在这条链表跑道跑,慢的指针速度为1,快的指针速度为2,若是这两个指针最后相遇,则说明有环,因为有环的话,快指针必然会追上慢指针,这里我的链表结构体如下typedef struct Nod

2020-05-23 16:35:02 299

原创 数字转字符串;字符串转数字

数字转字符串这里首先用到一个数组逆置函数如下void reverse(char *arr)//逆置{ char *p = arr; char tmp; while(*p != '\0') { p ++; } for(--p;arr < p;arr++,p--) { tmp = *arr; *arr = *p; *p = tmp; }}将arr数组逆...

2020-04-14 20:29:59 1393

原创 文件词频统计(第二版)

题目还有介绍就不说了,直接说下方案改进在上一版中,采用了两个结构体,一个是存单词,一个是做字典,这一版中,通过改善读取单词,换取了简单的结构体形式来处理。一个存单词并记录单词出现次数的结构体,一个存这个结构体存储了多少个单词并且通过此结构体上一结构体调用动态内存,说的好像不清楚,直接上代码#define WORD_LEN 80#define number 10typedef struct...

2020-04-13 21:31:29 291 1

原创 微项目之文本词频统计(第一版)

题目:统计文本中重复次数最多的前1000的单词,并按次数从高到低输出,并保存到另一个文本中题目这里说明一下,是对英文文本进行操作,所以这里是在http://novel.tingroom.com/ertong/4017/随意下了一篇英文小说,名字叫 A 《Sweet Little Maid》这个题目要解决两个问题,第一是如何将仅读单词然后划分开并且保存,第二是保存以后如何去重。这里暂且...

2020-04-06 19:07:10 202

原创 斐波那契数列,递归与循环

斐波那契数列(Fibonacci sequence),又称黄金分割数列、兔子数列,是数学家列昂纳多·斐波那契于1202年提出的数列。斐波那契数列为1、1、2、3、5、8、13、21、34……此数列从第3项开始,每一项都等于前两项之和,递推公式为F(n)=F(n-1)+F(n-2),n≥3,F(1)=1,F(2)=1。(老规矩,继续抄搜狗百科的一段介绍)斐波那契数列通项的数学公式如下但是在编程...

2020-04-06 18:24:48 422

原创 递归汉诺塔实现

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(先上一段搜狗的介绍,哈哈哈,我感觉我说的没这么清楚)所以就明确了,我们需要通过变成解决上述问题,为了使...

2020-03-31 20:43:03 217

原创 八皇后问题(粗暴方法)

粗暴方法,就前面提到的,八层for循环,写入条件,判断,最终得出结果。但在后边实现时候突然卡住,想到八个皇后占8*8的位置,第一个皇后随意到一个格子,其他皇后继续随意进入到一个格子,把问题想成了随机摆放,所以卡住了,后边重新简化问题,直接把各个皇后放在固定一行,问题就直接用简单的八层循环就好。代码如下,可以看到确实实现过程很繁琐,简化的话可以写一个判断函数,然后最后调用,就不用写这么多判断语句...

2020-03-24 20:38:56 89

原创 关于交换数值问题

总结了一下大致常见的关于交换两数值的问题。先附上第一段代码void swap2(int a,int b){ int tmp; tmp = a; a = b; b = tmp;}这段代码的问题不用多说,定义了变量a,b,交换仅仅限在此函数中交换,当从此函数出去,a,b生命周期就结束,所以不能调用此函数来完成数值的交换。第二段void swap3(int *p1,int *p...

2020-03-24 19:52:39 270

空空如也

空空如也

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

TA关注的人

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