一、什么是进程
进程是一个动态实体。是程序一次运行的过程。是系统进行资源分配的最小单位。
二、进程与程序的区别
程序是静态的,进程是动态的。程序是一些保存在磁盘上的可执行代码。进程是运行着的程序。
三、程序是怎样转化为进程的
操作系统将程序读入到内存中,并且为进程分配内存空间
为进程分配进程分配进程标志(PID)和其他所需要进程
内核将保存了进程的信息后,将进程等代队列中,等待操作系统的调度。
四、进程的创建
导致进程创建的原因:
1、系统的初始化 如:启动操作系统
2、正在运行的进程调用了系统函数调用 如一个进程需要另一个进程和它协作完成一个任务
3、用户请求 如交互式系统中双击一个图标就创建了一个进程
4、一个批处理作业的初始化 大型机的批处理系统中应用
总之、在所有的情形中一个新进程的创建都是通过一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。这个进程可以是一个运行的用户进程、一个键盘或鼠标启动的系统进程或是一个批处理的系统管理进程。
在UNIX或者linux系统中,只有一个系统调用可以创建新进程:fork.这个地同调用可以创建一个与调用进程相同的副本。即fork调用产生的进程复制了父进程的很多资源,包括存储映像、同样的环境字符串,同样的文件描述符。不同的地方是:新创建的进程有新的进程标号(pid)。
五、执行新新程序
一个进程调用了系统调用fork后创建了子的进程,子进程复制父进程的内存映像,所以子进程会和它的父进程一样继续执行当前的程序。当然几个进程执行一个程序没有什么意义。通常子进程会调用execve函数执行其他的程序。
当子进程调用exec后,它本身就已经死亡了,系统会把代码段替换为新程序的代码段。并且废弃了原有的数据段和堆栈段,重新分配了新的数据段和代码段。
常用执行新程序的函数有:
#include
int execve(const char*path,char * const argv[],char * const envp[]);
int execv(const char *path,char * const envp[]);
int execle(const char *path,char char *arg,);
int execl(const char *path,char * const argv[]);
int exevp(const char * fiel,char * const argv[]);
int execlp(const char *file,const char *arg);
其中,path为路径,argv为命令行参数,envp为环境变量
六、UNIX和WINDOWS系统创建进程的不同和相同点:
linux系统中创建了一个新的进程后,一般会让新进程调用exece或一个类似的系统调用去执行新的程序。此时新进程装入了新的内存映像。唯一保留了PID;
window系统中调用系统调用CreateProcess创建新进程同时也装入了要执行的程序。相当于将将fork和execve合二为一。
七、进程的退出
进程在创建了之后,它开始运行,但进程迟早是要退出了,进程退出的条件
1、正常退出
2、错误退出 如:输入了一个不存在命令
3、严重错误 如:对0作了除运算
4、被其他进程杀死 kill系统调用
八、进程的状态
执行(该进程实际占用CPU)
就绪 (可运行,但是因为其他进程占用了cpu而暂时停止)
阻塞 (因为某种原因而停止运行biru等待用于输入,当达到某种条件时进入就绪状态)
具体的情况为:
PICTURE:/home/wanglun/.tencent/qq//AppData/file//sendpix0.jpg
执行==>就绪:等待输入而阻塞
运行==>就绪:等待沉许选择另一个进程
就绪==>运行:调度程序选择这个进程
阻塞==>就绪:出现有效的输入
以上是我学习了进程的基础知识后所作的总结。以后还当完善……
阅读(801) | 评论(0) | 转发(0) |