深入理解计算机系统 第八章 异常控制流 Part2 第二遍
第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 508~530 页,共 23 页)
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/10206004.html
进程是计算机科学中最深刻、最成功的概念之一。(尽管看了书中关于进程的很多描述,我还是理解不了这句话,不是说怀疑这句话的正确性,只是自己不能理解,或许以后看得多了就能理解了)
进程和应用程序的关系
“进程的经典定义就是一个执行中的程序的示例”
那么,是否可以将它们的关系类比于 Java 中的类和对象呢?类对应于应用程序,对象对应于进程
上下文的概念
上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
每次运行程序时,操作系统会为此创建一个新的进程,然后在这个新进程的上下文中运行程序实例。
逻辑控制流
处理器的一个物理控制流可以被多个进程共享,即一个物理控制流可以拆分为由几个不同的进程控制的、在时间上不重叠的逻辑控制流
# 待了解
物理控制流和逻辑控制流是否可以联系到 CPU 的物理核和逻辑核?
进程的三个状态
1、运行
进程要么在 CPU 上执行,要么在等待被执行且最终会被内核调度
2、停止
进程的执行被挂起(suspended),且不会被调度。当收到 SIGSTOP、SIGTSTP、SIGTTIN 或者 SIGTTOU 信号时,进程就停止,并且保持停止直到它收到一个 SIGCONT 信号,在这个时刻,进程再次开始运行。(信号是一种软件中断的形式)
3、终止
进程永远地停止了。进程回音三种原因终止:(1)收到一个信号,该信号的默认行为是终止进程,(2)从主程序返回,(3)调用 exit 函数
注:
提到的几个信号的意思如下:

