进程的结构

2023-05-16

什么是进程

UNIX标准(特别是IEEE Std 1003.1,2004年版)把进程定义为:一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。 目前,可以把进程看作正在运行的程序。

像Linux这样的多任务操作系统可以同时运行多个程序。每个运行着的程序实例就构成一个进程。

作为多用户系统,Linux允许许多用户同时访问系统。每个用户可以同时运行许多个程序,甚至同时运行同一个程序的许多个实例。系统本身也运行着一些管理系统资源和控制用户访问的程序。

正在运行的程序或进程由程序代码、数据、变量(占用着系统内存)、打开的文件(文件描述符)和环境组成。一般来说,Linux系统会在进程之间共享程序代码和系统函数库,所以在任何时刻内存中都只有代码的一份副本。

进程的结构

我们来看看操作系统是如何管理多个进程的。如果有两个用户neil和rick,他们同时运行grep程序在不同的文件中查找不同的字符串。他们使用的进程如图所示。
在这里插入图片描述
如果在搜索结束之前运行ps命令,则该命令输出类似下面这样的内容:
在这里插入图片描述

每个进程都会被分配一个唯一的数字编号,我们称之为进程标识符或PID。它通常是一个取值范围从2到32768的正整数。当进程被启动时,系统将按顺序选择下一个未被使用的数字作为它的PID,当数字已经回绕一圈时,新的PID重新从2开始。数字1一般是为特殊进程init保留的,init进程负责管理其他进程,我们很快就会再次谈到它。这里我们可以看到由用户neil和rick启动的两个进程被分配的PID分别是101和102。

将要被grep命令执行的程序代码被保存在一个磁盘文件中。正常情况下,Linux进程不能对用来存放程序代码的内存区域进行写操作,即程序代码是以只读方式加载到内存中的。我们从上图中可以看到,虽然不能对这个区域执行写操作,但它可以被多个进程安全地共享。

系统函数库也可以被共享。例如,不管有多少个正在运行的程序要调用printf函数,内存中只要有它的一份副本即可。这种做法与微软Windows操作系统中使用的动态链接库(DLL)机制类似,但更加复杂。

从上图中还可以看出,共享函数库带来的另一个优点是,包含可执行程序grep的磁盘文件容量比较小,因为它不包含共享函数库代码。这对一个单独的程序来说,算不上大优点,但对整个操作系统来说,把常用例程提取出来放入(比如说)C语言的标准函数库中将节省大量的磁盘空间。

当然,并不是程序在运行时所需要的所有东西都可以被共享。例如,进程使用的变量就与其他进程所使用的截然不同。在本例中,传递给grep程序的搜索字符串以变量s的形式出现在每个进程的数据区中。它们之间是分离的,通常不能被其他进程读取。这两个grep命令所使用的文件也各不相同,进程通过各自的文件描述符来访问文件。

除此之外,进程有自己的栈空间,用于保存函数中的局部变量和控制函数的调用与返回。进程还有自己的环境空间,包含专门为这个进程建立的环境变量。进程还必须维护自己的程序计数器,这个计数器用来记录它执行到的位置,即在执行线程中的位置。

在许多Linux系统(也包括一些UNIX系统)上,在目录/proc中有一组特殊的文件,这些文件的特殊之处在于它们允许你“窥视”正在运行的进程的内部情况,就好像这些进程是目录中的文件一样。

最后,因为Linux和UNIX一样,有一个虚拟内存系统,能够把程序代码和数据以内存页面的形式放到硬盘的一个区域中,所以Linux可以管理的进程比物理内存所能容纳的要多得多。

进程表

Linux进程表就像一个数据结构,它把当前加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些ps命令输出的各类信息。操作系统通过进程的PID对它们进行管理,这些PID是进程表的索引。进程表的长度是有限制的,所以系统能够支持的同时运行的进程数也是有限制的。早期的UNIX系统只能同时运行256个进程。最新的实现版本已大幅度放宽这一限制,可以同时运行的进程数可能只与用于建立进程表项的内存容量有关,而没有具体的数字限制了。

