计算机中的硬件, 软件,操作系统都是可以看作一个状态机
先讲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获取状态