## CSAPP读书日记-第八章-异常控制流-第二周

程序和进程的区别:
在这里插入图片描述
再明确下进程的经典定义:
进程是一个执行中程序的实例。

理解上面的,有助于理解fork和execve函数
fork函数是创建出一个新的子进程然后在子进程中跑相同的程序.两个程序对应两个PID(进程id)
execve函数是在当前进程的上下文中加载运行一个新的程序, 直接覆盖掉当前进程的地址空间, 并没有创建出新的进程. 新旧程序的PID是一样的.

补充:进程是如何并发执行的?
操作系统有定时的中断机制,或者某个进程想读取系统文件,使用"陷阱"异常。
无论是中断还是陷阱,都会使当前进程从用户模式切换到内核模式。
只要进入到内核模式, 内核就可以对当前的进程进行调度, 把当前控制权交给另外一个进程, 这种机制叫做上下文切换. (每个进程都跑在一个上下文中).
这种短时间内的下文的切换,就是并发。

非本地跳转

这是一种用户级异常控制流形式, 其用来规避正常的调用/返回栈规则, 并且直接从一个函数分支到另一个函数。它是通过setjmp和longjmp实现的.

1.setjmp函数在env缓冲区中保存当前的调用环境,以供后面longjmp使用,并返回0,调用环境包括程序计数器、栈指针和通用目的寄存器。

2.longjmp函数从env缓冲区中恢复调用环境,然后从最近一次setjmp的env中恢复,恢复的时候相当于setjmp函数的返回,只是返回值非0(longjmp的第二个参数)。longjmp函数只有调用,没有返回。此外,setjmp函数调用一次,可以返回多次。

在这里插入图片描述

实用工具:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zjx130/article/details/85401504