查看进程

ps命令可以显示我们正在运行的进程、其他用户正在运行的进程或者目前在系统上运行的所有进程。下面是ps命令的输出样本:(部分)
在这里插入图片描述

这个命令显示了许多进程的相关信息。例如,TrY一列显示了进程是从哪一个终端启动的,TIME一列是进程目前为止所占用的CPU时间,CMD一列显示启动进程所使用的命令。下面我们来仔细查看其中的一些进程信息。
在这里插入图片描述
用户的初始登录是在第1个虚拟终端完成的。该终端是这台机器的一个主控台。运行的shell程斤是Linux系统的默认shell: bash。

默认情况下,ps程序只显示与终端、主控台、串行口或伪终端保持连接的进程的信息。其他进程在运行时不需要通过终端与用户进行通信,它们通常都是一些系统进程,Linux用它们来管理共享的资源。我们可以用ps命令的-a选项查看所有的进程,用-f选项显示进程完整的信息。

ps命令的精确语法及其输出内容的格式随系统的不同而稍有变化。Linux使用的GNU版本的ps命令支持来自以前几个ps命令实现版本中的选项(包括来自UNIX变体BSD和AT&T中ps命令的选项),并且它还新增了一些选项。有关ps命令可使用的选项和输出格式的更多细节请参考其手册。

系统进程

下面显示的是运行在另一台Linux系统上的一些进程。为清楚起见,我们对输出结果进行了简化。在下面的例子中,你将看到如何查看进程的状态。ps命令输出中的STAT一列用来表明进程的当前状态。常见的STAT代码见下表。
在这里插入图片描述
在这里插入图片描述
我们在这里看到了一个非常重要的进程。
在这里插入图片描述
一般而言,每个进程都是由另一个我们称之为父进程的进程启动的,被父进程启动的进程叫做子进程。Linux系统启动时,它将运行一个名为init的进程,该进程是系统运行的第一个进程,它的进程号为1。你可以把init进程看作为操作系统的进程管理器,它是其他所有进程的祖先进程。我们将要看到的其他系统进程要么是由init进程启动的,要么是由被init进程启动的其他进程启动的。

进程调度

ps命令的输出结果中还有一条对应ps命令本身的记录:
在这里插入图片描述

这行表明进程1159处于运行状态®,正在执行的命令是ps -aux。也就是说,这个进程出现在自己的输出结果中了。这个状态指示符只表示程序已准备好运行,并不意味着它正在运行。在一台单处理器计算机上,同一时间只能有一个进程可以运行,其他进程处于等待运行状态。每个进程轮到的运行时间(我们称之为时间片)是相当短暂的,这就给人一种多个程序在同时运行的假象。状态R+只表示这个程序是一个前台任务,它不是在等待其他进程结束或等待输入输出操作完成。这就是为什么你可能会在ps命令的输出结果中看到两个这样的进程的原因。

Linux内核用进程调度器来决定下一个时间片应该分配给哪个进程。它的判断依据是进程的优先级。优先级高的进程运行得更为频繁。而其他进程,如低优先级的后台任务运行的就不是非常频繁。在Linux中,进程的运行时间不可能超过分配给它们的时间片,它们采用的是抢先式多任务处理,所以进程的挂起和继续运行无需彼此之间的协作。但早一些的系统,如微软的Windows 3.x,通常需要进程明确地退出时间片,然后其他进程才能继续运行。

