【进程管理】进程三部曲:创建,执行与消亡(综述)
2014-05-13 14:43
239 查看
在linux系统中,第一个进程是系统固有的,是由内核的设计者安排好的;一个新的进程一定要由一个已存在的进程复制出来,而不是创造出来的;其实linux系统并不提供直接创建进程的方法;linux将进程的创建与目标程序的执行分成两步;
(1)从一个已存在的父进程像细胞分裂一样地复制出一个子进程;实际复制出来的子进程有自己的task_struct和系统空间堆栈,但是与父进程共享其他资源;例如,要是父进程打开了5个文件,那么子进程也打开了这5个文件,而且这些文件的读写位置处于相同的位置;fork()是全部复制,父进程的所有资源全部通过数据结构复制给子进程,但进程号不一样和clone()则带有参数的选择性的复制,可复制出一个线程,其他资源通过指针与父亲来共享;vfork()是除了task_struct和系统空间堆栈外的资源通过指针全部复制,因此复制出来的是个线程,效率很高;
(2)然后就是目标程序的执行,创建一个进程是为有不同的目标程序要让新的程序去执行,但复制完以后,子进程就要与父进程分道扬镳了,用execve(),让一个进程执行以文件形式存在的可执行程序映像了;
注:复制时只复制进程基本资源的复制,如task_struct,系统空间堆栈,页面表等,不包括父进程的代码和全局变量,这些通过只读方式的共享,在需要写的时候,通过copy_on_write()为所涉及的页面建立一个新的副本;主要原因是通过复制下来的资源通常对子进程很有用,比如服务器中的server端,还有pipe的通信;
创建了子进程以后,第一异步方式,父进程可以继续走自己的路,与子进程分道扬镳,但是如果子进程先行exit(),那么将要向父进程发一个信号;第二同步方式,父进程也可以选择睡眠,等子进程exit()以后再去世,然后父进程再继续执行,可使用wait3()某个特定的子进程,wait4()所有子进程;第三,自己exit()(是每一个可执行程序映像所必有的,因此在子进程中执行完后,不会返回);
Linux内核中确实有一个创建内核线程的函数,kernel_thread(),供内核线程调用,它是对clone()的包装,并不执行execve(),而是执行内核中某一个函数,会返回因此要执行一个exit()系统调用;
(1)从一个已存在的父进程像细胞分裂一样地复制出一个子进程;实际复制出来的子进程有自己的task_struct和系统空间堆栈,但是与父进程共享其他资源;例如,要是父进程打开了5个文件,那么子进程也打开了这5个文件,而且这些文件的读写位置处于相同的位置;fork()是全部复制,父进程的所有资源全部通过数据结构复制给子进程,但进程号不一样和clone()则带有参数的选择性的复制,可复制出一个线程,其他资源通过指针与父亲来共享;vfork()是除了task_struct和系统空间堆栈外的资源通过指针全部复制,因此复制出来的是个线程,效率很高;
(2)然后就是目标程序的执行,创建一个进程是为有不同的目标程序要让新的程序去执行,但复制完以后,子进程就要与父进程分道扬镳了,用execve(),让一个进程执行以文件形式存在的可执行程序映像了;
注:复制时只复制进程基本资源的复制,如task_struct,系统空间堆栈,页面表等,不包括父进程的代码和全局变量,这些通过只读方式的共享,在需要写的时候,通过copy_on_write()为所涉及的页面建立一个新的副本;主要原因是通过复制下来的资源通常对子进程很有用,比如服务器中的server端,还有pipe的通信;
创建了子进程以后,第一异步方式,父进程可以继续走自己的路,与子进程分道扬镳,但是如果子进程先行exit(),那么将要向父进程发一个信号;第二同步方式,父进程也可以选择睡眠,等子进程exit()以后再去世,然后父进程再继续执行,可使用wait3()某个特定的子进程,wait4()所有子进程;第三,自己exit()(是每一个可执行程序映像所必有的,因此在子进程中执行完后,不会返回);
Linux内核中确实有一个创建内核线程的函数,kernel_thread(),供内核线程调用,它是对clone()的包装,并不执行execve(),而是执行内核中某一个函数,会返回因此要执行一个exit()系统调用;
相关文章推荐
- 进程管理之2:进程三部曲:创建、执行和消亡
- Linux内核源代码情景分析-进程的创建,执行,等待,消亡
- php进程管理--手动创建进程锁,防止重复执行某程序代码
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度
- 进程的创建与可执行程序的加载
- 进程的创建与可执行程序的加载
- 操作系统实验参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进 程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制 ps 命令总在 ls 命令之前执行。
- 创建进程管理程序
- 进程的管理之进程创建笔记
- LNMP(php-fpm的pool,慢执行日志,定义open_bashdir,php-fpm进程管理
- Linux进程管理之进程的创建
- Delphi CreateProcess WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件
- 进程的创建与可执行程序的加载
- 【Linux】进程的创建执行和优先级
- Linux环境编程之进程(四):创建新进程、执行程序和进程终止
- Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
- 【进程】进程创建,执行与控制
- 《Unix内核源码剖析》读书笔记03-进程管理【切换执行进程】
- Linux下C编程:创建和执行进程
- Linux-进程描述(4)之进程优先级与进程创建执行