2018年2月23日

浅析I/O模型

摘要: 以下是本文的目录大纲: 一.什么是同步?什么是异步? 二.什么是阻塞?什么是非阻塞? 三.什么是阻塞IO?什么是非阻塞IO? 四.什么是同步IO?什么是异步IO? 五.五种IO模型 六.两种高性能IO设计模式 一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有 阅读全文

posted @ 2018-02-23 16:30 AlanTu 阅读(173) 评论(0) 推荐(0)

I/O复用 - 各种不同的IO模型

摘要: 一、概述 我们看到上面的TCP客户同时处理两个输入:标准输入和TCP套接字。我们遇到的问题就是在客户阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死。服务器TCP虽然正确地给客户TCP发送一个FIN,但是既然客户进程阻塞于从标准输入读入的过程,它将看不到这个ROF,知道从套接字读时为止( 阅读全文

posted @ 2018-02-23 16:27 AlanTu 阅读(304) 评论(0) 推荐(0)

Linux查看端口使用状态、关闭端口方法

摘要: 【摘要】 今天在编写socket,在期间遇到查看某个端口的状态,随后从网上找了一下,现在总结一下。 【内容】 大家都知道,端口不是独立存在的,它是依附于进程的。某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了。下次若某个进程再次开启,则相应的端口也再次开启。而不要纯粹的理解为关闭 阅读全文

posted @ 2018-02-23 16:26 AlanTu 阅读(89462) 评论(0) 推荐(0)

epoll讲解

摘要: 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数 阅读全文

posted @ 2018-02-23 16:25 AlanTu 阅读(304) 评论(0) 推荐(0)

Linux守护进程详解(init.d和xinetd)

摘要: 一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程来执行的。守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他 阅读全文

posted @ 2018-02-23 16:24 AlanTu 阅读(3106) 评论(0) 推荐(0)

linux下的僵尸进程处理SIGCHLD信号

摘要: 什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间,所以当终止子进程的父进程调用wait或waitpid时就可以得到这些信息。 而 阅读全文

posted @ 2018-02-23 16:21 AlanTu 阅读(535) 评论(0) 推荐(0)

传输层:TCP UDP SCTP

摘要: 总图 虽然协议族被称为“TCP/IP”,但除了TCP和IP这两个主要协议外,还有许多其他成员。图2-1展示了这些协议的概况。 图2-1中同时展示了IPV4和IPV6。从右向左看该图,最右边的5个网络应用在使用IPV6,随后的6个网络应用使用IPV4。 最左边名为tcpdump的网络应用或者使用BSD 阅读全文

posted @ 2018-02-23 16:17 AlanTu 阅读(741) 评论(0) 推荐(0)

Linux下Fork与Exec使用

摘要: 一、引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又 阅读全文

posted @ 2018-02-23 16:16 AlanTu 阅读(4660) 评论(0) 推荐(1)

TCP客户/服务器简单Socket程序

摘要: 建立一个 TCP 连接时会发生下述情形: 1. 服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这三个函数来完成,我们称之为被动打开。 2. 客户通过调用 connect 发起主动打开,这导致客户TCP发送一个SYN(同步)分节,标识希望连接的服务器端口以及 阅读全文

posted @ 2018-02-23 16:14 AlanTu 阅读(674) 评论(0) 推荐(0)

地址已经被使用 - Address already in use

摘要: 很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端socket后还是有这个问题。正如下面的这段简单的socket程序。 server.c #include 阅读全文

posted @ 2018-02-23 16:13 AlanTu 阅读(8785) 评论(0) 推荐(0)

Linux内存点滴 - 用户进程内存空间

摘要: 经常使用top命令了解进程信息,其中包括内存方面的信息。命令top帮助文档是这么解释各个字段的。VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, S 阅读全文

posted @ 2018-02-23 16:03 AlanTu 阅读(409) 评论(0) 推荐(0)

Linux内存使用方法详细解析

摘要: 我是一名程序员,那么我在这里以一个程序员的角度来讲解Linux内存的使用。 一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存。这两个概念主要来自于linux内核的支持。 Linux在内存管理上份为两级,一级是线性区,类似于00c73000-00c88000,对应于虚拟内存,它实际上 阅读全文

posted @ 2018-02-23 16:02 AlanTu 阅读(1480) 评论(0) 推荐(0)

直接管理内存

摘要: C++语言定义了两个运算符来分配和释放动态内存。运算符new分配内存,delete释放new分配的内存。 相对于智能指针,使用这来年刚给运算符管理内存非常容易出错,随着我们逐步详细介绍这两个四月份,这一点会更为清楚。而且,自己直接管理内存的类与使用智能指针的类不同,它们不能依赖类对象拷贝、赋值和销毁 阅读全文

posted @ 2018-02-23 15:55 AlanTu 阅读(141) 评论(0) 推荐(0)

动态内存和智能指针

摘要: 由编译器自动分配的内存都有着严格的生存期。全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部static对象在第一次使用前分配,在程序结束时销毁。 除了自动和static对象外,C++还支持动态分配对象。动态分配的对象的生存期与它 阅读全文

posted @ 2018-02-23 15:54 AlanTu 阅读(391) 评论(0) 推荐(0)

图说设计模式

摘要: 详见:http://design-patterns.readthedocs.io/zh_CN/latest/index.html 软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括 架构模式、分析模式和过程模式等,实际上,在软件生存 阅读全文

posted @ 2018-02-23 15:51 AlanTu 阅读(1244) 评论(0) 推荐(0)

设计模式概述

摘要: 1. 设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如 阅读全文

posted @ 2018-02-23 15:45 AlanTu 阅读(721) 评论(0) 推荐(0)

Facade - 外观模式

摘要: 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的 阅读全文

posted @ 2018-02-23 15:44 AlanTu 阅读(174) 评论(0) 推荐(0)

Adapter - 适配器模式

摘要: 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。 例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器 阅读全文

posted @ 2018-02-23 15:43 AlanTu 阅读(336) 评论(0) 推荐(0)

Bridge - 桥接模式

摘要: 1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具 阅读全文

posted @ 2018-02-23 15:40 AlanTu 阅读(334) 评论(0) 推荐(0)

Factory - 工厂模式

摘要: 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之 阅读全文

posted @ 2018-02-23 15:38 AlanTu 阅读(240) 评论(0) 推荐(0)

Singleton - 单例模式和Double-Checked Locking - 双重检查锁定模式

摘要: 问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再dele 阅读全文

posted @ 2018-02-23 15:32 AlanTu 阅读(248) 评论(0) 推荐(0)

Decorator - 装饰模式

摘要: 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性。如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上。 通过继承一个现有类可以使得子类在拥有自身方法的同时还 阅读全文

posted @ 2018-02-23 15:32 AlanTu 阅读(223) 评论(0) 推荐(0)

Template Method - 模板方法模式

摘要: 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->办理具体业务->对银行工作 阅读全文

posted @ 2018-02-23 15:31 AlanTu 阅读(598) 评论(0) 推荐(0)

设计模式 - 观察者模式

摘要: 提纲 问题的产生 观察者模式主要内容,定义 模式UML结构 使用场景 用户自定义观察者模式通用模式代码(java) 模式分类(推模型和拉模型) 模式实现(推模型) 模式实现(拉模型) 推拉两种模式的比较 优缺点 模式总结 JAVA提供的对观察者模式的支持 怎样使用JAVA对观察者模式的支持 Ruby 阅读全文

posted @ 2018-02-23 15:28 AlanTu 阅读(298) 评论(0) 推荐(0)

寻找最小的k个数

摘要: 1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 2 使用set的排序功能,以从大到小的顺序排序所有前K个元素,取出其余的元素与第一个元素比较,如果小于第一个元素,则将第一个元素删除,将当前元素插入。 3 使用pa 阅读全文

posted @ 2018-02-23 15:21 AlanTu 阅读(298) 评论(0) 推荐(0)

Trie树 - 字典树

摘要: 1.1、什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是最大限度地减少无谓的字符串比较,查询效率比较高。 Trie的核心思想是空间换时间,利用字符串的公共前缀来降 阅读全文

posted @ 2018-02-23 15:18 AlanTu 阅读(197) 评论(0) 推荐(0)

谈谈动态规划的思想

摘要: 动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些 阅读全文

posted @ 2018-02-23 15:16 AlanTu 阅读(10885) 评论(0) 推荐(0)

贪心算法 - 0/1背包问题

摘要: 1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi 阅读全文

posted @ 2018-02-23 15:14 AlanTu 阅读(14251) 评论(2) 推荐(0)

动态规划 - 活动选择问题

摘要: 一个递归解 设c[i][j]为Sij中最大兼容子集中的活动数目,当Sij为空集时,c[i][j]=0;当Sij非空时,若ak在Sij的最大兼容子集中被使用,则则问题Sik和Skj的最大兼容子集也被使用,故可得到c[i][j] = c[i][k]+c[k][j]+1。 当i≥j时,Sij必定为空集,否 阅读全文

posted @ 2018-02-23 15:12 AlanTu 阅读(564) 评论(0) 推荐(0)

贪心算法 - 活动选择问题

摘要: 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测 阅读全文

posted @ 2018-02-23 15:11 AlanTu 阅读(555) 评论(0) 推荐(0)

动态规划 - 最优二叉搜索树

摘要: 二叉查找树 摘要: 本章介绍了二叉查找树的概念及操作。主要内容包括二叉查找树的性质,如何在二叉查找树中查找最大值、最小值和给定的值,如何找出某一个元素的前驱和后继,如何在二叉查找树中进行插入和删除操作。在二叉查找树上执行这些基本操作的时间与树的高度成正比,一棵随机构造的二叉查找树的期望高度为O(lg 阅读全文

posted @ 2018-02-23 15:05 AlanTu 阅读(25383) 评论(0) 推荐(1)

动态规划 - 最长公共子序列

摘要: 1、基本概念 一个给定序列的子序列就是该给定序列中去掉零个或者多个元素的序列。形式化来讲就是:给定一个序列X={x1,x2,……,xm},另外一个序列Z={z1、z2、……,zk},如果存在X的一个严格递增小标序列<i1,i2……,ik>,使得对所有j=1,2,……k,有xij = zj,则Z是X的 阅读全文

posted @ 2018-02-23 15:03 AlanTu 阅读(1154) 评论(0) 推荐(0)

动态规划 - 矩阵链乘法

摘要: 前言:今天接着学习动态规划算法,学习如何用动态规划来分析解决矩阵链乘问题。首先回顾一下矩阵乘法运算法,并给出C++语言实现过程。然后采用动态规划算法分析矩阵链乘问题并给出C语言实现过程。 1、矩阵乘法 从定义可以看出:只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×r的矩阵A左乘一个r 阅读全文

posted @ 2018-02-23 15:00 AlanTu 阅读(966) 评论(0) 推荐(0)

动态规划 - 钢条切割

摘要: 前言:动态规划的概念 动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解。例如归并排序,快速排序都是采用分治算法思想。本书在第二章介绍归并排序时,详细介绍了分治算法的 阅读全文

posted @ 2018-02-23 14:58 AlanTu 阅读(633) 评论(0) 推荐(0)

数据结构的扩张

摘要: 前言:通常我们会遇到一些问题,采用一些标准的数据结构,如双链表、散列表或二叉查找数时,不能够满足操作要求,需要对这些数据结构进行扩张,添加一些额外的信息使得能够完成新的操作。附加的信息需要对数据结构的某些操作进行调整,这个是非常关键的步骤,决定着数据结构扩张是否能够实现。本章主要讨论了红黑树结构的扩 阅读全文

posted @ 2018-02-23 14:51 AlanTu 阅读(482) 评论(0) 推荐(0)

红黑树 - C++代码实现

摘要: 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了具备该特性之外,红黑树还包括许多额外的信息。 红黑树的每个节点上都有存 阅读全文

posted @ 2018-02-23 14:48 AlanTu 阅读(7180) 评论(0) 推荐(2)

红黑树

摘要: R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL 阅读全文

posted @ 2018-02-23 14:45 AlanTu 阅读(215) 评论(0) 推荐(0)

二叉搜索树

摘要: 摘要: 本章介绍了二叉查找树的概念及操作。主要内容包括二叉查找树的性质,如何在二叉查找树中查找最大值、最小值和给定的值,如何找出某一个元素的前驱和后继,如何在二叉查找树中进行插入和删除操作。在二叉查找树上执行这些基本操作的时间与树的高度成正比,一棵随机构造的二叉查找树的期望高度为O(lgn),从而基 阅读全文

posted @ 2018-02-23 14:42 AlanTu 阅读(376) 评论(0) 推荐(0)

散列表

摘要: 摘要: 本章介绍了散列表(hash table)的概念、散列函数的设计及散列冲突的处理。散列表类似与字典的目录,查找的元素都有一个key与之对应,在实践当中,散列技术的效率是很高的,合理的设计散函数和冲突处理方法,可以使得在散列表中查找一个元素的期望时间为O(1)。散列表是普通数组概念的推广,在散列 阅读全文

posted @ 2018-02-23 14:41 AlanTu 阅读(2366) 评论(0) 推荐(0)

基本数据结构 - 二叉树

摘要: 摘要 书中第10章10.4小节介绍了有根树,简单介绍了二叉树和分支数目无限制的有根树的存储结构,而没有关于二叉树的遍历过程。为此对二叉树做个简单的总结,介绍一下二叉树基本概念、性质、二叉树的存储结构和遍历过程,主要包括先根遍历、中根遍历、后根遍历和层次遍历。 1、二叉树的定义 二叉树(Binary 阅读全文

posted @ 2018-02-23 14:39 AlanTu 阅读(316) 评论(0) 推荐(0)

基本数据结构 - 链表

摘要: 链表 链表与数组的区别是链表中的元素顺序是有各对象中的指针决定的,相邻元素之间在物理内存上不一定相邻。采用链表可以灵活地表示动态集合。链表有单链表和双链表及循环链表。书中着重介绍了双链表的概念及操作,双链表L的每一个元素是一个对象,每个对象包含一个关键字和两个指针:next和prev。链表的操作包括 阅读全文

posted @ 2018-02-23 14:35 AlanTu 阅读(267) 评论(0) 推荐(0)

基本数据结构 - 栈和队列

摘要: 摘要 本章介绍了几种基本的数据结构,包括栈、队列、链表以及有根树,讨论了使用指针的简单数据结构来表示动态集合。本章的内容对于学过数据结构的人来说,没有什么难处,简单的总结一下。 1、栈和队列 栈和队列都是动态集合,元素的出入是规定好的。栈规定元素是先进后出(FILO),队列规定元素是先进先出(FIF 阅读全文

posted @ 2018-02-23 14:34 AlanTu 阅读(319) 评论(0) 推荐(0)

中位数和顺序统计量

摘要: 摘要: 本章所讨论的问题是在一个由n个不同数值构成的集合中选择第i个顺序统计量问题。主要讲的内容是如何在线性时间内O(n)时间内在集合S中选择第i小的元素,最基本的是选择集合的最大值和最小值。一般情况下选择的元素是随机的,最大值和最小值是特殊情况,书中重点介绍了如何采用分治算法来实现选择第i小的元素 阅读全文

posted @ 2018-02-23 14:33 AlanTu 阅读(612) 评论(0) 推荐(0)

线性时间排序

摘要: 摘要: 本章先回顾了前面介绍的合并排序、堆排序和快速排序的特点及运行运行时间。合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O(n^2),平均情况下达到O(nlgn),因此合并排序和堆排序是渐进最优的。这些排序在执行过程中各元素的次序基于输入元素间的比较,称这种算法为比较排 阅读全文

posted @ 2018-02-23 14:30 AlanTu 阅读(391) 评论(0) 推荐(0)

快速排序

摘要: 快速排序 对于n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n2)的排序算法,虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是O(nlgn),而且O(nlgn)中隐含的常数因子非常小。 1、快速排序的描述 快速排序算法采用 阅读全文

posted @ 2018-02-23 14:29 AlanTu 阅读(293) 评论(0) 推荐(0)

优先队列

摘要: 1、概述 队列是一种满足先进先出(FIFO)的数据结构,数据从队列头部取出,新的数据从队列尾部插入,数据之间是平等的,不存在优先级的。这个就类似于普通老百姓到火车站排队买票,先来的先买票,每个人之间是平等的,不存在优先的权利,整个过程是固定不变的。而优先级队列可以理解为在队列的基础上给每个数据赋一个 阅读全文

posted @ 2018-02-23 14:27 AlanTu 阅读(411) 评论(0) 推荐(0)

堆排序

摘要: 一 堆 堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树中每个节点与数组中的存放该节点值的那个元素对应。所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示: 二叉堆可以分为两种形式:最大堆和最小堆。在这两种堆中,结点的值都要满足堆的性质。 在最 阅读全文

posted @ 2018-02-23 14:26 AlanTu 阅读(215) 评论(0) 推荐(0)

树、二叉树基础

摘要: 刚看到堆排序,顺便记录一下关于树的一些基本概念: 前言 前面介绍的栈、队列都是线性结构(linear structure)。而树是非线性结构(non-linear structure)。因此,树中的元素之间一般不存在类似于线性结构的一对一的关系,更多地表现为多对多的关系。直观地看,它是数据元素(在树 阅读全文

posted @ 2018-02-23 14:24 AlanTu 阅读(345) 评论(0) 推荐(0)

分治法

摘要: 最大子数组问题 方法一:暴力求解方法 我们可以很容易地设计出一个暴力方法来求解本问题:简单地尝试没对可能的子数组,共有O(n2)种 #include<iostream> using namespace std; #define INT_MIN 0x80000000 int main() { int 阅读全文

posted @ 2018-02-23 14:15 AlanTu 阅读(2090) 评论(0) 推荐(0)

递归算法详细分析

摘要: 递归的理解与设计 递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 1,参考于书籍中的讲解: 递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此 阅读全文

posted @ 2018-02-23 14:13 AlanTu 阅读(7390) 评论(0) 推荐(1)

算法基础

摘要: 2.1 插入排序 C++实现: #include<iostream> using namespace std; void InsertSort(int arr[],int n) { int i,j,key; for(i=1;i<n;++i) { key=arr[i]; j=i-1; while(j> 阅读全文

posted @ 2018-02-23 14:10 AlanTu 阅读(462) 评论(0) 推荐(0)

Linux文件系统详解

摘要: 从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考: http://blog.chinaunix.net/uid-8698570-id-1763151.html http://www.iteye 阅读全文

posted @ 2018-02-23 14:06 AlanTu 阅读(97444) 评论(3) 推荐(13)

fs/ext2/inode.c相关函数注释

摘要: 用数组chain[4]描述四种不同的索引,即直接索引、一级间接索引、二级间接索引、三级间接索引。举例说明这个结构各个域的含义。如果文件内的块号为8,则不需要间接索引,所以只用chain[0]一个Indirect结构,p指向直接索引表下标为8处,即&inode->u.ext2_i.i_data[8]; 阅读全文

posted @ 2018-02-23 14:00 AlanTu 阅读(687) 评论(0) 推荐(0)

块设备的读流程分析

摘要: 关于VFS的通用读,我们不做考虑,本文以如下函数为根,往下分析: do_generic_mapping_read(*ppos,*mapping,*desc) do_generic_mapping_read(*ppos,*mapping,*desc) do_generic_mapping_read(* 阅读全文

posted @ 2018-02-23 13:52 AlanTu 阅读(908) 评论(0) 推荐(1)

linux文件系统管理的工作原理

摘要: 一、系统在初始化时如何识别硬盘 1、系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16X4的空间就是存储分区表信息的位置;如下图 2、在分区表中,主要储存了以下信息:(1)分区号,常见的 阅读全文

posted @ 2018-02-23 13:50 AlanTu 阅读(8343) 评论(0) 推荐(0)

Ext4文件系统架构分析(三)

摘要: ioctl源码分析之交换两个文件的物理extents 1. 交换两个文件的extents Ext4 的EXT4_IOC_MOVE_EXT命令用于交换两个文件的extents,实际上是交换两个文件的对应逻辑长度的数据的物理存储空间(见下图),也是EXT4文件系统碎片整理的基础。 用户可以通过ioctl 阅读全文

posted @ 2018-02-23 13:25 AlanTu 阅读(3084) 评论(0) 推荐(1)

Ext4文件系统架构分析(二)

摘要: Ext4 文件系统 ioctl功能概述 ioctl.c 源码功能概述 Ext4的ioctl提供给用户以下接口,以方便用户更改文件系统的各种设置和状态: (1) EXT4_IOC_GETFLAGS: 获取inode的标志位,用户获取当前的inode标志位信息; (2) EXT4_IOC_SETFLAG 阅读全文

posted @ 2018-02-23 13:23 AlanTu 阅读(4394) 评论(0) 推荐(1)

Ext4文件系统架构分析(一)

摘要: 本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外。整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等。感兴趣的看官敬请留意和指导! 1. Ext4文件系统布局综述 一个Ext4文件系统被分成一系列块组 阅读全文

posted @ 2018-02-23 11:15 AlanTu 阅读(27123) 评论(2) 推荐(0)

程序员面试宝典 - 总结

摘要: 1 x=x+1,x+=1,x++,哪个效率最高?为什么? 解析: x=x+1最低,因为它的执行过程如下: 1)读取右x的地址。 2)x+1 3)读取左x的地址 4)将右值传给左边的x(编译器并不左右x的地址相同)。 x+=1其次,其执行过程如下: 1)读取右x的地址 2)x+1 3)将得到的值传给x 阅读全文

