进程管理与运行分析

简介: 进程管理与运行分析

1 介绍

每个程序员对于阅读内核,以及往内核中打补丁patch作为一种荣耀。Linux内核大体的模块主要包括四大部分:

进程管理(调度,创建,内核线程等);
内存管理(物理内存和虚拟内存);
文件系统(虚拟文件系统VFS,真实的实时文件系统ext3/ext4)
内核协议栈:可参考网上的ntytcp

2 内核源码目录

如下是内核Linux4.4.4版本的内核文件内容

内核版本号含义:

V4.12.24: 4:主版本号 12:次版本号(奇数为测试版,偶数稳定版) 24:当前版本修复上个版本的补丁

3 进程原理

3.1 定义

在内核中用task_struct来描述,它的虚拟地址空间分为:用户虚拟地空间和内核虚拟地址空间

虚拟地址空间:每个用户进程都有;对于内核地址空间:所有的进程共享

3.2 特殊存在方式

两种特殊方式:
内核线程:没有用户虚拟空间的进程称为内核线程
用户线程:共享用户虚拟地址空间的进程称为用户线程

3.3 分类

常说的c库的进程和内核标准的不一致。如下图:

它们在内核中都是用task_struct描述。

3.4 进程的四要素

a:一段程序供其执行;
b:专门的系统堆栈空间;
c:在内核有task_struct描述;
d:有独立的存储空间,拥有专有的用户空间;

无第d项,则是线程;完全无用户空间称为内核线程;若共享用户空间映射称用户线程

3.5 内核task_struct描述

描述一个进程在内核中运行的所有信息,比较大大概有1.7kb左右。如下图

主要重要的就是pid,父子关系,任务状态,调度策略相关,内存处理,文件系统,内核栈等

3.6 常见的几种创建方式

1 内核进程产生原理:

内核会使用静态数据结构(固件中的)构造0号内核线程;然后0号内核线程分列成1号内核线程和2号内核线程(kthread线程);1号线程初始化完装载用户程序产生各种子进程,2号进程产生其它的各种内核线程。如下图:

2 创建进程的方式:

1 fork(分叉):定时复制技术 clone简化版本
2 vfork:淘汰
3 clone克隆:可供pthread库线程使用

上面的3个系统调用都会调用到kernel/fork.c中的__do_fork函数

例如:在应用程序中使用系统调用fork()函数:触发80软终端,然后再去系统调用表中查找sys_call_table(),对应到内核的sys_fork()函数,然后再调用do_fork()函数;

3 __do_fork的源码分析流程:

long _do_fork(unsigned long clone_flags,  //克隆标识,0为不要向父进程发信号
        unsigned long stack_start,// 栈开始,指定线程的用户栈起始位置(创建线程才有意义)
        unsigned long stack_size,//栈大小
        int __user *parent_tidptr,//新建线程保持自己的标识
        int __user *child_tidptr,//子进程的标识
        unsigned long tls)
{
//......
}

源码具体流程:

4 copy_progress源码流程:

3.7 进程的状态迁移图

在内核描述task_struct结构体中,有一个voliate int的state状态就是进程的状态。

进程主要有7种状态:就绪状态、运行状态、轻度睡眠、中度睡眠、深度睡眠、僵尸状态、死亡状态,它们之间状态变迁如下:

4 进程的调度策略

1、Linux内核支持调度策略

先进先出调度(SCHED_FIFO)、轮流调度(SCHED_RR)、限期调度策略(SCHED_DEADLINE)采用不同的调度策略调度实时进程

普通进程支持两种调度策略:标准轮流分时(SCHED_NORMAL)和SCHED_BATCH调度普通的非实时进程。

空闲(SCHED_IDLE)则在系统空闲时调用idle进程

2、进程优先级

限期进程的优先级比实时进程高,实时进程的优先级比普通进程高。

限制进程的优先级是-1。

实时进程的实时优先级是1-99,优先级数值越大,表示优先级越高。

