《深入理解Linux内核》笔记9 - 进程地址空间

线性地址空间的特征:

  • 进程的地址空间由允许进程使用的全部线性地址组成
  • 每个进程的线性地址空间是独立的
  • 内核通过线性区表示线性地址区间
  • 线性区由起始地址、长度和访问权限来描述
  • 线性区的长度和起始地址必须是4096的倍数(4K对齐)

进程获得新线性区的典型情况:

  • 创建新的进程,分配全新的地址空间
  • 正在运行的进程装入一个完全不同的程序(exec系列函数)
  • 正在运行的进程对一个文件执行内存映射(mmap)
  • 进程持续像用户态栈增加数据
  • 进程创建一个IPC共享线性区和其他进程共享内存
  • 进程通过malloc()之类的函数扩展动态内存区,最终是通过系统调用brk()mmap()进行内存分配的
阅读全文 →

《深入理解Linux内核》笔记3 - 中断和异常

中断和异常的区别:

同步中断(称为异常),由CPU控制单元产生,只有在执行某一条指令后才会触发异常。 异步中断,由外部硬件产生,如硬盘、网络等。 产生异常的原因以下两种:

程序错误,这种情况下内核通常发送信号进程。 需要内核处理的异常条件,如缺页、系统调用(intsysenter指令)。

阅读全文 →

《Linux内核设计与实现》笔记5 - 系统调用

Unix接口设计的格言:提供机制(mechanism)而不是策略(policy)。Unix系统调用抽象除了用于完成某种确定的目的的函数,至于这些函数怎么用完全不需要内核去关心。
阅读全文 →

[翻译]GNU C malloc实现原理

原文:https://sourceware.org/glibc/wiki/MallocInternals

Malloc概述

GNU C语言库(glibc)的malloc库包含一些管理应用程序地址空间中分配的内存的函数。glibc的malloc源于ptmalloc(pthreads malloc),而ptmalloc又源于dlmalloc(Doug Lea malloc)。这个malloc是一个 “堆 (heap)“式的malloc,这意味着不同尺寸的chunk(chunks)存在于一个更大的内存区域(“堆”)中,而不是像其他的实现那样,例如使用位图(bitmaps)和数组(arrays),或者相同尺寸的chunk(blocks),等等。在以前,每个应用程序只有一个堆,但glibc的malloc允许多个堆,每个堆都在它自己的地址空间内增长。

阅读全文 →

Linux性能分析

  • sar
  • top
  • uptime
  • dmesg
  • vmstat
  • mpstat
  • pidstat
  • iostat
  • free
阅读全文 →