《Linux内核设计与实现》读书笔记 3
第三章 进程管理
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的更多相关文章
- Linux内核设计与实现 读书笔记 转
Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- Linux内核设计与实现读书笔记(8)-内核同步方法【转】
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...
- Linux内核设计与实现——读书笔记2:进程管理
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...
- Linux内核架构与底层--读书笔记
linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...
- Linux内核设计第十七章笔记
第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...
- Linux内核分析 一二章读书笔记
第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...
- 《Linux内核设计与实现》笔记-1-linux内核简单介绍
一.Linux内核相对于传统的UNIX内核的比較: (1):Linux支持动态内核模块. 虽然Linux内核也是总体式结构,但是同意在须要的时候动态哦卸除(rmmod xxx)和载入内核模块(insm ...
随机推荐
- syslog与rsyslog的了解与比较
syslog日志收集器: syslog是早期的centos版本的日志收集器,应该是centos5之前的版本. syslog的两个重要的守护进程: 1.syslogd:system.主要以收集系统服务为 ...
- 6.1Python文件的操作(一)
目录 目录 前言 (一)基础类型 ==1.只读== ==2.只写== ==3.追加== (二)b二进制组合 ==1.读写二进制文件== (三)+ 附加组合 ==1.读附加== ==2.写附加== == ...
- 用Python读写Excel文件的方式比较
虽然天天跟数据打交道,也频繁地使用Excel进行一些简单的数据处理和展示,但长期以来总是小心地避免用Python直接读写Excel文件.通常我都是把数据保存为以TAB分割的文本文件(TSV),再在Ex ...
- python re模块记录
import re'''re模块 compile match search findall group groups 正则表达式常用格式: 字符:\d \w \t . (\d:数字;\w ...
- c++ 启动exe(启动别的exe程序)
http://blog.csdn.net/sdcxyz/article/details/13631613 1例程 1.1面向过程例程如下: #include <iostream> #inc ...
- junit常用注解详细说明
Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能.在junit中常用的注解有@Test.@Ignore.@BeforeClass.@AfterClass.@ ...
- PAT A1121 Damn Single (25 分)——set遍历
"Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...
- Selenium:HTML测试报告
自动化测试过程中,获得用例的执行结果后,需要有具象化.简洁明了的测试结果,比如:用例执行时间.失败用例数.失败的原因等,这时候,就需要用到测试报告. HTML测试报告是python语言自带的单元测试框 ...
- python条件、循环语句
既然讲到语句,那先说明一下语句块.语句块不是一种语句,是一组语句.在条件为真时执行或者多次的一组语句.主要注意其格式,用冒号来标识语句块的开始,块中每行缩进相同的量,一般4个空格(tab字符位置为8个 ...
- 使用jdom进行xml解析,网络抓包
最近再做一个项目,使用到了jdom进行xml解析,为了方便记忆,现在保存在这里 package bboss; import java.io.FileInputStream; import java.i ...