Linux下进程相关概念详解

目录

一、操作系统

概念

设计操作系统的目的

定位

如何理解“管理”

系统调用和库函数概念

二、进程

概念

描述进程—PCB(process control block)

查看进程

进程状态

进程优先级

 三、其它的进程概念


一、操作系统

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。简单的理解,操作系统包括:

  • 内核(进程管理、内存管理、文件管理、驱动管理)
  • 其他程序(例如函数库、shell程序等等)

设计操作系统的目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位

在整个计算机软硬件架构中,操作系统的定位是:一款“搞管理”的软件。

如何理解“管理”

答:先描述,再组织 

先描述:先用结构体确定其属性

再组织:再用链表或者其它高效的数据结构将其关联起来 

层状结构图 

系统调用和库函数概念

  • 在开发角度,操作系统对外会表现一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度,从而形成库(c库、c++库等),有了库,就方便上层用户或者开发者进行二次开发。 

二、进程

在Windows中,我们启动一个软件,本质上是启动了一个进程

而在Linux中,我们运行一条命令或者一个程序,其实就是在系统层面上创建了一个进程

概念

狭义的理解:进程是正在运行的程序的示例

广义的理解:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动

内核的观点:进程是担当分配系统资源的实体

进程 = 对应的代码和数据 + 进程对应的PCB结构体

描述进程—PCB(process control block)

PCB中存放着进程的信息,可以把PCB理解为是进程属性的集合

不同的操作系统对PCB的命名可能不同,在Linux下,PCB是被命名为task_struct的结构体

task_struct是Linux中描述进程的结构体

task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息

task_struct的内容划分

  • 标示符:描述本进程的唯一标示符,用来区分其它进程
  • 状态:任务状态,退出码,退出信号等
  • 优先级:相对于其它进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享的内存块的指针
  • 上下文数据:进程执行时CPU寄存器中的数据
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器时间的总和,使用的时钟数总和,时间限制,记账号等
  • 其它信息

查看进程

进程的信息可以通过/proc系统文件夹查看 

myproc.c 

#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("hello world\n");sleep(1);}                                                                                                                                                                       return 0;
}

通过系统调用来获取进程标示符

  •  进程ID(PID)
  • 父进程ID(PPID)

  #include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){while(1){pid_t pid = getpid();//自己进程的pidpid_t ppid = getppid();//父进程                                   printf("hello world,pid: %d, ppid: %d\n", pid, ppid);sleep(1);                                      }                                                return 0;                                        }    

 其中的这个父进程就是bash

进程状态

先来看看Linux内核中关于进程状态的定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

关于内核源码可以自行去官网下载

  • R运行状态:并不意味这进程一定在运行中,它表明进程要么在运行中要么在运行队列里
  • S睡眠状态:意味着进程在等待事件完成(这里的睡眠有时候也叫可中断睡眠)
  • D磁盘休眠状态:有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待I/O结束
  • T(t)停止状态:可以通过发送SIGSTOP信号给进程来停止进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
  • X死亡状态(终止状态):这个状态只是一个返回状态,是一瞬间的,你不会在任务列表里看到这个状态

注:当你在查看你的进程状态时后面可能会带一个+号,表明这是一个前台进程

如果要程序在后台运行,可以在运行时加上&,如下

  •  Z僵尸状态:僵尸状态是一个比较特殊的状态。一个子进程已经退出,但是父进程没有读取到子进程退出的返回代码,此时子进程就会变成僵尸状态,这个进程也称为僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态码。

代码演示僵尸状态

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){while(1){printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());sleep(3);break;}exit(0);}else {while(1){printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);} }return 0;
}

僵尸进程的危害

  1. 造成内存资源的浪费。因为进程退出了,但是还没有被释放,因此这个进程就还需要被维持下去,而维持这个状态本身就是要用数据来维持,也属于进程的基本信息,所以保存在PCB中,Z状态一直不退出,PCB就要一直维护。
  2. 造成内存泄露。因为PCB是个结构体,而结构体是要在内存中开辟空间的。

孤儿进程

父进程先退出,子进程还没退出,这时子进程就称之为“孤儿进程”,孤儿进程会被1号init进程(系统本身)领养,当然也会被init进程回收。

