今天学习了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进程的生成、使用和创建过程,以及相关的源码分析。 首先,我们来了解一下进程的生成。在Linux中,新进程通常是通过fork()系统调用创建的。这个调用会复制当前进程的所有状态,包括内存映射、...
五、进程创建与退出 Linux中,通过`fork()`函数可以创建新的进程,新进程继承父进程的大部分属性,但拥有独立的内存地址空间。`exec()`系列函数可用来替换进程的执行上下文,加载新的程序执行。当进程执行完毕或者...
### Linux进程创建与进程通信知识点解析 #### 实验背景与目的 在本次实验中,学生通过实际操作加深了对Linux环境下进程创建与进程间通信的理解。实验的主要目标是熟悉Linux系统调用,并学习如何在Linux中创建进程。...
本文将深入探讨Linux进程调度的原理、策略以及相关概念。 首先,我们了解什么是进程。在计算机科学中,进程是程序在内存中的实例,拥有自己的独立资源,如内存空间、文件描述符等。每个进程都有一个唯一的进程ID...
在Unix/Linux系统中,...综上所述,Unix/Linux进程池管理涉及多方面的技术,包括进程创建、任务调度、进程间通信、资源管理和错误处理。理解并掌握这些知识点对于开发高效、稳定的银行系统或其他服务型应用至关重要。
3. **进程创建方法**: 在Linux中,通常使用`fork()`系统调用来创建新进程。`fork()`会复制当前进程的所有资源,包括代码、数据、打开的文件等,创建出一个子进程。子进程和父进程拥有相同的程序计数器(PC),但...
### Linux创建进程:详解与代码实现 在深入探讨如何在Linux环境下使用C语言创建进程之前,我们先简要回顾一下进程的基本概念以及它在操作系统中的重要性。进程是正在执行的程序的一个实例,由程序段、数据段和进程...
在本"Linux进程间通讯视频教程"中,你将学习如何创建和管理这些通信机制,包括如何设置、使用以及避免潜在的问题。对于初学者而言,理解这些基本概念和操作是至关重要的,因为它们是构建复杂、并发系统的基础。通过...
操作系统课程实践之Linux进程创建 本文主要围绕Linux操作系统中的进程创建展开,通过实验演示了使用fork()和clone()系统调用创建子进程的过程,并对实验结果进行了详细的分析和解释。 一、Linux进程概念 在Linux...
Linux 进程创建详解 本文将详细介绍 Linux 下 C 语言编程中进程的创建,包括进程的概念、进程的标志、进程的状态、进程的所有者和进程的资源分配等内容。 一、进程的概念 在 Linux 操作系统中,进程是指一个正在...
本文将深入剖析Linux进程管理,探讨其生命周期,以及与用户进程创建、内存管理、调度和销毁相关的内核机制。 首先,Linux进程的生命周期包括创建、执行、等待、停止、继续执行和终止几个阶段。创建进程通常通过`...
进程创建的大致流程可以分为以下几个步骤: * fork()函数通过0x80中断(系统调用)来陷入内核。 * 内核创建一个新的task_struct结构体,并将其添加到系统的进程列表中。 * 内核分配虚拟地址空间和资源给新的进程。 ...
实验 Linux 进程通信的参考答案 Linux 进程通信是指在操作系统中,多个进程之间进行数据交换和同步的机制。在 Linux 中,进程通信可以通过信号、管道和共享内存等方式实现。 一、信号机制 在 Linux 中,信号是一...
Linux 进程编程基础 - 进程同步和进程通信 Linux 进程编程基础是计算机科学和软件工程中的一门重要课程,涉及到操作系统的核心内容。进程是操作系统中的一种基本概念,理解进程的概念和编程技术对于软件开发和系统...
本文将以Linux-2.2.10版本为基础,对Linux的进程源代码进行深入分析,主要探讨以下几个方面:进程的基本概念、进程创建的方式、进程调度策略及其实现机制。 #### 1. 进程概述 在计算机科学中,进程是操作系统为了...
### 进程的基本概念 #### 1. 进程的定义 ...综上所述,Linux 进程管理涉及了进程的概念、类型、启动方式以及常用的进程管理命令。理解和掌握这些内容对于有效地管理和优化Linux系统的性能至关重要。
Linux 进程基本管理是计算机操作系统中一个非常重要的概念,它涉及到进程的创建、管理和控制。在 Linux 环境下,进程是操作系统中一个基本的执行单元,每个进程都有其自己的虚拟地址空间、打开的文件描述符、信号...
【Linux进程间通信】在操作系统中,进程间通信(Inter-Process Communication, IPC)是不同进程之间交换数据的重要机制。Linux提供了多种IPC方式,包括管道、消息队列、共享内存、信号量等。本实例主要关注的是...
这些实验使用了VMWare workstation虚拟机和RedHat 9.0操作系统,提供了一个安全的环境来实践和理解Linux进程管理的复杂性。通过这样的实验,学生能够深入理解进程的概念,掌握进程创建、等待、终止和替换的过程,...