进程01

进程是程序执行时的一个实例。你可以把他看做充分描述程序已经执行到何种程度的数据结构的汇集。

完全没有用户空间,内核线程

共享用户空间,用户线程

一个进程必定同时又是一个内核线程

task_struct通过pidhash_next与pidhash_pprev两个指针连入到杂凑表的某个队列中

线性队列的第一个建立的进程为init_task,这个进程是所有进程的总根,这个线性队列就是以init_task为起点,每个进程都是通过其task_struct结构中的next_task和prev_task两个指针链入这个线性队列中

task_struct中进程状态:

可运行状态 TASK_RUNNING(就绪态)

可中断等待状态TASK_INTERRUPTIBLE(睡眠,进程被挂起)

不可中断的等待状态TASK_UNINTERRUPTIBLE()

暂停状态TASK_STOPPED(进程的执行被暂停)

跟踪状态TASK_TRACED(进程的执行由debugger程序暂停)

僵死状态EXIT_ZOMBIE(进程的执行被终止,父进程还没有通过系统调用来返回有关死亡进程的信息)

僵死撤销状态EXIT_DEAD(最终状态)

内核使用alloc_thread_info和free_thread_info宏分配和释放存储thread_info结构和内核栈的内存区

current->pid返回在cpu上正在执行的进程的pid

用list_head数据结构构造一个双向列表

处理函数和宏:

list_add(n,p)把n指向的元素插入p所指向的特定元素之后

list_add_tail(n,p)把n指向的元素插入p所指向的特定元素之前

list_del(p)删除p所指定的元素

list_empty(p)检测由第一个元素的地址p指定的链表是否为空

list_entry(p,t,m)返回类型为t的数据结构的地址,其中类型t中含有list_head字段,而list_head字段中含有名字m和地址p

list_for_each(p,h)对表头地址h指定的链表进行扫描,在每次循环时,通过p返回指向链表元素的list_head结构的指针

list_for_each_entry(p,h,m)与list_for_each类似,但是返回包含list_head结构的数据结构的地址,而不是list_head结构本身的地址

进程列表把所有进程的描述符链接起来,每个task_struct结构都包含一个list_head类型的tasks字段,prev与next分别指向前一个和后一个task_struct元素

进程链表头是init_task描述符,它是所谓的0进程或swapper进程的进程描述符,init_task的tasks.prev字段指向链表的最后插入的进程描述符的tasks字段

for_each_process(p), 扫描整个进程链表,从init_task开始

在多处理器系统中,每个cpu都有它自己的运行队列(TASK_RUNNING状态的进程链表)

real_parent 指向创建了P的进程的描述符(如果父进程不存在了,就指向init进程的描述符->用户运行后台程序后关闭shell,此程序就指向init_task)

parent指向P的当前父进程,通常与real_parent一致

children链表的头部,链表的所有元素都是P创建的子进程

sibling指向兄弟进程链表中的下一个元素或者前一个元素的指针,这些兄弟进程的父进程都是P

P0创建了P1,P2,P3,进程P3又创建了P4

fork()+execve()

系统调用fork(),vfork(),clone()的实现都是通过do_fork()来完成的不同的只是对do_fork()的调用参数。

在task_struct结构中有一个user指针,用来指向一个user_struct结构。一个用户有多个进程

内核线程并不属于某个用户,所以其task_struct中的user指针为0

内核初始化期间动态地为4个散列表分配空间,并把他们的地址存入pid_hash数组

一个散列表的长度依赖于可用RAM的容量

列如,一个512MB的RAM,每个散列表就被存放在4个页框中,可以拥有2048个表项

pid_hashfn宏把PID转化为表索引,散列函数(hash)并不总能确保PID与表的索引一一对应。两个不同的PID散列到相同的表的索引称为冲突

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 14:31:33

进程01的相关文章

统计学习方法进程01

