计算机中的硬件, 软件,操作系统都是可以看作一个状态机
先讲os, os的模型简单说就是一个管理多个软件(状态机)的一个状态机.
os的每个状态就是当前时间下的所有其他进程的状态, 在单核处理器下, 每次os的状态转移时会随机选择一个程序运行下一步,这就是调度. os的状态机中除了进程外,还有为了进程通信的缓冲区.
计算机系统中不确定性是有os引入的, os中的进程调度和系统外部的输入输出的不确定性, 导致了程序的不可预测性
程序内部也是一个状态机, 状态包括变量,pc.当程序需要结束退出时, 需要借助外界的系统调用
fork, execve, exit
fork会将进程一个字节一个字节的复制一份,类似一个叉子的分叉,他们拥有相同的过去. 他们拥有相同的打开文件,资源. 父进程会返回子进程的id, 子进程返回0. 在os的管理下, 会形成一个树状的父子进程关系, 当父进程先于子进程结束时, 子进程将会交给os的systemd管理视为托孤. 每个进程结束退出时,会向他的父进程发送SIGCHLD信号通知.
execve将会一个进程的状态机重置, 然后开始执行execve指定的程序. 这里重置的只是进程内部的状态机, 不会重置进程的外部状态,包括打开的文件和资源等等. 当execve成功执行后, 将不会再执行execve后的代码了
exit 进程终止时内核会发送SIGCHLD信号给父进程,父进程用wait/waitpid获取状态。