linux 进程调度 内存,理解Linux操作系统——Process和Memory

学习自《Linux性能分析》

Linux 进程管理

Process:an instance of execution that runs on a processor.

Linux操作系统通过进程描述符task_struct结构体管理进程。

30398188be3bd0e9c6cc678137bb56a4.png

Thread: an execution unit generated in a single process, also called Light Weight Process (LWP).

b4c0d0bc773999be3c3ddf763161bfab.png

进程priority和nice级别

priority: 包括dynamic priority和static priority,值越大,获得CPU的可能性也越大。

nice: 用户可以改变进程的nice级别,来间接地改变进程的static priority。取值范围19(lowest priority)到-20(highest priority),默认值0。

上下文切换

在进程执行时,运行进程的信息存储在处理器的寄存器和cache中。上下文切换只发生在内核态。

处理器的3种状态:

内核态:运行于Process Context,内核代表进程运行于内核空间

内核态:运行于Interrupt Context,内核代表硬件运行于内核空间

用户态:运行于用户空间

f80b6dc6000520043ac8a9a4e2ee703b.png

中断处理

hard interrupt: 由硬件产生。

soft interrupt: 由程序产生,即信号。

在多处理器环境下,通过绑定中断到一个特定的处理器上能够提高系统的性能。

进程状态

TASK_RUNNING: 正在运行或者在运行等待队列中。

TASK_STOPPED: 接收到了信号(例如SIGINT、SIGSTOP)使进程挂起,等待SIGCONT信号恢复运行。

TASK_INTERRUPTIBLE: 进程被挂起,并等待特定的条件发生。

TASK_UNINTERRUPTIBLE: 信号对于处于该状态的进程无作用,例如一个在等待磁盘I/O操作de进程。

TASK_ZOMIBE: 进程调用exit()后,等待父进程获取其退出状态信息。

11a18746d9615ac3a3029bc71ce74b8c.png

进程内存段

进程地址空间:

3450e07fa91a9d348374732917031694.png

Text segment: 存储可执行代码。

Data segment:

Data: 初始化数据,例如静态变量

BSS: zero-initialized data

Heap: malloc()分配的内存,往高地址空间增长

Stack segment: local variables、函数参数、函数的返回地址,往低地址空间增长。

可通过pmap命令查看用户进程地址空间情况。

Linux CPU 调度

Linux内核使用O(1)算法来选择一个进程运行。

算法使用了2个进程优先级数组:active和expired。

当一个进程次分配到时间片时,它会被放置在active数组。当进程时间片用完时,会分配新的时间片,然后放置在expired数组。当active数组为空了,两个数组就进行转换。

2307e7cfa0dccfb9a34fa537a57791f9.png

内存架构

通常在32bit机器上,Linux会把物理内存划分为几个zone:ZONE_DMA(I/O设备专用内存)、ZONE_NORMAL(内核能直接使用)、ZONE_HIGHMEM(内核无法直接使用,需要将这部分空间做一个映射,映射关系存储在ZONE_NORMAL中)。

352ab51cd5b01101b7cc78fecb33254a.png

be2d59afca64886296add518ef4863eb.png

虚拟地址被划分为内核空间和用户空间,32bit机器上虚拟地址与物理地址映射关系:

5e596862c64228912886c55089adf37e.png

32bit机器4G虚拟地址空间解析图:

cde8443203a47f89fc736bf25557522a.png

对于64bit机器,通常没有ZONE_HIGHMEM,因为64bit的虚拟地址中的内核空间足以映射非常大的物理内存。

18f33f10c32d27df408ec47e4c4b6bcc.png

虚拟内存管理器

860f3998c1c69c702c415ee26911e1f6.png

默认的虚拟内存管理器配置会把所有空闲的内存分配为disk cache使用。

页面分配

一页通常为4K bytes。当一个进程请求一定数量的页面时,如果有足够的页面,Linux内核会立即分配给它。否则,需要从其他进程或页缓存获取页面。

伙伴系统

Linux内核通过buddy system的机制维护空闲页面。

页面再生

如果无法为进程分配到需要的页面,Linux内核会试图通过释放某些页面来为进程分配所需的页面。这个过程称为page reclaiming,kswapd内核线程和try_to_free_page()内核函数负责这一过程。

kswapd通常是一个处于interruptible state的线程,被buddy system调用,基于LRU算法查找候选的页面。它会扫描active list查找出最近最少使用的页面,然后将其放到inactive list中。

可通过vmstat -a命令查看有多少内存是active和inactive。

kswapd也遵循另外一个原则。页面通常用于两种途径:page cache和process address space。当kswapd进行page reclaiming时,会选择page cache进行释放,而不是page out或者swap out进程的页面。

page out: take some pages (a part of entire address space) into swap space.

swap out: taking entire address space into swap space.

swap

Linux会高效地利用swap空间,当发现swap空间使用了许多时,并不一定是内存瓶颈问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值