代码演示

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){while(1){printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);}}else {while(1){printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());sleep(5);break;} exit(0);}return 0;
}

进程优先级

 CPU资源分配的先后顺序,就是指进程的优先级。优先级高的进程有优先执行的权利。

为什么要有优先级?

因为CPU是有限的,而进程太多,需要通过某种方式来竞争资源。

Linux中的优先级的做法是

优先级 = 老的优先级 + nice值

ps -l:查看系统进程 

PRI就是进程的优先级,其值越小进程的优先级别越高

NI就是nice值,其表示进程可被执行的优先级的修正数值

加入nice值之后,此时PRI = PRI(老)+ nice

当nice值为负值时,该程序的优先级值将会变小,即其优先级会变高。因此调整进程优先级在linux下就是调整进程的nice值。

nice的取值范围是-20至19,一共40个级别

更改进程的优先级

  1.  在命令行输入top
  2. 进入top后按“r”
  3. 输入进程的PID
  4. 输入nice值

设置有限的nice值而不直接改PRI的原因是:操作系统设置nice值的本质就是更好的平衡进程对系统资源的占用,如果直接改PRI可能产生一个进程长时间占用系统资源的现象。

三、其它的进程概念

独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。

竞争性:系统进程数目众多,而CPU资源有限,所以进程之间是具有竞争属性的。

并行:多个进程在多个CPU下同时进行运行。

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进。

上下文数据:一个进程在被运行时,CPU里的寄存器保存的一定是这个进程的临时数据,而这个临时数据就叫做上下文。上下文是绝对不可以被丢去的。在进程时间片到了要被切换时,要连同上下文一起打包带走。上下文可以有多份,分别对应不同的进程


内容如有错误,还望批评指正。如果你觉得内容有用的话,就给博主一键三连吧,你的支持将会是我的动力。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Easyx】easyx从入门到精通 — 初步入门

easyx 初步入门 1 安装easyx图形库2 如何使用Easyx3 效果初试4 基本图形绘制4.1 绘制点4.2 绘制直线4.3 绘制圆形4.4 绘制矩形4.5 绘制椭圆4.6 绘制圆角矩形4.7 绘制扇形 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇…

算法入门-二分搜索(长期更新)

文章目录 情景一 : 二分查找情景二 : 找出一个 > num 的最左侧的位置情景三 : 找出一个 < num 的最右侧的位置leetcode 162 :寻找峰值leetcode 69 : x 的平方根 首先来简介一下二分搜索算法,二分搜索是一种每次砍半的算法,最经典的案例当然是我们的二分查找算法,但是大部…

【JAVA重要知识 | 第一篇】一篇文章读懂HashMap(存储、扩容、初始化过程)

文章目录 1.一篇文章读懂HashMap&#xff08;存储、扩容、初始化过程&#xff09;1.1HashMap简介1.1.1特点1.1.2优点1.1.3缺点 1.2深入解读HashMap1.2.1常用常量和变量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用变量 1.2.2存储过程&#xff08;1&#xf…

诊所门诊电子处方软件操作教程及试用版下载,医务室处方笺管理系统模板教程

诊所门诊电子处方软件操作教程及试用版下载&#xff0c;医务室处方笺管理系统模板教程 一、前言 以下软件程序教程以 佳易王诊所电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;点击基本信息设置——处方配…

Python编程小案例—利用flask查询本机IP归属并输出网页图片

Python编程小案例—利用flask查询本机IP归属并输出网页图片 环境&#xff1a;Pycharm Mac OS 源码如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查询.html)if __name__ __…

如何正确选择一台大路灯?2024五大出众品牌大路灯推荐,附超全科普知识整理

大路灯的使用操作非常简便&#xff0c;而且能够提供最适合目前用眼的光线环境。但如今市场中却有一些劣质大路灯&#xff0c;它们的使用体验不佳&#xff0c;很多客户反馈说可能会出现光线不稳定、刺眼等问题&#xff0c;甚至会有让用户有损伤视力的风险。那么如何选择一台大路…

华硕ROG玩家国度幻16air 2024原装系统恢复安装教程方法

