进程的基本动作机制

进程

我们知道硬件到用户使用分为:硬件,内核(系统),软件。 硬件也就是我们常见到的计算机等等,就相当于我们的身体,内核就相当于是我们的大脑,软件就相当于我们的动作。而进程就相当于我们怎么去实现这些动作。

进程是程序的一个具体实现,同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。 进程的信息存储 Linux内核存储进程信息的固定格式:task struct 多个任务的的task struct组件的链表:task list

进程的创建

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

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

init初始化进程 相当于上帝
    进程:都由其父进程创建
    fork()请求创建子进程的接口,fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。实际上,子进程总可以查询自己的PPID来知道自己的父进程是谁,这样,一对父进程和子进程就可以随时查询对方。
   clone()克隆父进程数据
  systemd─┬─NetworkManager─┬─dhclient     #centos7把init改成了systemd
          │                └─2*[{NetworkManager}]
          ├─auditd───{auditd}
          ├─crond
          ├─dbus-daemon───{dbus-daemon}
          ├─firewalld───{firewalld}
          ├─login───bash
          ├─lvmetad
          ├─master─┬─pickup
          │        └─qmgr
          ├─polkitd───5*[{polkitd}]
          ├─rsyslogd───2*[{rsyslogd}]
          ├─sshd───sshd───bash───pstree
          ├─systemd-journal
          ├─systemd-logind
          ├─systemd-udevd
          ├─tuned───4*[{tuned}]
          └─wpa_supplicant

    进程优先级:
        0-139:
            1-99:实时优先级;
                 数字越大,优先级越高 
            100-139:静态优先级;
                数字越小,优先级越高;

            Nice值:
                -20对应100,19对应139
                   通过调用nice值,来调用进程

        Big O   算法复杂度
            O(1)速度一致, O(logn)高在到一致, O(n), O(n^2), O(2^n)

进程类型

        守护进程: 在系统引导过程中启动的进程,跟终端无关的进程;
        前台进程:跟终端相关,通过终端启动的进程 也可称为用户进程
        注意:也可把在前台启动的进程送往后台,以守护模式运行;

进程状态

        运行态:running
        就绪态:ready 可以运行但还没运行
        睡眠态: 
            可中断:interruptable
            不可中断:uninterruptable
        停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped
        僵死态:zombie

进程的分类

        CPU-Bound需要消耗更多的cpu片段
        IO-Bound 需要消耗更多的IO

子进程的死亡

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

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

进程与线程(thread)

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

原创文章,作者:N19_king,如若转载,请注明出处:http://www.178linux.com/17300

(1)
上一篇 2016-05-31 23:32
下一篇 2016-06-01 15:26

相关推荐

  • shell脚本编程之补充知识点

    一、处理用户输入   shell中使用read命令来实现与用户的交互输入。   格式:read [options] 变量    常用选项:      -p “提示信息”:显示提示信息;      -t #:等待用户输入的秒数;     &n…

    Linux干货 2016-02-14
  • Centos 编译内核操作实践

    §·编译内核: ※·程序包的编译安装: ./configure   make   make install 前提:开发环境(开发工具,开发库),头文件(/usr/include)  开源: 源代码开发—->可执行格式,(不同Linux的发行版以自己的理解,发行的软件不同) 发行版:以“通用”…

    Linux干货 2016-09-13
  • corosync + pacemaker + iscsi实现高可用mysql (下)

    上一篇讲的安装配置iscsi,本章介绍mariadb安装以及高可用的mysql具体实现 一、安装配置mariadb [root@SQL1 ~]# tar xf mariadb-5.5.36-linux-x86_64.tar.gz  -C /usr/local \\解压软件包 [r…

    Linux干货 2015-07-09
  • N26-第一周博客作业

    第一周博客作业 一、计算机的组成及其功能 计算机的组成可分为硬件、软件两部分。 硬件部分: 按冯.诺伊曼提出的计算机体系,计算机可分为五个部分,分别是:控制器、运算器、存储器、输入设备、输出设备。 CPU:由运算器及控制器组成。 控制器:发出决策指令,协调和指挥计算机各部件的工作。 运算器:对数据进行加工,主要进行算数运行、逻辑运算。 存储器:分为内存储器和…

    2017-02-17
  • 计算机的组成和Linux发行版本介绍

    计算机的组成及功能 计算机的五大组成,如下 各部分的作用; 控制单元和算数逻辑单元是CPU的两个主要组成部分  控制单元主要协调各组件与各单元间的工作  算数逻辑单元主要负责程序运算与逻辑判断 内存,DRANM(Dynamic Random Access Memory)动态随机访问内存;CPU读取的数据都是从内存读取来的。 输入单元,下指…

    2017-07-02
  • Linux基础之权限管理(含SUID\SGID\STICKY和ACL)

    概述     Linux系统是一个多人多任务的操作系统,系统上同时可能有很多人登录,每个人都会利用系统上的各类资源完成一定的操作。那么如何合理的规范这些用户的行为,保证资源的合理分配,则就需要用到权限管理的相关内容了。权限管理是Linux系统上最基础,也是最重要的一部分内容,本章就简要说明下权限管理的相关内容。内容主要…

    Linux干货 2016-08-04