自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高性能服务器————高性能服务器IO复用之select

谈到IO复用就不得不了解一下,都有哪些关于IO复用的方法IO复用的方法分为3种,这篇重点介绍select,至于其余的两种方法将会在下一篇介绍,考虑到篇幅和问题研究的专一性,这篇的重点就是分析select接口和原理,以及select使用的实例,如果对于为什么要使用IO复用以及IO复用的好处,可以翻看上一篇博客。建议在了解这篇博客之前,先了解这些概念:阻塞、非阻塞、以及文件描述符的就绪状态、IO复...

2019-04-29 10:21:23 285

原创 高性能服务器————高性能服务器之IO复用

1.为什么要使用IO复用?在很多文章中都能够看到IO复用的讲解但是很少看到过,对IO复用使用原因的讲解,和应用场景的说明。(1)在不使用线程的情况下,独立处理每个文件描述符,单个进程无法同时在多个文件描述符上阻塞,只有在这些描述符处于就绪状态(关于就绪状态,下文会说明)时,才能进行对文件描述符的操作(IO操作),否则会导致进程阻塞在IO操作上(此处的IO均为阻塞IO)。例如:发送了read()...

2019-04-17 20:12:42 343

转载 Linux高性能服务器开发之epoll

前言I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相同,但是本质上却没有什么区别。本文将重点探讨将放在EPOLL的实现与使用详解。为什么会是EPOLLselect的缺陷高并发的核心解决方案是1个线程处理所有连接的“等待消息准备...

2019-04-16 16:28:47 492

原创 打印一个串的全排列

1.全排的概念:从n个数中取出m个数(m<=n)按照一定的次序排成一列,叫做从n中去m个数的排列,那么n个数中取出n个数按照一定次序排成一列,叫做n的全排列。2.举个例子:1 2 3 4的全排列是:1 2 3 41 2 4 31 4 2 31 4 3 21 3 4 21 3 2 4。。。总共有12种序列(123*4),但这是我们通过大脑的做出来的,现在我们把我们脑海里的思路...

2019-04-09 12:46:12 196

转载 知识储备整理

https://blog.csdn.net/weixin_39731083/article/details/82141836

2019-04-07 15:32:15 675

转载 第一次在GitHub上推代码

好久没有写文章了,最近有学习了一个新的工具的使用方法--------GitHub,从配置到使用期间经历了一些坑,还好有一些好的资源帮我们学习,下面是我在学习使用GitHub时学习得一篇博客,分享出来,希望能帮到初次使用git的小白!!!https://blog.csdn.net/Hanani_Jia/article/details/77950594看完这篇博客,便可以学会在GitHub上托管自...

2019-03-01 10:52:03 1303

原创 银行家算法

银行家算法模拟实现直接上代码吧!!!bank.h:#include&amp;amp;amp;lt;iostream&amp;amp;amp;gt;using namespace std;#include&amp;amp;amp;lt;vector&amp;amp;amp;gt;//预定资源数组#define PRO 50//最大进程数#define MAXAVSUR 10//最大资源种类数int AVAILABLE[MAXAVSUR];

2019-01-04 11:35:37 427

原创 Linux(高级编程)12————线程概念

线程人们常说的轻量级进程,那么线程到底是什么呢?还记得我们前面在说进程时提到过PCB吗?其实在linux下PCB是对线程的描述。线程是轻量级进程,是一个进程内部的一条执行流。确切的说,linux下线程是以进程PCB来模拟的,所以前面说linuxPCB其实是对线程的描述,那么Linux下的进程又是什么呢?linux下的进程在此时就是一个线程组;因此线程是一个轻量级进程。一个进程内可能有多个线程,...

2018-12-16 12:31:55 218

原创 Linux(高级编程)11————进程间通信6(信号2)

接着上一篇博客对信号的介绍,本篇来介绍一下常用的接个信号和一些要点:

2018-12-14 15:24:00 232

原创 算法————排序总结

排序是我们程序员成长过程必不可少的一部分营养,今天就将这一部分的内容总结一下:常见的排序算法分为:插入排序(插入排序、希尔排序(插入排序的变形))、选择排序(选择排序、堆排序)、交换排序(快排、冒泡)、归并排序...

2018-12-07 21:48:42 221

原创 Linux(高级编程)10————进程间通信6(信号1)

信号是什么?

2018-12-02 17:07:43 400

原创 Linux(高级编程)9————进程间通信5(信号量)

信号量是是什么?信号量是进程间通信方式之一,用来实现进程间的同步与互斥。信号量的原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其他通信资源(如文本、外部设备等)来实现进程间通信。信号量本身不具备数据传输的功能,他只是一种外部资源的标识。信号量的本质是:具有等待队列的计数器。...

