Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的。下面对其作一下简单的总结。
一、Linux进程在内存中的相关资源
很容易理解,Linux进程的创建过程就是内存中进程相关资源产生的过程,那么Linux进程在内存中有哪些相关资源呢?
1)task数组中的一项:一个指针指向进程的task_struct
2)一页内存:task_struct(Linux进程控制块)和内核态堆栈
3)页表:线型地址到物理地址的映射表
4)页目录表项:指向页表
5)全局描述表(GDT)中的两项:一项指向任务状态段(tss,在task_struct中),一项指向该进程的局部描述符表(ldt,在task_struct中)
二、进程控制块-task_struct
上面提到的这几类资源中,很多都与task_struct有关,所以我想说一下task_struct。它是Linux的进程控制块,驻留在内存中,描述进程的基本信息,所以它是进程操作依据的数据结构,在进程中占有重要地位。下面列出在0.11版本中主要几类信息,对它应该就有了基本的了解。
1)标识号:进程标识、用户标识、组标识。
2) 信号
3)状态: Linux的进程的四种基本状态
4)调度信息:优先级、时间片、运行时间等
5)进程链信息:父进程、子进程的指针
6)文件信息:打开文件、当前目录
7)局部描述符表(LDT):代码段、数据段、堆栈段的描述符
8)任务状态段(tss):cpu相关寄存器的内容
三、任务状态段-tss
在上述的task_struct中有一个结构:任务状态段(tss)。我们知道,计算机运行一个程序的时候的直接依据就是CPU的各个寄存器,TSS就是描述进程运行时候CPU的状态信息,当CPU进行进程切换的时候,会自动将这些信息更新到到乡音寄存器中,主要有下列信息:
1)通用寄存器:eax,ecx,edx,ebx,esp,ebp,esi,edi
2)段选择符字段:es,cs,ss,ds,fs和cs段寄存器的内容
3)指令指针:EIP
4)前一个任务的指针
5)局部描述符表选择符:LDTR寄存器的内容
6)页目录表基地址:CR3中的内容
7)堆栈指针
8)其它
四、进程创建过程简述
Linux中一般进程都是由现有的一个进程创建的,也就是我们所说的父进程,子进程。具体的创建是通过fork()实现的。下面就让我们一起了解一下0.11核心中fork()的大体工作过程:
1)在内存中申请一页内存存放进程控制块task_struct,并返回进程号nr,并在task数组的nr处存放task_struct的指针,还要将task的当前指针current指到nr处;
2)将父进程的task_struct的内容复制到新进程的task_struct中作为模版
3)对task_struct中的信息进行修改,主要进行一下工作:设置父进程、清除信号位图、时间片、运行时间、根据当前环境设置tss(内核态指针esp0指向task_struct所在页的顶端)、设置LDT的选择子等(根据nr指向GDT中相应的ldt描述符)。
4)设置新进程的代码段、数据段的基地址和段长:更新task_struct中的代码开始地址:进程号(nr)×64M,更新task_struct中局部描述符表中的代码段和数据段描述符。
5)复制父进程的页表目录项和页表:在页目录表中,复制父进程的页表目录项,目的地址由新进程的线性地址计算出来;对每个对应的页表目录项申请一个空闲页,并用页表地址更新页表目录项,最后将父进程页表中各项复制到新进程对
6)更新task_struct中的文件信息:文件打开次数加1,父进程的当前目录引用数加1。
7)设置TSS和LDT描述符项:在全局描述符表(GDT)中设置新任务的TSS描述符项和LDT段的描述符项,使TSS描述符项和LDT描述符项分别指向task_struct的TSS结构和LDT结构。
8)将任务设置为就绪状态,向当前进程(父进程)返回新进程号。
五、结束语
可以看出,fork()中,内核并不立刻为新进程分配代码和数据物理内存页,新进程与父进程共同使用父进程已有的代码和数据物理内存页面。只有当以后执行过程中由一个进程一写方式访问内存时候被访问的内存页面才会在写操作之前被
Linux进程-进程的创建的更多相关文章
- Linux下进程的创建
这篇文章主要是讲解到Linux进程的控制,包括程序和进程.守护进程.守护进程的出错处理. 1.程序和进程 程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process ...
- Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量 ...
- linux 新进程的创建
慕课18原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.背景知识: 1. ...
- 《linux下进程的创建,执行,监控和终止》
<linux下进程的创建,执行,监控和终止> http://blog.csdn.net/miss_acha/article/details/43671047 http://blog.csd ...
- 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程
本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...
- Linux下进程的创建(system(); fork(); exec*())
0. system(); system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(): 特点:原进程和子进程各自运行,且原进程需要等子进程运行完后 ...
- 关于linux的一点好奇心(五):进程线程的创建
一直以来,进程和线程的区别,这种问题一般会被面试官拿来考考面试者,可见这事就不太简单.简单说一点差异是,进程拥有独立的内存资源信息,而线程则共享父进程的资源信息.也就是说线程不拥有内存资源,所以对系统 ...
- [转载]了解Linux的进程与线程
本文转自Tim Yang的博客http://timyang.net/linux/linux-process/ .对于理解Linux的进程与线程非常有帮助.支持原创.尊重原创,分享知识! 上周碰到部署在 ...
- Linux任务调度进程crontab的使用方法和注意事项
参考文章:Linux任务调度进程crond命令的使用方法和注意事项 一.crond简介 概念 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系 ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
随机推荐
- JS基础(二)
一.JS中的循环结构 循环结构的执行步骤 1.声明循环变量: 2.判断循环条件: 3.执行循环体操作: 4.更新循环变量 然后,循环执行2-4,直到条件不成立时,跳出循环. while循环()中的表达 ...
- ResizeObserver - 元素resize监听API
Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addE ...
- Java第1次实验提纲(基本概念与引入PTA+Git)
0. 控制台下编译.运行 在Notepad++编写Java程序 学会使用控制台,javac.java 学会使用Notepad++ 参考资料: 控制台-cmd应用基础 扫盲教程 使用命令行编译并运行ja ...
- 拟将博客迁移到github
其实博客园网站速度挺快的, 但是markdown的显示没有github美观. 尤其是代码高亮这一块. 近日发现github pages + vue + github api + stackedit 能 ...
- 简单将sublime text 配置为lua或c#一键编译运行环境
lua { "cmd": "luajit $file", "selector":"source.lua" } C { & ...
- Bootstrap3 栅格系统-实例:响应列重置(Responsive column resets)
四层的网格你肯定会遇到问题,可用在特定的断点,你的列不清楚作为一个比另一个高完全正确.为了解决这个问题,结合使用.clearfix和响应的实用工具类. <div class="row& ...
- leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...
- Android开发技巧——大图裁剪
本篇内容是接上篇<Android开发技巧--定制仿微信图片裁剪控件> 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪. 裁剪控件的简单使 ...
- OpenResty修改Nginx默认autoindex页面
Nginx的autoindex 命令可以自动列出目录下的文件,一些网站用这个功能做文件下载,但是Nginx又没有提供这个页面的 自定义的功能,后来看到别人提及 ngx_openresty,才想到 bo ...
- iOS开发之使用block块进行数据遍历的方法
看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...