自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sunnylunch-blog

介绍c/c++基础知识,介绍一些项目。

  • 博客(283)
  • 资源 (1)
  • 收藏
  • 关注

原创 系统调用与库函数调用

一、linux结构图简要分析 典型的linux结构如图: 操作系统与内核基本上是相同的,只不过操作系统在内核的基础上还有一些延伸,包括了提供基础服务的组件。操作系统对下通过驱动程序管理硬件。对上的话则暴露出来一些接口,供上层调用,这些接口就叫做系统调用。shell是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机交互界面。库函数是在系统调用的基础上

2017-01-17 21:15:43 5393 7

原创 linux进程的状态

一、进程的状态 进程描述符(task_struct)中的state变量描述进程的当前状态。常见的状态如下: 1、TASK_RUNNING(运行状态):表示进程是可执行的,它正在执行,或者在运行队列中等待执行。 2、TASK_INTERRUPTIBLE(可中断,也就是睡眠状态):进程正在睡眠(也就是进程被阻塞)等待某些条件满足后才运行。 3、TASK_UNINTERRUPTIBLE(不可中断,

2017-01-16 21:38:54 2015 1

原创 进程调度算法

1、先来先服务调度算法(FCFS) 先来先服务调度算法(FCFS)调度算法是一种最简单的调度算法。在进程调度中采用先来先服务算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使它能够运行。该进程一直运行到完成或发生某件事而阻塞后才放弃处理机。2、短进程优先调度算法(SPN) 短进程优先算法(SPF),是指对短进程优先调度的算法。短进程优先调度算法是从就

2017-01-16 20:22:04 1108

原创 task_struct(进程描述符)

一、什么是进程?什么是PCB??? 进程是一个正在执行的程序。 进程是程序的一个实例。 进程能分配处理器并由处理器执行的实体。 如果从内核的角度看的话:进程是分配系统资源的单位。当一个程序被加载到内存之后并为他分配一个PCB(进程控制块),这时候就称为进程了。在linux中PCB就是一个名字叫做task_struct的结构体,我们叫他”进程描述符”。它里面有进

2017-01-11 20:32:27 2737

原创 mm_struct简介

一、什么是mm_struct??? 内存描述符也用一个结构体表示,这个结构体的名字叫做mm_struct(内存描述符),linux就是通过mm_struct这个结构体来实现内存管理。 一个进程的虚拟地址空间主要由两个数据结构来描述,一个是最高层次的mm_struct,一个是较高层次的vm_ares_struct。最高层次的mm_struct结构描述了一个进程的整个虚拟地址空间。较高层次的结

2017-01-11 17:57:00 3965 2

原创 linux常用指令(2)

1、chattr&lsattr 1.1、chattr:改变文件属性 说明: chattr命令的作用很大,和chmod相比,chmod知识改变文件的读写、执行权限,更底层的属性控制由chattr来改变的。通过chattr命令修改属性能够提高系统的安全性,但是他并不适合所有的目录。chattr不能保护:/、/dev、/tmp、/var目录。命令:chattr [-RV] [-v versi

2017-01-09 15:40:53 1010

原创 GDB调试指南(初级)

GDB是Linux环境下的代码调试工具。如果我们在linux下面写代码的话,可以用GDB对程序进行调试。源代码经过编译之后生成的程序程序有两种:relese版本和debug版本。要想对程序进行调试的话就要在debug版本下面进行调试,因为debug版本下面加入了许多调试信息。在linux下面编写出来的代码是relese版本的,所以我们要想对程序进行调试的话,就必须在生成源代码的时候加上-g选项。

2017-01-07 12:41:15 5999

原创 linux下查询命令

1、which: which命令是在PATH变量指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。也就是说,使用which命令,就可以看到系统命令是否存在,以及执行的到底是哪一个位置的命令。命令格式:which 可执行文件名称 which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。2、whereis: whereis命令用于程序名

2017-01-01 23:02:28 6408 3

原创 linux下查看文件内容工具

在linux下面我们想要查看一个文件里面的内容,除了用编辑器把文件打开查看外,linux还提供了几条命令,可以不用打开文件就能把文件的内容输出到显示屏上进行查看。1、cat cat命令主要用来查看文件内容,创建文件,文件合并,追加文件等。 1.1、查看文件 命令:cat 文件名 说明:这条命令会把文件的内容全部 输出到显示屏上。 cat -n 文件名:查看文件内容,并对每一行都进行编号。

2017-01-01 22:49:47 7029 3

原创 make&makefile——(1)

在linux下,make有两个作用。第一个作用,可以通过命令行来编译和安装很多工具。第二个作用,可以用make来管理大型复杂项目编译问题。下面我们主要来介绍用make来管理大型复杂项目的编译问题。 make像命令行参数一样接受目标。这些目标通常放在Makefile(或makefile)来命名的特殊文件中,同时这个文件也包含与目标相对应的操作。当make命令第一次执行时,它扫描Makefil

2017-01-01 20:55:45 4797

原创 简易动态进度条实现

在生活中我们随处可见进度条,下面我们来实现一个能够动态变化简易的进度条。 分析:在这里所谓的动态变换其实不是真的让它进行动态变换,而是利用人眼的视觉暂留现象,当进度条显示出来的时候看起来像是动态变换的。 如上图: 最开始用一个”=”表示进度是1%,当把这个进度的状态显示完毕之后,我们再回到这一行的开始位置输出两个”=”表示2%。原理就是这样,比较简单的,但是在这里面我们需要注意两个

2016-12-31 20:39:26 7283

原创 Linux常用命令(1)

1、查看文件与目录 命令:ls [参数] 目录名称 -a :列出目录下所有的文件,包括以”.”开头的隐藏文件。 上面图中有三个隐藏文件,”.”表示当前目录,”..”表示上级目录。-i:输出文件的inode编号。 -l:列出文件的详细信息。 ls -l可以简化成ll。-s:在文件名后面输出文件的大小。 -S:以文件大小进行排序。 2、切换目录 命令:cd 目录名称 常用快

2016-12-30 16:18:15 9701

原创 Linux中的权限

一、linux中的权限在linux系统下,一切东西都可以看做是文件。针对一个文件而言,不同的用户对它有不同的权限。试想一下,假如有一个系统的配置文件,普通用户都可以对它进行修改,那么这将是多麽可怕的事情。所以,我们将根据不同的文件访问者设置不同的权限。在linux中,我们可以将文件的访问者分为三类,针对这三类访问者我们可以对他们设置不同的权限。 1、文件访问者的分类: 文件和文件目录的所有者:u

2016-12-29 23:11:07 2531

原创 find指令

我们知道,linux下面一切皆文件,所以对于像linux操作系统来说find是一条很重要的命令。linux下面的find指令用于在目录结构中搜索文件,并执行指定的操作。它提供了相当多的查找条件,功能很强大。在不指定查找目录的情况下,find会在对整个系统进行遍历。即使系统中含有网络文件系统,find命令在该文件系统中同样有效。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,

2016-12-27 13:55:17 2859 1

原创 vim系列(1)——初识vim

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2016-12-26 17:45:55 504

原创 touch指令

linux中的touch指令有两个功能,第一是修改文件的时间戳,第二是创建一个不存在的文件。1、命令格式 touch [参数选项] 文件名2、命令参数 -a 或–time=atime或–time=access或–time=use只更改存取时间。 -c 或–no-create 不创建任何文档 -m 或–time=mtime或–time=modify 只更改变动时间。 -r 将指定文件或目录的

2016-12-24 21:12:11 2891

原创 软连接和硬连接

一、文件的存储 我们知道,文件存储在硬盘上,硬盘的最小存储单位叫做”扇区”(sector),每个扇区存储512B,操作系统读取硬盘的时候,为了提高速度他不会一个扇区一个扇区这样的读取,他会一次连续读取多个扇区,也就是一次读取一个”块”(block)。这种由多个扇区组成的”块”是文件存取的最小单位,一般常见的块的大小是4k。 文件内容存储在”块”上,而文件的基本信息则存储在inod

2016-12-24 13:29:37 2200

原创 Linux文件类型

一、linux下面所有东西都是文件,既然是文件那么这些文件类型又是如何进行区分的呢??? 在windows下面是通过文件的扩展名来区分文件类型的,但是在linux中却不是这儿样的。在linux中就没有所谓的文件扩展名,一个linux文件能不能被执行时取决于它的属性中是否有x,与文件名一点关系都没有。一般我们所看到的文件扩展名只是为了给我们用户自己看的。提到文件的话就不得不先来简单了解一下i

2016-12-23 22:59:27 4109

原创 Linux环境变量

一、什么是环境变量??? 环境变量是在操作系统中具有一个特定名字的对象,它包含了一个或多个应用程序所将要使用到的信息。环境变量相当于给系统或用户应用程序设置的一些参数,具体什么作用这当然和具体的环境变量有关。二、linux下的环境变量 linux是一个多用户的操作系统,每个用户登录系统之后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认的环境实际上就是一组环

2016-12-23 20:24:40 5458

原创 STL——总纲

STL(标准模板库)是C++标准库中最重要的组成部分,它不仅是一个可复用组件库,而且是一个包罗算法和数据结构的软件空间。 STL充分体现了泛型化思想,它致力于追求复用。在复用的同时,STL还追求效率,比如迭代器萃取机制。总的来说,STL所做的一切都是以复用和效率为目标的。 STL有多个版本,linux下面用的SGI版,windows下面的PJ版。此外还有HP版本、RW版本等。

2016-12-19 16:17:25 738

原创 对一个数组,按照给定的下标进行排序,仅使用两两交换的方式

对一个数组,按照给定的下标进行排序,仅使用两两交换的方式,空间复杂度O(1)。例:原数组 A B C D E,现给定新位置为3 0 1 4 2 排序后的结果是D A B E C 初次见到这道题的时候,着实让我头疼了一把,最后经人指点,自己也就有了一个大致的思路,下面将这道题的解法做一下总结。分析:这道题要用到挖洞法的思想,不过要在挖洞法的基础上再做一些改进。 例1:原数组 A B C D

2016-12-17 15:11:50 4988 2

原创 基于进程的并发编程

基于进程的并发编程

2016-12-10 20:42:15 1499

原创 揭秘——STL空间配置器

为什么要有空间配置器呢?这主要是从两个方面来考虑的。1、小块内存带来的内存碎片问题  单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。2、小块内存频繁申请释放带来的性能问题。  关于性能这个问题要是再深究起来还是比较

2016-12-07 23:07:10 5267

原创 如何设计一个简单内存池

什么是内存池???  通常我们用new或malloc来分配内存的话,由于申请的大小不确定,所以当频繁的使用时会造成内存碎片和效率的降低。为了克服这种问题我们提出了内存池的概念。内存池是一种内存分配方式。内存池的优点就是可以有效的减少内存碎片化,分配内存更快速,减少内存泄漏等优点。  内存池是在真正使用内存之前,先申请分配一个大的内存块留作备用。当真正需要使用内存的时候,就从内存池中分配一块

2016-12-04 20:59:39 6496 4

原创

图是一种非线性数据结构,由顶点集合(vertex)和边的集合组成的一种数据结构。Graph=(V,E);V={x|x是顶点集合}; V是顶点的集合E={|x,y属于V}; E是边的集合图分为无向图和有向图。1、无向图2、有向图完全图:在由n个顶点组成的无向图中,若有N(N-1)/2条边,则成为无向完全图。(也就是说任意两个点都有路

2016-12-02 21:17:27 1791

原创 B+树&B*树简介

一、B+树B+树是B树的变体,也是一种多路搜索树,它的定义如下:1、根节点要么是叶子结点,要么至少具有两个孩子2、一棵M路的B树M至少大于2,每个非根结点的孩子的个数有[M/2,M]3、所有叶子结点都在同一层4、非根结点的子树指针与关键字的个数是相等的,也就是说孩子的个数与关键字的个数是相等的。5、为所有孩子结点都增加了一个链指针,可以按照关键码排序的次序遍历全部记录。

2016-11-27 19:23:16 979

原创 海量数据排序

排序分为内部排序和外部排序两大类,若要排序的元素很多,整个序列的排序过程不可能在内存中完成,则此类排序就称为外部排序。针对外部排序这种问题,下面我们来介绍一种方法。  由于要排序的数据量很大,不可能一次性加载到内存,所以我们就采取"分而治之"的方法。先将大文件分割成若干的小文件,使得小文件中的数据能够完全加载到内存。然后分别将每个小文件加载到内存并使用快速排序使之有序,将有序的序列再放回到小文

2016-11-27 13:13:24 2255

原创 并查集

在一个有N个元素的集合问题中,我们通常是让每个元素构成一个单元素的集合,然后按一定顺序将属于同一集合的元素进行合并。在此过程中要不断的查询某个元素归属于哪个集合,适合于描述这类问题的抽象数据类型我们称之为并查集。例: 已知有n个人和m对好友关系,并且这些好友关系存储在r里面,如果两个人是直接或间接的好友,则认为他们属于同一个朋友圈。  n=5,m=3,r={{1,2},{2,3},{4

2016-11-26 13:05:08 767

原创 基数排序

基数排序的主要思想:  基数排序又称"桶子法",他从低位开始将待排序的数按照这一位的值放到相应的编号为0到9的桶中。等到低位排完之后得到一个序列,再将这个序列按照次低位的大小进入相应的桶中。以此类推,直到将所有的位都排完之后,这组数就已经有序了。例:  基数排序是一种非比较排序,它的时间复杂度是O(N*digit),其中digit是这组待排序中的最大的数的数量级,它

2016-11-25 23:10:48 941

原创 计数排序

计数排序主要思想:  给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组统计出要排序的序列中各个元素出现的次数。等到统计完成的时候,排序就已经完成了。例:  计数排序是一种非比较的排序方法,它的时间复杂度是O(N+K),空间复杂度是0(K),其中K是要排序的数组的范围。可以看出计数排序是一种以

2016-11-25 20:23:05 732

原创 排序——Merge

归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。实现:void _MergeSort(int *a,int begin,int end,int *tmp){ int mid = ((begin^end) >> 1) + (begin&end); if (m

2016-11-23 18:34:18 1025

原创 排序——Quick

一、快速排序的过程快速排序:  快速排序是一种划分交换的方法,它采用分治法进行排序。其基本思想是取待排序元素序列中的某个元素作为基准值,按照这个元素的大小,将整个元素序列划分成两个左右两个子序列,使得左子序列的值都比这个元素小,右子序列中的值都比这个元素值要大于或等于,基准元素值则排在这两个序列中间,然后再对这两个子序列进行同样的方法,直到所有元素都排在相应的位置(即序列中只有一个元素或者

2016-11-23 13:12:28 1457

原创 线索化二叉树

线索化二叉树为我们提供了一种不需要递归和借助栈就能遍历一颗二叉树的方法,如果将二叉树写成STL的形式,那么线索化就可以为之提供迭代器,这也是线索化二叉树的最主要的用法。线索化二叉树有三种方式,前序线索化,中序线索化和后序线索化。一般只要掌握前序线索化和中序线索化就可以了。后序线索化遍历的时候要借助于三叉链表或者FindParent(寻找父亲结点的函数)。 将一颗搜索二叉树转换成有序双向链表

2016-11-20 22:26:03 881

原创 二叉树经典面试题

以下二叉树的结点类型如下:templatestruct BinaryTreeNode{ T _data; BinaryTreeNode *_left; BinaryTreeNode *_right; BinaryTreeNode(const T& data = T()) :_data(data) , _left(NULL) , _right(NULL){}};

2016-11-18 20:18:21 2253

原创 排序——Shell

希尔排序又称为缩小增量排序,它是插入排序的一种变形。希尔排序:  设待排序元素有n个,首先取一个整数gap例如:对{ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }进行升序排列。具体代码实现:void ShellSort(int *a, int len) //插入排序的变形,通过预排序使得元素大致有序,再通过插入排序使

2016-11-17 13:34:23 1320 1

原创 set与map用法简介

在介绍容器之前,我们先来介绍一下pair,pair是一种模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在#include 中。可以看到,pair的两个成员分别是first和second。一、set(集合):    set是一种key结构,它的元素就是它的键值,set不允许有两个相同的键值,set中的所有元素的键值都会自动被排序。set和

2016-11-13 18:58:37 1106 1

原创 浅析B-树

B树是一种适合与外查找的的搜索树,他是一种平衡的多叉树。在B树的每个结点中包含一组指针recptr[M]指向实际记录的存放地址。key[i]与recptr[i]形成一个索引项,通过key[i]可以找到某个记录的存储地址recptr[i]。M阶的B树具有以下特点:1、根节点要么是叶子结点,要么具有两个孩子。2、非根结点(叶结点除外)都具有[M/2,M]个孩子。3、非根结点都具

2016-11-12 15:15:09 1538

原创 大数据——面试题总结(1)

1、给出一个超过100G的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?分析:  由于文件超过100G,所以我们必须先对文件进行切分,然后再利用数据结构的知识求解。关键是如何切分效率最高???解决方法:  我们可以使用哈希切分,将同一个ip都分割到同一个文件中,注意同一个ip经过同一个散列函数 一定会进入到同一个文件中,然后再统计每一个

2016-11-09 15:27:52 2981

原创 如何定义一个不能被继承的类

如何定义一个不能被继承的类???    假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢???方法1:     我们可以在类内创建一个对象并提供一个静态的接口,返回创建的这个对象。但是如果使用这种方法的话,在定义B的对象的时候感觉不是很完美。方法2:   

2016-11-08 21:19:41 3985

原创 如何定义一个只能在栈上生成对象的类

如何定义定义一个只能在栈上生成对象的类???  这种题主要考的是对C++语法的理解,以及对C++语法的运用。分析:    对象可以在栈上生成也可以由我们在堆上new出来。要想只在栈上生成对象而不能在堆上生成对象在类外是无法完成的,我们必须从类的内部入手。    我们知道类对象的构造是由构造函数完成的,如果我们把构造函数声明为保护的,使得不能在类外

2016-11-08 19:13:11 1064

C&&C++知识体系结构图

C,C++知识体系结构图

2016-09-09

空空如也

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

TA关注的人

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