本文共 2222 字,大约阅读时间需要 7 分钟。
不同操作系统下,进程管理与调度的实现和机制有很大不同。对于上层应用(特别是跨平台)的开发,进程管理与调度显得不那么重要;但是,对于贴近操作系统的底层开发,就非常有必要了解Linux中进程的管理与调度
//调用kthread_run接口来创建内核进程,并立即执行//该接口是宏,本质是调用kthread_create函数来创建进程,再调用wake_up_process执行进程#define kthread_run(threadfn, data, namefmt, ...) \({ \ struct task_struct *__k \ = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \ if (!IS_ERR(__k)) \ wake_up_process(__k); \ __k; \})//调用kthread_stop来杀死内核进程int kthread_stop(struct task_struct *k)
进程描述符结构体中的元素state,描述的是进程状态,它可能有5种值
__TASK_TRACED:被其他进程追踪(被调试)
值得注意的是,若父进程比子进程先退出,那么子进程可能会成为“孤儿进程”,无法正常退出(处于僵死态而无人释放)。此时,系统会自动为“孤儿进程”指定其他进程作为“养父”,保证了不会出现“孤儿进程”
多任务系统可以分为抢占式和非抢占式。大部分操作系统(包括Linux)都采用了抢占式,所谓抢占式,就是:调度器可以随意挂起运行中的进程,转而去执行另一个更重要的进程
进程主要分为两类:I/O消耗型和处理器消耗型
Linux2.6.23中,采用的调度算法为CFS(完全公平调度算法)。该算法会智能的判断进程的情况来进行调度,可以说真正的达到了完全公平调度
Linux中采用两种优先级,它们都能进行手工设置
ps -el
,标记NI的那一列便是nice值。我们可以使用如下API设置nice值nice()
ps -eo state,pid,rtprio,comm
,标记RTPRIO的那一列便是实时优先级,若显示“-”,则说明它不是实时进程。我们可以使用如下API设置实时优先级sched_setparam()