异常控制流

异常控制流
在操作系统运行程序时,操作系统会把程序具体到每条指令,利用程序指针顺序执行指令以达到程序运行的目的。这些指令类似一个集合,称之为控制流。程序指针依次执行每条指令,称之为控制转移。

但是在程序运行过程中因为种种原因,程序状态发生变化,程序指针不会依次执行这些程序指令,引起程序状态变化的是存在于系统中的一些事件,程序状态的变化称为异常
什么是异常呢?
异常既是指程序状态的变化,程序运行时因为种种事件而导致程序不能继续运行下一条指令转而执行异常处理程序。异常可以分为四种类型:
1.中断
由系统I/O发出,一般处理程序运行完,会返回到程序的下一条指令
2.陷阱
系统调用,一般程序运行在用户模式下,如果调用了系统库函数,这时便会产生陷阱,进入内核模式进行处理
3.故障
一般是程序发生错误,该错误是可修复的,比如浮点数异常、段错误、读虚拟内存出错,一般从处理程序完成后可以返回当前指令,也可以终止引起故障的程序。也有可修复的错误,比如读取虚拟内存的错误,这时
系统会重新分配内存,然后再返回程序当前的指令继续执行
4.终止
指不可修复的错误,处理程序处理完成不会将控制权交还给应用程序,而是终止它异常产生过程
异常处理过程

每个异常事件或系统库函数都有一个编号,在操作系统启动时,会初始化一张异常转移表,该表每个条目都包含着一个编号和异常处理程序的地址,当发生异常时,系统首先从表中找到该异常编号的条目,然后跳转

到指定地址运行异常处理程序,待异常处理程序完成后,便将控制权交还给应用程序或终止应用程序


在操作系统中,进程是操作系统中最成功且最伟大的概念之一,异常是进程运行基础,因为创建一个进程得调用系统库函数fork,系统发现程序调用了库函数fork,便会对比异常表,找到fork函数的标号的那个条目然后进入内核模式处理,再返回应用程序。
进程就是一个运行中的程序的实例。常常会给我们一个假象,操作系统只运行这个程序,整个操作系统的内存空间只给这个程序使用,即使系统中运行了多个进程。这两个假象都是由逻辑控制流和私有地址空间导致


1.逻辑控制流
假设系统中运行了两个进程A和B,A进程运行一段时间后,系统会认为A进程已经运行了一段时间,便会把A进程挂起,保存A进程的上下文(A进程运行时的环境),然后把控制权交给B进程,B进程运行一会,系统又会

把控制权交给A进程,恢复A进程上下文环境,以此往复。这种现象称之为多任务。每个进程运行的时间称之为时间片,多任务也叫时间分片。时间片一般很短,用户察觉不出,所以造成假象,只有我的程序在运行
2.私有地址空间
每个进程都有自己的运行地址空间,所以才我们认为整个系统内存都由我的程序在使用
系统函数错误处理
一般系统级函数调用因某些原因导致调用出错,会设置errno来表明出错原因,在编程时可以调用strerror(errno)来打印错误信息。
创建一个进程可以调用fork,fork会返回两次,在父进程一次返回子进程id,子进程一次返回0.子进程会拷贝一份父进程的地址空间,但是运行时他们都有各自的私有地址
进程终止的三种方式
1.主程序返回
2.信号
3.调用exit
进程终止后没有被父进程回收资源,那么该进程便是一个僵尸进程,如果父进程结束,那么这个僵尸进程会被init进程管理
可以使用wait和waitpid来回收子进程资源,当waitpid第一个参数为-1时,表示等待所有子进程结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值