华硕ROG玩家国度幻16air 2024原装系统恢复安装教程方法 重建ASUSRECOVERY恢复功能 支持型号&#xff1a; GU605MI&#xff0c;GU605MY&#xff0c;GU605MZ GU605MV&#xff0c;GU605MU 分3种安装方法 远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1…

Spring对IoC的实现

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

前端monorepo大仓共享复杂业务组件最佳实践

一、背景 在 Monorepo 大仓模式中&#xff0c;我们把组件放在共享目录下&#xff0c;就能通过源码引入的方式实现组件共享。越来越多的应用愿意走进大仓&#xff0c;正是为了享受这种组件复用模式带来的开发便利。这种方式可以满足大部分代码复用的诉求&#xff0c;但对于复杂…

JAVA *数据库连接池 * 接JDBC

一.介绍: 数据库连接池实际上就是一个 " 容器 " 当有多个拥护需要访问数据库的时候, 一个用户会打开一个数据库连接, 但是!当用户离开的时候,就会断开数据库连接,那么数据库连接就作废了,之后如果还有用户需要进行访问,需要再建立一个数据库连接......循环往复, …

【Mybatis】快速入门 基本使用 第一期

文章目录 Mybatis是什么&#xff1f;一、快速入门&#xff08;基于Mybatis3方式&#xff09;二、MyBatis基本使用2.1 向SQL语句传参2.1.1 mybatis日志输出配置2.1.2 #{}形式2.1.3 ${}形式 2.2 数据输入2.2.1 Mybatis总体机制概括2.2.2 概念说明2.2.3 单个简单类型参数2.2.4 实体…

Web组态可视化编辑器 快速绘制组态

随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说&#xff0c;将单机版软件转变…

计算机视觉基础知识(十六)--图像识别

图像识别 信息时代的一门重要技术;目的是让计算机代替人类处理大量的物理信息;随着计算机技术的发展,人类对图像识别技术的认识越来越深刻;图像识别技术利用计算机对图像进行处理\分析\理解,识别不同模式的目标和对象;过程分为信息的获取\预处理\特征抽取和选择\分类器设计\分…

WebServer -- 注册登录

目录 &#x1f349;整体内容 &#x1f33c;流程图 &#x1f382;载入数据库表 提取用户名和密码 &#x1f6a9;同步线程登录注册 补充解释 代码 &#x1f618;页面跳转 补充解释 代码 &#x1f349;整体内容 概述 TinyWebServer 中&#xff0c;使用数据库连接池实现…

【深度学习笔记】计算机视觉——图像增广

图像增广 sec_alexnet提到过大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后&#xff0c;生成相似但不同的训练样本&#xff0c;从而扩大了训练集的规模。 此外&#xff0c;应用图像增广的原因是&#xff0c;随机改变训练样本可以…

Python + Selenium —— 下拉菜单处理!

传统的下拉菜单 Select 元素&#xff0c;由一个 Select 一系列的 option 元素构成。 <select id"source" name"source"><option value"">--请选择--</option><option value"1001">网络营销</option>&…

3.3 序列式容器-deque、stack、queue、heap、priority_queue

deque 3.1定义 std::deque&#xff08;双端队列&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一种容器&#xff0c;表示双端队列数据结构。它提供了在两端高效地进行插入和删除操作的能力。与vector的连续线性空间类似&#xff0c;但有所不同&#xff0c;deque动…

基于ssm旅社客房收费管理系统+vue

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

STM32使用FlyMcu串口下载程序与STLink Utility下载程序

文章目录 前言软件链接一、FlyMcu串口下载程序原理优化手动修改跳线帽选项字节其他功能 二、STLink Utility下载程序下载程序选项字节固件更新 前言 本文主要讲解使用FlyMcu配合USART串口为STM32下载程序、使用STLink Utility配合STLink为STM32下载程序&#xff0c;以及这两个…

代码随想录算法训练营第62/63天| 503.下一个更大元素II、42. 接雨水、84.柱状图中最大的矩形

文章目录 503.下一个更大元素II思路代码 42. 接雨水思路代码 84.柱状图中最大的矩形思路代码 503.下一个更大元素II 题目链接&#xff1a;503.下一个更大元素II 文章讲解&#xff1a;代码随想录|503.下一个更大元素II 思路 和739. 每日温度 (opens new window)也几乎如出一辙&…