第三章、进程管理

3.1进程

1.进程就是处于执行期的程序,但进程并不仅仅局限于一段可执行程序代码

2.执行线程:

简称线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程计数器。

3.在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。

4.程序本身并不是进程,进程是处于执行期的程序以及相关的资源的总称。

5.fork():使进程在创建它的时候开始存活;

Exec():创建新的地址空间,并把新的程序载入其中;

Exit():退出执行。

3.2进程描述符及任务结构

1.进程描述符:

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

2.进程描述符中包含的数据能完整地描述一个正在执行的程序:它打开的文件,进程的地址空间,挂起的信号,进程的状态,还有其他更多信息。

3.2.1分配进程描述符

Linux通过slab分配器分配task_struct结构。

由于现在用slab分配器动态生成task_struct,所以只需在栈底或栈顶创建一个新的结构struct thread_info。

每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。

3.2.2进程描述符的存放

内核通过一个唯一的进程标识值或PID来标识每个进程。

在内核中,访问任务通常需要获得指向其task_struct的指针。

3.2.3进程状态

(五种进程状态)

TASK_RUNNING(运行)

TASK_INTERRUPTIBLE(可中断)

TASK_UNINTERRUPTIBLE(不可中断)

_TASK_TRACED

_TASK_STOPPED(停止)

3.2.4设置当前进程状态

使用set_task_state(task,state)函数

3.2.5进程上下文

可执行程序代码是进程的重要组成部分。这些代码从一个可执行文件载入到进程的地址空间执行。一般程序在用户空间执行。当一个

程序执行了系统调用或者触发了某个异常,它就陷入了内核空间,此时,我们称内核“代表进程执行”并处于进程上下文中。

3.2.6进程家族树

继承关系

3.3进程创建

Unix采用了与众不同的实现方式,它把其他操作系统的步骤分解到两个单独的函数中去执行:fork()和exec();

Fork()通过拷贝当前进程创建一个子进程。

Exec()函数负责读取可执行文件并将其载入地址空间开始运行。

3.3.1写时拷贝

只在有需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。

3.3.2 fork()

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

do_fork完成了创建中的大部分工作,该函数调用copy_process()函数,然后让进程开始运行。

3.3.3 vfork()

除了不拷贝父进程的页表项外,vfork()系统调用和fork()的功能相同。

vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行的。

3.4线程在Linux中的实现

3.4.1创建线程

线程的创建和普通进程的创建类似,只不过在调用clone()的时候需要传递一些参数标志来指明需要共享的资源:

Clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,0);

传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类。

3.4.2内核线程

在后台执行一些操作

3.5进程终结

3.5.1删除进程描述符

进程终结时所需的清理工作和进程描述符的删除被分开执行。在父进程获得已经终结的子进程的信息后,或者通知内核它并不关注

那些信息后,子进程的task_struct结构才能被释放。

3.5.2孤儿进程造成的进退维谷

如果父进程在子进程之前退出,必须有机制来保证子进程能找到一个新的父进程,否则这些成为孤儿的进程就会在退出时永远处于

僵死状态,白白的耗费内存。

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

  1. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  2. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  3. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

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

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  5. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  6. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  7. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  8. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

  9. 《linux内核设计与实现》第一章

    第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...

  10. Linux内核设计与实现 第十七章

    1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 ...

随机推荐

  1. Python3编写网络爬虫05-基本解析库XPath的使用

    一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...

  2. 多个Activity和Intent

    Intent是Android应用程序组件之一,在Android系统当中表示一种意图,Intent中包含了一组信息: 最重要的内容是action(动作)和data(数据) Component name ...

  3. IOS - 执行时 (经常使用函数)

    能够通过NSObject的一些方法获取运行时信息或动态运行一些消息: /*Returns a Boolean value that indicates whether the receiving cl ...

  4. Ceph的BlueStore总体介绍

    整体架构 bluestore的诞生是为了解决filestore自身维护一套journal并同时还需要基于系统文件系统的写放大问题,并且filestore本身没有对SSD进行优化,因此bluestore ...

  5. metamask源码学习-metamask-controller.js

    The MetaMask Controller——The central metamask controller. Aggregates other controllers and exports a ...

  6. leetcode 199. Binary Tree Right Side View 、leetcode 116. Populating Next Right Pointers in Each Node 、117. Populating Next Right Pointers in Each Node II

    leetcode 199. Binary Tree Right Side View 这个题实际上就是把每一行最右侧的树打印出来,所以实际上还是一个层次遍历. 依旧利用之前层次遍历的代码,每次大的循环存 ...

  7. 如何使用zabbix初级监控

    如何用zabbix监控(初步使用)? 前提:必须启动mysql 和zabbix目录下的sbin中的zabbix_agentd zabbix_server,还有nginx以及php否则会报错,因为zab ...

  8. 理解Express中间件

    阅读目录 一:body-parser中间件 二:cookie-parser中间件 三:express-session 中间件 四:理解使用morgan记录操作日志 回到顶部 一:body-parser ...

  9. 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)

    阅读目录 一:vue-router是什么? 二:vue-router的实现原理 三:vue-router使用及代码配置 四:理解vue设置路由导航的两种方法. 五:理解动态路由和命名视图 六:理解嵌套 ...

  10. <转>安全测试思维导图

    最近有监控到公司的某些系统在某些时间段出现大量的HTTP或者TCP连接,考虑到安全性,老大让我研究研究安全测试... 正好今晚从订阅的码农周刊(开发者头条)看到了一篇安全测试相关的帖子,做个搬运工,分 ...