欢迎来到天天文库
浏览记录
ID:13996048
大小:262.00 KB
页数:11页
时间:2018-07-25
《linux 学习笔记 - 进程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux进程1基本内容进程,作为Linux里面的两大基本抽象之一,笼统来说就是执行中的程序。这样一个概念涵盖的内容很丰富:汇编代码、数据、状态、各种资源(包括文件、信号、内存等等)。本文档未包含进程间通信、同步等内容。1.1标识一个进程每一个进程,在内核中,都对应了一个task_struct结构体,也称为进程描述符,其中包含了描述一个进程的所有信息(约1.7K字节)。在内核中,所有的的task_struct都被组织在任务队列这样一个双向链表中,如下图:操作系统通过进程IDpid来区分不同的进程描述符,该变量为了与老版本的Linux兼容,其最
2、大值的默认值被默认设置为32768。这样的取值对于一般的个人机是足够使用了,但是有些大型的服务器可能会需要更多的进程。这个最大值可以进行设置,如果不考虑兼容性,可以设置成超过32768。既然task_struct记录了所有进程相关的描述信息,不难想象内核大部分对进程的操作都是通过该结构进行,那么高效的访问task_struct就十分重要了。X86体系中,内核访问task_struct的示意图如下:2010-06-27Page11,Total11第11页,共11页在进程的内核栈的最底端有一个thread_info结构,其保存了task_stru
3、ct的地址。宏current_thread_info()会取到本进程的thread_info,则current_thread_info()->task_struct即可。current_thread_info的实现值得注意:将栈指针SP的后12/13位与0相与。两种取值分别对应了4k/8k的内核栈。1.1进程状态Linux进程有5种状态:lTASK_RUNNING:运行状态–正在执行或者在等待执行的任务队列中lTASK_INTERRUPTIBLE:进程睡眠(或者说阻塞)lTASK_UNINTERRUPTIBLE:不可中断–等待时不可被信号唤醒
4、这类进程就是无法被kill命令杀死的进程了,也因此较上一种使用的较少lTASK_ZOMBIE:僵尸–进程已经结束,但为了父进程能够获得相关信息,内核还保留了该进程的一些相关信息,–直到父进程调用wait4()lTASK_STOPPED/TASK_TRACED:暂停执行、调试状态–一般都是通过特定的信号来实现本状态与运行状态的切换下面是FSM:2010-06-27Page11,Total11第11页,共11页1.1进程上下文当一个进程执行了系统调用,或者发生了某个异常,此时它将陷入内核空间对内核的访问,必须通过内核提供的系统调用,或者异常处理程
5、序,都有特定的接口,我们称内核将“代表进程执行”,并且处于进程上下文中。进程上下文中,current宏是有效的。当调用结束或者异常处理结束,程序恢复在用户空间的继续执行。中断有专门的中断上下文。1.2进程的创建1.2.1进程体系除了init进程之外,其他的进程都有其父进程(ppid)。每一个进程都有其所属的用户以及进程组,这是为了实现访问控制。另外注意的是,在Linux中,创建进程和加载可执行文件是两个步骤,分别通过fork系列函数已经exec系列函数调用进行。1.2.2forkfork用来创建子进程,子进程与父进程在以下几点上是不同的:lp
6、id/ppidl各类资源统计信息清零2010-06-27Page11,Total11第11页,共11页l所有挂起的信号被清除,子进程不进行继承l所有文件锁不会被继承Linux通过clone()系统调用来实现fork,这个系统调用的命名很贴切,这么说的原因在下面会看到。fork调用有2个返回值:父/子进程的pid。内核通常倾向于先返回子进程的pid。子进程在被创建初始,和父进程平分剩余的时间片。1.1.1exec当子进程创建成功并且被调度执行时,一般都会调用exec系列函数将目标可执行文件加载到内存中。通常,exec系列函数调用都不会返回,成功
7、的调用回跳到新的程序入口点进行执行,而之前运行的代码是不会存在于新的地址空间中的。exec调用改变了以下的进程信息:l挂起的信号丢失,锁定的内存丢失,与进程内存相关的信息丢失,包括文件映射l多数进程统计信息清零,多数线程属性还原到默认值l信号处理函数还原到默认的函数l最重要的是,改变了地址空间和进程的映像继承了的东西则有文件描述符集。1.1.2写时拷贝前面提到clone这个系统调用名称很贴切,原因就在于,Linux内核通过写时拷贝技术来进行子进程的创建。为什么要使用写时拷贝?早期的内核其实是这么干的:调用fork时,内核会把所有内部数据复制一
8、份,复制进程的页表项,把父进程地址空间中的内容逐页复制到子进程的地址空间中。对于内核而言,主页拷贝是效率十分低下,十分耗时的操作。写时拷贝怎么实现?在创建进程时,并
此文档下载收益归作者所有