LKD-Linux系统进程管理

《Linux 内核设计与实现》(LKD)第三版译者序 http://home.lupaworld.com/home-space-uid-26540-do-blog-id-230898.html 阅读详情

  本章介绍linux系统进程概念以及线程,讨论在linux内核中是如何对进程进行管理的以及进程结束流程。

    关于进程的概念在操作系统概念--操作系统中的进程、线程中已经描述过,这里不在赘述,在应用层一般理解是一个应用实例是一个进程,一个进程又可以包含多个线程,但是在传统的unix系统中每个进程都是由一个线程组成的,而Linux系统内核中也有单独的对线程的实现机制:即不区分线程和进程。

进程创建销毁概述

    Linux中一个进程生命周期的开始要从fork()这个大名鼎鼎的系统调用开始,fork()调用返回两次:一次是父进程pid,然后是子进程pid,fork完成后子进程和父进程还是一样的,直到调用exec()家族函数为子进程创建自己的地址空间以及加载相关代码到内存,fork函数实际上是调用的clone系统调用来实现进程拷贝的,

    进程的结束是通过调用exit系统调用来实现的,此函数会结束当前进程并且释放当前进程所占用的相关资源,父进程可以通过wait4()系统调用来收集子进程的退出信息,当进程结束的时候会被置为zombie状态,如果父进程调用wait或者waitpid,标记为zombie状态的进程就会结束。

进程描述符

    内核会把进程存储在一个叫做task list的循环双链表结构中,双链表中的每个元素都使用task_struct结构体描述该结构体被定义在头文件<linux/sched.h>中<include/linux/sched.h>:

struct task_struct {
    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
    struct thread_info *thread_info;
    atomic_t usage;
    unsigned long flags;    /* per process flags, defined below */
    unsigned long ptrace;
    int lock_depth;     /* Lock depth */
    int prio, static_prio;
    struct list_head run_list;
    prio_array_t *array;
...
...
#endif
#ifdef CONFIG_NUMA
    struct mempolicy *mempolicy;
    short il_next;
#endif
};

该结构体内容较多,请自行下载内核源代码进行预览,此结构体在32为机器上大概会占用1.7kb,但是考虑到此结构体所携带的所有内核所需要的关于进程的信息而言,这点空间占用也不算大,它包含了描述进程的数据:打开的文件、进程空间地址、信号量、进程状态等等。

分配进程描述符

task_struct结构体通过slab内存分配器来分配空间,linux kernel 2.6系列中task_struct被存储在每个进程的内核栈的尾部,这样可以避免使用额外的寄存器去存储结构体的位置,这就为寄存器紧张的架构如x86带来了好处,通过计算栈指针就可以找到task_struct的存储位置了,在linux系统中,虽然task_struct是用来描述一个进程,但是task_struct描述的是进程的通用部分,不同CPU架构之间的差异化描述则由thread_info结构体来描述,该结构体存储在内核栈的尾部,它包含一个task元素指向和他对应的一个task_struct,所以实际上一个进程是由thread_info和task_struct两个结构体共同来描述的,定义在thread_info.h头文件中

<include/asm-xxx/thread_info.h>:

struct thread_info {
    struct task_struct  *task;      /* main task structure */
    struct exec_domain  *exec_domain;   /* execution domain */
    __u32           flags;      /* low level flags */
    __u32           status;     /* thread synchronous flags */
    __u32           cpu;        /* current CPU */
    int             preempt_count;

    mm_segment_t        addr_limit; 
    struct restart_block    restart_block;
};

进程状态

 

Linux内核设计与实现(LKD)_中文_第三版 linux内核入门书籍,《深入了解Linux内核》的导论,适合菜鸟. 立即下载

相关推荐

Linux内核设计与实现(LKD)--中文版

那些有志于理解Linux内核的软件开发者,可提供足够多的关于Lunux内核设计和实现的信息,使其能够拥有较完备的知识 真正开始开发内核代码。

