摘要: 文件是linux中的一个重要概念。在Linux中,一切(几乎一切)都是文件。简单的说,C中基本的的printf()函数,scanf()函数,其实都属于文件操作。对于文件操作,虽然都是通过函数调用的方式实现,却还是能分为两类:系统调用和库函数。这篇文章将先介绍linux中文件的概念,系统调用和库函数的概念 ,然后具体的讨论两种方式下的文件操作。博文的主要内容如下:Linux 中的文件文件访问-库函数文件访问-系统调用库函数标准 I/O 库/proc文件系统1 Linux中的文件1.1概念按照普通的定义,文件不过是一堆数据,在往下说,就是存储器中的0101。。。而我们这里讨论的文件有了更广的定义。 阅读全文
posted @ 2012-08-04 09:38 Geek_Ling 阅读(68118) 评论(1) 推荐(2) 编辑
摘要: 开篇异常这个名词应该大家都不陌生,很多人都听说过。系统调用知道吧?其实系统调用也是一种异常。但是具体的什么是异常呢?他在计算机中有什么作用?他是如何工作,如何被我们利用的?我想很多人都还不都是很清楚。、了解异常有诸多好处,可以让你更好的理解操作系统和应用程序的交互,更好的理解并发等。所以今天就简单的来说一下异常。注:本博文图片来源《Computer system-A Programmer's Perspective》什么是异常为了便于理解,我就不按照书本来了啊,异常可以这样理解:计算机执行一个连续的指令序列,如:a1,a2,a3,,,ak,这些指令执行的时候是顺序执行的,相邻的两条指令 阅读全文
posted @ 2012-05-05 09:53 Geek_Ling 阅读(3772) 评论(4) 推荐(6) 编辑
摘要: 开篇几乎每种程序设计语言的语法中都会有语句的循环,跳转。像最为熟知的C语言便有 for 、 while 、 do---while 等等。这些循环一般都很容易理解和使用,对于程序中逻辑的实现也很有帮助。只是很多人不曾知道,这些循环、跳转在计算机内部、在底层是如何实现的,于是在出现问题时还是没有好的解决办法,或者是虽然写出来程序,对于内部的逻辑,却还是隔了一层迷雾。比如有人对这样一个问题:for( i=0 ; i< 10 ; i++){printf(”%i“,i);}for语句里面的 i++ 是什么时候执行的呢? 当循环开始时,是先执行括号里的 i++ 还是printf(”%i“,i)? 也 阅读全文
posted @ 2012-03-27 15:05 Geek_Ling 阅读(10446) 评论(5) 推荐(3) 编辑
摘要: 开篇学习任何一门编程语言,都会从hello world 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的hello world。然而,对于hello world 这个简单程序的内部运行机制,我相信还有很多人都不是很清楚。hello world 这些信息是如何通显示器过显示的?cpu执行的代码和程序中我们写的的代码肯定不一样,她是什么样子的?又是如何从我们写的代码变成cpu能执行的代码的?程序运行时代码是在什么地方?她们是如何组织的?程序中的变量存储在什么地方?函数调用是怎样是现的?这篇文章将简单的讨论程序的运行机制开发平台隐藏的过程每一种语言都有自己的开发平台,我们的程序大 阅读全文
posted @ 2012-03-05 13:16 Geek_Ling 阅读(15734) 评论(6) 推荐(9) 编辑
摘要: 开篇上一篇博文对缓存的思考——提高命中率详细介绍了高速缓存的组织结构,并通过实例说详细明了cpu从高速缓存中取数据的过程,对于缓存的工作机制应该有了清晰的认识。这篇博文就来简单讨论以下对于缓存在实际开发中的应用,这里将告诉你如何让你的程序充分利用该缓存,即如何编写高速缓存友好的代码。提示:如果高速缓存的运行机制还没有清晰的认识,请参照前面文章。注1:关于文中提到的局部性的相关知识参照:局部性原理浅析——良好代码的基本素质注2:这是一个系列的文章,收录在程序性能优化注3:文章知识有些地方不容易理解,所以用心才能看完噢。“用空间换时间”在搞算法的时候经常能听到这种说法,算法研究中通常要考虑算法的时 阅读全文
posted @ 2012-02-15 15:20 Geek_Ling 阅读(15615) 评论(9) 推荐(7) 编辑
摘要: 开篇编写高效的程序并不只在于算法的精巧,还应该考虑到计算机内部的组织结构,cpu微指令的执行,缓存的组织和工作原理等。好的算法在实际中不见得有高效率,如果完全没有考虑缓存、微指令实现的话。前两篇博文局部性原理浅析介绍了程序的局部性原理,如何写出局部性良好代码。提高程序性能、何为缓存讨论了存储器层次结构,计算机内部的存储结构、缓存的概念,简单的介绍了缓存的工作机制。建议先阅读前两篇博文,虽然他们之间联系不大,在前面也有一些对本文的铺垫。而且,这是一个系列的文章。旨在优化程序性能。这篇博文主要介绍的是缓存的组织、工作原理。拨开迷雾,让你更加清晰的认识缓存。通用缓存结构回顾在提高程序性能、何为缓存中 阅读全文
posted @ 2012-02-14 08:28 Geek_Ling 阅读(30708) 评论(17) 推荐(26) 编辑
摘要: 数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过?这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过What's a Declaration? What's a Definition?声明和定义c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。A definition is the special kind of d 阅读全文
posted @ 2011-11-29 22:55 Geek_Ling 阅读(4875) 评论(4) 推荐(4) 编辑
摘要: 这篇博文主要内容是程序运行时的数据结构,包括运行时程序中的不同部分如何分配内存、函数调用的内存实现、还介绍了一个c独有的强大功能,一个被称为“展开堆栈”(unwinding stack)的技术运行时 数据结构,中间的空格是特意留出的,运行时可以认为是程序执行的一个状态,一般有编译时,运行时等,他们都是表示一个处理状态。编程语言的的经典对立之一就是代码和数据的区别。代码和数据的区别也可认为是运行时和编译时的界限,编译器的绝大部分工作和翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。如果你用过GCC,就会知道用GCC编译程序,都会得到一个默认名为“a.out”的文件。简单说下“a.out 阅读全文
posted @ 2011-11-28 11:19 Geek_Ling 阅读(9011) 评论(1) 推荐(4) 编辑
摘要: 引言:写一段程序很容易、也能很容易的得到一个能正确运行的执行、学习语言很容易,难的是掌握它不管接触什么语言,最经典的入门例子大概就是“hello world”了。然而,对于“hello world”背后的东西、当时却不曾深究。作为做程序的普通小菜、我仍醉心于基础和底层的东西。诚然、我也认为这些东西很重要。练好“内功”、有扎实的底层基础才能走的更快更远。知其所以然:承上、今天看了一下关于编译过程中链接的部分、觉得很有价值遂分享如下。由于链接器是从编译器中分割出来的单独程序,所以先要对编译有一个基本的认识。编译器的基本概念:简单的说,一个编译器就是一个程序,它可以阅读某一种程序语言编写的程序,并把 阅读全文
posted @ 2011-11-24 19:57 Geek_Ling 阅读(2174) 评论(5) 推荐(3) 编辑
摘要: 开篇今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。如果你的软件实际上受到磁盘和内存的等待时间(访问时间)的限制,那么就是再好的芯片也无济于事。在内存和cpu之间存在着一道很深的鸿沟,而且是越来越深。在过去,每隔一两年,cpu的处理速度就会提升一倍,在相同的时间内,内存的容量倒是扩大了一倍,但它的访问时间提升却没有那么明显。。所以我的理解是:内存主要受限于容量和速度。容量问题除了集成工艺的发展扩大物理内存容量,还可用用虚拟内存的办法解决。访问速度则可通过Cache技术的发展和程序设计的优化。内存管理的前世今生最初的计算机使用的内存直接对物理内存进行访问。这样的方式很快就被淘汰, 阅读全文
posted @ 2011-11-19 17:14 Geek_Ling 阅读(3468) 评论(8) 推荐(4) 编辑
摘要: 初衷:最近在看算法相关的东西,看到贪心法解决mst的问题,可惜树上讲解的不是很清新,到网上找了很多资料讲解的也不透彻只是随便带过就草草了事、这几天抽空看了下,总算基本思路理清楚了主要还是得感谢强大的google,帮我找到一个很好的英文资料。(下面有链接,有兴趣的同学可以看看)理顺了思路,就和大家分享下~希望对学习贪心法的同学会有所帮助。这篇博客的主要内容是贪心法求解Minimum Spanning Tree (MST)(最小生成树)的问题贪心法求解最小生成树常用的有两种算法,分别是Prim’s MST algorithm和Kruskal's MST algorithm(prim算法和k 阅读全文
posted @ 2011-11-16 20:19 Geek_Ling 阅读(18870) 评论(5) 推荐(1) 编辑
摘要: 当然、这是一个经典的递归问题~ 想必来看这篇博文的同学对汉诺塔应该不会陌生了吧, 写这篇博还是有初衷的: 之前学数据结构的时候自己看书、也上网上查了很多资料,资料都比较散、而且描述的不是很清楚,对于当时刚刚接触算法的我,要完全理解还是有一定难度。今天刚好有时间就整理了下思路、重写分析了一下之前的疑惑的地方、没有透彻的地方便都豁然开朗了。所以迫不及待把我的想法记录下来,和大家分享。 如果你也是和之前的我一样对hanoi tower没能完全消化,或者刚刚接触汉诺塔,那希望我的这种理解方式能给你些许帮助,如果你觉得已经完全掌握的比较牢靠了,那也可以看看,有好的idea可以一起分享;毕竟交... 阅读全文
posted @ 2011-11-14 15:06 Geek_Ling 阅读(34437) 评论(29) 推荐(15) 编辑
摘要: 动态规划博大精深,想完全掌握是很难的,不过我们可以从一些简单的例子之中去体会她的奥妙。不说废话、先来一个简单的例子吧:longest path in DAGProblem: Given a weighted directed acyclic graph G=(V, E), an vertex v, where each edge is assigned an integer weight, find a longest path in graph G问题描述:给一个带权有向无环图G=(V,E),找出这个图里的最长路径。说实话初学者直接给出这个图会看蒙的、再看看问题,不知道从何下手。好了,对上图 阅读全文
posted @ 2011-11-12 20:28 Geek_Ling 阅读(43559) 评论(6) 推荐(5) 编辑
摘要: 之前也在看算法相关的书、在被称为黑书的《算法导论》里看过关于动态规划的讲解只是当时研究不深、最近突来兴趣对动态规划做了个小的总结、所以就分享下不足之处多多指正、先对动态规划做一个简单的介绍吧:动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。动态规划是信息学竞赛中选手 阅读全文
posted @ 2011-11-12 18:55 Geek_Ling 阅读(4210) 评论(0) 推荐(0) 编辑
摘要: 理性技术的局限机械逻辑人造机械的构成逻辑,比如说钟表的制作原理。是一种可被人类掌握的,可推演的理论。生物逻辑一个有机系统的构成逻辑。比如说草原、细胞、大脑等这些系统的存在所依托的逻辑,我们成为生物逻辑。这是一种系统层面的控制技术,涉及多个变量和多个复杂因素,是维持一个复杂系统的法则。简单的理论不足以... 阅读全文
posted @ 2014-12-13 10:47 Geek_Ling 阅读(826) 评论(0) 推荐(0) 编辑
摘要: My Writing 最近看了许多人洋洋洒洒的文笔、那些读了让人浑身舒服的文字。无端的也开始羡慕起非写作来,能写出让人读之畅快的文字,何尝不是一件非常与意义的事。严格来说,真正是的写作之于我应该是大三才开始的。当时看了一些博客,很多人都强调写作的重要性(当然,这里强调的更多是技术写作)后来忍不住就在博客园,写了一些技术博客,就这样,渐渐的喜欢上了技术写作。 对于技术协作,我的标准是:将其清晰、简单、通俗的描述出来,以至于对这个领域没有什么了解的人可以看懂。本着这样的原则,现在的我对于技术协作,也不是很陌生了。About Books 可能是由于技术写作的经历,使得我对文字的审美也发生变化:... 阅读全文
posted @ 2013-11-04 00:22 Geek_Ling 阅读(4679) 评论(6) 推荐(8) 编辑
摘要: Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四: 阅读全文
posted @ 2012-04-23 11:04 Geek_Ling 阅读(29545) 评论(1) 推荐(6) 编辑
摘要: 开篇编译,简单的说,就是把源程序转换为可执行程序。从hello world 说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对底层该兴趣的我,自然的,也就迫切想搞清楚编译的内部实现,也就是编译的原理。这篇文章主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。介绍编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语 阅读全文
posted @ 2012-04-17 12:25 Geek_Ling 阅读(131215) 评论(20) 推荐(25) 编辑
摘要: 开篇在实际的过程中,总需要对一些数据进行排序,在众多的排序算法中,快速排序是较为常用的排序算法之一。而网上对于快速排序的中文资料还不是很全。写这篇博文主要记录一些自己对于快速排序的了解,以及对快速排序的性能的分析。我将在这里记录下我对快速排序的认识和学习过程 ,用尽可能简单明了的叙述来阐述我的理解。快速排序基于算法中很重要的思想是 分治。所以会先介绍一下分治思想,然后对算法原理进行介绍,接着会分析算法的性能并对算法作进一步的讨论。注:为了便于说明问题,本博文中会用到部分《introduction to algorithm》中的图片。关键词:快速排序、分治、递归“大事化小”——从分治说起分治?分 阅读全文
posted @ 2012-04-16 10:22 Geek_Ling 阅读(13573) 评论(2) 推荐(9) 编辑
摘要: 开篇1、背景之前的很长一段时间里,随着加工工艺的发展,cpu的处理速度一直在提升,基本上每18个月就会翻倍。直到04年cpu主频达到了4.0GH以来,这种规律似乎已经失效,原因是人们在制造cpu的工艺方面已经达到了物理极限。除非技术有本质突破,才能进一步提高cpu的处理速度。然而需要处理的数据量并没有因此而停止增长,其中的一个方法就是采用多核、并行处理技术。这会成为并且正在成为未来发展的趋势。要理解并行技术,对线程有一定的了解是很必要的。这篇博客主要说一下自己对线程的看法,这只是从简单的角度来看问题,入门级文章,笔者认知有限,有不足之处还望不吝指正。2、我的想法关于并发编程,我觉得如果能有一种 阅读全文
posted @ 2012-02-27 10:18 Geek_Ling 阅读(8505) 评论(11) 推荐(12) 编辑