在一个如Linux这样的多任务系统中,多个程序可能会竞争使用同一个资源。在这种情况下,执行短期的突发性工作并暂停运行来等待输入的程序,要比持续占用处理器来进行计算或不断轮询系统来查看是否有新的输入到达的程序要更好。我们称表现良好的程序为nice程序,而且在某种意义上,这个nice是可以被计算出来的。操作系统根据进程的nice值来决定它的优先级,一个进程的nice值默认为0并将根据这个程序的表现而不断变化。长期不间断运行的程序的优先级一般会比较低。而(例如)暂停来等待输入的程序会得到奖励。这可以帮助与用户进行交互的程序保持及时的响应性。在程序等待用户的输入时,系统会增加它的优先级,这样,当它准备继续运行时,它就会有比较高的优先级而能优先执行。我们可以用nice命令设置进程的nice值,使用renice命令调整它的值。nice命令是将进程的nice值增加10,从而降低该进程的优先级。我们可以用ps命令的-l或-f(长格式输出)选项查看正在运行的进程的nice值。我们感兴趣的值列在NI(nice)一栏,如下所示:
在这里插入图片描述
我们看到ps程序(进程号为1188)正在以默认的nice值运行。如果我们用下面的命令来启动它:

在这里插入图片描述

它将分配到一个+10的nice值。如果用下面的命令调整这个值.
在这里插入图片描述
这个时钟程序运行得就会不那么频繁了。我们可以再用ps命令查看修改过的nice值,状态栏STAT中包含字符N表明这个进程的nice值已被修改过,已经不是默认值了。

ps命令输出中的PPID栏给出的是父进程的进程ID,它是启动这个进程的进程的PID。如果原来的父进程已经不存在,该栏显示的就是init进程的进程ID(PID为1)。
Linux调度器根据进程的优先级来决定运行哪个进程。每个系统的具体实现各有不同,但高优先级的进程总是运行得更频繁。某些情况下,只要还有高优先级的进程可以运行,低优先级的进程就根本不能运行。

启动新进程

启动新进程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程的结构 的相关文章

