`
kongweile
  • 浏览: 507059 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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中)
   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进程-zhangwl.rar_linux_linux 进程_linux进程_源码分析_进程 linux

    Linux 源码分析系列之进程 进程的生成,进程的使用,进程的创建

    linux实验四 进程控制实验

    3、学习进程创建方法及进程树的概念。 二、实验内容 1、进程的创建 编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a...

    linux进程创建.doc

    linux进程创建.doc

    Linux下C语言编程--进程的创建

    Linux下C语言编程--进程的创建

    Linux进程控制编程-fork子进程创建实例.pdf

    Linux进程控制编程-fork子进程创建实例.pdf 学习资料 复习资料 教学资源

    Linux创建进程

    Linux创建进程.方法详解,并附有代码实现。

    Linux 僵尸进程产生原因及解决方法

    例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,它的终止代号将告诉父进程这个任务是否已成功地完成。 为了遵循这些设计原则...

    linux-process-management.zip_linux进程管理

    Linux 进程管理剖析。在本文中,了解 Linux 进程的生命周期,探索用户进程创建、内存管理、调度和销毁的内核内幕。

    Linux 进程控制与进程互斥(附源代码)(附实验报告)

    1、利用fork函数创建新进程,并根据fork函数的返回值,判断自己是处于父进程还是子进程中; 2、在新创建的子进程中,使用exec类的函数启动另一程序的执行;...5、分析Linux系统下多进程与多线程中的区别。

    进程的创建控制实验

    目的:创建进程,体会进程间的并发特征 内容:编写一段程序,使用系统调用fork()创建两个子进程p1和p2。而且父进程输出字符串“father”,第一个子进程输出字符串“borther1”,第二个子进程输出字符串“borther2” ...

    20. Linux开发-Linux下进程编程.pdf

    主要是介绍Linux下进程相关知识点,命令行控制进程的相关命令,介绍创建进程、管理进程相关函数。

    linux实验报告\操作系统进程创建父子进程实验报告.docx

    dLinux进程创建与进程通信,实现父进程创建一个子进程,返回后父子进程分别循环输出字符串“The parent process.”及“The child process.”5次,每次输出后使用sleep(10)延时10秒,然后再进入下一次循环。...

    Linux系统下C语言编程--进程的创建

    Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命 令.那么操作系统是怎么实现多用户的环境呢?在现代的操作系统里面,都有程序和进程的...本文为大家介绍Linux系统下C语言编程--进程的创建。

    Linux编程--Linux内核

    3.1 Linux进程 29 3.2 标识符 31 3.3 调度 32 3.4 文件 34 3.5 虚拟内存 35 3.6 创建进程 36 3.7 时间和定时器 37 3.8 执行程序 38 3.8.1 ELF 39 3.8.2 脚本文件 40 第4章 进程间通信机制 41 4.1 信号机制 41 4.2 ...

    分析Linux内核创建一个新进程的过程

    本文主要介绍Linux内核创建一个新进程的过程,需要的朋友可以参考下。

    Linux中进程创建和内存空间申请

    Linux中进程创建和内存空间申请: 除进程0外,所有进程都是由一个已有进程在用户态下完成创建的。 进程0创建进程1前,要将进程0由内核态转变为用户态,方法是调用move_to_user_mode函数 硬件对5个push压栈的数据分别...

    Linux进程创建及多进程并发

    上机实验,在Linux环境下进行进程创建和实现多进程并发

    操作系统实验报告-Linux进程创建与通信.doc

    操作系统实验报告-Linux进程创建与通信.doc

    实验四:Linux下进程管道通信.docx

    操作系统实验四:Linux下进程管道通信 任务1:使用Pipe创建管道,创建一个子进程,子进程向父进程发送消息“I am your son!”,父进程接收到子进程的消息后,显示在屏幕上,并向子进程发送“I am your father!”。子...

    linux系统进程控制

    掌握进程相关的基本概念 ...掌握Linux下进程创建及进程管理 掌握Linux下进程创建相关的系统调用 掌握守护进程的概念 掌握守护进程的启动方法 掌握守护进程的输出及建立方法 学会编写多进程程序 学会编写守护进程

Global site tag (gtag.js) - Google Analytics