进程管理——linux内核设计与实现读书笔记

来源:互联网 发布:c语言教材分析 编辑:程序博客网 时间:2024/04/29 07:41

一、数据结构和概念

1、task_struct 进程管理结构(进程描述符),包含具体进程的所有信息,以双向链表方式存放在内核任务队列中,进程描述符包含其父子节点的指针。

slab分配器负责分配 task_struct。 PID进程唯一标识符:根据硬件结构的不同,一般通过栈指针计算或者存储于寄存器中。

2、thread_info

在栈创建thread_info,存放指向该任务实际task_struct指针。

3、进程上下文

程序在用户空间执行,当执行系统调用或触发异常,则进入内核空间,称内核代表进程执行并处于进程上下文中。

二、新进程生命周期

fork  创建新进程:/kernel/fork.c。拷贝父进程来创建子进程,并创建PID。 为task_struct、内核栈申请空闲页面,创建thread_info,挂接进程槽,并复制父进程管理结构,复制父进程页表;清除数据、设置状态。(写时拷贝)

exec 创建地址空间,载入程序

exit 退出 子进程自我析构。处理状态、功能、资源,释放后调用schedule。剩余内核栈、task_info和task_struct以向父进程提供信息。

wait 查询 父进程删除进程描述符等。

三、线程

linux线程:轻量级进程,共享资源手段。

线程创建:与普通进程过程类似,区别在于需要指明共享资源。具体:调用clone时传参。

内核线程:与普通线程的区别在于没有独立的地址空间。kthread

四、进程调度

I    调度器类:平衡调用周期和吞吐量。按优先级顺序便利调度类,拥有可执行进行的最高优先级的调度类获得执行。 sched.c。有CFS、实时等调度策略。

II   CFS完全公平调度:针对普通进程,nice值对时间片的作用以几何加权的方式体现,通过权重分配时间来确保进程公平的处理器使用比。

实现(sched_fair.c):

1、时间记账(没有时间片概念)。sched_entity 追踪进程记账信息:vruntime虚拟时间,通过系统定时器周期更新加权计算,记录程序运行时间和可用时间。

2、进程选择。红黑树选择具有最小vruntime的任务:选择:最左侧叶子节点;添加:被唤醒或fork创建时;删除:阻塞或终止时。

III  调度相关:

调度器入口。schedule(),找到最高优先级的调度类,通过其可运行队列确定下一个该运行的程序。

唤醒和睡眠。休眠进程位于等待队列中,包括可中断以及不可中断。唤醒操作唤醒队列上所有进程,设置状态、加入红黑树、设置标志等。

上下文切换:从一个可执行进程切换到另外一个可执行进程。包括虚拟内存切换和处理器切换。

内核调用sechdule的时机:当从用户空间、系统调用或者中断中返回的时候,通过确认标志来判断是否调度。标志设置:进程被抢占、优先级高的进程进入可执行状态。

linux支持用户抢占(从系统调用或者中断返回用户空间)和内核抢占,但是内核抢占必须判断无锁。

linux还提供调度相关系统调用接口:可以通过系统调用设置调度相关nice值、优先级等,调度策略、强制绑定处理器指定运行的cpu,放弃处理器时间。


0 0
原创粉丝点击