`
love19820823
  • 浏览: 944300 次
文章分类
社区版块
存档分类
最新评论

《深入理解Linux内核》--第三章 进程:读书笔记

 
阅读更多

最大体会关注的是进程的权限、父进程子进程的关系、进程与线程的关系 以及 进程线程的生命周期。
一、进程、轻量级进程,线程
进程拥有自己独立空间。
轻量级进程:两个轻量级进程基本上可以共享一些资源,诸如地址空间、打开的文件等。(之所以说轻量级,就是说偏向线程,可以共享一些资源,但是又不是完全的线程。)
线程,内核看做是简单的进程。
为什么要轻量级进程而非线程,例子:象棋程序的控制图像化棋盘部分、思考下一步移动的思考部分。两部分如果都是进程则不能共享数据(进程间共享数据困难,当然也可以通过各种方式做到);如果都是线程,则一个在运行,另一个则阻塞(同一进程内的多线程之间阻塞);运用轻量级进程可以保证 共享部分数据 和 运行 兼顾。

1)进程描述符 中thread_info,

未命名6
运用联合结构表示了一个进程的线程描述符和内核栈:
union thread_union{
struct thread_info thread_info;
unsigned long stack[2048]; /*对4k的栈数组下表是1024 ,long是4byte */
}
thread_info 从低地址向高处增长,堆栈stack从高地址往低地址增长,esp指向当前栈顶。
2)双向链表结构
list_head数据结构是双向链表结构,next,prev指针。
遍历进程链表的宏:
#define for_each_process(p)/
for(p=&init_task;(p=list_entry(p)->tasks.next,struct task_struct,tasks)!=&init_task;)
3)pidhash表及链表
散列表强调的是空间而不是在固定的时间内找到表中的最后一个元素。(当然hash能够很快找到对应的元素)
#define pid_hashfn(x) hash_long((unsigned long) x,pidhash_shift);
这里的pidhash_shift 值一般取11。
unsigned long hash_long(unsigned long val, unsigned int bits)
{
unsigned long hash=val *0x9e370001UL;
return hash>>(32-bits);
}
0x9e370001=2 654 404 609=2^31+2^29-2^25+2^22-2^19-2^16+1.
是接近黄金比例的2^32的一个素数。(也称为 “魔数常量”)
未命名6
二、进程间的关系
real_parent,指向创建了P进程的描述符,若不存在,则指向init(1)进程
parent ,指向P的当期父进程(与real_parent 不同发生在,监控P时ptrace()系统调用)
children
sibling, 指向兄弟进程,(注意的是sibling.prev或sibling.next 可能指向parent)

三、进程生命周期
1)创建进程,有三种方式可以创建:
(1)写时复制技术允许父子进程读相同的物理页。只要两者之一试图写一个物理页,内核就将
把这个页的内容拷贝到一个新的物理页,并把新的物理页分配给正在写的进程
(2)轻量级级进程:允许父子进程共享每进程(per-process)在内核的很多数据结构。
(3)vfork(),阻塞父进程的执行,直到子进程退出或执行一个新的其他程序。
注意的三个系统调用:clone()、fork()、vfork()
2)撤销进程(由自己撤销)
exit_group();线程组
exit();
3)进程删除(由父进程删除)
父进程wait()哪些僵死进程,如果wait()成功则删除子进程。如果父进程先结束,则会有很多僵死进程,这些孤儿进程会将父进程指向init(),init()负责wait()操作。

进程切换:1)切换页全局目录以安装一个新的地址空间;
2)切换内核态堆栈 和 硬件上下文,因为硬件上下文 提供了内核执行新进程所需要的所有信
息。这一步由 switch_to 宏执行。

四、其它

TSS(Task State Segment)
TSSD(Task State Segment Descriptor)


FPU、MMX和XMM寄存器的加载使用需要另外程序操作
union i387_unio{
struct i387_fsave_struct fsave;
struct i387_fxsave_struct fxsave;
struct i387_soft_struct soft;
};

内核线程 只运行在内核态,只使用大于PAGE_OFFSET(3G)的线性地址空间。其他普通进程在用户态或内核态都可以访问4G的线性地址空间。

进程0 (idle进程 或 swapper进程),是Linux在初始化阶段从无到有创建的一个内核线程。(祖先)
进程1 (init进程,在整个系统运行中一直存活),内核初始化后由内核线程 变为 普通进程,拥有
per-process内核数据结构,创建和监控在操作系统外层执行的所有进程的活动。

分享到:
评论

相关推荐

    Linux内核分析(《joyfire linux笔记》)

    Linux内核分析是一项深入理解操作系统核心机制的关键任务,尤其是在《joyfire Linux笔记》这样的资源中,我们可以获取到丰富的信息。这篇笔记涵盖了Linux内核的多个关键领域,包括启动流程、中断处理、内存管理、...

    linux内核解析笔记

    在深入探讨Linux内核之前,我们首先要理解什么是内核。操作系统内核是系统的核心部分,负责管理系统的硬件资源,提供基础服务,以及调度进程,确保计算机系统的稳定运行。Linux内核是开源的,由全世界的开发者共同...

    linux内核分析及编程(倪继利)(5-7章)

    《Linux内核分析及编程》是由倪继利编著的一本深入探讨Linux内核的书籍,主要涵盖了第5至7章的内容。这三章通常会涉及Linux内核的基础架构、进程管理和内存管理等核心主题。以下是对这些章节的详细解析: 第5章:...

    linux内核设计与实现第二版 学习笔记

    通过阅读《Linux内核设计与实现》第二版的学习笔记,可以深入了解这些核心概念,并掌握如何分析和调试内核,这对于系统管理员、软件开发者或者对操作系统感兴趣的任何人都极其有价值。这份笔记详尽地介绍了Linux内核...

    linux学习笔记分享

    - **/opt**:第三方或非标准软件的安装位置。 - **/proc**:虚拟目录,反映了系统的运行状态,如内核版本(/proc/version)和系统信息(/proc/sys/kernel)。 - **/root**:系统管理员(root用户)的主目录。 - ...

    joyfire的linux内核笔记

    Linux内核启动过程是操作系统核心运行的起点,涉及到一系列复杂而...了解这些启动步骤和初始化过程对于深入理解Linux内核的工作原理至关重要,有助于开发者调试和优化内核,以及解决与系统启动和资源管理相关的问题。

    Linux内核4.17.10版本.

    Linux内核4.17.10版本是Linux操作系统的核心组成部分,它负责管理系统的硬件资源、进程调度、内存管理、设备驱动以及网络协议等关键功能。这个版本的发布旨在提供性能优化、错误修复以及对新硬件的支持。对于系统...

    linux笔记整理 免费下载

    - `/opt`:可选软件包和第三方工具的安装位置。 - `/root`:超级用户(root)的主目录。 - `/run`:存放系统运行时需要的文件。 - `/sbin`:超级用户使用的系统管理命令。 - `/srv`:服务数据目录。 - `/tmp`:临时...

    Linux学习笔记.pdf,linux详解,LINUX

    本资料“Linux学习笔记.pdf”将带你深入理解Linux的基础知识和高级应用。 一、Linux系统概述 1. Linux的起源:Linux的诞生源于托瓦兹对Minix系统的不满,他决定创建一个符合个人需求的、免费的Unix-like操作系统...

    linux-3.0.86-20150324.tgz

    Linux内核是操作系统的核心部分,负责管理系统的进程、硬件设备、内存、文件系统等关键功能。3.0.86版本是在2015年3月24日发布的,是Linux发展历史上的一个重要里程碑。这个版本包含了从早期版本到3.0.86期间的各种...

    Linux内核相关资料和设计与实现

    "Linux内核相关资料和设计与实现"这一主题涵盖了对Linux内核的深入理解和学习,特别是通过提供的书籍和资料。 首先,"Linux内核设计与实现_第三版_中文版"是一本经典的教材,它详细阐述了Linux内核的架构和工作原理...

    Linux学习笔记--RuanJava

    17. **/opt**:用于存放非标准的或第三方的应用程序。 18. **/proc**:虚拟目录,提供对内核状态的访问,如`/proc/cpuinfo`和`/proc/meminfo`。 19. **/root**:系统管理员(root用户)的主目录。 20. **/var**:...

    步入Linux的现代方法-Markdown格式的笔记

    Linux是一种开源的操作系统,它的内核由林纳斯·托瓦兹开发,并在全球范围内由众多开发者贡献和维护。Linux有多种发行版,如Ubuntu、CentOS、Fedora和Kali等,每个发行版都有其特定的应用场景和特点。Ubuntu适合桌面...

    若干源程序资料12.rar

    2012-06-11 21:44 6,947,979 Linux内核完全注释V3.0书签版(带源码).rar 2012-06-11 21:31 11,599 MATLAB仿真程序OFDM程序.txt 2012-06-11 21:37 14,584,477 msdn for vb6.0简体中文版.zip 2012-06-11 21:02 12,288 ...

    嵌入式linux学习笔记

    对于初学者,理解Linux内核模块的概念也很重要,这些模块可以动态加载或卸载,以增加系统的灵活性。 再者,文件系统在Linux中扮演着至关重要的角色,它管理着如何存储、组织和检索文件。在嵌入式系统中,常见的文件...

    linux学习笔记

    这篇学习笔记主要涵盖了Linux的基本概念、系统目录结构、分区、常用指令以及网络设置的基础知识。 在Linux的目录结构中,每个目录都有特定的功能: 1. `/home`:存放用户个人文件的目录。 2. `/boot`:存放系统引导...

    linux-2.6.24_谢宝友注释版.7z

    1. **内核版本号的意义**:在Linux内核版本号中,主版本号代表主要架构改变,次版本号代表功能增删,第三位数字则是bug修复和小改进。因此,2.6.24表明这是一个稳定版本,主要是对2.6系列的进一步优化和调整。 2. *...

    linux-kernel-boot-thread.zip_kernel thread

    这篇学习笔记深入探讨了这个主题,旨在帮助读者理解Linux内核启动线程的工作原理、创建方法以及其在系统中的作用。 首先,内核启动线程是内核自身启动的第一个线程,它的主要职责是初始化系统资源,如内存管理、...

    嵌入式Linux入门笔记

    5. 模块编程实验:讲解了如何编写和加载Linux内核模块,理解内核与用户空间的交互,这是进行内核定制和驱动开发的基础。 6. 简单的字符设备驱动实验:介绍如何为简单的硬件设备编写驱动程序,这是理解驱动开发的第...

Global site tag (gtag.js) - Google Analytics