文章目录
- 概述
- 进程,轻量级进程和线程
- 进程描述符
- linux进程四要素
- 创建进程
- linux3个系统调用创建新的进程
- do_fork函数
- copy_process函数
- 撤销进程
- 小结
概述
这一章,主要讲的是进程的概念,即程序执行的一个实例。在linux源代码中,通常把进程称为任务。
然后写了这一章的重点,先讨论进程的静态特性,然后描述内核如何进行进程切换;最后两节研究如何创建和撤销进程。
进程,轻量级进程和线程
写点这一节有趣的事情,如下:
进程有生命周期,被产生,可以产生一个或多个子进程,最终都要灭亡。每个进程只有一个父亲。
从内核观点看,进程的目的就是担当分配系统资源(CPU时间,内存等)的实体。
一个进程由几个用户线程组成,每个线程都代表进程的一个执行流。
从内核观点看,多线程应用程序仅仅是一个普通的进程。多线程应用程序多个执行流的创建,处理,调度整个都是在用户态进行的。
进程描述符
内核管理进程,必须对每个进程所做的事情进行清楚的描述。使用进程描述符来对进程的一些内容进行管理。
进程描述符都是task_struct类结构,如下:
对于一个进程来说,要了解进程的状态,比如:
可运行状态,可中断的等待状态,不可中断的等待状态,暂停状态,跟踪状态,僵死状态,僵死撤销状态这几种状态,代码如下:
linux进程四要素
- 有一段程序供其执行;
- 有进程专用的系统堆栈空间;
- 在内核有task_struct数据结构;
- 都独立的存储空间,拥有专有的用户空间。
如果只有前三条,则称为“线程”。如果完全没有用户空间,就称为“内核线程”;而如果共享用户空间映射就称为“用户线程”。
创建进程
在linux中,新进程是从一个已经存在的进程中复制出来的,内核使用静态数据结构造出0号进程,0号内核线程分叉生成1号内核线程和2号内核线程。1号内核线程完成初始化以装载用户程序,编程1号进程,其他进程都是1号进程或者它的子孙进程分叉生成的。
linux3个系统调用创建新的进程
- fork(分叉):子进程是父进程的一个副本,采用写时复制技术。
- vfork:用于创建子进程,之后子进程立即调用execve以装载新程序的情况,为了避免复制物理页,父进程会睡眠等待子进程装载新程序。现在fork采用了写时复制技术,vfor没什么速度优势,废弃了。
- clone(克隆):可以精确地控制子进程和父进程共享哪些资源。这个系统调用的主要用处是可供pthread库用来创建线程。clone是功能齐全的函数,参数多使用复杂,fork是clone的简化函数。
来看下代码,如下图:
do_fork函数
do_fork()函数负责处理clone(),fork(),vfork()系统调用。来看看do_fork()函数的执行流程。如下图:
可以看到,具体的核心处理在copy_process()函数中。
copy_process函数
先来看下这个函数的主要流程,如下图:
代码贴一点,能看到多少,看多少吧,然后顺着代码配合上边的图,理解下整个流程。
撤销进程
进程终止的一般方式是调用exit()库函数,该函数释放c函数库分配的资源,执行程序所注册的每个函数,并结束从系统回收进程的那个系统调用。
小结
本篇只是简单的写了进程这一章,毕竟,后边还有2章写的是这个概念,后边慢慢写。随时补充新的内容。感兴趣,可以一起学习学习。OK,结束。