0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何创建一个进程 程序和进程的区别

Linux爱好者 来源:未知 作者:工程师李察 2018-10-06 11:53 次阅读

计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令(instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜。

那么,程序和进程(process)的区别又是什么呢?

进程是程序的一个具体实现。只有食谱没什么用,我们总要按照食谱的指点真正一步步实行,才能做出菜肴。进程是执行程序的过程,类似于按照食谱,真正去做菜的过程。同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口

操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空间,管理进程的相关信息等等,就好像是为我们准备好了一个精美的厨房。

看一眼进程

首先,我们可以使用$ps命令来查询正在运行的进程,比如$ps -eo pid,comm,cmd,下图为执行结果:

(-e表示列出全部进程,-o pid,comm,cmd表示我们需要PID,COMMAND,CMD信息)

每一行代表了一个进程。每一行又分为三列。第一列PID(process IDentity)是一个整数,每一个进程都有一个唯一的PID来代表自己的身份,进程也可以根据PID来识别其他的进程。第二列COMMAND是这个进程的简称。第三列CMD是进程所对应的程序以及运行时所带的参数

(第三列有一些由中括号[]括起来的。它们是内核的一部分功能,被打扮成进程的样子以方便操作系统管理。我们不必考虑它们。)

我们看第一行,PID为1,名字为init。这个进程是执行/bin/init这一文件(程序)生成的。当Linux启动的时候,init是系统创建的第一个进程,这一进程会一直存在,直到我们关闭计算机。这一进程有特殊的重要性,我们会不断提到它。

如何创建一个进程

实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

老进程成为新进程的父进程(parent process),而相应的,新进程就是老的进程的子进程(child process)。一个进程除了有一个PID之外,还会有一个PPID(parent PID)来存储的父进程PID。如果我们循着PPID不断向上追溯的话,总会发现其源头是init进程。所以说,所有的进程也构成一个以init为根的树状结构。

如下,我们查询当前shell下的进程:

root@vamei:~# ps -o pid,ppid,cmdPID PPID CMD169353101sudo -i1693916935-bash2377416939ps -o pid,ppid,cmd

我们可以看到,第二个进程bash是第一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。

还可以用$pstree命令来显示整个进程树:

init─┬─NetworkManager─┬─dhclient  │        └─2*[{NetworkManager}]  ├─accounts-daemon───{accounts-daemon}  ├─acpid  ├─apache2─┬─apache2  │     └─2*[apache2───26*[{apache2}]]  ├─at-spi-bus-laun───2*[{at-spi-bus-laun}]  ├─atd  ├─avahi-daemon───avahi-daemon  ├─bluetoothd  ├─colord───2*[{colord}]  ├─console-kit-dae───64*[{console-kit-dae}]  ├─cron  ├─cupsd───2*[dbus]  ├─2*[dbus-daemon]  ├─dbus-launch  ├─dconf-service───2*[{dconf-service}]  ├─dropbox───15*[{dropbox}]  ├─firefox───27*[{firefox}]  ├─gconfd-2  ├─geoclue-master  ├─6*[getty]  ├─gnome-keyring-d───7*[{gnome-keyring-d}]  ├─gnome-terminal─┬─bash  │        ├─bash───pstree  │        ├─gnome-pty-helpe  │        ├─sh───R───{R}  │        └─3*[{gnome-terminal}]

fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。实际上,子进程总可以查询自己的PPID来知道自己的父进程是谁,这样,一对父进程和子进程就可以随时查询对方。

通常在调用fork函数之后,程序会设计一个if选择结构。当PID等于0时,说明该进程为子进程,那么让它执行某些指令,比如说使用exec库函数(library function)读取另一个程序文件,并在当前的进程空间执行 (这实际上是我们使用fork的一大目的: 为某一程序创建进程);而当PID为一个正整数时,说明为父进程,则执行另外一些指令。由此,就可以在子进程建立之后,让它执行与父进程不同的功能。

子进程的终结(termination)

当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数)。在这个信息里,会解释该进程为什么退出。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能从内核中取出子进程的退出信息,并清空该信息在内核中所占据的空间。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。

