异常
异常是异常控制流的一种形式,部分有硬件实现,部分由操作系统实现,是控制流的一种突变,用以响应处理器某些状态变化。
异常.PNG 异常处理.PNG异常表: 异常表.PNG
异常的类别: 异常的类别.PNG
中断: 中断.PNG
陷阱和系统调用:
陷阱是一种有意的异常,是执行一条指令的结果。陷阱的一个最重要的作用就是实现系统调用。处理器提供了一个特殊的
syscall n
指令,当应用程序执行syscall指令时,会导致一个跳转到异常处理程序的陷阱,这个程序会解析该指令的参数,然后跳转到对应的系统调用。
系统调用.PNG
故障和终止:
故障和终止.PNG
x86-64异常
x86-64系列有多大256种异常,其中0~31号为Intel架构师定义的异常,剩余未操作系统定义的中断和异常。
x86-64异常.PNGLinux/x86-64故障和终止:
Linux-x86-64故障和终止.PNG
Linux/x86-64系统调用:
Linux系统调用.PNG
Linux常用系统调用.PNG
进程
进程.PNG逻辑控制流:
逻辑控制流.PNG 注意区别这里的逻辑控制流和前面讲的控制流之间的异同。
并发流:
并发流.PNG
私有地址空间:
进程地址空间.PNG
用户模式和内核模式:
内核模式.PNG
上下文切换:
进程上下文切换.PNG
进程切换举例:
进程A和B切换.PNG 需要注意的是,上图在进行第一次上下文切换之前,内核代表进程A工作在用户模式,换句话说,操作系统里没有额外的独立内核进程。同时,上下文切换工作在内核模式,如上图的第一次上下文切换,内核先工作在进程A的内核模式,然后进入进程B的内核模式。
系统调用的错误处理
系统调用的错误处理.PNG进程控制
获取进程ID:
创建和终止进程:
进程状态.PNG
终止进程.PNG
创建进程.PNG
回收子进程:
僵尸进程.PNG
waitpid函数.PNG
函数waitpid的等待集合由其参数pid决定,如果pid > 0,则等待节合就是一个单独的子进程,它的进程ID等于pid;如果pid = -1那么等待集合就是由父进程的所有子进程组成。我们还可以修改waitpid函数的默认行为:
waitpid的默认行为.PNG
检查已回收子进程的退出状态:
检查已回收子进程的退出状态.PNG
简化版waitpid函数.PNG
让进程休眠:
让进程休眠.PNG
加载并运行程序
execve函数.PNG参数和环境变量组织结构.PNG
用户程序的栈结构.PNG
操作环境变量数组.PNG
程序和进程.PNG
信号
低层次的硬件异常是由内核异常处理程序处理的,正常情况下对用户是不可见的,而信号提供了一种机制,通知用户发生了这些异常。每种信号类型都对应某种系统事件,例如进程试图除零,或者进程执行了一个非法指令,或者有非法的内存引用,或者ctrl+c、kill命令等。
Linux信号.PNG发送一个信号到目的进程由两个步骤组成: 发送信号.PNG 接收信号.PNG
待处理信号: 待处理信号.PNG
发送信号: 进程组.PNG setpgid函数将进程pid的进程组改为pgid,如果pid是零,则改变本进程的进程组id;如果pgid是零,则将pid作为进程组id。 kill命令.PNG
网友评论