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

时间:2022-09-29 18:24:55

一、  什么是进程?

初学者,可能认为程序或者一段代码就是一个进程。其实这样说是很不全面的,进程简单的说就是一个个条件。

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
} 

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

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

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

一、  进程的切换

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

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

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

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

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

一、  进程的创建

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

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

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

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

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

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

2、如何创建进程

inux的进程-进程的概念和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的值

inux的进程-进程的概念和fork创建进程的更多相关文章

  1. linux中fork创建进程讲解&lpar;转&rpar;

    大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难.我们举个例子来看看fork的用法吧.         大家用fork的时候记住fork是 ...

  2. linux创建进程fork的方法步骤

    fork创建进程 函数原型如下 #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数 pid_t fork(void); //void代表没有 ...

  3. LINUX编程学习笔记&lpar;十四&rpar; 创建进程与 父子进程内存空间

    1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps  -a//所有进程 ps - ...

  4. Linux进程上下文切换过程context&lowbar;switch详解--Linux进程的管理与调度&lpar;二十一)

    1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...

  5. linux 进程&lpar;一&rpar;---基本概念

    一.进程的定义         进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程.   二.进 ...

  6. 线程概念&lpar; 线程的特点&comma;进程与线程的关系&comma; 线程和python理论知识&comma;线程的创建&rpar;

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  7. Python之进程 1 - 基本概念

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  8. python 全栈开发,Day41&lpar;线程概念&comma;线程的特点&comma;进程和线程的关系&comma;线程和python 理论知识&comma;线程的创建&rpar;

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

  9. linux内核之进程的基本概念&lpar;进程,进程组,会话关系)

    进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家 ...

随机推荐

  1. 管理Scope和Lifetime

    Nick Blumhardt’s Autofac lifetime primer 是一个学习Autofac Scope和Lifetime的好地方.这里有很多未理解的,混淆的概念,因此我们将尝试在这里完 ...

  2. iOS给UIimage添加圆角的两种方式

    众所周知,给图片添加圆角有CALayer的cornerRadius, 比如: 最直接的方法: imgView.layer.cornerRadius1=110;   imgView.clipsToBou ...

  3. PDOStatement&colon;&colon;bindParam的一个陷阱

    废话不多说, 直接看代码: <?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query ...

  4. android 语言切换过程分析

    android 语言切换过程分析 2014-02-27 18:13 1207人阅读 评论(0) 收藏 举报 语言切换android语言切换android改变语言 最近在看一个bug,系统切换语言后,本 ...

  5. bzoj3280

    bzoj1221的变形版本,弄懂1221,这题还是很简单的 ; type node=record        point,next,flow,cost:longint;      end; ..] ...

  6. Canvas Path 绘制柱体

    public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceS ...

  7. JSON&period;parse&lpar;&rpar;与JSON&period;stringify&lpar;&rpar;的区别

    JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析 ...

  8. 假面舞会&lbrack;NOI2008&rsqb;

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告 ...

  9. Scikit-learn:模型评估Model evaluation

    http://blog.csdn.net/pipisorry/article/details/52250760 模型评估Model evaluation: quantifying the qualit ...

  10. Unicode编码问题 如&colon;&bsol;u529e&bsol;u7406&bsol;u9996&bsol;u6c7d&bsol;u52a0&bsol;u6cb9

    python 遇到\u529e\u7406\u9996\u6c7d\u52a0\u6cb9 解决方法: a = "\u529e\u7406\u9996\u6c7d\u52a0" b ...