2018-11-25 17:10:39 1799 3

原创 Linux(高级编程)8————进程间通信4(共享内存)

共享内存是什么?

2018-11-23 23:21:13 266

原创 Linux(高级编程)7————进程间通信3(消息队列)

1.消息队列什么?首先我们在学习数据结构后应该对队列有了一个确切的理解,那么在Linux下进程间通信(System V进程间通信)就有这么一种机制。**消息队列概念:**也叫报文队列,其实就是一个消息的链表,发送的数据就是带有类型的数据块。2.消息队列特性:1.消息队列是操作系统在内核为我们创建的一个队列。2.数据传输:用户组织一个带有类型的数据块,添加到队列中,其他进程从队列中读取特定类...

2018-11-21 22:54:27 295

原创 Linux(高级编程)6————进程间通信2(命名管道)

通过匿名管道学习,我们对管道有了一些了解,下面我们将进行下一步学习管道,这次来学习一下匿名管道,关于管道这里就不在赘言了,直接上命名管道。命名管道:1.文件系统可见。2.命名管道是一类特殊类型文件(管道类型文件) 。3.命名管道可以应用于同一主机上所有的进程之间的通信(命名管道于匿名管道区别)。命名管道的创建:函数原型: #include &amp;lt;sys/types....

2018-11-16 20:35:29 379

原创 C/C++知识点梳理之new/delete与malloc/free的区别

1.就new/delete和malloc/free的本质而言(属性):new/delete是C++关键字,而malloc/free是c语言的库函数。其次new/free在为对象开辟/释放空间时会调用对象的构造函数/析构函数;而对于非内部类型malloc/free为对象动态的分配空间就不能够满足了。而且new/free是关键字,编译器可以控制其调用对象的构造函数对对象成员创建时进行初始化工作,在对...

2018-11-16 12:26:57 367

原创 C/C++知识点梳理之static关键字与const关键字

1.static关键字修饰变量:局部变量:局部变量指在代码块{}中定义的变量,只在代码块内有效,缺省时为存储方式为自动变量或者动态变量,即程序执行到变量定义处才为变量分配存储空间,当改代码段执行结束是释放该存储空间。static修饰局部变量时,则改变变量存储方式(生命周期),是变量成为静态局部变量,即在编译过程中为其分配存储空间,直到程序退出才释放这块空间,其生命周期为整个程序。这样使得该变...

2018-11-15 22:50:20 262

原创 Linux(高级编程)5————进程间通信1(匿名管道)

进程间通信

2018-11-09 13:04:47 243

原创 Linux(高级编程)4————基础IO

什么是IO?

2018-10-25 18:09:22 192

原创 Linux(小项目)————shell的实现,包含重定向、内建命令。

bash原理:通过上面bash的原理我们可以,了解到shell的框架与流程:1.等待用户输入命令。2.解析用户输入的字符串。3.创建子进程执行exec程序替换4.父进程等待子进程退出。循环执行1~4步骤,即可完成my_shell。最简单版本的my_shell实现:#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include&amp;amp;amp;lt;stdlib.h&amp;amp;

2018-10-22 13:33:36 574

原创 Linux(高级编程)3————进程的控制

进程控制都包含那些内容?1.进程创建2.进程终止3.进程等待4.进程替换1.进程创建:在前面进程概念中关于进程创建已有所了解,下面更详细的分析进城创建。fork()函数返回值类型:pid_t1.返回值:1.子进程中返回0;2.父进程中返回子进程的pid;3.失败返回-1 ;(失败原因:1.子进程数目达到上限;2.内存不够)2.fork的特点:1.子进程以父进程为...

2018-10-22 11:56:36 256

原创 Linux(高级编程)2————环境变量以及设置

什么是环境变量?环境变量:一般是指操作系统在运行时指定操作系统运行环境的一些参数。Linux是多用户操作系统,Linux为每个用户都配置有自己的环境变量,这样每个用户都有自己的环境变量,默认情况下每个用户的环境变量是一样的。每个用户可以通过配置环境变量来修改自己的运行环境。常见环境变量:PATH*:指定命令的搜索路径。HOME*:指定用户的主打工作目录(即用户刚登陆Linux时的默认目录)...

2018-10-17 15:56:53 365

原创 数据结构————文件压缩(利用哈夫曼编码实现)

