linux进程管理
进程
进程就是处于执行期的程序.但不仅仅局限于一段可执行程序代码.通常还要包括其他资源,打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间或多个执行线程.
在linux中线程是一种特殊的进程.是内核调度的对象.每个线程都拥有一个独立的程序计数器,进程栈,一组进程寄存器.
在操作系统中进程提供两种虚拟机机制:虚拟处理器和虚拟内存
进程描述符及任务结构
内核把进程的列表存在叫任务队列的双向循环链表中.链表的每一项类型为task_struct称为进程描述符的机构.主要保存有:打开的文件,进程的地址空间,挂起的信号,进程的状态等.
每个进程都有自己的父进程,父进程可以管理其子进程.通过fork创建子进程.
在系统中有一个进程内核栈,动态生成task_struct只需要在栈上创建一个新结构thread_info,thread_info中包含了指向task_struct的指针.
线程
在linux中线程创建和普通进程的创建类似,但是在调用clone()(也就是复制父进程的资源)的时候要传入参数指明要共享的资源.因为在linux中线程和普通的进程差不多,只是有共享资源.
进程终结
原因:
- 可能是自身引起,调用exit()系统调用.可能被其他进程终结.
过程:
- 讲tast_struct中标志成员设置为PF_EXITING.
- 调用deltimersync()删除任意内核定时器.根据返回结果,确保没有定时器在排队,也没有定时器处理程序在运行.
- 如果BSD(伯克利软件套件)进程记账功能开启,do_exit()调用函数输出记账信息.
- 调用exit_files和exit_fs(),分别递减文件描述符,文件系统数据的引用技术.如果每个引用技术为0,则可以释放
- 把退出代码保存下来,供父进程随时检索.
- 调用exit_notify()向父进程发送信号,给子进程重新找养父,养父为线程组的其他线程或者init进程,并吧线程状态设置为EXIT_ZOMBIE
- 切换新的进程
在每个进程结束之后都会保留一个退出信息,等待父进程调用结束后在被释放.(通过wait()函数).
如果父进程在子进程之前退出,就会在当前线程组内找一个线程作为父亲,如果不行就让init进程做他们的父进程.保证了每个进程死亡之后不会僵死,会有父进程回收此进程的退出代码信息