# 疑问
感觉“停止”状态跟“运行”状态的等待被执行阶段是一样的,这两者之间有什么差别吗?
从 8.1 节的最后一段提到了进程被抢占即被挂起,感觉跟这里的挂起对应不起来
并发、并发流、并行、并行流、时间片、时间分片
当两个或多个逻辑流在时间上有交叉时,我们称之为并发流,这两个或多个流被称为并发地运行。
多个流并发地执行的现象被称为并发(concurrency)。一个进程和其他进程轮流运行的概念成为多任务(multitasking)。一个进程执行它的控制流的一部分的每一个时间段叫做时间片(time slice)。因此,多任务也叫做时间分片(time slicing)。
并发流的思想与流运行的处理器核数或者计算机数无关。如果两个流在时间上重叠,那么它们就是并发的,它是并发流的一个真子集。如果两个流并发地运行在不同的处理器核或者计算机上,那么我们称它们为并行流(parallel flow),它们并行地运行(running in parallel),且并行地执行。
不太明白并发与并行的区别,先记住并行流是并发流的真子集吧,并行流一定是并发流,并发流不一定是并行流。
私有地址空间
私有地址空间是进程为每个程序提供的一种假象,好像它独占地使用系统地址空间。
其实这个私有地址空间好像也叫做虚拟内存,“虚拟”,顾名思义,并不是真实的物理内存。
但是,尽管私有地址空间是假象、是虚拟的,每个进程的实际占有的空间在这个进程被终止前都是不能被其他进程读写的。从这个意义上说,这个地址空间是私有的。
内核
内核即操作系统常驻内存的部分
用户模式、内核模式
1、关于模式位
之前理解错了,之前以为设置的模式位有各种值,现在看来,好像只有两种状态,设置了和没设置
设置了就是内核模式,没设置就是用户模式
2、权限
处于用户模式的进程不能执行特权指令,比如停止处理器、改变模式位,或者发起一个 I/O 操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。
3、所谓的内核模式
进程从用户模式变为内核模式的唯一方法是通过异常(中断、故障或者陷入系统调用)。当异常发生时,控制传递到异常处理程序,处理器将模式从用户模式变为内核模式。处理程序运行在内核模式中,当它返回到应用程序代码时,处理器就把模式从内核模式改回到用户模式。(我的理解:即,发生异常时,进程陷入内核模式,然而此时并不会让进程随意执行指令,而是处理器根据异常处理程序来在内核模式下做特定的事)
我的一点理解,不知道对不对
用户模式和内核模式都是隶属于进程的,可以看做进程的两种身份,内核(操作系统常驻内存的部分)既可以代表进程在用户模式下运行、也可以代表进程在内核模式下运行,但并没有一个单独的内核进程,即内核在做这些事情的时候,是借助的某个进程的名义。
fork
创建子进程,关于比较难理解的一次调用、两次返回,我的理解如下:
在调用 fork 之后,子进程立刻产生,且立刻获得与父进程相同的任何东西(PID除外),那么函数的返回值肯定也是有的,但是值不同,父进程返回的是子进程的PID,子进程返回的是PID
这么看,父进程和子进程有两个值不一样,一是fork返回的值不一样,一个是PID不一样
其他的值都一样(其他的虽然是副本、是不同对象,但值一样)
进程的生命周期:
被创建 → 运行或被挂起 → 终止 → 僵死进程 → 被回收(即,不存在)
进程的回收操作一般由其父进程发起
进程组
8.5.2 小节中提到了进程组的概念,第一次听到这个概念,进程组是进程的集合,每个进程都只属于一个进程组,很多命令可以直接以进程组为操作对象,操作目标进程组中的所有哦进程
深入理解计算机系统 第八章 异常控制流 Part2 第二遍的更多相关文章
- 深入理解计算机系统 第八章 异常控制流 Part1 第二遍
第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/101651 ...
- 深入理解计算机系统 第八章 异常控制流 part2
关于进程,需要关注其提供给应用程序的两个关键抽象: 1.一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器 2.一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统 ...
- 深入理解计算机系统 第八章 异常控制流 part1
本章主旨 第八章的目的是阐述清楚应用程序是如何与操作系统交互的(之前章节的学习是阐述应用程序是如何与硬件交互的) 异常控制流 异常控制流,即 ECF(exceptional contril flow) ...
- CSAPP:第八章 异常控制流1
CSAPP:第八章 异常控制流1 关键点:异常 8.1 异常8.2 进程 现代系统通过使控制流发生突变来对这些情况做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Cont ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP:第八章 异常控制流2
CSAPP:第八章 异常控制流2 关键点:进程控制.信号 8.4 进程控制8.5 信号 8.4 进程控制 Unix提供了大量从C程序中操作进程的系统调用.8.4.1 获取进程ID 每个进程都有一 ...
- csapp:第八章 异常控制流ECF
第八章 异常控制流ECF 8.1 异常 Exception graph LR E[异常Exception]-->E2[中断:异步异常] E-->E3[同步异常] E3-->陷阱 E3 ...
- [CSAPP笔记][第八章异常控制流][呕心沥血千行笔记]
异常控制流 控制转移 控制流 系统必须能对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获,也不一定和程序的执行相关. 现代系统通过使控制流 发生突变对这些情况做出反应.我们称这种突变为异常 ...
- 深入理解计算机系统 第二章 信息的表示和处理 Part2 第二遍
<深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 29 ~ 34 页) 第一遍对应笔记链接 https://www.cnblogs.com/s ...
随机推荐
- Flask的请求扩展
from flask import Flask,request app = Flask(__name__) 一.请求前 before_request 用法 @app.before_request de ...
- 个人考场VIM配置
前言 这个是我个人使用的Vim配置.双引号杠掉的部分是关于光标行列高亮(觉得难受而杠)和输入左括号同时打上右括号的(不习惯),如果要启用的话去掉引号即可. 将以下要启用的输入到$“./vimrc”$中 ...
- Spark执行流程(转)
原文地址:http://blog.jobbole.com/102645/ 我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使 ...
- day19作业
1.什么是对象?什么是类? 对象是特征和功能的结合体 类是一系列对象相同的特征和技能的集合体 2.绑定方法的有什么特点 绑定方式是由对象来调用类内部的函数,特点是会把对象当作第一个参数传入 ...
- Shell进阶精品课程
课程链接 Shell精品进阶教程:理解Shell的方方面面 课程目标 系统性的掌握shell相关知识,进阶shell脚本能力,对shell各方面了然于心 适用人群 具备shell基础但想深入.系统性掌 ...
- Java基础(二十四)Java IO(1)输入/输出流
在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称为输出流. 输入流的指向称为源,程序从指向源的输入流中读取数据. 输出流的指向是字节要去的目的地, ...
- Java基础(二)数据类型
数据类型主要分为基本类型和引用类型两大类. 一.基本类型 1.基本类型又分为数值类型和boolean类型, (1)数值类型包括浮点数类型.整数类型和字符类型 整型 ...
- Redis(三)Redis附加功能
一.慢查询分析 许多存储系统(例如MySql)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息 ...
- 2017.12.21 学习vue的新得
温故而知新,这句话说的真的有道理.每次回顾vue总会学到不一样的知识点,我就在想,我第一遍到底看了什么? 废话不多说,简要记录今天的所得: 1.v-if 与 v-show 同:都是条件渲染 异:渲染的 ...
- HyperLPR车牌识别
简介 本文基于HyperLPR进行修改,完整代码参考https://github.com/Liuyubao/PlateRecognition. HyperLPR是一个使用深度学习针对对中文车牌识别的实 ...