一、什么是进程

从用户的角度来看进程是程序的一次执行过程。
从操作系统的核心来看,进程是操作系统分配的内存、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));

UNIX环境高级编程——进程基本概述的更多相关文章

  1. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  2. UNIX环境高级编程——进程控制

    一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...

  3. Unix环境高级编程—进程控制(二)

    一.函数wait和waitpid 今天我们继续通过昨天那个死爹死儿子的故事来讲(便于记忆),现在看看wait和waitpid函数. #include<sys/wait.h> pid_t w ...

  4. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  5. UNIX环境高级编程——进程环境

    一.main函数 C程序总是从main函数开始.当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址--这是由连接编译器设置的,而连接编译器则由 ...

  6. Unix环境高级编程—进程关系

    终端登录 网络登录 进程组 getpgrp(void) setpgid(pid_t pid, pid_) 会话: 是一个或多个进程组的集合,通常由shell的管道将几个进程编成一组. setsid(v ...

  7. UNIX环境高级编程——信号基本概述和signal函数

    一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...

  8. unix环境高级编程----进程控制wait()

    一.wait()函数 当一个进程中调用wait()函数的时候 (1)假设其全部的子程序都还在执行,则堵塞 (2)假设一个子进程已终止.则等待父进程获取其终止状态. (3)假设没有子进程,则返回错误. ...

  9. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

随机推荐

  1. 利用mybatis-generator自动生成数据持久化的代码

    MyBatis生成器简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将生成所有版本的MyBatis的代码,以及版本2.2.0之后的iB ...

  2. 批量录入快递地址-快宝地址服务(PHP代码示例)

    快递地址写错了怎么办?快递地址写的不详细怎么办?怎么皮批量录入收件人地址?微商怎么批量录入发件人地址?快宝地址清洗,有效的解决了寄送快递时,批量录入收件人信息.发件人信息时,纠正地址数据,不完整地址识 ...

  3. Lintcode393 Best Time to Buy and Sell Stock IV solution 题解

    [题目描述] Say you have an array for which the i th element is the price of a given stock on day i. Desi ...

  4. JavaScript 比较和逻辑运算符

    比较和逻辑运算符用于测试 true 或者 false. 比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等. 给定 x=5,下面的表格解释了比较运算符: 实例 »实例 » 大于 大于或等于 ...

  5. 更新git源以便安装最新版本

    sudo add-apt-repository ppa:git-core/ppa sudo apt-get update

  6. 安全框架Shiro

    原文地址:https://www.cnblogs.com/learnhow/p/5694876.html 一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精 ...

  7. 安卓获取清单文件meta-data数据

    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name& ...

  8. Android------Android.mk调用shell脚本

    $(info $(shell ($(LOCAL_PATH)/echo_test.sh)))

  9. Vulkan的分层设计

    Vulkan驱动层提供了简单高效的API.作为Vulkan API的使用者,我们要严格遵循Vulkan API的使用规则.如果我们违反了这些规则,Vulkan只会返回很少的反馈,它只会报告一部分严重和 ...

  10. [CSDN_Markdown] 使用CSDN Markdown编辑器

    简介 最近CSDN支持Markdown语法写博客了,甚是欢喜.前几天写了一篇实验了下,感觉不错.准备写几篇文章介绍一下如何使用CSDN的Markdown编辑器写博客,不求全面,但求够用,望大家批评指正 ...