寄存器:程序计数器、栈指针(调用关系以及相应局部变量的所在位置)等,进程切换后,将信息存储入进程控制块
恢复至CPU
僵尸队列
fork是一个完全的复制,怎么执行的呢?想一想进程的定义!
exec之后:
在一个3次循环中,fork出不止8个!
进程的创建顺序
卧槽,好多
copy_memory\copy_thread
空闲进程:放置于就绪队列中,优先级最低的进程,当没有进程在执行时,就执行空闲进程
创建内核线程与创建用户态进程,最终都落到do_fork函数上
用户态进程的初始化之前,需要先创建一个内核线程
fork()的实现开销,复制父进程的地址空间、内存和它的寄存器状态(??进程的地址空间与内存,一实际,一虚拟么??)
现在都支持写时复制技术,因此可以节约开销!
???写exec后面那个printf的意义:如果执行到这句话了,说明exec执行出现了问题,若exec执行无问题,printf应该无问题
wait(等子进程)
看!这个变化!
所执行的代码已经发生了变化!
在地址空间中的变化
实际只负责了页表,写操作时,触发异常,做出不同的页/读操作则不需要如此麻烦
等待和终止进程:
父进程要等待子进程的结束
PCB是代表进程存在的唯一标识
用户态的资源,操作系统可以帮忙释放掉,但内核态的资源比如PCB是难以释放的,因此由父进程帮忙释放
wait为了配合子进程的exit(),进而实现释放子进程所有资源的目标
exit()执行完毕,但wait()尚未执行完毕,这样的一个状态被称作僵尸态,即将死未死的状态,等着被回收(被父进程),不是就绪、等待与执行。
父进程先于子进程死亡的话?
执行excute,进程可能在不同的状态!
执行exec时,进程可能被阻塞!