1,应用程序在运行时的内存包括代码去和数据区。
对于一个进程的内存空间而言,可以在逻辑上分成三个部分:代码去,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配咋动态数据区,既堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
在传统的c中堆和栈实际是一块物理内存,堆主要用来动态分配内存,从堆栈内存的低端向上分配;而栈主要用来传递函数参数、返回值和局部参数内存分配,是从堆栈内存的高端向下分配,俗称压栈和出栈。堆是动态分配,需要手工释放,否则会导致内存泄漏;栈是静态分配,分配堆栈,但堆栈能够自动释放。
2,含参数的宏和函数。
宏是编译期的,函数是运行期的;宏不是实体,而函数是一个可寻址的实体;宏只是编译期替换,参数两个实体并没有由宏实际产生,而函数会在栈中定义参数;宏没有生存期、作用域之类的概念,而函数有。
宏没有类型检测,而内联函数和函数有。
3,程序什么时候使用线程,什么时候单线程效率高。
1,耗时的操作使用线程,提高应用程序响应。
2,并行操作时使用线程,如C/S架构的服务器并发线程响应用户的请求。
3,多cpu系统中,使用线程提高CPU利用率。
4,改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为及格独立或半独立的运行部分,这样的程序会利于理解和修改。
4,内存对齐的问题。
编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,然而,对齐的内存访问仅需要一次访问。
5,进程死锁
原因:资源竞争及进程推进顺序非法
4个必要条件:互斥,请求保持,不可剥夺,环路
处理:鸵鸟策略,预防策略,避免策略,检测和解除死锁
进程调度策略:fcfs(先来先服务),优先级,时间片轮转,多级反馈
6,volatile关键字
volatile表示程序编译过程中不可以对其修饰的变量进行优化,每次使用的时候都要到内存中去取。
当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。