文件压缩原理:首先文件压缩是通过HuffmaCode实现的、整体思路通过读取文件获取字符出现频率,通过字符出现频率可以构建HuffmanTree,每个文件中出现的字符通过HuffmanTree获取HuffmanCode,从而将文件中的字符同过HuffmanTree获取相应编码,并写入压缩文件,从而完成文件压缩。为什么通过HuffmanCode可以实现文件的压缩呢?原因:1.每个文件的字符种类...

2018-10-16 20:26:46 3129

原创 Linux(高级编程)1————进程概念

何为进程?进程的典型定义:1.进程是程序的一次执行。2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。3.进程是具有独立功能的程序在数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。进程 = 程序段+数据段+PCB(程序控制块)那么进程有什么特征呢?1.进程具有动态性。在这一点我们可以从进程状...

2018-10-09 12:55:50 320

原创 数据结构————堆(TopK、堆)

堆是数据结构的一种,可用于排序和海量数据处理中的TopK问题堆的逻辑结构:是一颗完全二叉树,由于是是一颗完全二叉树我们就可通过数组来实现他的存储方式。上面是一颗完全二叉树,分别为树状存储、数组存储。堆的性质:1.堆分为大堆和小堆。2.大堆的对顶大于它的左子树和右子树(小堆相反)。3.左右子树分别为大堆(或者小堆)。4.为方便计数满足数组的存储方式有以下规律:a.lchild(左...

2018-09-26 15:45:45 755

原创 Linux————Linux下进度条的实现(加彩色版本和渐变色)

一:进度条关于进度条不用我多说,当我们在安装程序或者软件时通常会看到软件安装进度,而这个给我以视觉感受的进度表示,通常被叫做进度条。二:进度条需要的知识储备缓冲区:对于缓冲区这个概念我们其实并不陌生,它是能够存储固定数量的容器后者是一个存储器,或者分段运输区,其数据可被存储一共后续检索。C库的写入文件函数一般是全缓冲方式,像printf、fwrite库函数是自带缓冲区的,而只有我们达到一种...

2018-09-22 13:36:59 557

原创 算法————设计一个O(N^2)时间复杂度的算法,找出由n个数组成序列的最长单调递增序列

关于这道题,其实就是利用动态规划的一种思想,解这道题有点类似冒泡,采用遍历数组序列,不断更新递增序列的长度以至于来找到最长单调递增序列。关于问题呢,大概已有有一点思路:下面将思路画一画,通过将思想的整理,得到这样一副图: 通过图片我们可以看出要想找到最长递增子序列,我们得不断扩大范围这里是指图片中的(sub[i]所对应的区间),其实也就在小区间得到递增的序列的长度,然后继续扩大区间来...

2018-06-06 15:31:51 10085 5

原创 排序————归并排序

归并排序是一种时间复杂度很优的算法,他到底有多优下面分析了再写,但就目前所知至少比冒泡排序要优先来讲一下归并排序的大体思路:首先将要排序的数组,进行拆分,但拆分为单个时,即单个子序列有序(该过程通过递“归”);然后再合并单个元素,得到单个有序子序列,最终得到有序序列(该过程为“并”)画图来仔细分析:整体思路是有了,可是它的递归过程还是有必要分析一下的:为了说明问题我只花...

2018-06-05 14:47:49 276

原创 算法————皇后问题(回溯法)

#include<iostream>#include<cmath>#include<vector>using namespace std;class Nqueen{public: long NQueen() { cout<<"请输入皇后个数!"<<endl; cin>>n; sum = 0; a.reserve(n+1); init(); backtrack(1);//找合理

2018-05-31 18:00:23 2125

原创 算法————简单的字符串翻转(只有单词反转,单词里的字母不反转)

题目要求:用C/C++来实现字符串的反转。比如:字符串”I am student.”反转之后变成了”student. am I”。(只有单词反转,单词里的字母不反转)思路:        通过两步来实现:        1.将句子中的每个单词翻转。        2.将整个句子翻转        画图来分析:        //这段代码实现翻转        void rotate_sentenc...

2018-05-28 15:27:14 2660

原创 Linux0————vim常用功能配置及部分快捷键

vim配置vim是早期vi的进化版,可以说功能比vi更强大,而vim的使用也是很多人头疼的地方,因为配置的好了,可以事半功倍,差了的话会很难受的!!!,下面介绍一下vim的配置及配置方法。配置文件为vimrc常用的几个功能配置方法如下:首先在终端上转到root用户,打开vim配置文件/etc/vimrc进行配置下面是个种功能的配置代码set number #开启行号sy...

2018-05-25 09:10:40 429

原创 Linux————Linux下批量建立用户并设置密码(shell脚本)

在这里分为两种情况1.有规则给定用户名2.给定无规则用户名3.删除一:以下是创建给定用户名:首先得给出给定用户名,并逐个创建for user in {u1,u2,u3,u4};这句代码说明给定用户名在{u1,u2,u3,u4}这个数组中;通过for循环逐个取出douseradd $user//添加给定userecho &amp;quot;123456&amp;quot; | passwd --stdin $user;//设置密码

2018-04-23 22:16:09 22523 5

原创 数据结构————(堆排)创建堆、优先级队列、Topk、堆排序

堆是数据结构的一种,堆分为大堆和小堆堆的概念:堆是一颗完全二叉树,通常情况下我们用数组来表示堆,在下面我用的是vector其实也就是数组;大堆(是一颗二叉树,它的特点是父亲节点大于它左右孩子);小堆(即就是它的父亲节点小于它的左右孩子);堆的实现这里我们采用适配器模式来实现大小堆,避免一些重复的代码;首先我们的了解堆一般都那些接口,push、pop、size、top、empty;堆的实现的核心算法:

2018-03-15 21:50:58 383

原创 算法————入栈出栈合法性检验

出栈入栈合法性检验1.首先得讲一下对问题的理解,例如这样一道题问题如下:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列,入栈的序列(1,2,3,4,5),出栈序列为(1,5,3,2,4)是不合法序列2.问题就是这样,也就是说给我们一串这样的数组,我们用不同的入栈方式,是否能得到所要验证的出栈序列,那么我们可以还原入栈出战的场景,顺着出栈顺序的思路入栈出栈,看是否能够顺利

2018-02-24 15:09:57 1310

原创 数据结构————Vector、List的使用和模拟

1.初步了解和使用vector list·vector实质是一个动态增长数组,list是一个链表,他们都是STL的一种容器。①使用vector#vector使用样例代码:#pragma once#include&amp;amp;lt;iostream&amp;amp;gt;using namespace std;#include&amp;amp;lt;vector&amp;amp;gt;void test_vector(){ vector&amp

2017-12-07 20:36:22 462 3

原创 C++————智能指针

将到智能指针首先得讲下智能指针出现的原因,在C++中我们会动态开辟一些空间,而这些空间的释放就得程序员自己动手了,像java这些语言有自动回收机制,而C++就要求程序员自己释放空间,否则会导致内存泄漏(这个后果很严重!!!!)下面举一些例子来讲下内存失败的场景:1.在return之后释放空间void test(){int *p = (int*)malloc(100);//...//...r

2017-11-28 15:19:36 340

原创 C++————类型萃取

当我们遇到这样的场景时,我们会用到类型萃取template<class T>void Copy(T* dst, T* str, size_t n)//模板函数copy{ memcpy(dst, str, n*sizeof(str));}void test(){ string s1[10] = { "aaaaaaaaaaaaa", "wwww", "iiii" };

2017-11-19 19:28:31 371

原创 C++————多态及多态对象模型

首先,讲到多态就得讲一下虚函数,在上一篇讲菱形继承时,我们提到一个概念虚继承,那么我们会联想到虚继承和虚函数是否有关系?,其实呢虚函数和虚继承是没有关系的只不过是关键字一样(virtual)。1.虚函数,类的成员函数前加virtual关键字,此函数成为虚函数。2虚函数重写,当子类重定义了与基类完全相同的函数时,则成为虚函数重写(也称覆盖)了父类的虚函数。多态:当基类对象的指针、引用调用子类重写的虚函

2017-11-11 16:12:38 344

原创 算法————双栈实现队列、双队列实现栈、实现一个栈Push(出栈)Pop(入栈)Min(返回最小值的操作)的时间复杂度为O(1)

一.双栈实现队列1.思路原理:队列的特点,先进先出;栈的特点,后进先出;原理刚好相反,那么无非是俩个栈互相“倒“或者“导”,这都不是重点了,有了这个初步思路我们就得想办法来实现如何倒了。2“倒”或者“导”思路图:法①:核心原理:每次插入都得倒回popstack栈的所有元素,最后所有的元素回归popstack法一代码:template<class T>class QueueByTwoStack{

2017-10-10 20:26:01 1006

原创 数据结构————二叉树

二叉树是数据结构的一个重要内容之一,那么对于我们这些学习编程的人来说,掌握二叉树的各种遍历(递归遍历和非递归遍历)是必不可少的,下面我们就分析一下,二叉树的各种遍历方法:1首先得建立一个二叉树:1.二叉树节点struct BinaryTreeNode//二叉树节点 { BinaryTreeNode* _left; BinaryTreeNode* _right; T _

2017-09-19 23:15:14 434

空空如也

空空如也

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

TA关注的人

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