posted @ 2018-02-23 10:57 AlanTu 阅读(2414) 评论(0) 推荐(1)

循环、递归、概率

摘要: 递归是程序设计中的一种算法。一个过程或函数直接调用自己本身或通过其他的过程或函数调用语句间接地调用自己的过程或函数,称为递归过程或函数。 例子一:打靶 面试1:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种? 解析:靶上一共有10种可能——1环到10环,还有可能脱靶,那就是 阅读全文

posted @ 2018-02-23 10:53 AlanTu 阅读(472) 评论(0) 推荐(0)

面向对象总结

摘要: 1 structure和class的区别? structure和class的唯一区别就是默认的访问控制不同,structure默认是public,class默认是Private;structure也可以有构造函数、析构函数、成员函数等。 2 继承体系中为什么将析构函数声明为虚函数? 当你可能通过基类 阅读全文

posted @ 2018-02-23 10:50 AlanTu 阅读(272) 评论(0) 推荐(0)

队列中取最大值操作问题

摘要: 题目描述: 假设有这样一个拥有3个操作的队列: 1 Enqueue(v): 将v加入队列 2 DeQueue:使队列中的队首元素删除并返回此元素 3 MaxElement:返回队列中的最大元素 请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。 队列是遵守“先入先出”原则的 阅读全文

