《Linux内核设计与实现》学习总结 Chap3
第三章 进程管理
进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在。
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()函数
l 调用dup_task_struct()为新进程创建一个内核栈、thread_info结构和task_stuct结构。这些与当前进程相同,PID也相同。
l 检查创建子进程后,用户多有进程书目没有超出它分配的资源的限制。
l 进程描述符的许多成员都要清零或设为默认,以和父进程区分开。
l 子进程状态被设置为TASK_UNINTERRUPTIBLE,确保不会被投入运行。
l 调用alloc_pid()为新进程分配一个有效ID
l Copy_process()做扫尾工作,返回一个指向子进程的指针。
Vfork():与fork()的区别就是不考贝父进程页表项。现在没啥用了。
3.4线程在Linux中的实现
从内核角度说,Linxu没有线程概念。所有线程都被当作进程
创建进程:和创建普通进程差不多,只是在调用clone()时需要传递一些参数标志。
内核线程:kernel thread和普通进程的区别在于内核线程没有独立地址空间。只在内核空间运行。
3.5进程终结
当一个进程终结,内核必须释放所占有的资源,并告知父进程。
靠do_exit()实现:
l 将tast_struct中的标志成员设置为PF_EXITING
l 调用del_timer_sync()删除任一内核定时器
l 调用acct_update_integrals()输出记账信息
l 调用exit_mm()释放进程占用的mm_struct。
l 调用sem_exit()若进程排队等候IPC,则离开
l 调用exit_files()和exit_fs()分别递减文件描述符和文件系统数据的应用计数。
l 调用exit_notify()向父进程发送信号,给子进程找养父。。。
l do_exit调用schedukle(0切换到新进程。
删除进程描述符:
若父进程在子进程之前退出。孤儿进程会在退出时处于永远僵死状态。
《Linux内核设计与实现》学习总结 Chap3的更多相关文章
- Linux内核设计第一周学习总结 计算机如何工作
北京电子科技学院 20135310陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002 ...
- Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码
陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用实验楼的虚拟机 ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- linux内核设计与实现学习笔记-模块
模块 1.概念: 如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”. LINUX Kernel是组件模式的,所谓组件模式是指:LINUX K ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- 《Linux内核设计与实现》第四章学习笔记
<Linux内核设计与实现>第四章学习笔记 ——进程调度 姓名:王玮怡 学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...
- 《Linux内核设计与实现》第五章学习笔记
<Linux内核设计与实现>第五章学习笔记 姓名:王玮怡 学号:20135116 一.与内核通信 在Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核 ...
- 《Linux内核设计与实现》第四章学习笔记——进程调度
<Linux内核设计与实现>第四章学习笔记——进程调 ...
随机推荐
- 回顾下TCP/IP协议
首先要知道什么是TCP/IP协议,从字面意思来看TCP是“Transmission Control Protocol”的缩写,也就是传输控制协议.IP是“Internet Protocol”的缩写,即 ...
- 解决Ubuntu“下载额外数据文件失败 ttf-mscorefonts-installer”的问题 (转载)
解决Ubuntu“下载额外数据文件失败 ttf-mscorefonts-installer”的问题 发表于 2017-09-15 | 更新于 2018-04-29 | 分类于 Linux | 评论数: ...
- java后端面试题汇总
转载链接:https://www.nowcoder.com/discuss/90776?type=0&order=0&pos=23&page=0 基础篇 数据结构与算法 线性表 ...
- Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- Scrum Meeting 11.04
成员 今日任务 明日计划 用时 徐越 学习Fragment相关知识,代码移植 代码移植 4h 赵庶宏 selvet移植,服务器配置,编写数据库 服务器配置,代码移植 4h 薄霖 学习安卓界面设计数据库 ...
- 20172324 2017-2018-2《程序设计与数据结构》第五周 n!的计算
20172324 2017-2018-2<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...
- YQCB冲刺周第七天
站立会议 任务看板 燃尽图 今天的任务为实现个人设置中的修改密码.设置金额的功能.以及界面的美化. 遇到的问题为修改自己密码时获得当前用户的id问题.
- 重温servlet①
Servlet是单例的,是线程不安全的.比较灵活,但是容易会使两个线程产生错误 类由我们自己来写,对象由服务器生成,方法由服务器自己调用. 一个servletconfig对象对应着一段web.xm ...
- Git管理分支
管理分支:git branch 直至现在为止,我们的项目版本库一直都是只有一个分支 master.在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支.下面列举一些常见的分支策略, ...
- Scapy 网段中ping扫描
安装scapy pip3 install scapy-python3 交互式ip包构造 #scapy >>> ping = sr(IP(dst='202.100.1.1')/ICMP ...