zsy619
23
所在小组
第六组
组内昵称
慎思明辨笃行
你的心得体会
第八章 异常控制流(8.5信号)
一种更高层次的软件形式的异常,称为unix信号,它允许进程中断其他进程。
低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程而言是不可见的。信号提供了一种机制,通知用户进程发生了这些异常。
8.5.2发送信号
进程组:每个进程都只属于一个进程组,进程组是由一个进程组ID来标识的。默认的,一个子进程和它的父进程同属于一个进程组。
在任何时刻,至多只有一个前台作业和0个或多个后台作业。外壳为每个作业创建一个独立的进程组,一个作业对应一个进程组。
8.5.3接收信号
进程可以通过使用signal函数来修改和信号相关的默认行为。唯一的例外是SIGSTOP和SIGKILL,它们的默认行为不能被修改。
8.5.4信号处理问题
当一个程序捕获多个信号时,容易有一些细问问题:
第九章 虚拟存储器(9.1~9.5)
需要知道:
- 虚拟存储器是硬件异常,硬件地址翻译,主存和磁盘文件,内核软件的完美交互
- 为每一个进程提供一个大的,一致的和私有的地址空间
- 将主存作为磁盘地址空间的高速缓存
- 保护每个进程的地址空间不被其他进程破坏
虚拟存储器遍布在计算机系统所有层次,硬件异常,汇编器,链接器,加载器,共享对象,文件和进程中扮演重要角色
虚拟存储器是危险的:
引用变量,间接引用指针,调用malloc动态分配程序,就会和虚拟存储器交互
如果使用不当,将遇到危险复杂的与存储器有关的错误:段错误,保护错误
物理寻址:
计算机主存被组成为m个连续的字节大小的单元数组,每个字节地址叫做物理地址;
cpu访问存储器最自然方式是使用物理地址,该方式成为物理寻址
虚拟寻址
cpu生成一个虚拟地址,来访问主存
地址翻译
将虚拟地址转为物理地址就叫做地址翻译
地址翻译需要cpu和操作系统之间的合作
主要利用储存在主存中的查询表来动态翻译虚拟地址
查询表则由操作系统进行管理
地址空间
地址空间就是一个非负整数地址的有序集合
如果地址空间中整数连续,则成为线性地址空间
一个地址空间大小由表示最大地址需要的位数来描述
虚拟地址空间就是在一个带虚拟存储器的系统中,cpu从一个有N=2^n个地址的地址空间中生成虚拟地址,这个地址空间成为虚拟地址空间
那当然也有物理地址空间,与系统中物理存储器的M=2^m个字节对应
smgu
25
所在小组
第四组
组内昵称
彳亍
你的心得体会
回收子进程:
内核并不是立即把终止的进程从系统中清除->终止但还未被回收的进程称为僵死进程(不运行,但仍消耗系统内存资源)(zombie);init进程的PID为1,系统启动时由内核创建,它不会终止,是所有进程的祖先->内核会安排init进程去回收孤儿进程;waitpid、wait->P516;waitpid返回已终止子进程的PID时,这个进程已经被回收;
逐级缓存的思想。
(1)前有硬件上弥补CPU与内存间速度差距的SRAM高速缓存;
(2)现有软件上虚拟内存系统中页面的调度(缓存PTE的TLB、SRAM、DRAM、磁盘)(在硬件上缓存的不止指令和数据,还有虚拟寻址用的页表、页表条目、虚拟页)(页作为磁盘和较高层的主存之间的传输单位)(主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址)
(3)再细到对内存空闲块的管理,页是分类快速“逐级”索引的思想,划分大小类级别,维护一个空闲链表数组。
所在小组
第二组
组内昵称
可可
心得体会
虚拟寻址
- 内存我们可以看做一个连续的字节数组
通过MMU(memory management unit) 计算机把虚拟地址转变为虚拟地址
虚拟内存作为缓存工具
- 虚拟内存在磁盘
- 磁盘的开销很大,引入DRAM老缓存虚拟内存
- DRAM写回策略为写回,而不是直写(简单说这样减少开销)
- DRAM与虚拟内存直接全相联
这里虚拟内存做为媒介存储这真正的数据,也和物理内存打着交道。
页表
位于内存的页面,由操作系统维护
- 表示某个页是否缓存在页中
命中
- OS → PTE → PP → return address
缺页
- OS->PTE->VP->PP->return address
- 可能会涉及写回
内存管理
操作系统为每个进程提供了一个独立的页表
- 独立的地址空间,这样我们不用关心代码和数据的实际地址
- 内存分配, 连续的虚拟地址可以再不连续的物理内存上,而这一切都由OS保证
Q: vp → pp如何进行地址翻译
内存保护
通过在pte上加一些特殊标志位来规范全县
地址翻译
- n位虚拟地址 = VPO + VPN
- VPN +PTE → PPN
- PPN-> Address + PPO = 具体地址
TLB(加速)
不是改进了什么方法,而是改变了位置
把内存中的PTE缓存进MMU中的TLB
多级页表
扛不住的内存
- PPN来自最后一个
- 多个页表大小不一
内存映射
fork share都变的得心应手
gaohua
30
所在小组
第七组
组内昵称
高华
心得体会
异常做为异常控制流的一种形式,一部分由硬件实现,一部分由软件实现;
信号是一种更高层的软件形式的异常,一个信号就是一条小消息,通知进程系统中发生了一个某种类型的事件;
虚拟内存提供了三个重要的能力:
- 它将主存看作是一个存储在磁盘上的地址空间的告诉缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存
- 它为每个进程提供了一致的地址空间,从而简化了内存管理
- 它保护了每个进程的地址空间不被其他进程破坏
虚拟内存是沉默地、自动地工作的,不需要应用程序员的任何干涉,这是它成功的最重要的原因。
所在小组
第四组
组内昵称
魏琮
你的心得体会
9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM)。
虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互。
为每个进程提供一个大的,一致的和 私有的地址空间。
提供了3个重要能力。
将主存看成磁盘地址空间的高速缓存。
只保留了活动区域,并根据需要在磁盘和主存间来回传送数据,高效使用主存。
为每个进程提供一致的地址空间
简化存储器管理
保护了每个进程的地址空间不被其他进程破坏。
程序员为什么要理解它?
虚拟存储器是中心的。
遍布在计算机系统所有层次,硬件异常,汇编器,连接器,加载器,共享对象,文件和进程中扮演重要角色。
虚拟存储器是强大的。
可以创建和销毁存储器片(chunk)
将存储器片映射到磁盘文件的某个部分。
其他进程共享存储器。
例子
能读写存储器位置来修改磁盘文件内容。
加载文件到存储器不需要显式的拷贝。
虚拟存储器是危险的
引用变量,间接引用指正,调用malloc动态分配程序,就会和虚拟存储器交互。
如果使用不当,将遇到复杂危险的与存储器有关的错误。
例子
一个带有错误指针的程序可以立即崩溃于段错误或者保护错误。
运行完成,却不产生正确结果。
本章从两个角度分析。
虚拟存储器如何工作。
应用程序如何使用和管理虚拟存储器。
虚拟内存作为缓存工具 在讲述这一小章之前,必须交代一下我对虚拟存储器概念的存疑。 原本我以为虚拟存储器=虚拟内存。 以下是虚拟内存的定义 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换 而在下面的定义我们可以看到CSAPP中认为虚拟存储器是存放在磁盘上的。 在此,我们姑且当做两者是不同的东西,以后有更深刻的理解,再思考。 缺页 在虚拟存储器的习惯说法中,DRAM缓存不命中称为缺页。 处理过程如下:
读取虚拟地址所指向的PT。
读取PTE有效位,发现未被缓存,触发缺页异常。
调用缺页异常处理程序
选择牺牲页。
如果牺牲页发生了改变,将其拷贝回磁盘(因为是写回)
需要读取的页代替了牺牲页的位置。
结果:牺牲也不被缓存,需要读取的页被缓存。
中断结束,重新执行最开始的指令。
在DRAM中读取成功。
虚拟存储器是20世纪60年代发明的,因此即使与SRAM缓存使用了不同的术语。
块被称为页。
磁盘和DRAM之间传送页的活动叫做交换(swapping)或者页面调度(paging)。
有不命中发生时,才换入页面,这种策略叫做按需页面调度(demand paging)。
现代系统基本都是用这个
flash
32
所在小组
第七组
组内昵称
李佳
心得体会
• 上下文切换:内核为每个进程维持一个上下文,重启一个被抢占的进程所需的状态。
• 调度:内核决定可以抢占当前进程,重新启动一个进程的决定。1.保存当前进程上下文。2.恢复某个被抢占的进程。3.将控制权交给这个新恢复的进程。
• 虚拟存储器:为每个进程提供一个大的,一致的和私有的地址空间,根据需要在磁盘和主存之间来回传送数据,保护了每个进程的地址空间不被其他进程破坏。
• 虚拟寻址:通过虚拟地址来访问主存,虚拟地址先转换为物理地址。
• 虚拟存储器,主存中每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
• 未分配的页在物理存储器中不存在,未缓存的页在主存中不存在,缓存的当前缓存在物理存储中已分配。
• 当页未命中时,系统会牺牲一个页,将其修改为未缓存的状态,然后从磁盘拷贝需要的内容到存储器中随后返回。
• 虚拟存储器管理存储器:允许每个进程的存储器使用相同的基本格式,并且可以按照需要自动调入数据页
• 虚拟寄存器似的每个进程只能修改自己的虚拟页面,使得分离不同进程的私有寄存器变得容易。
所在小组
第四组
组内昵称
Murphy
心得体会
虚拟化的概念在计算机科学中是非常重要的,当你准备虚拟化一个资源的时候,你就要向请求该资源的用户展现这个资源的不同类型的视图,这种视图通常是资源的某种抽象。
我们可以通过干预和介入对资源的访问过程来完成虚拟化的过程。
磁盘是一种经典的例子。尽管磁盘的结构复杂,但是磁盘控制器给上层应用的视图是一系列的逻辑块。磁盘控制器就是拦截了内核发送的逻辑块转换为了实际的物理地址。
对于访问内存的指令的拦截,是由一个叫MMU的内存管理单元所完成的。
当CPU执行一个指令的时候,其访问的虚拟地址,这个虚拟地址会被MMU转换为实际的物理地址,然后对应我们想要的数据的物理地址。
使用MMU管理内存的优点?
- 更为有效的使用主存(你可以将虚拟内存视为存储在磁盘上的字节序列,而主存DRAM就像是虚拟内存的缓存)
- 更为简单的管理内存
- 地址空间独立,防止其他进程访问,保护内存。
虚拟地址空间通常比物理地址空间大的多,且对于所有进程中,其看到自己的虚拟空间是相同的。这种简单易操作的模型正是MMU所想提供的。
虚拟内存中将数据分成页。每一个页都将分配一个数字,这些页面的一部分被存储在了物理的DRAM中,而有一些则没有。系统中存在map帮我们缓存虚拟内存到DRAM的映射。
DRAM在未命中的情况下就得去磁盘里面去取数据,这会是巨大的消耗。这时候,块的大小变成了一个关键的议题,块太小会导致经常性的未命中,而块太大则会导致内存不够用,也会导致未命中。
虚拟内存系统很少直接写入磁盘,而是会尽可能的延缓这个过程而增加运行速度。
负责映射的map称之为page table(PTE),存储在内存中,由内核维护,每个进程都有,key是虚拟页的编号,而value是其存储的物理地址。
如果未命中,就会导致缺页异常,然后从磁盘里把数据读到内存中,之后重新执行。如果内存满了,就要将一个内存页删掉再读。
虚拟内存找到对应物理地址的方法和高速缓存相近,是由虚拟页的号码和在此页中的offset所组成的,虚拟块中的偏移量和物理块中的offset是相等的。除此以外还有个valid记录此条信息是否合法。
因为page table是存储在内存中的,内存页毕竟还是不够快,所以我们很明显可以用SRAM缓存来加速这个过程,而这块SRAM就是TLB。
尽管本质上目前计算机的最高寻址位是2的48次方,但是这个数量依旧是过于庞大,对于一页2的12次方大小的页,需要2的36次方条记录才可以完成完备的映射。
所以在现代计算机中使用了多页表的方式,不存储大多数不用的地址空间,从而达到减少内存使用的目的。
并发(concurrency/concurrent)和并行(parallel)
一个逻辑流的执行在时间上与另一个流重叠,称为并发流(concurrent flow).这两个流被称为并发的运行
- 多个流并发地执行的一般现象被称为并发(concurrency)
- 一个进程和其他进程轮流运行的概念称为多任务(multitasking)
- 一个程序执行它的控制流的一部分的每一时间段叫做时间片(time slice)
- 多任务也叫做时间分片(time slicing)
- 一个逻辑流可以有多个不连续的时间片
并发流的思想与流运行的处理器核数或者计算机数无关。如果两个流在时间上重叠,那么它们就是并发的,即使运行在同一个处理器上
如果两个流并发地运行在不同的处理器核心或者计算机上,即为并行流(parallel flow)。它们并行地运行(running parallel ),且并行地执行(parallel execution)
brk: 重置堆顶
/proc 文件系统就许多内核数据结构的内容输出为一个用户程序可以读的文本文件的 层次结构
/sys 输出关于系统总线和设备的额外的底层信息
进程
- 每个进程都有一个父进程
- 当子进程终止时,父进程会得到通知并能取得子进程的退出状态
命名空间–> PID, UTC
进程组
- 每个进程也属于一个进程组
- 每个进程主都有一个进程组号,改号等于该进程组组长的PID号
- 一个进程只能为它自己或子进程设置进程组ID号
进程组组长-groupleader
信号
更高层的软件形式的异常
- 一个待处理处理信号最多只能被接受一次
- 一个进程处理多个信号时,会出现阻塞
- 系统调用可以被中断
虚拟内存
页表
判定虚拟页是否缓存
即提供了怎么样的映射关系
你可以利用Linux的getrusage函数监测缺页的数量
虚拟内存作为内存管理的工具的优点
- 简化链接,即每个进程看到的都是同样的映射关系,共享函数的偏移量也是一致的
- 简化加载
- 简化共享
- 简化内存分配,程序看到的是连续的内存,但是可能在物理内存的多个不连续的位置,充分利用物理内存空间
所在小组
第六组
组内昵称
杨凯伟
心得体会
异常控制流(Exceptional Control Flow)是系统改变控制流的方式,用于发送系统事件消息。
异常
异常是 ECF 的一种形式,它一部分由硬件实现,一部分由操作系统实现。异常的处理需要硬件和软件紧密合作。系统中可能的每种类型都分配了一个唯一的非负正数的异常号,一部分由处理器的设计者分配,其他号码由操作系统内核的设计者分配。
- 中断(Interrupt):来自处理器外部的异常称作异步异常(Asynchronous Exception),也称作中断。引发中断的事件一般由处理器引脚电平的变化导致,比如数据到达或键盘按下Ctrl+C。系统无法预测中断何时到来,所以是异步的
- 陷阱,程序执行系统调用(syscall)的方式。内核的代码与资源是用户级程序无法访问的。为了请求系统资源,用户级程序主动发起一个异常,使控制流切换到内核状态,调用系统资源。系统库提供的函数,如open,read等,实际上是系统调用的封装。
- 故障,用户级程序执行某条指令时发生错误,比如除0,缺页,段错误(Segmentation Fault)等引发异常,有些是可恢复的,比如缺页,恢复异常时,这条指令重新执行。
- 终止,如不可恢复的致命错误导致,一般是硬件错误。如段错误,会导致程序中止(Abort)。
进程
进程是程序可执行文件的实例化,因为可执行文件只存储一份在磁盘中,而可执行文件可以被加载到内存的不同位置产生多个进程。操作系统为进程提供了两个抽象:逻辑控制流(Logical Control Flow,即貌似独占的CPU资源)和私有的地址空间(虚拟内存)。
新创建的子进程与父进程由相同的但是独立的地址空间(由相同的变量,但是改变变量的只不会影响对方)。
在进程中 frok 创建新进程是,父进程和子进程是并发运行的独立进程,是并发执行的,没有顺序保证。
子进程执行完后变成僵尸进程(Zombie),需要父进程回收资源。如果父进程比子进程更早退出,子进程成为init进程的子进程,被自动回收。如果父进程一直不退出,僵尸子进程在内存中越积越多,将导致内存泄漏。
信号
信号是一种软件形式的异常,它允许进程和内核中断其他进程。
kill -<signum> <pid>
,当pid为负数,表示gpid(进程组 PID)
未处理信号不会排队的,所以不能使用信号来统计事件发生的次数。
如果两个类型 k 的信号发送给一个目的进程,而因为目的进程当前正在执行信号 k 的处理程序,所以信号 k 被阻塞了,那么第二个信号就简单的丢弃了。
关键思想是,如果存在一个未处理的信号就表明至少又一个信号到达了。
RockLD
37
所在分组
第二组
组内昵称
文弱书生
心得体会
1.计算机主存是一个M个连续的字节大小的单元组成的数组,每个字节对应一个唯一的物理地址;
2.虚拟寻址,CPU通过生成一个虚拟地址来访问内存,虚拟地址在传输到内存之前会转换成物理地址;
3.地址空间是一个非负整数地址的有序集合;
4.虚拟内存可以作为缓存工具,在作为缓存工具时:
任意时刻,虚拟页面的集合都分为三个不相交的子集:
未分配的:虚拟地址还没分配的页。没分配的部分没有任何数据相关联,不占用任何磁盘空间。
缓存的: 当前已经缓存在物理内存的。
未缓存的:没缓存在物理内存中的已分配的页。
5.虚拟内存可以作为内存管理的工具。
好处是简化链接、简化加载、简化共享、简化内存分配。
6.虚拟内存可以作为内存保护的工具
计算机为操作系统提供控制内存访问的方法,不允许用户进程修改它的只读代码段。
所在小组
第六组
组内昵称
钟荣荣
你的心得体会
虚拟内存 1.理解虚拟内存的作用:虚拟内存在计算机各个层面都扮演了重要角色,理解它有助于理解计算机系统;熟练使用虚拟内存可以给应用程序助力;避免虚拟内存使用不当的错误;
2.物理和虚拟寻址:物理寻址看起来好像访问数组;虚拟寻址通过虚拟地址访问主存,先将虚拟地址翻译成物理地址;
3.地址空间:地址空间是一个非负整数的有序集合;地址空间的概念区分了数据对象和它们的属性;
4.虚拟页面的集合:未分配的:不占用任何磁盘空间;缓存的:当前已缓存在物理内存中已分配页;未缓存的:未缓存在物理内存中的已分配页