posted @ 2018-02-23 10:49 AlanTu 阅读(3427) 评论(0) 推荐(0)

优先队列的实现

摘要: 实现优先队列结构主要是通过堆完成,主要有:二叉堆、d堆、左式堆、斜堆、二项堆、斐波那契堆、pairing 堆等。 1. 二叉堆 1.1. 定义 完全二叉树,根最小。 存储时使用层序。 1.2. 操作 (1). insert(上滤) 插入末尾 26,不断向上比较,大于26则交换位置,小于则停止。 (2 阅读全文

posted @ 2018-02-23 10:48 AlanTu 阅读(2465) 评论(0) 推荐(0)

尾递归与Continuation

摘要: 怎样在不消除递归的情况下防止栈溢出?(无论如何都要使用递归) 这几天恰好和朋友谈起了递归,忽然发现不少朋友对于“尾递归”的概念比较模糊,网上搜索一番也没有发现讲解地完整详细的资料,于是写了这么一篇文章,权当一次互联网资料的补充。 递归与尾递归 关于递归操作,相信大家都已经不陌生。简单地说,一个函数直 阅读全文

posted @ 2018-02-23 10:44 AlanTu 阅读(393) 评论(0) 推荐(0)

进程上下文与中断上下文

摘要: 1、前言 最近在学习linux内核方面的知识,经常会看到用户空间与内核空间及进程上下文与中断上下文。看着很熟悉,半天又说不出到底是怎么回事,有什么区别。看书过程经常被感觉欺骗,似懂非懂的感觉,很是不爽,今天好好结合书和网上的资料总结一下,加深理解。 2、用户空间与内核空间 我们知道现在操作系统都是采 阅读全文

posted @ 2018-02-23 10:38 AlanTu 阅读(2369) 评论(0) 推荐(0)

Linux驱动面试题总结

摘要: 1、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口 阅读全文

posted @ 2018-02-23 10:32 AlanTu 阅读(10832) 评论(0) 推荐(1)

三十道linux内核面试题

摘要: 1. Linux中主要有哪几种内核锁? Linux的同步机制从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过渡;伴随着从非抢占内核到抢占内核的过度。Linux的锁机制越来越有效,也越来越复杂。 阅读全文

posted @ 2018-02-23 10:31 AlanTu 阅读(19065) 评论(0) 推荐(1)

三大文本处理工具grep、sed及awk的简单介绍

摘要: grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。 grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效 阅读全文

posted @ 2018-02-23 10:08 AlanTu 阅读(935) 评论(0) 推荐(0)

作为应聘者 面试结束时应该问面试官一些什么问题呢

摘要: 几乎所有的面试在结束时候都会留一些时间给应聘者来提问问题,不少应聘者都以没有问题来结束了整个面试过程,其实我感觉这个提问时间还是大有用处的,正确的问一些问题不但能让你对雇主有更好的了解,更有可能为你的面试加分甚至影响面试结果。那到底应该问一些什么问题呢?以下是我个人的一点意见,希望能给大家有所帮助。 阅读全文

posted @ 2018-02-23 10:07 AlanTu 阅读(1800) 评论(0) 推荐(0)

二叉树中常见的面试题

摘要: 1 用一个函数判断一棵树是否平衡 题目:实现一个函数检查一棵树是否平衡。对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1。 注意,对于这道题,要审清题意。它并不是让你判断一棵树是否为平衡二叉树。平衡二叉树的定义为:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1, 阅读全文

posted @ 2018-02-23 10:05 AlanTu 阅读(11547) 评论(0) 推荐(0)

指针辨析:悬垂指针、哑指针、野指针、智能指针

摘要: 悬垂指针: 1:提出的原因: 请看下面的代码片段: 输出结果为: 得出结论:第二段程序中,由于fun()函数中的临时变量被销毁,故第二次输出时,p已经成为悬垂指针。 2:定义 指向曾经存在的对象,但该对象已经不再存在了,此类指针称为垂悬指针。结果未定义,往往导致程序错误,而且难以检测。 3:解决策略 阅读全文

posted @ 2018-02-23 10:03 AlanTu 阅读(712) 评论(0) 推荐(0)

du和df命令的区别

摘要: du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /<filesystem>用于报告文件系统使用的块数。但是,我们可以发现从df命令算出的文件系统使用块数的值与通过du命令得出的值是不一致的。 如下例: # du -s /tmp 返回如下值: 1292 阅读全文

posted @ 2018-02-23 10:00 AlanTu 阅读(2418) 评论(0) 推荐(0)

字符串函数汇总

摘要: 1 strcpy 为什么strcpy要有返回值? 返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。 链式表达式的形式如: int iLength=strlen(strcpy(strA,strB)); 又如: cha 阅读全文

posted @ 2018-02-23 09:58 AlanTu 阅读(372) 评论(0) 推荐(0)

死锁原因及解决、避免办法

摘要: 死锁的条件 互斥条件(Mutual exclusion) :资源不能被共享,只能由一个进程使用。 请求与保持条件(Hold and wait):进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。 不可抢占条件(No pre-emption) :有些系统资源是不可抢占的,当某个进 阅读全文

posted @ 2018-02-23 09:55 AlanTu 阅读(562) 评论(0) 推荐(0)

八大排序算法图文讲解

摘要: 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 本文将依次介绍上述八大排序算法。 算法 阅读全文

posted @ 2018-02-23 09:52 AlanTu 阅读(430) 评论(0) 推荐(0)

链表问题集锦

摘要: 链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程功底,所以是很值得考的地方。我将复习过程中觉得比较好的链表问题整理了下。 下面是本文所要用到链表节点的定义: 1. 在O(1)时间删除链表节点 题目描述:给定链表的头指针和一个节点指针,在O(1)时间删除该节点。[Google 阅读全文

posted @ 2018-02-23 09:50 AlanTu 阅读(332) 评论(0) 推荐(0)

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

摘要: 最长公共子序列 1、动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列。如果序列比较长,这种方法需要指数级时间,不切实际。 LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,… 阅读全文

posted @ 2018-02-23 09:49 AlanTu 阅读(653) 评论(0) 推荐(0)

高并发网络编程之epoll详解

摘要: select、poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱的火热之年代,select和poll的用武之地越来越有限了,风头已经被epoll占尽。 selec 阅读全文

posted @ 2018-02-23 09:46 AlanTu 阅读(1532) 评论(0) 推荐(0)

位操作实现加减乘除四则运算

摘要: 解决方案 需要熟练掌握一些常见的位操作实现,具体为: 1)常用的等式:-n=~(n-1)=~n+1 2)获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)如:n=010100,则-n=101100,n&(-n)=000100 3)去掉整数n的二进制中最后一个1:n&(n-1),如:n= 阅读全文

