进程管理与运行分析

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

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中也是有用到这种思想。

目录
相关文章
|
3月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
596 3
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
535 2
|
10月前
|
弹性计算 运维 监控
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
413 17
|
11月前
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
197 14
|
12月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
1384 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
475 4
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
499 4
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
567 4
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
数据采集 监控 API
如何监控一个程序的运行情况,然后视情况将进程杀死并重启
这篇文章介绍了如何使用Python的psutil和subprocess库监控程序运行情况,并在程序异常时自动重启,包括多进程通信和使用日志文件进行断点重续的方法。

热门文章

最新文章