普通进程的静态优先级是100-139,优先级值越小,表示优先级越高,可通过修改nice值改变普通进程 的优先级,优先级等于120加上nice值。

在task_struct结构体中,4个成员和优先级有关如下:

5 写时复制技术

写时复制核心思想:只有在不得不复制数据内容时才去复制数据内容。

redis中也是有用到这种思想。

目录
相关文章
|
12天前
|
算法 调度 UED
探索操作系统核心:进程管理与调度
【9月更文挑战第28天】在数字世界的心脏跳动着无数进程,它们像是细胞一样构成了操作系统的生命体。本文将深入探讨操作系统中进程管理与调度的奥秘,揭示如何通过精心设计的数据结构和算法来维护系统的稳定性和效率。我们将从进程的基本概念出发,逐步解析进程状态转换、进程同步机制,以及进程调度策略,旨在为读者呈现一幅清晰、生动的操作系统内部工作机制图景。
|
6天前
|
算法 调度
深入理解操作系统:进程管理与调度
【9月更文挑战第34天】操作系统是计算机系统的核心,负责管理和控制计算机硬件和软件资源。本文将探讨操作系统中的一个重要概念——进程管理与调度。我们将了解进程的概念、进程状态以及进程调度算法。通过学习这些知识,我们可以更好地理解操作系统的工作原理,为进一步学习和研究打下基础。
|
10天前
|
算法 调度 开发者
深入理解操作系统之进程管理与调度
【9月更文挑战第30天】本文旨在通过浅显易懂的语言和具体代码示例,带领读者探索操作系统中进程管理的奥秘。我们将从进程的生命周期出发,逐步解析进程调度的核心概念,并通过实例展示如何实现简单的进程调度算法。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息,帮助你更好地理解和掌握进程管理与调度的知识。
25 4
|
21天前
|
监控 算法 程序员
探索操作系统的核心:进程管理与调度
【9月更文挑战第19天】本文深入浅出地探讨了操作系统中至关重要的一环——进程管理与调度。通过直观的语言和生动的案例,我们将了解进程是什么,它们如何被操作系统所管理,以及调度算法对系统性能的影响。文章旨在为读者揭示操作系统背后的秘密,同时提供实用的代码示例来加深理解。无论你是计算机专业的学生还是对操作系统有兴趣的程序员,这篇文章都将为你打开新世界的大门。
|
5月前
|
机器学习/深度学习 人工智能 负载均衡
深入理解操作系统之进程管理与调度优化
【5月更文挑战第27天】 本文旨在探索操作系统的核心机制之一——进程管理,特别是进程调度的策略与优化。通过分析不同调度算法的特点、性能指标和应用场景,我们揭示了现代操作系统在多核处理器环境下面临的挑战及应对策略。文章不仅总结了经典的调度理论,还讨论了实时性、能效比以及用户体验等维度下的调度优化方法。此外,结合最新的研究动态,探讨了机器学习技术如何被整合进进程调度策略中,以实现更为智能和自适应的资源管理。
|
2月前
|
算法 调度
操作系统中的进程管理与调度
【8月更文挑战第14天】在现代计算机系统中,操作系统扮演着至关重要的角色。它不仅负责管理硬件资源,还提供了进程管理的机制来协调多个程序的执行。本文将深入探讨操作系统如何通过进程管理与调度来优化资源使用和提高系统响应性。我们将从进程的概念出发,分析进程状态转换、进程调度算法及其对系统性能的影响。通过理解这些概念,读者将能够更好地把握操作系统的核心原理及其在实际场景中的应用。
|
5月前
|
监控
一个进程监控脚本程序
一个进程监控脚本程序
24 0
|
5月前
|
消息中间件 监控 安全
【C/C++ 程序设计】Linux 进程管理 设计 获取进程信息 策略权衡
【C/C++ 程序设计】Linux 进程管理 设计 获取进程信息 策略权衡
143 0
|
Linux Shell 网络安全
Linux 让进程在后台可靠运行的几种方法
Linux 让进程在后台可靠运行的几种方法
135 0
|
监控 Unix Linux
高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务
高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务