posted @ 2018-02-23 09:44 AlanTu 阅读(1113) 评论(0) 推荐(0)

堆和栈的区别

摘要: 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。 阅读全文

posted @ 2018-02-23 09:42 AlanTu 阅读(174) 评论(0) 推荐(0)

IT思想类智力题

摘要: 1、 台阶问题 题目:一个人上台阶可以一次上一个或两个,问这个人上n层的台阶,一共有多少种走法。 本题可以采用递归的方法来设计模型,先从数字的规律入手:假设共有i阶台阶,走完所有的台阶有n种走法,则存在如表6- 3所示。 表6- 3组合情况 i n 组合情况 1 1 {1} 2 2 {1, 1}{2 阅读全文

posted @ 2018-02-23 09:35 AlanTu 阅读(452) 评论(0) 推荐(0)

C/C++基础总结

摘要: 1 static(静态)变量有什么作用 3个体明显的作用:1)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态变量在一个函数被调用的过程中其值维持不变2)在模块内,它的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问。3)内部 阅读全文

posted @ 2018-02-23 09:33 AlanTu 阅读(545) 评论(0) 推荐(0)

数据库总结

摘要: 1 关系数据库系统与文件数据库系统有什么区别? 2 SQL语言的功能有哪些 基本SQL语句有select、insert、update、delete、create、drop、grant、revoke等。 3 内连接与外连接的区别? 4 什么是事务? 事务是数据库中一个单独的执行单元,它通常由高级数据库 阅读全文

