进程控制
创建进程,撤销进程,实现进程转换(必须一气呵成,使用原语)
原语不被中断是因为有关中断指令
创建进程
撤销进程
进程创建fork
fork()函数会创建一个子进程,子进程会返回0,父进程会返回子进程的id所以才会有ifelse
虽然是复制但是数据是不一样的,进而导致后面的结果不一样
程序的加载和执行
等待和终止进程
exit 子进程完毕,父进程的wait还没完毕,这段时间子进程是半死不活,僵尸状态
祖宗进程会定期扫描 pcb队列看有没有僵尸状态进程
当一个进程创建了一个子进程后,通常会使用等待函数来等待子进程的结束。这样可以确保父进程在子进程执行完毕后再继续执行,或者获取子进程的退出状态。
以下是父进程等待子进程结束的典型执行流程:
父进程创建子进程。
子进程执行自己的任务。
父进程调用等待函数(如
wait()
或waitpid()
),进入阻塞状态,等待子进程的结束。如果子进程结束了,操作系统会通知父进程,父进程从等待函数返回,并获取子进程的退出状态。
父进程根据需要处理子进程的退出状态,然后继续执行自己的任务。
如果父进程在子进程结束前就退出了,子进程将会成为孤儿进程,而不是僵尸进程。孤儿进程将被 init 进程(通常是进程 ID 为 1 的进程)接管,并且在子进程结束后,init 进程会负责回收子进程的资源,这样就避免了僵尸进程的产生。
父进程在子进程结束之前退出可能发生在以下几种情况下:
父进程意外终止:父进程在创建子进程后,由于某种原因意外终止,例如由于错误或异常而导致父进程崩溃或被终止。在这种情况下,子进程可能会继续执行,而父进程已经退出。
父进程主动退出:父进程在创建子进程后,执行完自己的任务后主动退出,而不等待子进程结束。这可能是因为父进程的设计或逻辑决定在某一时刻结束执行,而不必等待子进程的完成。
并行执行:父进程和子进程可能并行执行,而不是串行执行。在这种情况下,父进程不会阻塞等待子进程的完成,而是继续执行自己的任务,最终可能在子进程之前退出。
在父进程仍处于等待状态而子进程已经结束的情况下,通常是由于父进程没有处理子进程退出状态所导致的。这可能出现在以下几种情况下:
父进程忘记或没有调用等待函数:父进程创建了子进程后,忘记或者没有在合适的时候调用等待函数(如
wait()
或waitpid()
)来等待子进程的退出状态。这样会导致子进程结束时,其状态被操作系统保留,而父进程仍然处于等待状态。父进程被阻塞或无法处理子进程退出状态:父进程可能因为其他原因而被阻塞,无法处理子进程的退出状态。例如,父进程可能在等待某些资源,或者被其他任务占用,无法及时处理子进程的退出。
父进程异常终止:在某些情况下,父进程可能由于错误或异常而意外终止,而未能处理子进程的退出状态。