经过上一文对进程和线程有一个简单的理解,下面详细的介绍进程:
进程:是程序的一次执行,具有动态性,动态性还表现在:“它由创建而产生,由调度而执行,由撤消而消亡”可见,进程实体有一定的生命期,而程序则只是一组有序指令的集合,并存放于某种介质上,其本身并不具有运动的含义,因而是静态的。(并发性是进程重要的特征)
进程的状态和转化关系
还可以添加进程的创建和结束
孤儿进程:若父进程先结束,子进程成为孤儿进程,被init进程收养(init进程的优先级为1,为所有进程的父进程)
僵尸进程:若子进程先结束,父进程如果没有及时回收,子进程变成僵尸进程
引起进程创建的原因:1 用户登录。在分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入就绪队列中。
2作业调度。在批处理系统中,当作业调度程序按一定的算法调度到某作业时,便将该作业装入内存,为它分配必要的资源,并立即为它创建进程,再插入就绪队列中
3提供服务。当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务
引起进程终止的事件:1 越界错误。这是指程序所访问的存储区已越出该进程的区域。
2 等待超时。这是指进程等待某事件的时间超过了规定的最大值
3 非法指令。这是指程序试图去执行一条不存在的指令。出现该错误的原因,可能是程序错误地转移到数据区,把数据当成了指令。
在应用层进程的使用方式:
fork()用于进程的创建
当返回等于0时创建子进程,大于0创建父进程,小于0创建失败
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
pid_t pid;
char *message;
int n;
pid = fork();
if (pid < 0) {
perror("fork failed");
exit(1);
}
if (pid == 0) {//子进程的创建
message = "This is the child\n";
n = 6;
} else {//父进程的创建
message = "This is the parent\n";
n = 3;
}
for(; n > 0; n--) {
printf(message);
sleep(1);
}
return 0;
}