posted @ 2018-02-23 09:32 AlanTu 阅读(230) 评论(0) 推荐(0)

Windows内存管理和linux内存管理

摘要: windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页;页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换 阅读全文

posted @ 2018-02-23 09:31 AlanTu 阅读(8513) 评论(0) 推荐(0)

面试网络总结

摘要: 1 OSI七层模型和TCP/IP 2 B/S与C/S有什么区别? C/S是客户端/服务器的缩写,在C/S架构中,服务器通常采用高性能的PC、工作站或者小型机,而且采用大型数据库系统,如SQL server 、DB2、Oracle和Sybase等。客户端需要安装专用的客户端软件。 B/S是浏览器/服务 阅读全文

posted @ 2018-02-23 09:31 AlanTu 阅读(263) 评论(0) 推荐(0)

面试操作系统总结

摘要: 1 进程和线程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配的一个独立单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及 阅读全文

posted @ 2018-02-23 09:29 AlanTu 阅读(2658) 评论(0) 推荐(0)

数据结构与算法 - 字符串

摘要: 题型1:如何统计字符中有多少个单词? 方法1:使用空格作为分隔。如果测出某一个字符为非空格,而它前面的单词是空格,则表示“新的单词开始了”此时单词数count累加1.如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词的继续,count不应再累加1. 方法2:使用sstream中 阅读全文

