首页 > 技术文章 > 并发编程(二)

zuanzuan 2018-11-17 14:38 原文

前言

在第三代计算机的发展中因为出现了多道技术使得同一时刻可以在内存中同时运行多个程序,那么这样就产生了进程的概念.

在本篇博客中将介绍进程相关的理论知识,对操作系统进一步的认识.

进程

什么是进程

进程( process),是指计算机中已运行的程序.进程曾经是分时系统的基本运行单位.在面向进程设计的系统(如早期的 UNIX,Linux2.4及更早的版本)中,进程是程序的基本执行实体,是操作系统的资源单位;在面向线程设计的系统(如当代多数操作系统, Linux2.6及更新的版本)中,进程本身不是基本运行单位,运行单位变为线程,进程是线程的容器.程序本身只是指令,数据及其组织形式的描述,进程才是(指令和数据)的真正运行实例.若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行.现代计算机系统因为空间共享(空间复用)可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(时间复用),以在一个处理器上表现出异步(平行)运行的感觉.

开启进程需要的资源

用户下达运行程序的命令后,就会产生进程.同一程序可产生多个进程(一对多的关系),以允许同时又多位用户运行同一程序,却不会产生冲突.

开启进程需要一些必要的资源才能完成工作,如 CPU 使用时间,存储器,文件以及 I/O 设备,且为依序逐一进行,也就是每个 CPU 内核任何时间内仅能运行一项进程.

进程包含的资源

一个计算机系统集成包括(或者说拥有)下列资源:

  • 那个程序的可执行机器代码的一个在存储器的映像;
  • 分配到的存储器(通常是虚拟的一个存储器区域).存储器的内容包括可执行代码,特定于进程的数据(输入或输出),调用堆栈(用于保存运行时运输中途产生的数据);
  • 分配给该进程的资源的操作系统描述符,诸如文件描述符( UNIX 术语)或文件句柄( Windows),数据源和数据终端;
  • 安全特性,诸如进程拥有者和进程的权限集(可以容许的操作);
  • 处理器状态,诸如寄存器内容,物理存储器定址等.当进程正在运行时,状态通常保存在寄存器,其他数据保存在存储器.

进程的状态

进程在运行中,状态会随时发生改变.所谓状态,就是指进程目前的动作:

  • 新生( new):进程新产生重;
  • 运行(running):正在运行;
  • 等待( waiting):等待某事发生,例如等待用户输入完成.也称之为阻塞;
  • 就绪( ready):等待 CPU;
  • 结束( terminated):完成运行.

各状态名称可能虽不同的操作能够系统而不同,对于单核系统( UP),任何时间可能有多个进程为等待,就绪,但必定仅有一个进程在运行.

进程表

对于一个进程来说,操作系统为了能够在CPU离开后继续执行该进程,会把此时进程运行的所有状态保存下来,为此,操作系统和会维护一张表格,即进程表( process table),每个进程占用一个进程表项(也称之为进程控制块).

对于上图中重要项的解释如下:

  • 寄存器:如累加器,变址寄存器,堆栈指针以及一般用途寄存器,状况代码等,主要用途在于中断

进程时暂时存储数据,以便稍后继续利用;其数量及类别因计算机体系结构有所差异;

  • 程序计数器:接下来要运行的指令地址;
  • 进程状态:可以是 new,ready,running,waiting,blocked或 terminated;
  • 优先级( CPU 排班法):优先级,排班队列等指针以及其他参数;
  • 存储管理:如标签页表,正文段指针,数据段指针以及堆栈指针等;
  • 会计信息:如 CPU 遇实际时间值使用数量,时限,账号,工作或进程号;
  • 输入输出状态:配置进程使用 I/O 设备,如磁带机.

Unix进程

类 Unix 系统进程概念

Unix进程PID

在类 Unix 系统中可以使用 ps 命令查询正在运行的进程,比如 ps -eo pid,comm,cmd,下图为执行结果:(-e 表示列出全部进程, -o pis,comm,cmd 表示我们需要 PID,COMMAND,CMD 信息)

每一行代表一个进程.每一行分为三列.第一列为 PID(Process IDentity)是一个整数,每一个进程都有一个唯一的 PID 来表示自己的身份,进程也可以根据 PID 来识别其他的进程.第二列 COMMAND 是该进程的简称.第三列 CMD 是进程所对应的程序以及运行时所带的参数.(第三列有一些由[]括起来的,它们是内核的一部分功能)

在第一行的 PID 为1,名字为 systemd(18.04,版本为16.04该名字为 init).这个进程是执行/sbin/init 这一文件(程序)产生的(不知道我的为什么不是,查看了朋友的是/sbin/init

推荐阅读