zoukankan      html  css  js  c++  java
  • UNIX环境高级编程——进程基本概述

    一、什么是进程

    从用户的角度来看进程是程序的一次执行过程。
    从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。
    进程是资源分配的最小单位。
    每一个进程都有自己独立的地址空间与执行状态。
    像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。


    二、进程数据结构

    进程的静态描述:由三部分组成:PCB、有关程序段和该程序段对其进行操作的数据结构集。
    进程控制块:用于描述进程情况及控制进程运行所需的全部信息。
    代码段:是进程中能被进程调度程序在CPU上执行的程序代码段。
    数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行后产生的中间或最终数据

    堆栈段:程序运行时需要在这里做数据运算,存储临时数据,开辟函数栈等。在Linux下,栈是高地址往低地址增长的。


    三、进程与程序

    进程是动态的,程序是静态的。
    进程的生命周期是相对短暂的,而程序是永久的。
    进程数据结构PCB。
    一个进程只能对应一个程序,一个程序可以对应多个进程。


    四、进程状态变迁

    运行状态(TASK_RUNNING)
    可中断睡眠状态(TASK_INTERRUPTIBLE)
    不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
    暂停状态(TASK_STOPPED)
    僵死状态(TASK_ZOMBIE)


    五、进程控制块

    进程描述信息

    进程标识符用于唯一的标识一个进程。

    进程控制信息

    进程当前状态
    进程优先级
    程序开始地址
    各种计时信息
    通信信息

    资源信息

    占用内存大小及管理用数据结构指针
    交换区相关信息
    I/O设备号、缓冲、设备相关的数结构
    文件系统相关指针

    现场保护信息

    寄存器
    PC
    程序状态字PSW
    栈指针


    六、进程标识

    每个进程都会分配到一个独一无二的数字编号,我们称之为“进程标识”(process identifier),或者就直接叫它PID.
    是一个正整数,取值范围从2到32768
    当一个进程被启动时,它会顺序挑选下一个未使用的编号数字做为自己的PID
    数字1一般为特殊进程init保留的


    七、进程的创建

    不同的操作系统所提供的进程创建原语的名称和格式不尽相同,但执行创建进程原语后,操作系统所做的工作却大致相同,都包括以下几点:
    给新创建的进程分配一个内部标识,在内核中建立进程结构。
    复制父进程的环境
    为进程分配资源, 包括进程映像所需要的所有元素(程序、数据、用户栈等),
    复制父进程地址空间的内容到该进程地址空间中。
    置该进程的状态为就绪,插入就绪队列。


    八、进程的销毁

    进程终止时操作系统做以下工作:
    关闭软中断
    :因为进程即将终止而不再处理任何信号;
    回收资源:释放进程分配的所有资源,如关闭所有已打开文件,释放进程相应的数据结构等;
    写记帐信息:将进程在运行过程中所产生的记帐数据(其中包括进程运行时的各种统计信息)记录到一个全局记帐文件中;
    置该进程为僵死状态:向父进程发送子进程死的信号(SIGCHLD),将终止信息status送到指定的存储单元中
    转进程调度:因为此时CPU已经被释放,需要由进程调度进行CPU再分配。


    九、终止进程的5种方法

    从main函数return返回
    调用exit(C库函数)
    调用_exit(系统调用)
    调用abort(产生SIGABRT信号,异常终止)
    由信号终止(如ctrl+c 产生的 SIGINT信号)

    需要注意的是main函数返回会调用exit;exit会调用_exit; exit会调用fflush,但_exit不会调用fflush。


    atexit可以注册终止处理程序,ANSI C规定最多可以注册32个终止处理程序。终止处理程序的调用与注册次序相反

    int atexit(void (*function)(void));

  • 相关阅读:
    linux 开机启动设置
    Ubuntu安装Oracle时出现乱码,及其他安装错误
    ubuntu 设置DNS
    opencv cuda TK1 TX1 兼容设置
    int to string
    post文件的html
    vc 获得调用者的模块名称
    dlib landmark+人面识别
    android破解
    jquery $(document).ready() 与window.onload的区别
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172815.html
Copyright © 2011-2022 走看看