zoukankan      html  css  js  c++  java
  • 多进程

    多进程:

    什么是进程:

    程序在计算机中一次执行的过程

    理解qq聊天过程中刚才发送的信息,和现在刚刚发送的信息是两个不同的进程

    程序;是一个静态的描述,不占用计算机资源

    进程:是一个动态的过程,占有cpu内存的计算机资源,有一定的生命周期。

    *****注意:同一个程序,每次执行都是不同的进程。因为分配的计算机资源不同。

    一、进程的创建流程:

    1、用户空间运行程序发起进程创建申请;

    2、调用操作系统内核接口创建进程;

    3、分配计算机资源,确定进程状态

    4、将新的进程提供给用户使用

    二、多个进程,如何占用cpu

    1、一个内核同一时刻只能运行一个任务

    2、多个进程对内核资源进行争夺,操作系统决定哪个进程占用计算机核心

    3、占用计算机核心的进程,我们称之为该进程占用cpu的时间片

    三、进程有哪些信息,如何保存

    PCB(进程控制块)

    linxu,unix系统中进程创建后,会在内存开辟一块空间存放进程的相关信息,称之为PCB

    yangrui@ubuntu:~$ ps -aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.1 0.3 225468 7424 ? Ss 07:54 0:20 /sbin/init au
    root 2 0.0 0.0 0 0 ? S 07:54 0:00 [kthreadd]
    root 3 0.0 0.0 0 0 ? I< 07:54 0:00 [rcu_gp]
    root 4 0.0 0.0 0 0 ? I< 07:54 0:00 [rcu_par_gp]
    root 6 0.0 0.0 0 0 ? I< 07:54 0:00 [kworker/0:0H
    root 8 0.0 0.0 0 0 ? I< 07:54 0:00 [mm_percpu_wq
    root 9 0.0 0.0 0 0 ? S 07:54 0:00 [ksoftirqd/0]
    root 10 0.0 0.0 0 0 ? I 07:54 0:11 [rcu_sched]

    PID:在操作系统中进程的唯一标志,是大于0的整数,由系统自动分配。

    四、进程特征

    1、进程是操作系统资源分配的最小单位;

    2、每个进程单独占用4G虚拟内存

    3、进程之间相互独立,运行不受影响

    五、进程的状态:

    进程的三态:

    1、就绪态:进程具备运行条件,等待系统分配处理运行

    2,运行态:进程占有cpu处于运行的状态

    3、等待/阻塞态(sleep,accept):又称为阻塞态,睡眠态,指进程暂时不具备运行的条件,需要阻塞等待

    进程的五态:

    新建态:创建一个进程,获取资源,直接表现为运行一个程序,或者在程序中创建新的进程

    终止态:进程执行结束,资源回收过程

    ps -aux-------》STAT表示进程状态

    D  等待态(不可中断等待)

    S 等待态(可中断等待)

    T 等待态(暂停)

    R 运行态

    Z 僵尸态

    + 前台进程(不带+即为后台进程)

    < 高优先级

    N 低优先级

    l 有进程链接

    s 会话组

    进程优先级

    优先级决定了一个进程的执行权限和占有资源的优先程度

      top:动态查看当前运行的进程的状态

    <+shift或者>+shift   上下翻页

    linux中优先级范围    :-20------19    数字越小优先级越高,  -20最高

    用户程序默认优先级为:0

    nice:以指定的优先级运行进程

    例如:nice -9 ./while.py 以9的优先级运行此程序。

    以小于0的优先级运行时,需要管理员权限

    例如:sudo nice --9 ./while.py

    renice :改变某个进程的优先级

    例如:renice 2 PID

    父子进程(process):在系统中除了初始化进程,其他进程都有一个父进程,一个父进程可能有多个子进程。

    进程树 pstree

    问题:

    1、什么是进程,进程的特征

    2、进程的状态,每种状态怎么回事,转换

    3、进程和线程的区别

    os.fork()

    功能:创建一个新的进程

    参数:无

    返回值:1、失败返回一个负数

                   2、成功  0  在字进程中fork的返回值

                   3、 成功  >0的正整数(新的进程PID), 在父进程中的返回值

     

    ********************************************************

    1、父进程中的fork语句之前的内容(代码),子进程同样会复制,但父子进程空间独立,fork之后的修改不会影响到对方

     2、父子进程在执行上互不影响,谁先执行,谁后执行完全不确定

    3、子进程虽然复制父进程的空间,但是有自己的特性,比如自己的PID,进程PCB,进程栈空间等。

    **************************************************************

    获取PID号

    os.getpid()

    功能:获取当前进程的PID号

    返回值:当前进程的PID

    os.getppid()

    功能:获取当前进程父进程的PID号

    返回值:父进程PID

    进程的退出;

    os._exit(status)

    功能:结束一个进程

    参数:表示进程的结束状态,是一个整数

    sys.exit([status])

    功能:结束一个进程,可以抛出异常

    参数:传入一个正整数表示结束状态

              传入字符串表示结束打印

     孤儿进程:父进程先于子进程退出,此时子进程变成孤儿进程

    ***孤儿进程会被系统指定的进程所收养,即该进程成为孤儿进程新的父进程(孤儿进程退出时,“继父会进行处理,不会使其成为僵尸进程”)

     僵尸进程:子进程先于父进程退出,并且父进程没有处理子进程的退出情况,子进程就会变成僵                        尸进程。

    ***僵尸进程会滞留PCB的部分信息在内存中,大量的僵尸进程会消耗系统资源,所以应该尽量避免僵尸进程的产生。

    如何避免僵尸进程的产生:

    1、让父进程先退出(简单,但不好控制)

    2、让父进程处理子进程的退出

    **使用wait或者waitpid函数

         os.wait()---阻塞

         功能;等待子进程的退出进行处理

         参数:无

         返回值:一个二元元组,第一个值为退出的子进程的PID

                                                 第二个值为子进程的退出状态

    **使用信号处理

    3、创建二级子进程

  • 相关阅读:
    hdoj 1237 模拟
    Codeforces 242E:XOR on Segment(位上的线段树)***
    Tsinsen A1333: 矩阵乘法(整体二分)
    HDU 2830:Matrix Swapping II(思维)
    BZOJ 3110:[Zjoi2013]K大数查询(整体二分)
    POJ 2104:K-th Number(整体二分)
    玲珑OJ 1083:XJT Love Digits(离线处理+哈希)
    玲珑OJ 1082:XJT Loves Boggle(爆搜)
    模板:树状数组(带区间修改和区间更新)
    HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)
  • 原文地址:https://www.cnblogs.com/sike8/p/11112987.html
Copyright © 2011-2022 走看看