CPU与内存的那些事

  1. HZ、CPU cycles、tick、jiffies
    HZ:内核每个固定周期发出的timer interupt(IRQ 0);

    HZ=1000 表示每秒有1000次的timer interupt  
    

    Tick:是HZ的倒数,意即timer interrupt每发生一次中断的时间。如HZ为250时,tick为4毫秒(millisecond)
    Jiffies:为Linux核心变数(32位元变数,unsigned long),它被用来纪录系统自开几以来,已经过多少的tick。每发生一次timer interrupt,

     Jiffies变数会被加一。值得注意的是,Jiffies于系统开机时,并非初始化成零,而是被设为-300*HZ (arch/i386/kernel/time.c),即
     代表系统于开机五分钟后,jiffies便会溢位。那溢位怎么办?事实上,Linux核心定义几个macro(timer_after、time_after_eq、time_before与time_before_eq),即便是溢位,也能藉由这几个macro正确地取得jiffies的内容。  
    另外,80x86架构定义一个与jiffies相关的变数jiffies_64 ,此变数64位元,要等到此变数溢位可能要好几百万年。因此要等到溢位这刻发生应该很难吧。那如何经由jiffies_64取得jiffies资讯呢?事实上,jiffies被对应至jiffies_64最低的32位元。因此,经由jiffies_64可以完全不理会溢位的问题便能取得jiffies  
    
  2. CPU与各个组件之间的延迟:
    一般情况下大部分指令执行需要一个cpu cycles(1/3 nanoseconds)
    cpu cache
    cpu 与内存的关系
    cpu 与内存之间的那些事

  3. 一般情况下一条tcp链路占用多大内存?
    socket:3.0K + 0.5K=3.5KB
    建立了epoll来监听长连接的socket fd。根据epoll的实现,在64位环境下,epoll在内核中需要为每个fd消耗160Bytes[i]。
    这部分内存可以通过slabtop查看。
    在网络层中,还需要struct sock数据结构来表示socket。
    内核中socket相关的内存消耗都是描述socket的数据结构。相关的数据结构都是从内核的slab高速缓冲区中申请和释放的。
    通过查看系统的slab信息,可以计算得出socket相关数据结构(包括epoll)内核态的消耗为2.7KB(包括epoll的消耗)。再加上SLAB数据结构对齐造成的额外开销,socket相关数据结构总共消耗3KB。
    进程打开的socket无数据发送时,单个socket消耗3KB,有数据发送时,消耗4KB。因此内核中为每个socket连接需要消耗的内存空间为3+4=7KB。
坚持原创技术分享,您的支持奖鼓励我继续创作!