读书笔记:《深入理解计算机系统》第八章 异常控制流

第一次作业:认识异常分类,进程的切换及状态。

第二次作业:认识信号,非本地跳转。

 

异常控制流是一个很宽泛的概念,我们经常提到的异常是异常控制流的一种形式,一部分由硬件实现,一部分由操作系统实现。

主要分为4类,中断,陷阱,故障,中止。

除了中断是硬件方面的问题,其他都是系统方面的问题。

 

异常是允许操作系统内核提供进程概念的基本构造块,而进程是计算机科学中最深刻,最成功的的概念之一。

在现代系统中,进程是切换执行的。举个例子,我们一边听音乐一边浏览网站,看起来我们是同时执行的,其实是切换执行的,那为什么浏览网站的时候音乐还在播放呢,简单的来说是因为系统中缓冲了一些资源。

以上的举例是建立在单处理器的基础上,随着科技的发展,现在我们的电脑一般都是多核处理器,也就是说可以真的做到并发执行。

再谈一下并行与并发这两个概念,并发与处理器的个数没有关系,只要两个逻辑控制流有重叠或者交错就都是并发.并行是并发的一个特例.并行是指多个处理器同时执行。

 

操作系统内核使用一种称为上下文切换的较高层次的异常控制流来实现多任务。程序就运行在进程的上下文中。

内核为每个进程维持一个上下文,里面包含了进程的一些信息。然后在进程执行的一些时刻,内核通过调度器决定当前运行哪个进程。

举个例子,A进程正在执行,然后系统内核收到信号,中止A进程,运行B进程。过了一会,系统决定中止B进程继续运行A进程,于是通过A进程中的上下文继续运行A进程。

 

从程序员的角度来说,进程一般处于运行,停止,终止三个状态之一。

父进程通过调用fork函数创建一个新的运行的子进程。新创建的子进程几乎但不完全与父进程相同,子进程得到与父进程用户级虚拟地址空间相同的一份副本,包括代码和数据段,堆,共享库以及用户栈。

fork函数是一次调用,两次返回,一次在调用进程(父进程)中,一次在创建的子进程中,父进程中fork会返回子进程的pid,而子进程会返回0.

除了fork函数外,还有一些与进程相关的函数。

waitpid函数功能比较多,主要是判断并针对子进程的状态进行一些操作。

sleep函数将一个进程挂起一段指定的时间。

execve函数在当前进程的上下文中加载并运行一个新程序,使用旧程序的地址空间。与fork一次调用返回两次不同,execve调用一次从不返回。

 

当一个进程因为某种原因终止时,内核并不会立即把它从系统中清楚,进程会保持在一种已终止的状态中,等待被它的父进程收回。当被收回后,子进程就不存在的了。

一个终止了但还未被收回的进程成为僵死进程,会占用系统资源。

 

信号是一种更高层次的软件形式的异常,它允许进程和内核中断其他进程。

传送一个信号到目的进程分为发送信号和接受信号两个步骤。

Unix系统提供了大量向进程发送信号的机制,而所有机制都基于进程组这个概念。

每个进程都属于一个进程组,默认地一个子进程和它的父进程属于一个进程组。

可以用 /bin/kill程序,键盘,kill函数,alarm函数发送信号。

而接受信号,一般会执行下面中的一种

(1)进程终止

(2)进程终止并转储内存

(3)进程挂起等待重启

(4)进程忽略该信号

为了使得处理程序能安全的并发执行,我们要对信号进行仔细的处理。

 

C语言中提供了一种用户级异常控制流形式,称为非本地跳转,它将控制直接从一个函数转移到另一个正在执行的函数。Java中的try...catch也是这个原理。

 

参考

1.《深入理解计算机系统》第八章

2.【读薄 CSAPP】伍 异常控制流  https://wdxtub.com/csapp/thin-csapp-5/2016/04/16/

 

 

你可能感兴趣的:(计算机系统,读书笔记,计算机系统,读书笔记,异常)