一、  什么是进程?

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

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
} 

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

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

一、  进程的切换

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

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

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

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

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

一、  进程的创建

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

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

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

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

2、如何创建进程

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

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创建进程讲解(转)

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

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

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

  3. 创建进程,join方法,进程对象相关属性和方法,僵尸进程和孤儿进程,守护进程,互斥锁

    创建进程 在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题.在multiprocessing 模块中有一个类Process. from multiproces ...

  4. LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间

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

  5. Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

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

  6. linux 进程(一)---基本概念

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

  7. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

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

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

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

  9. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

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

随机推荐

  1. Giraph入门

    概要 这是一个Giraph的入门教程,主要用来运行少量输入的Giraph程序,并不能用于生产环境. 在这个教程中,我们将会在一个物理机器行部署一个单节点,伪分布的Hadoop集群.这个节点既是mast ...

  2. Thrift入门初探(2)--thrift基础知识详解

    昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...

  3. CMFCShellList和自定义ShellList结合使用,达到“直接浏览缩略图,双击打开图片”

    在GOPaint的设计研究过程中,我一直希望能够实现这样的结果(A B C 3个步骤) 在我之前的博客里面,曾经有过缩略图显示的现就(http://www.cnblogs.com/jsxyhelu/p ...

  4. JS特效——图片水平滚动

    具体源码如下: <!doctype html> <html lang="en"> <head> <meta http-equiv=&quo ...

  5. 工具使用——MATLAB基本调试方法

    作者:桂. 时间:2017-02-28  07:06:30 链接:http://www.cnblogs.com/xingshansi/articles/6477185.html 声明:转载请注明出处, ...

  6. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...

  7. UCSC genome browser 个人track 安装

    处理基因组数据,很多时候我们会觉得直接看序列文件不够直观,如果绘图的话,把n多G把数据用画图出来不仅费劲,就算操作也不方便.因此我们可以用UCSC开发出的genome browser,可以直接把数据信 ...

  8. Python入门教程(3)

    人生苦短,我学Pyhton Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于199 ...

  9. java基础:数组查询,同一数组一个元素最多出现两次

  10. lab1-Junit&Eclemma

    Software Testing, Lab 1 March 10. 2016, by 赵国佺(3014218108) 一.     environment setup Firstly, I downl ...