
程序员的自我修养
leileicaocao
这个作者很懒,什么都没留下…
展开
-
程序员的自我修养(1续)
四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量:为协调共同对一个共享资源的单独访问而设计的。3、信号量:为控制一个具有有限数量用户资源而设计。4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section) 临界转载 2013-06-03 20:14:45 · 521 阅读 · 0 评论 -
程序员的自我修养(8、9)
第八章不是很感兴趣,直接跳到第九章。 DLL即动态链接库(Dynamic Link Library)的缩写. 一个DLL中有两个数据段,一个进程间共享,另一个私有. 当我们使用“__declspec(dllexport)”时表示该符号是从本DLL导出的符号。“__declspec(dllimport)”表示该符号是从别的DLL导入的符号。转载 2013-06-03 20:20:52 · 524 阅读 · 0 评论 -
程序员的自我修养(7)
静态链接浪费内存和磁盘空间、模块更新困难等问题,因此寻找一种更好的办法来组织程序模块。 静态链接对程序的更新、部署和发布也会带来很多麻烦。 动态链接: 就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。 动态链接的方式使得开发过程中各个模块更加独立、耦合度更小,便于不同的开发者和开发组织之间进行独立的开发和测试。转载 2013-06-03 20:20:12 · 599 阅读 · 0 评论 -
程序员的自我修养(6)
进程与程序: 程序是一个静态的概念,它就是这些预编译好的指令和数据集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时也有一定的含义。 一般来来说,C语言指针大小的位数与虚拟空间的位数相同,如果32位平台下指针为32位,即4字节;64位平台下的指针为64位,即8字节。Intel自从1995年的Pentium Pro转载 2013-06-03 20:18:00 · 527 阅读 · 0 评论 -
程序员的自我修养(4)
对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件? 或者说,输出文件中的空间如何分配给输入文件?/*假设有a.c*/extern int sharedint main(){int a = 100;swap(&a,&shared);}/*b.c*/int shared = 1;void swap(int *a转载 2013-06-03 20:16:59 · 628 阅读 · 0 评论 -
程序员的自我修养(3)
可执行文件格式主要是:Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format)他们都是COFF(Common file format)格式的变种。 目标文件就是源代码编译后但未进行链接的那些中间文件。动态链接库(windows的.dll和Linux的.so)及静态链接库(Windows的.l转载 2013-06-03 20:13:48 · 696 阅读 · 0 评论 -
程序员的自我修养(2)
从源文件到可以行文件的过程: 预处理——编译——汇编——链接 第一步预编译:$gcc -E hello.c -o hello.i或者$cpp hello.c > hello.i 注:‘-E’选项表示只进行预编译;cpp是预编译器 预编译主要处理一‘#’开头的预编译指令: 将所有的"#define"删转载 2013-06-03 20:13:14 · 538 阅读 · 0 评论 -
程序员的自我修养(1)
从helloworld说起: #include int main(){printf("Hello,World\n");return 0;} 你能回答如下问题吗? ·程序为什么要经过编译才能运行? ·编译器把C语言转化为可执行的机器码的过程做了什么,怎么做的 ·最后编译出来的可执行文件里转载 2013-06-03 20:12:27 · 537 阅读 · 0 评论 -
程序员的自我修养(11续)
__cdecl 的压栈方式——printf#includeint main(){ int b = 3; int arr[] = {6,7,8,9,10}; int *ptr = arr; *(ptr++) += 123; //printf("%d,%d\n", *ptr, *(++ptr)); //输出转载 2013-06-04 09:14:49 · 515 阅读 · 0 评论 -
程序员的自我修养(12)
系统调用接口往往是通过中断来实现,比如Linux使用0x80号中断作为系统调用的入口,Windows采用0x2E号中断作为系统调用的入口。EAX名字C语言定义含义参数1exitvoid _exit(int status)退出进程EBX表示退出码转载 2013-06-03 20:23:06 · 559 阅读 · 0 评论 -
程序员的自我修养(11)
程序从main开始的吗?在执行main之前全局变量已经初始化,main函数的两个参数也被正确传了进来,堆和栈的初始化也已经完成,一些系统I/O也被初始化。完成上面这些工作的函数称为入口函数(Entry Point)。一个典型的运行步骤大致如下:·操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库中的某个函数。·入口函数对运行库和程序运行环境进行初始转载 2013-06-03 20:22:09 · 505 阅读 · 0 评论 -
程序员的自我修养(10)
注:这一章的内容比较经典,之前看“深入理解计算机系统”的时候,也有看到栈帧(Stack Frame),但是不是很清楚,通过这一章的讲解,更清楚了。如果能再结合讲讲GDB调试的话就更完美了。 栈:栈用于维护函数调用的上下文,离开了站函数调用就没法实现。堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。 L转载 2013-06-03 20:21:28 · 551 阅读 · 0 评论 -
程序员的自我修养(6续)
由 user process角度来说明的话,VMA 是 user process 里一段 virtual address space 区域;virtual address space 是连续的内存空间,当然VMA 也会是连续的空间。VMA 对 Linux 的主要好处是,可以内存的使用更有效率,並且更容易管理 user process address space。从另一个观念来看,VMA 可转载 2013-06-03 20:19:07 · 609 阅读 · 0 评论 -
程序员的自我修养(5)
PE: Portable ExecutableCOFF: Common Object File Format 跟ELF一样,PE中也允许程序员将变量后函数放到自定义段。在GCC中使用“__attribute__((section)("name"))”,在VISUAL C++中可以使用 “#pragma”编译器指示。#pragma data_seg("FOO")转载 2013-06-03 20:17:25 · 557 阅读 · 0 评论 -
使用 GNU 的 GDB调试器,内存布局和栈
我们会学些什么? 为了更高效的学习使用GDB,你必须了解帧,通常也成为栈帧,因为帧构成了栈。为了学习栈,我们需要了解可执行文件的内存布局。这里的讨论主要都是理论上的,但是为了使学习比较有趣,在本章结束之前我们将通过GDB来展现栈和栈帧的例子。 本章学习的东西似乎相当的理论化,但是对于达到以下目的来说却是非常有用的:1. 理解栈对于转载 2013-06-03 20:25:09 · 1534 阅读 · 0 评论