code,stack and heap.

静态代码放在地址空间顶部,heap从顶部向下增长(用户malloc()更多内存),stack从底部16KB向上增长(用户进行进程调用),当然还有其他的地址空间安排。

我们描述的是OS为运行程序提供的抽象。程序实际上不在物理地址0到16KB的内存中,它被加载到任意物理地址。

segmentation带来的问题:

1.OS在上下文切换时做什么?保存和恢复寄存器。

2.segment变化时与OS的交互。程序调用malloc分配对象,某些情况下,heap能提供服务,malloc为对象找到free space并将指针返回调用者。但其他情况下heap自身需要grow,则内存分配库执行系统调用扩展heap,OS提供space,更新segment size register大小,通知库成功,库为新对象分配空间并完成返回调用。如果没有可用内存或者调用程序过多,OS拒绝请求。

3.管理物理内存中的可用空间。一般问题(外部碎片)是物理内存很快被充满形成小空白,很难分配新的段。解决方案:重新排列现有段,但压缩代价很高,占用长时间CPU。