当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在内核中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。

进程与线程(thread)

尽管在UNIX中,进程与线程是有联系但不同的两个东西,但在Linux中,线程只是一种特殊的进程。多个线程之间可以共享内存空间和IO接口。所以,进程是Linux程序的唯一的实现方式。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11302

    浏览量

    209413
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81022
  • 进程
    +关注

    关注

    0

    文章

    203

    浏览量

    13960

原文标题:Linux 进程基础

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    进程和线程的区别

    系统对应用的并发性。进程和线程的区别在于:简而言之,程序至少有
    发表于 12-12 09:28

    怎么区别进程和子进程

    怎么区别进程和子进程? 各位大神
    发表于 01-11 17:15

    线程、进程程序区别

    ,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是
    发表于 03-23 13:09

    什么是僵尸进程和孤儿进程

    在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这
    发表于 08-02 08:36

    进程是什么?进程程序区别在哪

    进程是什么?进程程序区别在哪?进程的状态有哪几种?
    发表于 12-23 06:27

    Linux下进程创建、执行和终止

    ()和exec函数族。首先,fork()函数通过复制当前进程创建进程,子进程与父
    发表于 06-11 09:21 616次阅读

    你们知道Linux的进程是怎样创建的吗

    颗树的结构。就像下面这样:     在Linux中,为了创建进程,父进程用系统调用for
    的头像 发表于 11-09 10:46 3309次阅读
    你们知道Linux的<b class='flag-5'>进程</b>是怎样<b class='flag-5'>创建</b>的吗

    探讨进程创建与终止

    在启动进程时(好像会创建空转进程),通常会创建若干进程
    的头像 发表于 08-17 17:59 2385次阅读
    探讨<b class='flag-5'>一</b>下<b class='flag-5'>进程</b>的<b class='flag-5'>创建</b>与终止

    如何区分程序进程

    到目前为止,你肯定已经见过很多次这两词了,“程序”“进程”。那程序进程到底有什么区别呢。
    的头像 发表于 02-24 14:17 1246次阅读
    如何区分<b class='flag-5'>程序</b>与<b class='flag-5'>进程</b>

    Linux应用开发之进程程序

    进程可执行程序的实例,程序包含了系列信息文件,这些信息描述了如何在运行期间
    的头像 发表于 06-04 16:35 691次阅读
    Linux应用开发之<b class='flag-5'>进程</b>和<b class='flag-5'>程序</b>

    程序进程和线程的区别

    什么是进程 1、进程和线程的区别 进程是指正在运行的程序,它拥有独立的内存空间和系统资源,不同进程
    的头像 发表于 06-22 11:39 671次阅读
    <b class='flag-5'>程序</b>中<b class='flag-5'>进程</b>和线程的<b class='flag-5'>区别</b>

    进程和线程的区别以及优缺点

    进程与线程 1、什么是进程、线程,有什么区别进程是资源(CPU、内存等)分配的基本单位,线程是 CPU 调度和分配的基本单位(程序执行的
    的头像 发表于 07-21 11:02 1379次阅读

    PCB进程创建和终止过程

    PCB进程控制块 独立运行基本单位的标志:创建进程创建PCB,进程结束时回PCB,进程随之消亡
    的头像 发表于 10-08 15:36 1129次阅读

    mcu线程和进程区别是什么

    程序执行的基本单位,它是进程中的实体,是进程内的条执行路径。线程是CPU调度的最小单位,
    的头像 发表于 01-04 10:45 746次阅读

    深入解析Linux程序进程

    关于某个数据集合的次运行活动。作为系统进行资源分配和调度的基本单位,是操作系统结构的基础。 程序进程的关系 进程的状态 基础进程状态
    的头像 发表于 12-18 11:01 78次阅读
    深入解析Linux<b class='flag-5'>程序</b>与<b class='flag-5'>进程</b>