随机推荐

  • ESP8266_NONOS_SDK开发环境搭建及验证

    ESP8266 NONOS SDK开发环境搭建及验证 视频教程 xff1a 芯片资料芯片 xff1a ESP8266EX模组 xff1a ESP 12F开发板 xff1a NodeMCU 启动模式安装AiThinkerIDE编译报错问题No
  • 华为开发者大会2019观后感

  • 运行Mapreduce,运行一半卡着不动了

    64 root 64 master mr inverted test bash run sh rmr DEPRECATED Please use rm r instead 19 01 17 23 22 23 INFO fs TrashPol
  • 51单片机 | LCD1602 液晶显示实验

    文章目录 一 LCD1602 介绍1 LCD1602 简介2 LCD1602 常用指令3 LCD1602 使用 二 硬件设计三 软件设计1 LCD1602 驱动函数2 主函数 四 实验现象 在前面章节 xff0c 我们已经学习过几种显示装置
  • Ubuntu18.04下自定义meauconfig

    一 前言 本文记录ubutu18 04下自定义meauconfig的安装使用 二 安装 参考链接 xff1a https nuttx apache org docs latest quickstart install html 或者可以看这
  • 服务器搭建及数据库部署

    服务器搭建 参考文章 快速搭建一个自己的服务器详解 xff08 java环境 xff09 因为上学期做非关系数据库课程实验时使用过PolarDB云数据库 xff0c 进行过阿里云的学生认证 xff0c 所以此次云服务器也就选择了Ali的开发
  • MATLAB 2018b 安装 mexopencv (VS 2017 编译)

    MATLAB 2018b 安装 mexopencv VS 2017 编译 之前电脑上装的是MATLAB 2016b 没办法识别VS 2017 虽然官方说有补丁解决这个问题 但还是下了最新的2018b 2018b 识别VS 2017 是没问题
  • Mybatis搞五下(分页、缓存)

    Mybatis搞五下 xff08 分页 缓存 xff09 上篇博客我们讲了动态SQL xff0c 一一多多和延迟加载问题 xff0c 这篇我们讲点轻松的东西 xff0c 关于分页插件pageHelper和Mybatis面试常问的缓存问题 M
  • 03、postman前置脚本

    postman前置脚本是指在Pre requests Script中编写的js脚本 xff0c 一个请求在发送之前 xff0c 会先去执行Pre Request Script xff08 前置脚本 xff09 中的代码 xff0c 可以是为
  • Python3爬取淘宝网商品数据!

    分析淘宝网 这次选择的是淘宝网热卖而不是淘宝网 xff0c 二者虽然名字有不同 xff0c 但是数据还是一样的 xff0c 区别就在于前者把后者的所有店铺和商品的海量数据按照销售量 好评度 信誉度综合测评 重新计算 重新排序展现给买家的一个
  • Python实现淘宝准点抢单!双十一秒杀神器啊!还不来学?

    一 ChromeDriver的安装 若想使用Selenium成功调用Chrome浏览器完成相应的操作 xff0c 需要通过ChromeDriver来驱动 我们在下载之前先来确认下我们使用的Chrome浏览器版本 只需要红框内几位相同即可 根
  • 【点云系列】 场景识别类导读

    文章目录 1 背景知识2 定义3 传统方法4 基于深度学习的方法5 其他参考 xff1a 终于可以简单写一下这一块的导读了 xff0c 拖了一个多周了 希望可以帮助到大家 xff1b xff09 1 背景知识 点云检索 xff08 poin
  • 异常检测综述(Anomaly Detection: A Survey)

    Anomaly Detection A Survey 异常检测综述 xff1a 异常检测是一个重要的问题 xff0c 已经在不同的研究领域和应用领域进行了研究 许多异常检测技术是专门为某些应用领域开发的 xff0c 而其他技术则更为通用 本
  • 基于Prometheus和k8s搭建监控系统

    文章目录 1 实验环境2 Prometheus介绍 xff1f 3 Prometheus特点3 1 样本 4 Prometheus组件介绍5 Prometheus和zabbix对比分析6 Prometheus的几种部署模式6 1 基本高可用
  • STM32F4 | 窗口门狗(WWDG)实验

    文章目录 一 STM32F4 窗口看门狗简介二 硬件设计三 软件设计四 实验现象五 STM32CubeMX 配置 WWDG 在本章中 xff0c 我们将使用窗口看门狗的 中断功能来喂狗 xff0c 通过 DS0 和 DS1 提示程序的运行状
  • deepin15.11系统下使用源码包(tar.xz)安装MySQL 8.0+(补充)

    1 下载MySQL的安装包 1 1 进入官网 xff0c 找到下载 官网地址 mysql官网 1 2 找到下载入口 1 3 选择这个 1 4找到适合自己电脑系统版本 2 安装 配置MySQL和创建mysql用户 注意 最好使用root安装和
  • 基于docker部署prometheus

    1 prometheus架构 Prometheus Server 收集指标和存储时间序列数据 xff0c 并提供查询接口 ClientLibrary 客户端库 Push Gateway 短期存储指标数据 主要用于临时性的任务 Exporte
  • Prometheus监控实战系列二十:监控Kubernetes集群(下)

    本文承接上篇 xff0c 在本篇中我们会讲解Prometheus如何应用基于Kubernetes的服务发现功能 xff0c 检索目标信息并进行监控 在监控策略上 xff0c 我们将混合使用白盒监控与黑盒监控两种模式 xff0c 建立起包括基
  • RT-Thread 简介及架构

    RT Thread xff0c 全称是 Real Time Thread xff0c 顾名思义 xff0c 它是一个嵌入式实时多线程操作系统 xff0c 基本属性之一是支持多任务 xff0c 允许多个任务同时运行并不意味着处理器在同一时刻真
  • 进程的结构

    什么是进程 UNIX标准 xff08 特别是IEEE Std 1003 1 2004年版 xff09 把进程定义为 一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源 目前 xff0c 可以把进程看作正在运行的程序 像Linu