一起学习C/C++
文章平均质量分 70
分享C/C++学习总结,一些算法分析与数据结构
宇哲_安菲尔德
这个作者很懒,什么都没留下…
展开
-
linux定时任务(crond)
关于crondcrond是linux下的一个周期性的执行某种任务或者等待处理某些时间的一个守护进程,与windows下的计划任务类似,当安装完成操作后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。crond并且也是一个守护进程,类似于计划任务,crond进程会自动启动。 上图中我们可以看到1920c原创 2017-02-27 22:12:55 · 738 阅读 · 0 评论 -
进程间关系
说完了进程,我们来说一下进程间关系。进程组一个或者多个进程的集合,每一个进程除了有一个进程ID之外,它还属于一个进程组。通常来说,进程组和作业相关联,可以来接收同一个终端下的各种信号,每一个进程组也有对应的唯一进程组ID。 这一列PGID就是进程组,我们可以看到上面那三个mydaemon的守护进程所在不同进程组。这里下面的带[]的都是内核进程,可以看到它们都在同一进程组。组长进程:组长进程就是原创 2017-03-01 22:17:37 · 1931 阅读 · 0 评论 -
gdb调试多线程多进程
今天进行学习一下关于gdb调试多线程和多进程的情况:gdb调试多进程尝试来调试多进程的程序,我们使用gdb进行调试程序,gdb的调试默认是调试父进程的,但是为了做到可以对父进程和子进程都做到调试,所以附加了调试子进程的功能。我们可以对fork出来的进程进行设置调试方法。follow-fork-mode的用法为:set follow-fork-mode parent/child如果你选择了parent原创 2017-03-03 09:28:06 · 1670 阅读 · 0 评论 -
Shell当中的字符串切割
我们来看一下以下这几种字符串切割的方式。1.使用 # 和 ## 来进行截取。val=“hello world!”echo ${val#*o}echo ${val##*o}进行字符串截取, 第一个是从左到右进行删除第一个o的字符串。 第二个是从左到右进行删除最后一个o的字符串。 这里的 * 表示的是通配符所以输出是: 使用%和%%进行截取 第一个介绍了从左到右进行截取,下面我们就进行介绍一下原创 2017-03-27 18:26:26 · 22412 阅读 · 1 评论 -
I/O多路复用——select
接下来我们讨论3篇关于I/O多路复用的问题,首先我们来看下select,select是多路复用当中最早的一种I/O复用的最主要的功能就是让程序能够同时去监听多个文件描述符,这样程序的性能就能提高。select介绍我们先来看一下select的接口。 int select(int nfds, fd_set *readfds, fd_set *writefds,原创 2017-03-27 21:40:20 · 814 阅读 · 1 评论 -
I/O多路复用——poll
上一篇我们说了关于select的相关信息,我们可以看到select是有弊端的,所以为了解决select的弊端,UNIX又在后期提出了poll。select的弊端这里就不多说了,上一篇博客有提及。pollpoll和select类似,不过在一些方面改善了select的弊端。它也是在指定的时间进行轮询文件描述符,查看是否有就绪时间发生。和上次一样,我们先来看一下poll系统调用。 int poll(str原创 2017-03-27 22:29:25 · 1293 阅读 · 0 评论 -
I/O多路复用——epoll
说完了select和poll,那么必须要说一下epoll的。select和poll是UNIX当中的,epoll是Linux所特有的。和前面的思路一样,poll解决了select的缺点,所以epoll的出现也是为了最大化的提高多路复用的效率,解决poll的缺点。epoll介绍epoll的实现和select与poll的实现有很大的差异,epoll不像select和poll一样通过一个系统调用来完成任务,原创 2017-03-28 13:23:15 · 1132 阅读 · 0 评论 -
I/O多路复用比较(select,poll,epoll)
讲述完了三种I/O多路复用模型,我们现在需要进行一下比较。比较三种I/O多路复用关于他们的优缺点呢,前面三篇博客我都有所提及,这里我主要为了再次总结一下。 select和poll都只能工作在低效的LT(水平触发),这种方式下进行多次的循环处理时间的等待。而epoll是在高效的ET(边沿触发)模式下工作,这个模式下当有时间响应的时候,应用程序这个时候必须立即处理。并且epoll还支持EPOLLONE原创 2017-03-28 13:49:28 · 741 阅读 · 0 评论 -
存储映射I/O(mmap函数)和共享内存
前言最近在一次电话面试的过程中,面试官问我相关的共享内存的知识,当时就认为是我在学习IPC进程间通信学习到的共享内存,所以就给面试官讲解了一下,然后,面试官说我是否知道在Linux下的存储映射I/O,当时我下意识的知道就是mmap函数,但是感觉自己对这两个理解还是不够深刻,所以,写一篇博客来记录一下。首先附上我的关于共享内存的链接,关于共享内存的大致内容我这里就不多提了。 http://blog.原创 2017-03-28 15:26:14 · 2762 阅读 · 0 评论 -
静态库和动态库
前言在平时,我们很少关注于编译和链接的过程,在现在IDE遍布的天下,IDE为我们考虑好了一切。但是真正的藏在每个程序运行背后的东西,很多系统软件背后的运行机制都是需要我们去熟悉的,熟悉了这些,我们才能快速的解决一些相关的性能等问题。大家应该都知道对于链接来说,应用程序有两种的链接方式,一种就是静态链接,一种是动态链接。对于链接,链接的主要内容就是把各个模块之间相互引用的部分都处理好,是的各个模块之家原创 2017-02-18 15:41:58 · 697 阅读 · 0 评论 -
进程间通信——共享内存
前言进程间IPC通信的三大主题,消息队列,信号量,共享内存,我们接下来说一说共享内存,共享内存可以提供给服务器进程和客户进程之间进行通信,不需要进行数据的复制,所以速度最快,只需要让两个进程通过页表映射到同一块物理内存即可,这样,这块物理内存是两个进程都能看到的,这样当一个进程进行写操作,另外的一个进程也就可以做读操作。所以问题关键也就是给出一个特定的存储区。通常情况下,我们需要确保一个进程在写的时原创 2017-02-20 16:03:07 · 2608 阅读 · 5 评论 -
进程间通信——消息队列
前言进程间需要进程通信进行数据传输和资源共享,另外一个进程在很多时候需要向另外的一个进程通知事件,有时候进程之间存在关系,需要去控制另外的一个进程,所以进程通信是很需要的。进程间通信的第一种就是消息队列什么是消息队列消息队列是消息的链表,存放在内核当中,由消息队列标识符标识,消息队列提供一种进程之间数据块传送的方法,每个数据块都被认为是一种类型。每个进程都有一个与之相关联的消息队列,其功能就类似于一原创 2017-02-20 17:29:55 · 1151 阅读 · 2 评论 -
守护进程
我们接下来说一下关于守护进程。守护进程也叫做精灵进程,是运行在后台的一种特殊的进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。生存周期长,它们常常在系统引导装入的时候启动,仅仅在系统关闭的时候才终止。因为它们没有控制终端,所以说它们是在后台运行的。很多服务器的应用都和守护进程相关。守护进程的特征:通常来说,我们需要知道,对于当我们开机以后首先操作系统首先通过0号进程去进行操作原创 2017-02-27 17:46:52 · 1015 阅读 · 1 评论 -
多线程编程(1)
线程概念线程线程就是进程的若干个执行流,因为一个进程在某一时刻只能去做一件事情,有了线程之后,我们可以在同一时间去做不同的事情,比如我正在边利用cmd markdown写博客。边用网易云音乐听音乐,这样多线程的情况下,能给我们带来很多好处。 在系统内核中其实是不存在线程的,linux使用进程模拟线程,线程的实现其实就是多个共享数据代码等信息的进程。所以我们把线程也叫做轻量级进程。进程常常用来分配资源原创 2017-02-20 20:14:42 · 915 阅读 · 0 评论 -
进程间通信--信号量
对于信号量来说,是IPC机构当中的一个,与消息队列等不同,它是一个计数器,用于为多个进程提供对共享数据对象的访问,接下来,我们对信号量进行一些探索。在这我们需要提出一些概念: 临界区:指的是访问临界资源的程序代码片段。临界区只能允许一个进程进入。 临界资源:临界资源说的是一次只能提供一个进程使用的资源。 互斥:互斥是指某一个资源同时只允许一个访问者对其进行访问。 原子性:一个事务包含多个操作原创 2017-02-16 23:29:32 · 848 阅读 · 0 评论 -
进程—内存描述符(mm_struct)
前言上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员包含了很多与进程相关的信息,今天我们来看一下其中一个被叫做内存描述符的结构体——mm_struct,抽象的来描述linux下进程的地址空间的所有的信息。1.概述一个进程的虚拟地址空间主要由两个数据结来描述。一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs。最高层次的mm_struc原创 2017-01-12 10:20:00 · 29161 阅读 · 0 评论 -
进程调度算法
今天我们来谈一谈进程调度算法:1. 先来先服务调度算法(FCFS)先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为原创 2017-02-12 13:32:46 · 839 阅读 · 0 评论 -
文件描述符和文件指针的区别
1.什么是文件描述符?文件描述符是计算机科学中的一个术语,是一个用于表述只想文件的引用的抽象化概念。在linux当中,每个进程会在进程控制块(PCB)当中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表都有一个指向已经打开文件的指针。每个linux进程都应该有三个标准的文件描述符,对应三个标准流。 整数值 名称 (unistd.h)符号常量 (stdio.h)文件流 0原创 2017-02-12 14:09:08 · 1869 阅读 · 0 评论 -
linux中关于压缩的命令
1.前言最近在linux下安装东西,发现好多安装都需要通过使用压缩指令来完成,所以觉得是时候来总结一下了。在windows下,我们常见的压缩格式有两种,zip和rar。在讲述压缩指令之前,我们先去看两个概念,打包和压缩。这个很好理解,打包,就是把零散的东西包装起来成一个总文件,压缩呢,就是把一个大文件压成小文件。这两个概念是必须要清楚的,对于linux来说,后续很多命令存在在这个概念的区别。首先,我原创 2017-01-01 10:55:44 · 3879 阅读 · 0 评论 -
进程管理—进程描述符(task_struct)
前言当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息。 内核当中使用进程描述符task_struct。 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理。接下来我们需要对tas原创 2017-01-12 09:52:15 · 3020 阅读 · 0 评论 -
从一个进度条看问题
1.前言我们要实现关于一个进度条,我们的想法是采用for循环的方式,所以对于这个进度条,我们需要从下面几个问题来一一看待问题。2.关于 ‘\n’ 与 ‘\r’这两个符号,一个叫做回车,一个叫做换行,好多人对这两个分不清,所以我们在这里需要介绍一下。 在最早的时候,只有打字机的时候,人们在每行的后面加上两个表示结束的字符,一个叫做回车,它把打字机的光标定位在左边界,另外一个是换行,它用来换到下一行,原创 2016-12-31 20:45:40 · 3318 阅读 · 0 评论 -
初识linux下的三个时间
1.从命令看时间在linux下,我们可以去查看一个文件的三个时间,比如:对于test.c文件我们可以查看时间,使用命令 stat查看stat test.c在这里我们得到以下信息。 通过上述信息,我们可以看到有许多信息,接下来,对于这三个时间,我们进行一番讲解。2.深入理解三个时间atime(Access time):当我们去访问这个文件,这个时间会被改变,时间就是最后一次我们访问的时间,例如原创 2016-12-24 22:29:29 · 2279 阅读 · 0 评论 -
初识linux下的find命令
1.认识find命令关于find命令,本人认为是linux当中所有的命令当中最重要的一个命令之一,所以,在这里,我们来聊一聊find命令。find命令用于在目录下查找文件,find是在磁盘上进行查找,所以相对来说,效率会低一些。首先,给出find命令所有的参数 -amin<分钟>:查找在指定时间存取过的文件或者目录,单位以分钟计算。 上述就显示了我15分钟内存取过的文件或者目录,这里说的是被访问原创 2016-12-30 19:36:08 · 869 阅读 · 0 评论 -
关于linux新手常用命令
这些命令是最先看linux时常用的,现在来汇总下:1.切换用户 当使用su你可以在当前用户模式下切换到root模式,而你想要退出root时,输入exit命令即可。 2.显示日期的指令 当我们在命令行模式下,需要知道日期时,只需要键入命令 date 3.显示日历 在linux下,我们也可以用命令 cal 来查看日历。默认我们输出的是某一个月的。 4.计算器 采用命令 bc 我们可原创 2016-04-03 12:32:35 · 627 阅读 · 0 评论 -
初识linux软链接和硬链接
1.从文件开始到软硬链接在认识软链接和硬链接之前,我们先来了解一下整个系统当中的文件存放特点,在linux当中,数据分为元数据和用户数据,元数据包括文件的一些属性,例如文件大小,创建时间等一些内容。元数据当中有一个叫做inode(它是元数据的一部分,可以叫做索引节点号),inode作为文件的唯一标识。而文件名,是为了方便记忆。linux系统通过inode来查找正确的数据块,获取对应的信息,而对于用户原创 2016-12-22 20:55:46 · 2117 阅读 · 3 评论 -
STL剖析——空间配置器
近来闲来无趣,看了下STL的空间配置器。首先恭喜我入坑,网上无数的人都在剖析这STL的空间配置器,所以,刚好,今天我也加入了这个团队,这个应该是我目前看到的比较完整架构的一个源码了吧,希望能提示我的水平,毕竟设计的很好。在这里特别说下,没有操作系统的知识,所以在这里的线程和锁的这些问题,我们一概不讨论STL的空间配置器,就是一个为了给容器进行分配内存和管理内存的东西,容许我盗几张图给大家说明。 这原创 2016-12-09 12:59:15 · 885 阅读 · 0 评论 -
面试题——快排挖坑法的应用
对一个数组按照给定的下标进行排序,仅仅使用两两交换的方式,要求不能对数组进行扩容,尽可能少的额外空间。 如:原数组为A,B,C,D,E,现在给定的新位置为3,0,1,4,2,那么排序后为D,A,B,E,C, void SwapSort(int *pArr,int *pPos,int n)1.解决问题这是最近看到的一道面试题,感觉突然一下不容易想到,所以特此来写一下:实现代码:原创 2016-12-17 19:13:25 · 2154 阅读 · 1 评论 -
回忆智能指针
今天去回想了一下智能指针,发现长时间不用,好多知识点都忘记了,所以在这里写一篇博客记录一下。C++当中没有自动内存回收机制,这样每次new出来的内存都需要我们手动的去delete,这样就会存在忘记的可能性,最终造成内存的泄漏。,所以为了解决这个问题,C++引入了智能指针。std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_a原创 2016-12-05 11:13:57 · 435 阅读 · 0 评论 -
内存池——实现一个简单的固定大小的内存池
最近在STL当中看到了第二级内存分配器,这里有个内存池的内容,在这在知乎上看到了内存池的相关内容,所以萌生了一个想自己写一个简单的内存池的想法。这种简单的内存池,援引自知乎的: 实现固定内存分配器: 即实现一个 FreeList,每个 FreeList 用于分配固定大小的内存块,比如用于分配 32字节对象的固定内存分配器,之类的。每个固定内存分配器里面有两个链表,OpenList 用于存储原创 2016-12-04 21:48:23 · 4164 阅读 · 1 评论 -
二叉树——面试题
1.求二叉树中最远的两个节点的距离在这我们首先来分析思路,对于最远的两个节点,在这会有两种情况。1)如果root为NULL,那么这是一颗空树。空树的最远子节点距离和高度均为零。 2),如果root非空,最大距离要么是左子树中的最大距离,要么是右子树中的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离,同时记录左子树和右子树节点中到根节点的最大距离。 示例代码://求原创 2016-11-30 12:33:21 · 1216 阅读 · 0 评论 -
归并法外排序—海量数据排序
1.外归并排序讲完了内排序,我们来了解一下,外归并排序,外归并排序一般是应对于数据量非常大的数据,这些数据放在硬盘上,无法一次性的放到内存上。所以,我们通常采用的思路对于这些数据就是进行切分,然后对切分出来的文件进行排序。在排序的时候,小文件我们采用快排来排序,如果是大文件,我们就从两个文件中一个一个读取,然后进行归并排序,放入合并以后的文件当中,最后最大的文件就是排序以后的结果。外排序是指在排序期原创 2016-11-29 20:10:55 · 3143 阅读 · 1 评论 -
非比较排序—计数排序和基数排序
讲述完了比较排序以后,我们来看一下非比较排序。1.计数排序实现计数排序是一种稳定的排序算法,计数排序实现简单。它算法的步骤是:1)首先找出序列当中的最大和最小的数,然后通过这两个数确定一个范围,这样就可以直接建立一个范围这么大的哈希表。 2)把数对应哈希表的下标,统计次数。 3)通过哈希表,从小到大进行遍历,然后按哈希表顺序写入序列当中。 示例代码:#pragma once#define _C原创 2016-11-26 19:37:16 · 677 阅读 · 0 评论 -
从一道小米面试题看并查集
首先,我们从一道题来引出这个问题。假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋原创 2016-11-26 22:06:12 · 1573 阅读 · 1 评论 -
分析归并排序
对于归并排序而言,我们应该需要关注一下思想,归并也是一种分治的思想,类似与快速排序,但是又和快速排序有本质的区别。归并排序归并排序将要排序的序列分成两个长度相等的子序列,然后对每一个子序列进行拆分,一直到只有两个元素的两个子序列,对这两个子序列进行归并,将它们合并成一个序列,这种方法就是所说的二路归并的方法。实现归并排序的思路: 所以,综合下来,我们实现代码://递归解决归并排序templat原创 2016-11-24 09:25:04 · 804 阅读 · 0 评论 -
选择排序及其优化
选择排序是八大内部排序方法中的一种,选择排序的整体的思想就是,我们在一个序列当中选出一个最大的(升序为最小的),然后和第一个元素交换,然后后面再在剩下的找最大的,再和第二个元素交换。这样最终就可以得到一个有序的序列。我们最先接触的就是这种写法。//Cpp版本template<typename T>void SelectSort(T* arr,int n){ int max = 0;原创 2016-11-23 22:22:22 · 9842 阅读 · 3 评论 -
快速排序及其优化
我们今天来研究下快速排序,快速排序的一个整体的思想就是分治的思想,在这个过程当中,首先对一个大区间进行单趟快速排序,然后把大区间分成多个区间,再去进行单趟排序,一直到这个区间中的元素只剩下一个元素,这样重复以后就可以得到最后的排序后的结果。 1.单趟排序分析快速排序的最重要的就是单趟排序,接下来就是进行分治的单趟排序,所以我们来重点说一下单趟排序。我们在这里介绍关于快速排序的单趟排序的三种方法。左原创 2016-11-23 22:13:46 · 2541 阅读 · 1 评论 -
从直接插入排序到希尔排序
希尔排序需要和直接插入排序我们来联合起来进行比较。1.直接插入排序首先我们来看直接插入排序: 直接插入排序就是一个将无序区的内容向有序区放的一个过程,有序区不断地变大,无序区不断的变小,这样最后全部变为有序,就完成了直接插入排序的过程了。算法步骤:1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序原创 2016-11-17 14:15:17 · 1037 阅读 · 0 评论 -
浅析——B树,B+树,B*树以及分析MySQL的两种引擎
接触到了数据结构当中的B树,B+树,B*树,我觉得应该写一篇博客记录下,毕竟是第一次接触的,只有写了博客以后,感觉对这个的印象才会更加深刻。 前言: 为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?这个要从几个方面来说了, 计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 所以当你用红黑树的时原创 2016-11-17 13:52:50 · 18070 阅读 · 5 评论 -
初识STL——set,multiset,map,multimap
最近在学习STL,在前期分析了vector和list的源码,印象很深,感觉对自己以后的代码之路产生了很多改变,今天,介绍下STL当中的几个关联式容器。本博客所有论述的都为SGI版本的STL。1.什么是关联式容器关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及po原创 2016-11-13 15:08:59 · 1535 阅读 · 0 评论 -
海量数据分析问题总结
1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。2)与上题原创 2016-11-10 13:36:13 · 1781 阅读 · 1 评论