▇以Solaris系统上的Sched进程理解进程的创建
名词对照小贴士
pid |
进程标志符。大多数操作系统根据一个唯一的pid来识别进程pid通常是个整数。 |
Solaris |
SunMicrosystems研发的计算机操作系统它被认为是UNIX操作系统的衍生版本之一 |
Sched |
小红伞(Antivir)升级病毒库相关进程 |
pageout |
内存换页守护进 |
fsflush |
Solaris系统的一个后台内核守护进程。它周期性扫描内存并将文件系统高速缓存中已修改的页面写到磁盘 |
init |
用户进程的根进程 |
inted |
负责网络服务 |
dtlogin |
表示用户登录界面 |
sdt_shel |
当一个用户登录时,dtlogin会生成一个X-windows会话,它反过来又会生成sdt_shel进程 |
Shell |
用户命令行 |
Solaris系统上Sched进程树:
▇ 通常进程需要一定的资源(CPU时间、内存、文件、I/O设备)来完成任务。在一个进程创建子进程时,子进程可以从操作系统那里直接获得资源,也可能只从父进程那里获得资源。
▇ 初始化数据由父进程传递给子进程。
▇ 当进程创建新进程时,有两种执行可能
父进程与子进程并发执行
父进程等待,知道某个或全部子进程执行完
▇ 新进程的地址空间也有两种可能
子进程是父进程的复制品
子进程装入另一个新的程序
▇ 在UNIX系统中,使用fork()系统调用来创建新进程。新进程通过复制原来进程的地址空间而成,这种机制与许父子进程之间方便的通信。两个进程都执行位于系统调用fork()之后的指令。但是,子进程fork()返回0,父进程则返回子进程的标志符。
通常,在系统调用fork()之后,一个进程会使用系统调用exec(),以用新程序来取代进程的内存空间。这种方式可以使两进程相互通信并按照个自的方法执行。
如果父进程在子进程运行时没什么可,它将采用系统调用wait()把自己移出就绪队列来等待子进程终止。
▇ 一个UNIX创建进程的例子:
#include
#include
#include
void main(int argc,char *argv[])
{
pid_t pid;
//fork a child process
pid=fork();
if(pid<0)
{
fprintf(stderr,"Fork Failed");
exit(-1);
}
else if(pid==0)//child process
{
execlp("/bin/ls","ls",NULL);
}
else//parent process
{
wait(NULL);
printf("Child Complete");
exit(0);
}
}
▇Windows与UNIX不同,使用的CreatProcess()创建新进程时需要传入至少10个参数(fork()不用传递参数)其中参数STARTUPINFO指明新进程的许多特性(窗口大小,标准输入和输出文件的句柄),参数PROCESS_INFORMATION包含新生成进程和线程的标识。
举个栗子:
CreatProcess(NULL,//应用名//如果应用名为空,命令行参数指明了要装入的应用
“C:\\WINDOWS\\system32\\mspaint.exe”,//命令行参数//装入了微软Windows中的mspaint.exe程序
NULL,//不继承进程句柄
NULL,//不继承线程句柄
FALSE,//关闭句柄继承
0,//指定不创建标志
NULL,//使用父进程已有的环境块
NULL,//使用父进程已有的目录
&si,//指向程序刚开始生成的STARTUPINFO指针
&pi//指向程序刚开始生成的PROCESS_INFORMATION指针
)
▇进程终止的情况
->当进程执行最后的语句并使用exit()请求操作系统删除自身时,进程终止。此时进程可以返回状态值到父进程(通过系统调用wait()),所有进程资源被操作系统释放。
->进程通过适当的系统调用能终止另一个进程。通常只有被终止进程的父进程才能执行这一系列调用。
父进程终止子进程的原因:
1、子进程使用了超过它所分配的一些资源
2、分配给子进程的任务已不再需要
3、父进程退出,操作系统不再允许子进程继续(级联终止)
UNIX系统中,如果父进程终止,那么其所有子进程会以init进程作为父进程,因此,子进程仍然有一个父进程来收集状态和执行统计。