《Linux内核设计与实现》读书笔记 3

第三章 进程管理缓存

3.1进程ide

概念:函数

  进程:处于执行期的程序。但不只局限于程序,还包含其余资源(打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具备内催音社的内存地址空间及一个或多个执行线程,存放全局变量的数据段等)操作系统

  内核须要有效又透明地管理全部细节。线程

  线程:执行线程的简称,是在进程中活动的对象。每一个线程有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程而不是进程。指针

         进程提供两种虚拟机制:虚拟处理器和虚拟内存。对象

  线程之间能够共享虚拟内存,但每一个都拥有各自的虚拟存储器。继承

  进程建立:调用fork(),该系统调用经过复制当前进程建立新进程。使用fork()的是父进程。在调用结束时,在返回点这个相同位置,父进程恢复,子进程开始执行。队列

3.2进程描述符及任务结构进程

      内核把进程的列表存放在叫作任务队列的双向循环链表中。链表中的每一项都是task_struct类型,称为进程描述符的结构。

      该结构内包含了内核管理一个进程所需的全部信息。

  分配进程描述符:经过slab分配器分配,为了对象复用和缓存着色。

  进程描述符的存放:进程经过一个惟一的进程标识值(process identification value)标识每一个进程。PID最大默认32768,,就是系统中容许同时存在的进程最大数目。

  进程状态:进程描述符中的state域描述了进程的当前状态,有五种状态:运行、可中断、不可中断、被跟踪、中止。

  设置当前进程状态:调整状态使用set_task_state(task,state)函数。

  进程家族树:系统进程有明显的继承关系。全部进程都是init的后代。每一个进程都有父进程,相同父进程的成为兄弟。

3.3进程建立

Fork()和exec():

  Fork()经过拷贝当前进程建立一个子进程。Exec()函数负责都去可执行文件,并将其载入地址空间开始运行。

  写时拷贝:fork()复制全部资源是效率低下的,所以采用写时拷贝,推迟甚至免除拷贝数据。只有须要写入的时候,数据才被复制。

  Fork():经过clone()系统调用实现fork()。do_fork()调用copy_proceess()函数

    调用dup_task_struct()为新进程建立一个内核栈、thread_info结构和task_stuct结构。这些与当前进程相同,PID也相同。

    检查建立子进程后,用户多有进程书目没有超出它分配的资源的限制。

    进程描述符的许多成员都要清零或设为默认,以和父进程区分开。

    子进程状态被设置为TASK_UNINTERRUPTIBLE,确保不会被投入运行。

    调用alloc_pid()为新进程分配一个有效ID

    Copy_process()作扫尾工做,返回一个指向子进程的指针。

  Vfork():与fork()的区别就是不考贝父进程页表项。

3.4线程在Linux中的实现

         从内核角度说,Linxu没有线程概念。全部线程都被看成进程

         建立进程:和建立普通进程差很少,只是在调用clone()时须要传递一些参数标志。

         内核线程:kernel thread和普通进程的区别在于内核线程没有独立地址空间。只在内核空间运行。

3.5进程终结

         当一个进程终结,内核必须释放所占有的资源,并告知父进程。

  靠do_exit()实现:

    将tast_struct中的标志成员设置为PF_EXITING

    调用del_timer_sync()删除任一内核定时器

    调用acct_update_integrals()输出记帐信息

    调用exit_mm()释放进程占用的mm_struct。

    调用sem_exit()若进程排队等候IPC,则离开

    调用exit_files()和exit_fs()分别递减文件描述符和文件系统数据的应用计数。

    调用exit_notify()向父进程发送信号,给子进程找养父。

    do_exit调用schedukle(0切换到新进程。

小结:

  本节,咱们学到了操做系统的核心概念——进程。

  Linux如何存放和表示进程——用task_struct和thread_info

  建立进程——经过fork(),其实是clone()

  把新的执行映像装到地址空间——经过exec()系统调用族

  表示进程的层次关系,父进程如何收集其后代信息——经过wait()系统调用族

  进程如何消亡——强制或自愿调用exit()

相关文章
相关标签/搜索