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

时间:2022-09-02 12:31:56

第三章 进程管理

3.1进程

概念:

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

  内核需要有效又透明地管理所有细节。

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

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

  线程之间可以共享虚拟内存,但每个都拥有各自的虚拟存储器。

  进程创建:调用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()

《Linux内核设计与实现》读书笔记 3的更多相关文章

  1. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  2. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  3. Linux内核设计与实现读书笔记&lpar;8&rpar;-内核同步方法【转】

    转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...

  4. Linux内核设计与实现——读书笔记2:进程管理

    1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...

  5. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

  6. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  7. Linux内核架构与底层--读书笔记

    linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...

  8. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  9. Linux内核分析 一二章读书笔记

    第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...

  10. 《Linux内核设计与实现》笔记-1-linux内核简单介绍

    一.Linux内核相对于传统的UNIX内核的比較: (1):Linux支持动态内核模块. 虽然Linux内核也是总体式结构,但是同意在须要的时候动态哦卸除(rmmod xxx)和载入内核模块(insm ...

随机推荐

  1. C&plus;&plus;内存动态分配

    https://www.percona.com/blog/2012/07/05/impact-of-memory-allocators-on-mysql-performance/ https://su ...

  2. C&num;实现Windows服务

    资源:Walkthrough: Creating a Windows Service Application in the Component Designer: https://msdn.micro ...

  3. Falcon Genome Assembly Tool Kit Manual

    Falcon Falcon: a set of tools for fast aligning long reads for consensus and assembly The Falcon too ...

  4. Copy-VMFile

    将文件移到或移出虚拟机可能会产生问题.首先,你需要安装集成服务,打开文件共享.这只需要一个简单的PowerShell命令:Enable-VMIntegrationService.但是你必须登录到虚拟机 ...

  5. C&num; 线程知识--使用Task执行异步操作

    在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务.线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值.但是在C#4.0中引人了一个的任 ...

  6. C语言数据结构基础学习笔记——基础线性表

    线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...

  7. AX&lowbar;HelpGenerator

    HelpGenerator helpGenerator; ; helpGenerator = infolog.helpGenerator(); helpGenerator.showURL(" ...

  8. Python 扩展技术总结&lpar;转&rpar;

    一般来说,所有能被整合或导入到其他Python脚本中的代码,都可以称为扩展.你可以用纯Python来写扩展,也可以用C/C++之类的编译型语言来写扩展,甚至可以用java,C都可以来写 python扩 ...

  9. Hive数据据类型 DDL DML

    Hive的基本数据类型 DDL DML: 基本数据类型 对于Hive而言String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以 ...

  10. 创建React组件

    组件概述 组件可以将UI切分成一些独立的.可复用的部件,这样你就只需专注于构建每一个单独的部件. 组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的 ...