摘要: 程序从main开始的吗?在执行main之前全局变量已经初始化,main函数的两个参数也被正确传了进来,堆和栈的初始化也已经完成,一些系统I/O也被初始化。完成上面这些工作的函数称为入口函数(Entry Point)。一个典型的运行步骤大致如下:·操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库中的某个函数。·入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造等。·入口函数在完成初始化之后,调用main函数,正是开始执行程序主体部分·main函数执行完毕以后,返回到入口函数,入口函数进行清理工作,包括全局变量的 阅读全文
posted @ 2012-05-11 21:25 KingsLanding 阅读(954) 评论(0) 推荐(0)
摘要: 注:这一章的内容比较经典,之前看“深入理解计算机系统”的时候,也有看到栈帧(Stack Frame),但是不是很清楚,通过这一章的讲解,更清楚了。如果能再结合讲讲GDB调试的话就更完美了。栈:栈用于维护函数调用的上下文,离开了站函数调用就没法实现。堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。Linux进程地址空间内存布局:在操作系统中,栈总是向下增长的。在i386下,栈顶由称为esp的寄存器进行定位。压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大。 程序栈实例在栈底的地址是0xbfffffff,而esp寄存器表明了栈顶,地址 阅读全文
posted @ 2012-05-11 20:57 KingsLanding 阅读(1862) 评论(1) 推荐(1)
摘要: 第八章不是很感兴趣,直接跳到第九章。 DLL即动态链接库(Dynamic Link Library)的缩写. 一个DLL中有两个数据段,一个进程间共享,另一个私有. 当我们使用“__declspec(dllexport)”时表示该符号是从本DLL导出的符号。“__declspec(dllimport)”表示该符号是从别的DLL导入的符号。创建DLL:/*math.c*/__declspec(dllexport) double Add(double a, double b){return a+b;}__declspec(dllexport) double Sub(double a, doub.. 阅读全文
posted @ 2012-05-11 20:38 KingsLanding 阅读(549) 评论(0) 推荐(0)
摘要: 静态链接浪费内存和磁盘空间、模块更新困难等问题,因此寻找一种更好的办法来组织程序模块。 静态链接对程序的更新、部署和发布也会带来很多麻烦。动态链接: 就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。动态链接的方式使得开发过程中各个模块更加独立、耦合度更小,便于不同的开发者和开发组织之间进行独立的开发和测试。动态链接还有一个特点就是程序在运行时可以动态的选择加载各种程序模块,使得插件成为可能。Linux系统中,ELF动态链接文件被称为动态共享对象(DSO,Dynamic Shared Objects),简称共享对象,它们一般都是以“.so”为扩展名;动态链接文件被称为动态.. 阅读全文
posted @ 2012-05-06 22:51 KingsLanding 阅读(2327) 评论(2) 推荐(0)
摘要: 由 user process角度来说明的话,VMA 是 user process 里一段 virtual address space 区域;virtual address space 是连续的内存空间,当然VMA 也会是连续的空间。VMA对 Linux 的主要好处是,可以内存的使用更有效率,並且更容易管理 user process address space。从另一个观念来看,VMA 可以让 Linux kernel 以 process 的角度来管理 virtual address space。Process 的 VMA对应,可以由 /proc/<pid>/maps 来查看;例如 阅读全文
posted @ 2012-05-06 22:24 KingsLanding 阅读(1165) 评论(0) 推荐(0)
摘要: 进程与程序: 程序是一个静态的概念,它就是这些预编译好的指令和数据集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时也有一定的含义。 一般来来说,C语言指针大小的位数与虚拟空间的位数相同,如果32位平台下指针为32位,即4字节;64位平台下的指针为64位,即8字节。Intel自从1995年的Pentium Pro CPU开始采用了36位的物理地址,也就是可以访问高达64GB的物理内存。Intel把这个地址扩展方式叫做PAE(Physical Address Extension)。应用程序如何使用这些大于常规内存的空间?一个很常见的方法就是操作系统提供一 阅读全文
posted @ 2012-05-06 22:11 KingsLanding 阅读(2070) 评论(0) 推荐(0)
摘要: 前一篇寻找第k小的数可以用来处理大量数据,这里介绍的堆排序也可以用来处理大量数据的情况,而且堆排序的思想还可以找出前k小的数据(自然也可以找出前k大的数据,就看是建立大根或者小根堆了),只需要建立k个数据的堆就行了,然后依次把后面的数据放入到堆中的适当位置。这里只是实现了堆排序(并没有实现找出前k小的数)。#include <iostream>#include <algorithm>#include <ctime>#include <cstdlib>#include <iterator>using namespace std;cons 阅读全文
posted @ 2012-05-04 19:25 KingsLanding 阅读(273) 评论(0) 推荐(0)
摘要: 使用快排中的partition方法,可以很快找到一个无序序列中的第k小的数。思想:对于一个数组a[0...n-1],分段成a[0...st-1],a[s],a[st+1...n-1]分组后,a[0...st-1]里面的元素都小于等于a[st],a[st+1...n-1]里面的元素都大于等于a[st]. 所以,如果 st==k-1,那么a[st]就是要求的数。如果 st>k-1,那么要求的数在a[0...st-1]里。 如果 st<k-1,那么要求的数在a[st+1...n-1]里。因此我们把范围缩小到 a[0...st-1]或者a[st+1...n-1]里,然后对缩小范围后的数组也 阅读全文
posted @ 2012-05-04 19:17 KingsLanding 阅读(301) 评论(0) 推荐(0)
摘要: #include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <ctime>using namespace std;const int NUM = 25;/** 这里默认使用的pivot是a[left] partition将 a[]分成两部分,左边的部分小于pivot,右边的部分大于pivot**////两种partition方式都是对的/*int partition(int a[],int left, int right) //分 阅读全文
posted @ 2012-05-03 23:03 KingsLanding 阅读(327) 评论(1) 推荐(0)
摘要: 1. 下面我想就管理中的组织结构这个问题谈谈个人粗浅的看法.要点: "粗浅的"这个一般不翻译全句可翻译为: I would like to put forward my own opinion about organizing in management.2. 为了让人们能够更好的合作,必须明确他们的任务、目标、责任与权力。要点:必须明确的内容,可以用两种方式翻译全句可翻译为:In order for people to cooperate effectively, they must know their roles, their objectives, their re 阅读全文
posted @ 2012-05-02 21:58 KingsLanding 阅读(365) 评论(0) 推荐(0)