学习统计学习方法也已经有几天了,在这几天的时间里,我主要对分类学习方法进行了初步学习,包括:感知机-->支持向量机,K近邻法,朴素贝叶斯法,决策树,logistic 回归与最大熵模型. 其中k近邻法的实现为kd树,朴素贝叶斯通过极大似然估计实现,决策树包含有生成决策树算法ID3,C4.5,决策树的剪枝算法CART. logistic回归,核心为参数估计,一般用极大似然估计把问题变成优化问题.最优化问题的解决通常采用梯度下降法,拟牛顿法.概率学习问题中还涉及到最大熵模型(存在一定遗忘) 支持向量机

nginx的源码编译及相关文件配置

Nginx 安装 Ngninx与apache的比较 1.轻量级,同样起web服务,比apache占用更少的内存及资源 2.抗并发,nginx处理请求是异步非阻塞的,而apache是同步阻塞型的,在高并发下nginx能保持低资源低消耗高性能,apache是同步多进程模型,一个连接对应一个进程:nginx是异步,多个连接可以对应一个进程 3.高度模块化的设计,编写模块相对简单 4.nginx处理静态文件好,耗费内存少,一般动态请求要apache去做,nginx适合做静态和反向 nginx服务器: s

我喜欢减肥我们来减肥吧

http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313278016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313282016/2015.01.28.html http://www.ebay.com/cln/honus.jyw4mvptb/cars/158313289016/2015.01.28.html http://www.ebay.com/cln/usli

百度回家看沙发沙发是减肥了卡斯加积分卡拉是减肥

http://www.ebay.com/cln/hpryu-caw8ke/cars/158056866019/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445650015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/158445674015/2015.01.31 http://www.ebay.com/cln/xub.50x2l7cj/cars/1584456790

巢哑偕倥乇椭煞谙暗逞帕俸

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

我国第三代移动通信研究开发进展-尤肖虎200106

众所周知,数据科学是这几年才火起来的概念,而应运而生的数据科学家(data scientist)明显缺乏清晰的录取标准和工作内容.此次课程以<星际争霸II>回放文件分析为例,集中在IBM Cloud相关数据分析服务的应用.面对星际游戏爱好者希望提升技能的要求,我们使用IBM Data Science Experience中的jJupyter Notebooks来实现数据的可视化以及对数据进行深度分析,并最终存储到IBM Cloudant中.这是个介绍+动手实践的教程,参会者不仅将和讲师一起在线

pl/sql学习1——标量变量psahnh6S

为类型.不能用于表列的数据类型.范围为的子类型.自然数.为的子类型.具有约束为单精度浮点数.为变量赋值时.后面要加为双精度浮点数.为变量赋值时.后面要加.为数字总位数.为小数位数是的子类型.最大精度位是的子类型.最大精度位单精度浮点型是的子类型.最大精度位双精度浮点型定义精度为位的实数..定义为位的整数.变长字符串.最长测试变量数据!.定长字符串.最长测试变长二进制字符串物理存储的为类型...固定长度.个字节使用定义数据类型那个最小值:最大值:最小值:最大值:最小值:最大值:最小值:最大值:最小

第一次作业:基于Linux0.01深入源码分析进程模型

一.前言 本文主要基于Linux0.01源代码分析进程模型.Linux 0.01虽然是Linux的第一个发行版本,但是却基本具备了操作系统中最重要的组成部分,同时Linux 0.01只有8500行左右的代码,对于初学者而言学习起来比较简单一点. Linux 0.01源代码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/ 二.进程的定义 进程是程序执行的基本单位.(其中,进程和程序的区别:程序指的是由若干函数组成的可执

01进程

alt+shift+f10 调出 添加 Process的引用 Process不是静态类,但有静态成员 Process[] pro = Process.GetProcesses(); 获取所有进程(数组) 使用进程打开文件 Process.Start("notepad"); Process.Start("mspaint"); Process.Start("iexplore", "http://baidu.com"); Proce