Linux必学书籍!五本强烈推荐,你读过几本?

《深入理解Linux内核》 推荐等级:5颗星为了透彻理解Linux的工作机理,以及为何它在各种系统上能顺畅运行,你需要深入到内核的心脏。cPu与外部世界的所有交互活动都是...

资料qun832218493 5827

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 440

LKD (linux内核设计与实现)笔记

zcat /proc/config.gz > .config

一霎那的永恒 578

Jenkins离线安装保姆级教程:从下载.war包到SVN+Maven项目一键部署(附避坑脚本)

本文详细介绍了Jenkins离线安装的全流程,包括.war包下载、SVN+Maven项目配置及自动化部署。特别针对内网环境提供解决方案,涵盖插件管理、开发工具链配置、构建触发器和SSH部署等关键步骤,帮助企业在网络隔离环境下实现高效持续集成。

weixin_30096975的博客 374

基于STM32的最简易蓝牙遥控小车

基于STM32的蓝牙遥控小车,基于HAL库编写代码,具有移动功能,读者可自行添加其他扩展功能。按下状态的对应关系:2前进,4左转,5停止,6右转,8后退,松开状态都是5,都选择16进制。首先按照小车的图纸把小车的机械部分装好。做这个小车的成本在200元左右,包括焊接设备,杜邦线等。

weixin_43469377的博客 1万+

LKD:进程管理

进程 进程:处于执行期的程序,包括:可执行程序代码、打开的文件、挂起的信号、内核内部数据、处理器状态、一个或多个具有内存映射的内存地址空间及一个或多个执行线程、用来存放全局变量的数据段等。实际上,进程就是正在执行的程序代码的实时结果。 执行线程:简称线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的是线程,而不是进程。 进程提供两种虚拟机...

Neil驱动的博客 701

TTL转RS422(B)工业级转换模块设计:从原理到实战部署

在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的

weixin_29195615的博客 341

linux开发必备的5本秘籍

有关内核的书籍可以用汗牛充栋来形容,不过只有一些经典的神作经住了考验。首先是5本久经考验的神作(个人概括为“2+1+2”,第一个2是指2本全面讲解内核的书,中间的1指1本讲解驱动开发的书,后面的2则指2本有关内核具体子系统的书,你是否想到了某某广告里三个人突然站起单臂齐举高呼“1比1比1”的场景?)。         一、《Linux内核设计与实现》         简称LKD,从入门开始,介

生命的紫金颜色 780

无人驾驶小车调试笔记(六)-- 车轮校准

简介:小车的动力完全来自于两个电机带动的车轮,在理想状态下,给两个电机同样的驱动参数,两个车轮会以同样的转速带动小车直线行驶,而实际情况是每个电机可能都会有个体差异,也就是说给予同样的驱动参数,表现出的转动速度会有些许不同,两个轮子的差速会导致车辆拐弯,后果就是给了直线行驶的控制命令,但是车走着走着就偏离了原本的方向,所以在开始控制之前,我们需要先平衡两个车轮的转速,保证在同样驱动参数下,两个车轮转速大致相同,也就是可以走直线。 车轮校准分为3步,测试、调整后再测试、保存参...

aibingjin的博客 1820

手把手教你学SOME/IP「3.2.1.发布/订阅行为」

本文详细介绍了SOME/IP协议中的服务发现机制,重点解析了发布/订阅行为的流程。主要内容包括:1)服务发布与Method通信流程,涵盖find/offer报文交互、TTL保活机制及异常处理;2)服务订阅与Event通信流程,包括subscribe/ack报文交互和组播延迟机制;3)特殊场景如快速发送、半周期回复、重置订阅等机制。通过邮局订阅报纸的类比,帮助理解服务发现的核心原理,并强调流程图对于问题定位的重要性。文章为SOME/IP协议的工程实现提供了实用指导。

nihaoljq2010的博客 1220

学习linux内核的经典书籍介绍

