linux使用上百个双向链表来存储内核的各种数据结构, 其中包括进程描述符的task_struct结构.
cpp 代码
- struct list_head {
- struct list_head *next, *prev;
- };
在list.h中,形如__xxx的函数用来操作整个链表,而不是单个链表元素.
进程从pid得到进程描述符pd要一种高效的方法, 提到高效方法,那就用哈希表啦. 内核在这儿的哈希方法为一道宏, 表中有
PIDHASH_SZ个元素(一般情况下PIDHASH_SZ=1024):
cpp 代码
- #define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
哈希表解决冲突的方法以是采取双向链表. 这是数据结构中一种比较常见的手段. 因为数字比较大的pid很少用到, 这样的pid一般放在链表尾端。 而数字较小的pid经常用到, 而它们如果冲突也排在链表很前的位置, 所以采取这样的数据结构速度很快.
内核提供了hash_pid()来加入一个元素到表中,
unhash_pid()从表中删除一元素.
这个哈希表的主要目的是通过pid找到进程描述符, find_task_by_pid()提供了这项功能.
cpp 代码
- static inline void hash_pid(struct task_struct *p)
- {
- struct task_struct **htable = &pidhash[pid_hashfn(p->pid)];
-
- if((p->pidhash_next = *htable) != NULL)
- (*htable)->pidhash_pprev = &p->pidhash_next;
- *htable = p;
- p->pidhash_pprev = htable;
- }
-
- static inline void unhash_pid(struct task_struct *p)
- {
- if(p->pidhash_next)
- p->pidhash_next->pidhash_pprev = p->pidhash_pprev;
- *p->pidhash_pprev = p->pidhash_next;
- }
-
- static inline struct task_struct *find_task_by_pid(int pid)
- {
- struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];
-
- for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
- ;
-
- return p;
- }
分享到:
相关推荐
在本资料包中,您将找到关于Linux内核的各种版本的源码,这些源码是学习和研究的理想资源。 首先,Linux内核的版本迭代反映了其功能的扩展和技术的进步。每个新版本通常会包含错误修复、性能提升、新硬件支持以及...
通过深入学习Android 3.0内核源码,开发者可以理解系统如何与硬件交互、如何调度资源、如何处理系统调用,以及如何优化性能和安全性。这对于系统级开发、驱动编写以及性能调优等工作具有极大的价值。 然而,由于...
"易语言源码创建新进程.rar"这个压缩包文件包含的源码,显然与在易语言环境下如何创建新的操作系统进程有关。在计算机科学中,进程是程序在执行时的一个实例,具有独立的内存空间和执行上下文。 创建新进程是系统...
通过深入研究Linux kernel 0.12源码,开发者不仅可以学习到操作系统的基本架构,还能了解到Linux的演化历程和设计原则。这些知识对理解现代Linux内核乃至其他操作系统的设计都有着深远的影响。同时,这也是一种对...
1. **微内核架构**:T-Kernel采用微内核设计,将操作系统的基础服务如内存管理、进程通信等集中在内核最小化的核心中,提高了系统的稳定性和安全性。 2. **模块化设计**:T-Kernel允许开发者根据需求选择加载必要的...
`public`目录下的源码包含了Windows内核中可以公开访问的部分,这些代码通常涉及到系统服务、设备驱动程序接口、内存管理、进程和线程管理等核心功能。例如,文件`ntoskrnl.exe`包含了内核的主要入口点和许多基础...
进程句柄 = API("kernel32.dll", "OpenProcess", .访问权限, .假, 进程ID) ``` 断开网络连接通常涉及修改套接字选项,这需要找到进程内的网络相关句柄,如套接字。这一步比较复杂,可能需要使用调试工具或系统底层...
在实际使用中,WKE的源代码是开放的,即Windows-Kernel-Explorer-master文件,用户可以根据需求进行定制和扩展,这对于学习Windows内核编程和开发自定义工具的人来说是一个宝贵的学习资源。 总的来说,Windows-...
总的来说,"Kernel-Master: TOTORO的内核"是一个深度学习和参与Linux内核开发的好起点,涵盖了大量的计算机系统知识,包括操作系统原理、硬件交互、网络编程以及安全实践。通过这个项目,开发者可以深入理解操作系统...
具体源码需要查看操作系统的内核代码,如Linux kernel的源码。 了解这些基本概念后,开发者可以更好地控制和管理进程,优化系统资源的使用,提高系统的整体性能。同时,这也是操作系统课程和系统编程学习的重要内容...
本文将围绕“Linux Kernel学习资料”这个主题,详细介绍Linux内核的一些核心概念和关键组成部分。 1. **内核架构** Linux内核采用微内核设计,主要由以下几个部分组成: - **进程管理**:包括进程创建、销毁、...
这些API函数来自`kernel32.dll`库,通过它们可以获取系统进程快照,并遍历所有进程信息。在易语言中,你需要声明这些API函数,然后按照指定的顺序和参数调用,以获取进程ID、进程名等信息。 2. **使用WMI(Windows ...
总的来说,易语言源码“凌晨孤星——取进程映像路径及命令行参数”为我们展示了易语言在系统级操作上的应用,通过学习这段代码,不仅可以掌握易语言的基本语法和API调用,还能了解到进程管理和参数传递的基础知识。...
例如,如果要获取系统中所有进程的信息,可以调用“系统调用”并指定“EnumProcesses”函数,该函数来自kernel32.dll库,返回当前系统中的进程ID列表。然后,可以进一步通过“OpenProcess”函数打开指定ID的进程,再...
易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语句,降低了编程的...这个压缩包中的源码是学习易语言和系统进程管理的一个实践案例,通过阅读和理解代码,可以加深对易语言编程和系统底层知识的理解。
1. **子程序_PEB获取Kernel32基址**:PEB(Process Environment Block)是Windows系统中每个进程的核心数据结构,包含了进程的各种信息,包括模块列表。通过PEB,可以获取到Kernel32.dll模块的基地址,这是Windows ...
在Linux源码分析方面,我们可以深入到kernel/proc目录下的源码,研究如何实现进程的创建、调度和管理。例如,进程描述符(task_struct)结构体包含了进程的所有信息,而在do_fork()函数中可以看到完整的进程复制流程...
内核源码是操作系统的核心部分,它负责管理硬件资源、进程调度、内存管理等关键任务。在Linux系统中,内核源码通常是开放的,允许开发者进行定制和优化。 描述中提到的“Neo5-内核源”进一步确认了我们要研究的是...
通过对 LiteOS A 内核源码的分析,我们可以学习到如何设计和实现一个高效的轻量级内核,这对于嵌入式开发人员和物联网解决方案的开发者来说具有很高的价值。理解并掌握这些核心组件的工作原理,能够帮助我们在实际...
在VB(Visual Basic)编程环境中,显示进程源码涉及到对操作系统内部进程的了解以及如何通过编程接口(如Windows API)来获取和展示这些信息。在这个主题中,我们将深入探讨以下几个关键知识点: 1. **进程**:在...