在Linux中,进程的创建由系统调用fork和vfork完成。它们生成一个子进程并且子进程是父进程的一个复制品。
Fork系统调用对应的kernel函数是sys_fork,此函数简单的调用kernel函数do_fork。一个简化版的do_fork执行如下:
(1)alloc_pid()。给新的进程分配一个新的pid,即进程号
(2)copy_process()此函数会做fork的大部分事情,它主要完成讲父进程的运行环境复制到新的子进程,比如信号处理、文件描述符和进程的代码数据等。
(3)wake_up_new_task()。计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。
简化的copy_process()流程:
(1) dup_task_struct()。分配一个新的进程控制块,包括新进程在kernel中的堆栈。新的进程控制块会复制父进程的进程控制块,但是因为每个进程都有一个kernel堆栈,新进程的堆栈将被设置成新分配的堆栈。
(2)初始化一些新进程的统计信息,如此进程的运行时间
(3)copy_semundo()复制父进程的semaphore undo_list到子进程。
(4)copy_files()、copy_fs()。复制父进程文件系统相关的环境到子进程
(5)copy_sighand()、copy_signal()。复制父进程信号处理相关的环境到子进程。
(6)copy_mm()。复制父进程内存管理相关的环境到子进程,包括页表、地址空间和代码数据。
(7)copy_thread()。设置子进程的执行环境,如子进程运行时各CPU寄存器的值、子进程的kernel栈的起始地址。
(8)sched_fork()。设置子进程调度相关的参数,即子进程的运行CPU、初始时间片长度和静态优先级等。
(9)将子进程加入到全局的进程队列中
(10)设置子进程的进程组ID和对话期ID等。
简单的说,copy_process()就是将父进程的运行环境复制到子进程并对某些子进程特定的环境做相应的调整。
应用程序使用系统调用exit()来结束一个进程,此系统调用接受一个退出原因代码,父进程可以使用wait()系统调用来获取此代码,从而知道子进程退出的原因。对应到kernel,此系统调用sys_exit_group(),它的基本流程如下:
(1)将信号SIGKILL加入到其他线程的信号队列中,并唤醒这些线程。
(2)此线程执行do_exit()来退出。
do_exit()完成线程退出的任务,其主要功能是将线程占用的系统资源释放,do_exit()的基本流程如下:
(1)将进程内存管理相关的资源释放
(2)将进程ICP semaphore相关资源释放
(3)__exit_files()、__exit_fs()。将进程文件管理相关的资源释放。
(4)exit_thread()。只要目的是释放平台相关的一些资源。
(5)exit_notify()。在Linux中进程退出时要将其退出的原因告诉父进程,父进程调用wait()系统调用后会在一个等待队列上睡眠。
(6)schedule()。调用进程调度器,因为此进程已经退出,切换到其他进程。
分享到:
相关推荐
操作系统课程实践之Linux进程创建 本文主要围绕Linux操作系统中的进程创建展开,通过实验演示了使用fork()和clone()系统调用创建子进程的过程,并对实验结果进行了详细的分析和解释。 一、Linux进程概念 在Linux...
Linux 进程创建详解 本文将详细介绍 Linux 下 C 语言编程中进程的创建,包括进程的概念、进程的标志、进程的状态、进程的所有者和进程的资源分配等内容。 一、进程的概念 在 Linux 操作系统中,进程是指一个正在...
Linux 进程创建与通信 ...本实验报告介绍了 Linux 进程创建和通信的基本概念和实现方法,包括进程创建、进程同步和管道通信。这些技术在实际应用中非常重要,例如在服务器端与客户端的通信、数据处理和网络编程等领域。
在本"Linux进程间通讯视频教程"中,你将学习如何创建和管理这些通信机制,包括如何设置、使用以及避免潜在的问题。对于初学者而言,理解这些基本概念和操作是至关重要的,因为它们是构建复杂、并发系统的基础。通过...
当一个进程调用`fork()`时,操作系统会为该进程创建一个副本,这个副本被称为子进程。调用`fork()`后,父进程和子进程都会继续执行`fork()`之后的代码,但各自拥有独立的内存空间和进程标识符(PID)。在这个实验中...
### Linux进程创建与并发实验知识点解析 #### 一、实验目的 本实验旨在通过实践操作加深学生对进程概念的理解,并掌握在Linux环境下如何创建进程以及探究并发执行的本质。具体目标包括: 1. **加强进程概念的理解*...
* 进程管理:是操作系统中负责管理进程的模块,包括进程创建、进程同步、进程通信和进程调度等。 * 系统调用:是操作系统提供的一种机制,允许应用程序请求操作系统提供的服务,例如创建进程、打开文件、读写文件等...
本文将详细探讨Linux进程编程的基础知识,包括进程的概念、创建与管理进程、进程间通信以及线程的使用。 首先,我们需要了解什么是进程。在操作系统中,进程是程序的执行实例,它包含了一段内存空间,包括代码、...
1. **Linux进程状态** 包括运行、可中断等待、不可中断等待、僵死和停止状态。这些状态反映了进程在操作系统中的生命周期。 2. **`ps`命令** 用于显示系统中进程的实时状态,通过`ps aux`等参数可以获取详细信息。`...
总结来说,Linux进程和线程的管理涉及进程状态的转换、task_struct的作用、内存泄漏的检测与防范、fork创建子进程以及子进程资源的回收等问题。而调度方面,则包括进程调度策略、调度器的算法和对CPU资源的限制。...
提供的"word文档供学习参考"可能包含了实验步骤、示例代码和相关理论解释,对于深入理解和实践Linux进程编程非常有帮助。 在实际操作中,结合`man`手册页和实验指导,学习者可以更全面地掌握这些概念和操作,从而...
Linux进程池是一种高级的系统...通过理解和掌握以上知识点,开发者可以构建一个高效的Linux进程池,实现对并发任务的有效管理和调度。同时,需要注意的是,进程池的设计应当灵活可扩展,以适应不同应用场景的需求变化。
### 进程的基本概念 #### 1. 进程的定义 ...综上所述,Linux 进程管理涉及了进程的概念、类型、启动方式以及常用的进程管理命令。理解和掌握这些内容对于有效地管理和优化Linux系统的性能至关重要。
我们将关注《Linux进程编程介绍.pdf》这份文档,它可能涵盖了以下内容:进程的创建与管理(`fork()`, `execve()`等),进程状态(运行、就绪、睡眠等),进程标识符(PID, TID等),以及如何使用`wait()`和`waitpid...
* Linux 系统的所有进程间的关系呈现树型结构,除 1 号进程(init)外,其他每个进程都是由另一个进程创建的,在树结构中以父子关系存在。 * 1 号进程是整个树型结构的树根,是任何其他进程的祖先。 * Linux 进程在...
综上所述,Linux进程管理涉及多个方面,包括进程控制块的结构设计、进程状态的管理、进程创建和终止的机制、进程调度策略以及进程间通信。掌握这些知识点对于深入理解Linux操作系统和进行系统编程都至关重要。
Linux 进程的创建和管理是指使用 fork 函数和exec 函数来创建新进程,并使用 wait 函数和signal 函数来等待进程结束和处理信号等。在 Linux 中,进程可以使用各种函数来管理和控制其执行,例如 getppid 函数、getpid...
利用fork()函数编写一个程序,要求父进程创建两个子进程,父进程、子进程并发执行,输出并发执行的消息,如: 父进程正在执行….. 子进程1正在执行….. 子进程2正在执行….. 一段时间后,父进程杀死子进程,然后...
通过学习这个讲座,开发者不仅能深入了解Linux进程的生命周期、状态转换、创建和管理,还能掌握进程间的协作和资源分配,这对于系统管理和软件开发都是至关重要的。对于运维人员和Linux开发者而言,深入理解并熟练...