程序(静态的,磁盘上的)
百度的解释是:
计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
进程(动态的,内存中)
进程的概念
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体
换句话说进程是一个容器,包含程序执行需要的代码、数据还有资源等信息。多任务的操作系统,可以同时执行多个进程。
进程虚拟地址空间
多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中,这个沙盘就是虚拟地址空间 (virtual addressspace), 在32位经典模式下,它总是一个4GB的内存地址块。这些虚拟地址通过页表(pagetable) 映射到物理内存,页表由操作系统维护并被处理器引用。每个进程都拥有一套属于它自己的页表,但是还有一个隐情, 只要虚拟地址被使能,那么它将会作用于这台机器上运行的所有软件,包括内核本身,因此,有一部分虚拟地址必须保 留给内核使用。
线程
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程
函数
包含某个特定功能的代码块,可以叫做子程序。
典型的内存空间布局
-
从低地址到高地址依次为:代码区、只读常量区、全局区/数据区、BSS段、堆区、栈区。
代码区:存放可执行指令。 只读常量区:存放字面值常量、具有常属性且被初始化的全局和静态局部变量(如:字符串字面值、被const关键字修饰的全局变量和被const关键字修饰的静态局部变量)。 全局区/数据区:存放已初始化的全局变量和静态局部变量。 BBS段:存放未初始化的全局变量和静态局部变量,并把它们的值初始化为0。 堆区:存放动态分配的内存。 栈区:自动变量和函数调用时需要保存的信息(逆向分析的重点) 补充: 代码区和只读常量区一般统称为代码段 栈区和堆区之间相对生长的,堆区的分配一般按照地址从小到大进行,而栈区的分配一般按照地址从大到小进行分配。 复制代码