posted @ 2018-02-23 09:28 AlanTu 阅读(551) 评论(0) 推荐(0)

数据结构与算法 - 图论

摘要: 题型1:拓扑排序 1)使用一个入度数组indegree来记录每个顶点的入度数,并使用一个变量来记录已经访问的顶点数 2)将入度为0的顶点压入栈中 3)将栈顶的元素删除。访问的顶点数加1.并将入该顶点相邻的所有顶点的入度数减1,如果减1之后的入度数为0,则将其压入栈中; 4)重复上面的过程,直到栈中的 阅读全文

posted @ 2018-02-23 09:28 AlanTu 阅读(248) 评论(0) 推荐(0)

数据结构与算法 - 链表

摘要: 链表 题型1:数组和链表的区别是什么? 数组和链表的区别主要表现在以下几个方面: 1)逻辑结构。数组必须事先定义固定的长度,不能适应数据动态地增减。当数组中插入、删除数据项时,需要移动其他数据项。而链表采用动态分配内存的形式实现,可以适应数据动态第增减的情况,需要时可以用new/malloc分配内存 阅读全文

posted @ 2018-02-23 09:26 AlanTu 阅读(296) 评论(0) 推荐(0)

数据结构与算法 - 数组

摘要: 题型1:如何用递归实现数组求和 方法1: 题型2:如何用一个for循环打印一个二维数组 方法1:array在二维数组中的行号和列号分别为[i/MAXY],[i%MAXY] 题型3:用递归和非递归的方法实现二分查找 题型4:如何在排序数组中,找出给定数字出现的次数 方法1:二分查找,分别找出左边界和右 阅读全文

