今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的。下面对其作一下简单的总结。


一、Linux进程在内存中的相关资源
   很容易理解,Linux进程的创建过程就是内存中进程相关资源产生的过程,那么Linux进程在内存中有哪些相关资源呢?
   1)task数组中的一项:一个指针指向进程的task_struct
   2)一页内存:task_struct(Linux进程控制块)和内核态堆栈
   3)页表:线型地址到物理地址的映射表
   4)页目录表项:指向页表
   5)全局描述表(GDT)中的两项:一项指向任务状态段(tss,在task_struct中),一项指向该进程的局部描述符表(ldt,在task_struct中)

   6)代码段、堆、栈、参数全局变量等数据区

二、进程控制块-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()中,内核并不立刻为新进程分配代码和数据物理内存页,新进程与父进程共同使用父进程已有的代码和数据物理内存页面。只有当以后执行过程中由一个进程一写方式访问内存时候被访问的内存页面才会在写操作之前被
复制到新申请的内存页面中。
    另外在fork的最后是将任务设置成了就绪状态,由于fork()是一个系统调用,在系统调用部分system_call.s,可以看到在系统函数返回后,会调用调度函数schedule(),在schedule()中,就会检测到新进程的就绪状态,并用switch_to()切换到新进程进行执行。

Linux进程-进程的创建相关推荐

  1. linux创建进程读共享写复制,Linux下进程的创建、执行和终止

    1)进程的创建和执行 许多操作系统提供的都是产生进程的机制,也就是说,首先在新的地址空间里创建进程.读入可执行文件,后再开始执行.Linux中进程的创建很特别,它把上述步骤分解到两个单独的函数中去执行 ...

  2. 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )

    文章目录 一.Linux 中进程的 CPU 资源调度 二.进程生命周期 三.进程生命周期之间的转换 一.Linux 中进程的 CPU 资源调度 Linux 操作系统 是 多任务系统 , 可以 同时运行 ...

  3. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

  4. 总结-linux初识进程(包括cpu调度、进程创建、僵尸进程(重点)、环境变量)

    冯诺依曼体系结构--现代计算机的硬件体系结构 输入设备.输出设备(数据输出).存储器(数据缓冲).运算器(数据运算).控制器. 所有设备都是围绕存储器工作---CPU是从存储器中获取数据处理---控制 ...

  5. linux下进程的创建代码,伪代码说明Linux进程创建过程

    http://blog.csdn.net/hongmy525/archive/2007/11/11/1879026.aspx 以前单知道linux创建进程用的fork函数,深一点点知道是调用sys_f ...

  6. linux守护进程写法_搞懂进程组、会话、控制终端关系,才能明白守护进程如何创建...

    守护进程 概念: 守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程.周期性的执行某种任务或等待处理某些发生的事件. Linux系统有很多守护进程,大多数服务都是用守护进程实现的 ...

  7. linux内核-进程三部曲:创建、执行与消亡

    就像世上万物都有产生.发展与消亡的过程一样,每个进程也有被创建.执行某段程序以后最后消亡的过程.在linux系统中,第一个进程时系统固有的.与生俱来的或者说是由内核的设计者安排好了的.内核在引导并完成 ...

  8. 【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)

    文章目录 一.进程创建 1.1 系统调用 fork 1.2 理解 fork 的返回值 1.3 写时拷贝策略 二.进程终止 2.1 main 函数的返回值 2.2 进程退出的几种情况 2.3 进程退出码 ...

  9. 【Linux】进程控制1-进程创建、进程终止

    文章目录 进程创建 fork函数 用户空间.内核空间 写实拷贝 fork创建子进程时的一些特性 守护进程 进程终止 正常终止 异常终止 exit和_exit的区别 缓冲方式 进程创建 fork函数 调 ...

  10. 【Linux】进程控制(创建、终止、等待)

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:[Linux]欢迎支持订阅 相关文章推荐: [Linux]冯.诺依曼体系结构与操作系统 [Linux]进程理解与学习Ⅰ-进程概念 [ ...

最新文章

  1. Can't add more than 2 views to a ViewSwitcher
  2. 湘潭计算机职业技术学校专业介绍,湘潭计算机职业技术学校介绍
  3. Fiddler过滤指定域名
  4. php 5.5.38 ldap安装,centos5.5系统下面,lnmp环境下面php加载ldap扩展
  5. php下xmlwriter,PHP实现基于XMLWriter操作xml的方法
  6. CUDA、MPI和SU混编,MakeFile文件的编写
  7. Flutter进阶—路由和导航
  8. html实现点赞效果,js实现点赞效果
  9. python运维脚本部署jdk_Jenkins 为Jenkins添加Windows Slave远程执行python项目脚本
  10. linux php 源码安装,Linux下PHP的源码安装与配置
  11. 听说这家云计算公司要搞事情
  12. Mac下PyCharm快捷键大全
  13. win7/win10 密码忘了?没关系,利用5次shift,9步轻松破解密码
  14. java技术分享些什么,大牛最佳总结
  15. CWE ID 259:Use of Hard-coded Password
  16. 远程连接GitHub仓库
  17. 请画出使用mapreduce对英文句子_微信英文培训:50句出国旅行英语
  18. WIFISON使用及适配
  19. Unity Android 加载Sprite
  20. 区块链前景分析和学习建议

热门文章

  1. 我是架构师--设计模式-单例模式
  2. Android studio 自定义打包apk名
  3. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
  4. select 忽略查询字段值大小写【小技巧】
  5. 用R语言 画条形图(基于ggplot2包)
  6. Mysql memory表引擎
  7. 多线程(十、AQS原理-ReentrantLock公平锁)
  8. 让IE8和IE9支持 placeholder
  9. Centos 6 常用服务部署命令说明
  10. iphone6 iphone6 plus 放大显示模式高分辨率模式问题