学习linux内核的经典书籍介绍        有关内核的书籍可以用汗牛充栋来形容,不过只有一些经典的神作经住了考验。首先是5本久经考验的神作(个人概括为“2+1+2”,第一个2是指2本全面讲解内核的书,中间的1指1本讲解驱动开发的书,后面的2则指2本有关内核具体子系统的书,你是否想到了某某广告里三个人突然站起单臂齐举高呼“1比1比1”的场景?)。 《Linux内核设计与实现》

banditzhi的专栏 740

3D Slicer学习记录(4)-PLUSapp连接双目相机Intel Realsense

plusapp是基于openIGTLink协议的免费的开源库和应用程序API接口,用于数据采集、预处理、校准和实时流成像、位置跟踪和其他传感器数据。这里以intel realsense双目相机为例详细的演示整个图像流导入到3D Slicer的流程。

weixin_39090239的博客 1344

Linux内核学习总结

Linux 内核学习经验总结 开篇 学习内核,每个人都有自己的学习方法。以下是我在学习过程中总结出来的东西,拿出来跟大家交流一下。 写这篇博客的原因 刚开始学内核的时候,不要执着于一个方面,不要专注于一个子系统就一头扎到实际的代码行中去,因为这样的话,牵涉的面会很广,会碰到很多困难,容易产生挫败感,一个函数体中很可能掺杂着其他各个子系统方面设计理念下相应的代码实现,这个时候看到这些东西,纷繁芜杂,是没有头绪而且很不理解的,会产生很多很多的疑问,,而事实上等了解了各个子系统后再回头看这些东西的话,就简单多了,

qq_44856630的博客 239

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8101

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LINUX内核学习--课本学习过程

先读lkd, 了解linux的大体框架, 再读ldd, 了解kernel中常用的api。 再尝试 写驱动,读驱动。  写自己的内存管理,进程调度,文件系统。 lkd2 —— linux kernel development Linux内核开发第二版 ulk —— Understanding the Linux Kernel 深入理解Linux内核 “ldd3”

程序狗的成长之路 794

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

了解linux内核必读的5本书

了解linux内核必读的5本书 1.《Linux内核设计与实现》 简称LKD,从入门开始,介绍了诸如进程管理、系统调用、中断和中断处理程序、内核同步、时间管理、内存管理、地址空间、调试技术等方面,内容比较浅显易懂,个人认为是内核新人首先必读的书籍。 2.《深入理解Linux内核》 简称ULK,相比于LKD的内容不够深入、覆盖面不广,U...

魏波 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux内核学习经验总结

开篇 学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。​ 内核学习,一偏之见;疏漏难免,恳请指正。 为什么写这篇博客 刚开始学内核的时候,不要执着于一个方面,不要专注于一个子系统就一头扎到实际的代码行中去,因为这样的话,牵涉的面会很广,会碰到很多困难,容易产生...

weixin_34267123的博客 100

too much to learn...

要学的东西好多,烦躁。。。 不能输,加油啊!

on the road 746

LKD3笔记

笔记

u013021855的博客 612

Linux 内核学习经验总结

(点击上方公众号,可快速关注) 来源:冰凌块儿 blog.chinaunix.net/uid-24669930-id-4039377.html 开篇 学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。 内核学习,一偏之见;疏漏难免

程序员的那些事 1041

(LKD3读书记录)-Chap3:进程管理

/* 学习记录 无意侵权 */ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 进程管理

forsakening的专栏 1688

Process Management [LKD 03]

今天开始读Linux Kernel Development这本书。

scutth的专栏 485

Linux----内核学习过程

转自http://blog.chinaunix.net/uid-24669930-id-4039377.html 作者:冰凌块儿 开篇 学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。 内核学习,一偏之见;疏漏难免,恳请指正。 为什么写这篇博客 刚开始学内核的时候,不要执着于一个方面,不要专注于...

A634634634的博客 244
上一篇: Google原生输入法LatinIME引擎初始化流程分析(二)
下一篇: 虚存技术(上)
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值