posted @ 2018-02-23 09:25 AlanTu 阅读(300) 评论(0) 推荐(0)

open和fopen的区别

摘要: open和fopen的区别: 1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写 阅读全文

posted @ 2018-02-23 09:23 AlanTu 阅读(2782) 评论(0) 推荐(1)

malloc的内存分配原理

摘要: 0 堆内存的在计算机内存中的形式 根据《The C Programming language》推测得到堆内存,图中的Heap区域即为堆内存块(Heap区域的数目不代表计算机堆内存的真实数目)。 [1] 堆内存不连续。只有标识为Heap的才是堆内存。 [2] 在malloc()/free()看来,每个 阅读全文

posted @ 2018-02-23 09:18 AlanTu 阅读(13131) 评论(1) 推荐(2)

if else和switch的效率

摘要: switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true. 说实话 我也没有深入研究过这个问题的根源 只是在实际开发中 没有人会去用很多很多else if的 都是用 switch case 的 后者比较清 阅读全文

posted @ 2018-02-23 09:15 AlanTu 阅读(805) 评论(0) 推荐(0)

关于结构体占用空间大小总结

摘要: 关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的。这道题是这样的: 在32位机器上,下面的代码中 class A { public: int i; union U { char buff[13]; int i; }u; void 阅读全文

posted @ 2018-02-23 08:56 AlanTu 阅读(14377) 评论(0) 推荐(1)

导航