第三章学习笔记

1、进程缓存

  1.进程就是出于执行期的程序函数

  2.执行线程,简称线程,是在进程中活动的对象spa

  3.进程提供两种虚拟机制:虚拟处理器和虚拟内存线程

2、进程描述符和任务结构指针

  1.内核把进程的列表存放在焦做任务队列的双向循环链表中,其中每一项都是类型为task_struct、称为进程描述符的结构对象

  2.进程描述符的分配和存放:队列

    (1)目的:Linux经过slab分配task_struct结构,以达到对象复用以及和缓存着色的目的(避免资源动态分配和释放带来的资源消耗)进程

    (2)分配:每一个任务的堆栈尾端(好比,对于向上增加的堆栈来讲,就是在堆栈的栈顶)有结构体thread_info,它指向了task_struct结构体内存

    (3)查找:资源

      1)内核中的大部分处理处理进程的代码都是经过task_struct进行的;所以,须要经过current宏查找到当前正在运行进程的进程描述符    

      2)X86系统中,current把栈指针的后13个有效位屏蔽掉,用来计算出thread_info的偏移(经过current_thread_info函数)

  3.进程状态

    进程在任什么时候刻,都一定处于五种状态中的一种

    (1)TASK_RUNNING

    (2)TASK_INTERRUPT

    (3)TASK_UNINTERRUPT

    (4)TASK_TRACED

    (5)TASK_STOPPED

  4.设置进程当前状态

    (1)调用set_task_state(task,state)函数将进程设置为指定状态

  5.进程上下文

    (1)可执行代码从一个可执行文件载入到进程的地址空间执行。当一个程序执行了系统调用,内核就会“表明进程执行”并处于进程上下文中

    (2)对比:在中断上下文中,系统不表明进程执行——不会有进程去干扰这些中断处理程序

3、进程建立

  1.Unix系统的进程建立方式

    (1)fork()经过拷贝当前进程建立一个子进程

    (2)exec()负责读取可执行文件并将其载入地址空间开始运行

    (3)写时拷贝

      1)Linux的fork()使用写时拷贝推迟甚至免除拷贝。内核在建立新进程的时候并不复制整个地址空间,而是让父进程和子进程共享同一个拷贝;直到子进程/父进程须要写入的时候才进行拷贝

      2)于是,fork的实际开销只是复制父进程的页表以及给子进程建立惟一的进程描述符

  2.fork函数

    (1)Linux经过clone系统调用实现fork

    (2)由clone去调用do_fork()

    (3)定义在<kernel/fork.c>中的do_fork()完成建立中的大部分工做,它调用copy_process函数,而后让进程开始运行

4、内核线程

  1.内核线程:独立运行在内核空间的标准进程。

  2.内核线程没有独立的地址空间只在内核空间运行,历来不切换到用户空间,能够被调度被抢占

  3.内核线程只能由其余内核线程建立

5、进程终结

  1.进程终结时,内核必须释放它所占有的资源并告知父进程。

  2.进程终结的缘由:通常是来自自身,发生在调用exit()系统调用时。

  3.删除进程描述符

    经过release_task()实现进程描述符的删除,至此,全部资源都被释放了

  4.解决孤儿进程

    (1)父进程在进程以前退出,就会遗留下子进程,也就是孤儿进程

    (2)解决方法:在当前的线程组内给孤儿进程寻找新的父进程;

            直接以init做为其父进程

相关文章
相关标签/搜索