inux的进程-进程的概念和fork创建进程

一、  什么是进程?

初学者,可能认为程序或者一段代码就是一个进程。其实这样说是很不全面的,进程简单的说就是一个正在运行的程序,正在运行的程序需要满足一下的2个条件。

1、需要一个代码

2、需要运行这个代码环境和资源

从下面的一段代码,我们来分析这段代码运行时产生的进程所需要的环境资源

Hello.c
3、  #include
4、  char *p="hello"  //全局变量初始化区域
5、  int a;//全局变量未初始化区域
6、  int main(int arge)//arge栈区
7、  {
8、  int n;//栈区
9、  char *p;//栈区
10、            p=(char *)malloc(sizeof(1024));//堆区
11、            free(p);
12、            return 0
} 

linux的进程-进程的概念和fork创建进程

从上图我们可以看出,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈stack region。进程是一个执行中的程序。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程

Text/date是全局变量初始化区域。Bss是全局变量未被初始化的区域。函数的参数,局部变量都是栈区,使用malloc函数申请的空间是堆区。请读者自行对比代码后面的注释和内存空间图。

 

一、  进程的切换

一个cpu同一时间只能执行一个进程进程切换就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器

这里所说的从某个进程收回处理器,实质上就是把进程存放在处理器的寄存器中的中间数据找个地方存起来,从而把处理器的寄存器腾出来让其他进程使用。那么被中止运行进程的中间数据存在何处好呢?当然这个地方应该是进程的私有堆栈

让进程来占用处理器,实质上是把某个进程存放在私有堆栈寄存器的数据(前一次本进程被中止时的中间数据)再恢复到处理器的寄存器中去,并把待运行进程的断点送入处理器的程序指针PC,于是待运行进程就开始被处理器运行了,也就是这个进程已经占有处理器的使用权了。

这就像多个同学要分时使用同一张课桌一样,所谓要收回正在使用课桌同学的课桌使用权,实质上就是让他把属于他的东西拿走;而赋予某个同学课桌使用权,只不过就是让他把他的东西放了。linux的进程-进程的概念和fork创建进程linux的进程-进程的概念和fork创建进程


通过上面进程x切换到进程Y的示意图应该明白进程切换的过程了吧!!

一、  进程的创建

我第一次看到这个概念,进程的创建不就是个运行个程序么?为什么还要创建呢?linux的进程都是父子兄弟的关系,我们在linux输入可以top可以看到现在在运行的进程,其中init就是所有进程的父进程。我们这儿创建进程是指创建子进程。

 

1、为什么要创建子进程呢?

 

首先我们需要知道,我们计算机的各个进程可以并发执行。前面已经说过进程的切换这儿不再详说了。我们cpu通过分时的机制进行轮流切换进程,让我们感觉所有的进程都是并发执行的。如果你想在一个程序中并发处理n件事,那你就需要创建n个进程。说到这儿,你应该发现系统调用的最小单位是进程,不是程序。打个比方,我们Chrom的浏览器的程序运行就包括很多进程。

 linux的进程-进程的概念和fork创建进程


linux的进程-进程的概念和fork创建进程

上图的Chrom的程序包含了很多进程在执行,他们会有一个总的父进程。

 

2、如何创建进程

linux的进程-进程的概念和fork创建进程

上图便是创建子进程的过程,下面举例说明

Linux系统通过fork()的系统调用来创建一个进程,fork()函数定义如下

#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   
    pid_t fpid; //fpid表示fork函数返回的值  
    int count=0;  
    fpid=fork();   
    if (fpid < 0)   
        printf("error in fork!");   
    else if (fpid == 0) {  
        printf("i am the child process, my process id is %d/n",getpid());    
        count++;  
    }  
    else {  
        printf("i am the parent process, my process id is %d/n",getpid());   
        count++;  
    }  
    printf("统计结果是: %d/n",count);  
    return 0;  
}<span style="font-family: 'Microsoft YaHei', 'Helvetica Neue', SimSun;"> </span>

结果自己验证,注意count的值

猜你喜欢

转载自blog.csdn.net/XG_2013/article/details/51590093