《深入理解计算机系统》Exceptional Control Flow-Exception and Processes

分支跳转和过程调用与返回,也是异常的一种。

较低层次的异常:

由操作系统和硬件共同管理

较高层次的异常:

1. 进程上下文切换:操作系统+硬件定时器

2. signals

3. 各类跳转

异常:

当发生一些异常事件(除0,段错误,缺页,算数溢出,IO请求完成)时,控制权从用户态进程交给内核。由内核的异常处理函数来执行。执行结束后,有三种方式处理:1.回到原来的地址重新执行(缺页异常);2.跳到下一条指令继续执行(中断服务程序执行完成后,或按了ctrl-c后,或执行系统调用);3.程序退出(段错误等致命错误)。

异常的机制由软件和硬件共同组成。跳转到%rip的动作是硬件完成的。但跳转后执行的内容是操作系统软件完成的。

内核中有一个异常表。不同异常对应的处理函数的地址放在异常表中,每一个value对应一个异常index。

异常可分为同步异常和异步异常。

异步异常也称为中断。

同步异常有三种:陷阱,故障,终止。

1. 陷阱traps:故意的,正常的。例如系统调用。

2. 故障faults:如果异常是可修复的(如缺页异常),则会修复完成后,返回原地址重新执行;如果异常是不可修复的(访问空地址等),则走abort流程。

3. 中止aborts:不可恢复的异常(非法指令,dram校验错误等很底层的错误,程序将遭到破坏)。

关于系统调用:

系统调用为中断号为0x80的软中断?

在系统调用内部,每个不同的系统调用有一个系统调用号。

执行系统调用时,首先把系统调用号赋给%rax

然后将最多6个参数依次赋值给%rdi,%rsi,%rdx,%r10,%r9,%r8

然后执行syscall指令。

执行完成后,返回值被写在%rax中。正数为正常,负数代表出错,需要查看当前errno。

关于进程:

从用户角度看:1.独享cpu资源2.独享内存空间

进程上下文包括:通用cpu寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器内核栈(保存了当前进程的各种信息如当前task_struct,打开的文件表等)。

进程总是处于以下三种状态之一:

1.运行:正在运行或已就绪等待被调度;

2.停止:进程被被挂起

3.终止:进程执行了exit或遇到致命错误。

程序终止有三种途径:

1.收到信号,该信号的处理结果是终止进程;

2.从主程序返回;

3.调用了exit函数

并发的概念:某一个时间段内,都在执行。(逻辑流在时间上重叠)

并行:同时执行,必须时多核cpu

子进程退出后,需要父进程调用wait或waitpid,来回收子进程的资源。否则子进程会变为僵尸进程。

如果子进程退出是父进程已经退出(无父进程),则init进程会直接回收子进程的资源,避免其称为僵尸进程。

wait系统调用,会阻塞直到其中一个子进程退出。传入的int*的整型会被修改为子进程的退出状态。

execve:装载并执行程序

只有出现异常时,才返回,否则不返回。

int execve(char* filename, char* argv[], char* envp[]);

它会覆盖子进程所有地址空间,只保留了pid,打开的文件的信息。

为什么要把fork和exec分开成2个函数,而不是放在一个函数实现:

1. fork复制一个进程空间的功能在服务器场景有用处;

2. 在创建进程之后,有可能用户需要设置参数、环境变量等内容,再执行可执行程序;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值