1)进程的创建和执行 许多操作系统提供的都是产生进程的机制,也就是说,首先在新的地址空间里创建进程、读入可执行文件,最后再开始执行。Linux中进程的创建很特别,它把上述步骤分解到两个单独的函数中去执行:fork()和exec函数族。首先,fork()函数通过复制当前进程创建一个子进程,子进程与父进程的区别仅仅在于不同的PID、PPID和某些资源及统计量。exec函数族负责读取可执行文件并将其载入地址空间开始运行。
要注意的是,Linux中的fork()函数使用的是写时复制页的技术,也就是内核在创建进程时,其资源并没有被复制过来,资源的赋值仅仅只有在需要写入数据时才发生,在此之前只是以只读的方式共享数据。写时复制技术可以使Linux拥有快速执行的能力,因此这个优化是非常重要的。
2)进程的终止 进程终结也需要做很多烦琐的收尾工作,系统必须保证回收进程所占用的资源,并通知父进程。Linux首先把终止的进程设置为僵尸状态,这时,进程无法投入运行,它的存在只为父进程提供信息,申请死亡。父进程得到信息后,开始调用wait函数族,最后终止子进程,子进程占用的所有资源被全部释放。
本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》 |