进程可以使多个程序并发执行,用于改善资源利用率,并且提高系统的吞吐量;
它具有动态性、并发性、独立性、异步性、结构特性五中特性。
一、五个特性:
1、动态性:进程是程序的执行,是程序在处理机上执行时的一个活动;
2、并发性:多程序可以同时运行在一个内存空间中;
3、独立性:同内存中有多个进程,但独有自己的虚拟内存空间,故互不干扰。并且是独立获得资源和调度的基本单位;
4、异步性:每个进程按照各自的速度进行;
5、结构特性:每个进程都有自己的私有空间,在私有空间中,进程在内存中的结构由代码段、数据段和堆栈段构成。
二、进程相关信息
1、进程ID:每个进程独有的ID号;
2、进程状态:运行、等待、结束等三种基本状态,另外还有就绪、挂起、僵尸等状态;
3、进程切换:运行的进程让出处理器的使用权,交给另一个进程执行;
4、虚拟内存:每个进程都运行在自己的虚拟内存中,功能:拥有巨大的寻址空间、可以共享虚拟内存和对进程保护等。
三、进程的基本操作
1、fork()函数:创建一个新的进程,复制父进程的所有资源,创建后根据返回值判断:
返回0:表示在子进程中;
返回子进程的PID:表示在父进程中;
返回值小于零:创建子进程失败,没有足够的内存空间。
2、如下程序:执行后,发现数据返回了两次,说明父进程执行了一次,子进程执行了一次。返回值的不同执行情况不同,但返回顺序不是固定的。
#include
#include
#include
#include
int main(void)
{
pid_t pid;
if((pid=fork())<0)//如果小于零,表示创建子进程失败
{
printf("fork error!
");
exit(1);
}
else if(pid==0)//如果成立,表示此时在子进程中
{
printf("in the child process!
");
}
else //如果成立,表示此时在父进程中
{
printf("in the parent process!
");
}
exit(0);
}
结果:in the child process!
in the parent process!(输出结果顺序不是确定的)
3、vfork()函数,如下代码:与fork()函数不同的是,他不会复制父进程的所有资源,父子进程共享地址空间。
#include
#include
#include
int gvar=2;//全局变量
int main(void)
{
pid_t pid;
int var=5;//局部变量
printf("process id:%ld
",(long)getpid());//输出父进程的PID
printf("gvar=%d var=%d
",gvar,var);
if((pid=vfork())<0)//创建子进程失败
{
perror("error!");
return 1;
}
else if(pid==0)//如果在子进程中执行以下程序
{
gvar--;
var++;
//输出子进程的PID和修改后的变量值
printf("the child process id:%ld,gvar=%d var=%d
",(long)getpid(),gvar,var);
//父进程调用vfork()会被阻塞,需要在子进程中调用_exit()函数退出子进程,而不是调用exit()函数。
_exit(0);
}
else
{ //输出父进程的PID以及变量值
printf("the parent process id:%ld,gvar=%d var=%d
",(long)getpid(),gvar,var);
return 0;
}
}
执行结果:process id:3858
gvar=2 var=5
the child process id:3859,gvar=1,var=6
the parent process id:3858,gvar=1,var=6