所在小组
第六组
组内昵称
undefined
心得体会
信号
关于信号
信号是一个操作系统提供的基础异常机制。主要核心改了就是发生信号和接收信号
发生方可以是操作系统或其他进程,接收方则必须设置一个信号处理程序,或使用默认的信号。
信号是针对进程组而言,如果未设置信号组,则以pid为准。
信号的核心问题
信号的优先级问题,多个信号触发时,存在2类阻塞机制:隐式阻塞机制和显式阻塞机制。
针对信号处理方法,存着多个设计点:处理逻辑尽可能简单、只调用异步信号安全的函数、保存和恢复errno、阻塞所有信号并保护对共享局部数据结构的访问、volatilee声明全局变量、sig_atomic_t声明标记
不过这几个设计点暂时还是不能特别理解。
虚拟内存
虚拟内存的核心
DRAM缓存的组织结构,位于高速缓存下的主存缓存,同时为了支持缓存是否命中,以及当前缓存位于哪个物理页,则需要一个数据结构来表示,此乃页表
页命中,通过地址翻译将虚拟地址翻译成实际地址并进行读取。
缺页,则会出发一个缺页中断,将磁盘中的数据加载回内存。
虚拟内存的核心优化点:简化链接、简化加载、简化共享、简化内存分配。
这也是印证了所有计算机问题都可以通过一层代理来解决。
sadame
2020 年11 月 8 日 13:48
44
所在小组
第一组
组内昵称
SADAME
心得体会
除了基本的改变控制流的方法
跳转和分支
调用和返回
还有另一种更加复杂的机制,称之为异常控制流(exceptional control flow)。
异常控制流存在于系统的每个层级,最底层的机制称为异常(Exception) ,用以改变控制流以响应系统事件,通常是由硬件的操作系统共同实现的。更高层次的异常控制流包括进程切换(Process Context Switch) 、信号(Signal)和 非本地跳转(Nonlocal Jumps) ,也可以看做是一个从硬件过渡到操作系统,再从操作系统过渡到语言库的过程。进程切换是由硬件计时器和操作系统共同实现的,而信号则只是操作系统层面的概念了,到了非本地跳转就已经是在 C 运行时库中实现的了。
异常 Exception
这里的异常指的是把控制交给系统内核来响应某些事件(例如处理器状态的变化),其中内核是操作系统常驻内存的一部分,而这类事件包括除以零、数学运算溢出、页错误、I/O 请求完成或用户按下了 ctrl+c 等等系统级别的事件。
系统会通过异常表(Exception Table)来确定跳转的位置,每种事件都有对应的唯一的异常编号,发生对应异常时就会调用对应的异常处理代码
异步异常(中断)
异步异常(Asynchronous Exception)称之为中断(Interrupt),是由处理器外面发生的事情引起的。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的,但是可以屏蔽掉[1]。这种情况下:
需要设置处理器的中断指针(interrupt pin)
处理完成后会返回之前控制流中的『下一条』指令
比较常见的中断有两种:计时器中断和 I/O 中断。计时器中断是由计时器芯片每隔几毫秒触发的,内核用计时器终端来从用户程序手上拿回控制权。I/O 中断类型比较多样,比方说键盘输入了 ctrl-c,网络中一个包接收完毕,都会触发这样的中断。
同步异常
同步异常(Synchronous Exception)是因为执行某条指令所导致的事件,分为陷阱(Trap)、故障(Fault)和终止(Abort)三种情况。
类型
原因
行为
示例
陷阱
有意的异常
返回到下一条指令
系统调用,断点
故障
潜在可恢复的错误
返回到当前指令
页故障(page faults)
终止
不可恢复的错误
终止当前程序
非法指令
这里需要注意三种不同类型的处理方式,比方说陷阱和中断一样,会返回执行『下一条』指令;而故障会重新执行之前触发事件的指令;终止则是直接退出当前的程序。
系统调用虽然看起来像是函数调用,但实际上走的是异常控制流
非本地跳转 Non local Jump
所谓的本地跳转,指的是在一个程序中通过 goto 语句进行流程跳转,尽管不推荐使用goto语句,但在嵌入式系统中为了提高程序的效率,goto语句还是可以使用的。本地跳转的限制在于,我们不能从一个函数跳转到另一个函数中。如果想突破函数的限制,就要使用 setjmp
或 longjmp
来进行非本地跳转了。
setjmp
保存当前程序的堆栈上下文环境(stack context),注意,这个保存的堆栈上下文环境仅在调用 setjmp
的函数内有效,如果调用 setjmp
的函数返回了,这个保存的堆栈上下文环境就失效了。调用 setjmp
的直接返回值为 0。
longjmp
将会恢复由 setjmp
保存的程序堆栈上下文,即程序从调用 setjmp
处重新开始执行,不过此时的 setjmp
的返回值将是由 longjmp
指定的值。注意longjmp
不能指定0为返回值,即使指定了 0,longjmp
也会使 setjmp
返回 1。
我们可以利用这种方式,来跳转到其他的栈帧中,比方说在嵌套函数中,我们可以利用这个快速返回栈底的函数
所在小组 : 第四组
组内昵称 :LuGH
心得体会:
异常可以分为四类:中断(interrupt)、陷阱(trap)、故障(fault)和终止(abort)。
中断是异步产生的,是来自处理器外部的I/O设备的信号的结果。硬件中断不是由任何一条专门的指令造成的,从这个意义上来说它是异步的。硬件中断的异常处理程序通常称为中断处理程序(interrupt handler)。I/O设备,例如网络适配器、磁盘控制器和定时器芯片,通过向处理器芯片上的一个引脚发信号,并将异常号放到系统总线上,以触发中断,这个异常号标识了引起中断的设备。
陷阱是有意的异常,实质性一条指令的结果。就像中断处理程序一样,陷阱处理程序将控制返回到下一条指令。陷阱最重要的用途就是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
故障是由错误引起的,它可能被故障处理程序修正。当故障发生时,处理器将控制转移到故障处理程序。如果处理程序能够修正这个错误情况,它就会将控制返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核的abort例程,abort例程会终止引起故障的应用程序。
终止是不可恢复的致命错误造成的结果,通常是一些硬件错误,例如DRAM或者SRAM位被损坏时发生的奇偶错误。终止处理程序从不将控制返回给应用程序。
lvsoso
2020 年11 月 8 日 13:57
51
所在小组
第七组
组内昵称
吴奇驴
你的心得体会
1.信号:更高层次的软件形式的异常,允许进程和内核中断其他进程;
2.任何时刻,一种类型至多只会有一个待处理信号;
3. Ctrl+C 是触发 SIGINT 信号给前台的进程组里的每一个进程;
4.未处理的信号是不排队的,如果存在一个未处理的信号就表明至少有一个信号到达了,不可以用信号来对其他进程中发生的事件计数;
5. strace\ps\top\pmap. /proc;
6. DRAM 总是写回而不是直写;
7. 工作集大小超出了物理内存大小,程序会发生“抖动”,页面会不停的换进换出,性能下降。
zhilin
2020 年11 月 8 日 15:48
54
所在小组
第四组
组内昵称
zhilin
心得体会
虚拟内存
虚拟存储器又叫做虚拟内存,我们现在的操作系统普遍都支持了虚拟内存,这样做是因为我们同时运行着太多的程序了,如果不使用虚拟内存4G的内存空间很快就会被耗尽,而一旦没有了内存空间,其他程序就无法加载了。虚拟内存的出现就是为了解决这个问题,当一个程序开始运行的时候,其实是为每个程序单独创建了一个页表(这个以后讲),只将一部分放入内存中,以后根据实际的需要随时从硬盘中调入内容。当然虚拟内存不仅仅只有这个功能,我们的操作系统也是在内存中运行着的,虚拟内存同时还提供了一种保护,这样做其他进程就不会损坏掉系统的内存空间。
虚拟存储器的主要思想就是:在主存中缓存硬盘上的虚拟页(pagefile.sys),虚拟页有三个状态:未分配、缓存的、未缓存的。
① 页表
页表是一个存放在内存中的数据结构,MMU就是通过页表来完成虚拟地址到物理地址的转换。这个数据结构每一个条目称为PTE(Page Table Entry),由两部分组成:有效位和n位地址段。有效位如果是1,那么n位地址就指向已经在内存中缓存好了的地址;如果为0,地址为null的话表示为分配,地址指向磁盘上的虚拟内存(pagefile.sys)的话就是未缓存。我们来看一个典型的页表图:
虚拟页vp1,2,7,4当前被缓存在内存中,页表上有效位设置成1,分别用PTE1,2,4,7表示。VP0和VP5(PTE0、5)未被分配,VP3和VP6被分配并指向虚拟内存,但未被缓存。
② 页命中
当我们使用2100虚拟地址来访问虚拟页2的内容的时候,就是一个页命中。地址翻译将指向PTE2上,由于有效位1,地址翻译器MMU就知道VP2已经缓存在内存中了。就使用页表中保存的物理地址进行访问。
③ 缺页
我们再来看看不命中,也就是缺页的情况,当CPU需要VP3的一个字时,初始化是这样的:
PTE3有效位是0,同时地址位指向了虚拟内存(pagefile.sys),就会触发缺页异常。异常处理程序会选择牺牲一个内存(DRAM)中的页,本例中选择的是内存中的PP3页的VP4,接下来内核就从虚拟内存中拷贝VP3到内存中的PP3,并使得PTE3指向内存中的PP3,形成如下:
(注:虚拟存储器出现早于高速缓存,按照习惯的说法块被叫做页。从虚拟内存到物理内存传送页的活动就叫做页面交换。)
[quote=“tarzan, post:7, topic:1255”]
所在小组
第七组
所在小组
第五组
组内昵称
王传义
你的心得体
cori7 结构没看懂,只理解地址转换在cpu完成,非内存完成。这说明物理内存只是物理内存。
虚拟内存不同段存储第地址上不是连续的。因此在访问时候出现,小缺页,大缺页,只读三个异常。
进程的虚拟内存区域通过映射方式直接把文件加载到内存。虚拟内存存储磁盘可能swap mmap
虚拟内存出现,让动态库共享成为可能(file),虽然此时程序任务各自独占。只读 ,不然cow
因为不确定内存需求情况,需要使用动态内存 new delete
内存碎片造成heap 利用了低。
free 一个地址后,如果上下没有释放,这个地址标记为free,但是无法合并成更大的区块的。
这也引证了free释放2个方式,小于128k 128k内存区别。
忘记free为什么造成内存泄漏,因为这个区域依然标记被占用,系统并不知道
gc问题,不同语言不通处理,不是c++不提供,相关知识就学习了。1960就提出相关理论、
过去优点,可能变成今天确定 ,gc通过图来维护,c无法来维护。