Linux学习(11)——进程的基本概念

目录

一、程序

1、什么是程序?

二、进程

1、什么是进程?

 2、进程具有的特征

2.2进程,线程,协程

2.2.1 进程和线程的区别

2.2.2如何查看一个程序是多线程还是单线程

3、进程使用内存的问题

①内存泄漏:Memory Leak

②内存溢出:Memory Overflow

③内存不足:OOM Out Of memory

4、进程状态

4.1进程的基本状态

4.2状态之间转换六种情况

4.3 进程更多的状态

4.4 僵尸进程

5、进程的优先级

6、进行分类 


一、程序

1、什么是程序?

执行特定任务的一段代码

二、进程

1、什么是进程?

运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,是硬件资源分配的最小单位。

  • 进程ID(Process ID,PID)号码被用来标记各个进程

  • UID、GID语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承。

  • 通常从执行进程的用户来继承

  • 存在生命周期

  • 都由其父进程创建

  • 进程创建:

  • init:第一个进程,从 CentOS7 以后为systemd

  • 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write 写实更新,有数据写入子进程需要新的内存空间

 2、进程具有的特征

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

  • 并发性:任何进程都可以同其他进程一起并发执行;

  • 独立性:进程是系统进行资源分配和调度的一个独立单位;

  • 结构性:进程由程序、数据和进程控制块三部分组成。

2.2进程,线程,协程

进程:

①硬件资源分配的最小单位

②只分配任务,不执行任务

线程:

①线程是程序执行的最小单位

②减少硬件资源的消耗

 协程:

是一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己写程序来管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性。

2.2.1 进程和线程的区别

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多。

2.2.2如何查看一个程序是多线程还是单线程

pstree 

grep -i threads /proc/进程的PID/status
prtstat    进程pid号|GREP -j threads

3、进程使用内存的问题

①内存泄漏:Memory Leak

指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态

②内存溢出:Memory Overflow

指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。

③内存不足:OOM Out Of memory

OOM 即 Out Of Memory,“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示

Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child

当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理。

原因:

给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的JVM参数指定)太少。

应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

使用的解决办法:

1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用

2,给系统增加swap空间

pmap  进程id #查看进程具体模块所占内存的大小

4、进程状态

4.1进程的基本状态

  • 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

  • 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行

  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态

  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用

  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

4.2状态之间转换六种情况

运行——>就绪:

①主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的

②在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态

就绪——>运行:

运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:

正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如:发生了I/O请求

阻塞——>就绪:

进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

阻塞——>运行:

即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

就绪——>阻塞:

就绪态根本就没有执行,谈不上进入阻塞态

4.3 进程更多的状态

  • 运行态:running

  • 就绪态:ready

  • 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable

  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动

  • 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程

4.4 僵尸进程

一个进程结束了,但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵厂进程。

父进程退出 子进程没有退出 那么这些子进程就没有父进程来管理了, 就变成僵尸进程。

子进程已经结束了,父进程没有意识到。

[root@centos7 ~]#bash
[root@centos7 ~]#echo $BASHPID
1809
[root@centos7 ~]#echo $PPID
1436
#将父进程设为停止态
[root@centos7 ~]#kill -19 1436
#杀死子进程,使其进入僵尸态
[root@centos7 ~]#kill -9 1809
[root@centos7 ~]#ps aux #可以看到上面图示的结果,STAT为Z,表示为僵尸态
#方法1:恢复父进程
[root@centos7 ~]#kill -18 1436 
#方法2:杀死父进程
[root@centos7 ~]#kill -9 1436
#再次观察,可以僵尸态的进程不存在了
[root@centos7 ~]#ps aux

5、进程的优先级

在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice

其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。

PRI 和 NI 的关系如下:

PRI (最终值) = PRI (原始值) + NI

其实,大家只需要记得,我们修改 NI 的值就可以改变进程的优先级即可。NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理。

修改 NI 值时有几个注意事项:

  • NI 范围是 -20~19。

  • 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。

  • 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。

  • 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

进程优先级调整

  • 静态优先级:100-139

  • 进程默认启动时的nice值为0,优先级为120

  • 只有根用户才能降低nice值(提高优先性)

6、进行分类 

操作系统分类:

  • 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用

  • 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务

进程类型:

  • 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

  • 前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

按进程资源使用的分类:

  • CPU-Bound:CPU 密集型,非交互

  • IO-Bound:IO 密集型,交互

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

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

相关文章

GO语言笔记1-变量与基本数据类型

变量使用步骤 声明赋值使用 package main import "fmt" func main(){var age int //声明一个 int类型的变量叫ageage 18 //给变量用 赋值fmt.Println(age) //使用变量 输出变量的值 } 编译运行输出变量值 变量的四种使用方式 package main import "fmt&q…

【大数据】Spark学习笔记

初识Spark Spark和Hadoop HadoopSpark起源时间20052009起源地MapReduceUniversity of California Berkeley数据处理引擎BatchBatch编程模型MapReduceResilient distributed Datesets内存管理Disk BasedJVM Managed延迟高中吞吐量中高优化机制手动手动APILow levelhigh level流…

RFID技术在3C家电中的全方位应用

RFID技术在3C家电中的全方位应用 一、RFID技术简述 射频识别(RFID)技术是一种无线通信技术,已经在各行各业得到广泛应用。在3C家电领域,RFID技术的应用正在逐渐增加,为产品追溯、库存管理、防伪验证等方面提供了许多…

leetcode1944. 队列中可以看到的人数

Problem: 1944. 队列中可以看到的人数 文章目录 题目解题方法复杂度Code 题目 有 n 个人排成一个队列,从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights ,每个整数 互不相同,heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边…

JVM之对象创建

对象创建的流程 1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new指令对…

含科研思考六、关于【图神经网络】的一些要点 | 图神经网络节点表示学习研究:选题参考、问题探讨 | 图神经网络多模态 | 异构图神经网络

我们抬头便看到星光,星星却穿越了万年. 🎯作者主页: 追光者♂🔥 🌸个人简介: 📝[1] CSDN 博客专家📝 🏆[2] 人工智能领域优质创作者🏆 🌟[3] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌿[4] 2022年度博客之星人工智能领域TOP4🌟 🏅

Docker-Compose部署Redis(v7.2)主从模式

文章目录 一、前提准备1. redis配置文件2. 下载redis镜像3. 文件夹结构 二、docker-compose三、主从配置1.主节点配置文件 环境 docker desktop for windows 4.23.0redis 7.2 一、前提准备 1. redis配置文件 因为Redis 7.2 docker镜像里面没有配置文件,所以需要…

Color Control

设计一个优秀的用户界面是一项艰巨的任务。特别是如果你想改变UI的颜色,调整所有元素可能需要花费大量时间。Color Control可以帮助你!在检查器中以可视化的方式将你的项目颜色定义为资源。Color Control为你提供了组件,当你编辑它们时,它们会自动更新你的UI元素。 颜色控制…

Oracle-游标

简介 游标即cursor,是一种用于遍历结果集的数据类型。它是一个指向结果集的指针,可以用于遍历结果集中的每一行数据,但是一次只能指向一行。游标通常用于存储过程和函数中,以便在处理结果集时能够逐行处理数据。 语法 /* 游标:(…

花了一小时,拿python手搓了一个考研背单词软件

听说没有好用的电脑端背单词软件?只好麻烦一下,花了一小时,拿python手搓了一个考研背单词软件。 代码已经开源在我的github上,欢迎大家STAR! 其中,数据是存放在sqlite中,形近词跳转是根据jaro …

新的centos7.9安装docker版本的jenkins2.436.1最新版本-后端项目发布(四)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/n…

遥感影像-语义分割数据集:2021年昇腾杯复赛数据集详细介绍及训练样本处理流程

原始数据集详情 简介:细粒度语义分割赛道依据现有的遥感地物分类要求, 结合现有的地物分类实际需求,参照地理国情监测、 “三调”等既有地物分类标准,依据遥感地物“所见即所得”原则, 设计地物要素分类体系&#xff…

Excel技巧之【如何修改密码】

我们知道,Excel可以设置多种密码来保护文件,那想要修改密码,要如何操作呢?下面小编来分享一下Excel常用的3种密码的修改方法,一起来看看吧! 1. “打开密码” 想要修改Excel表格的“打开密码”&#xff0c…

scratch给数据清单排序 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch给数据清单排序 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Web前端篇——ElementUI之el-scrollbar + el-backtop + el-timeline实现时间轴触底刷新和一键返回页面顶部

ElementUI之el-scrollbar el-backtop el-timeline实现时间轴触底刷新和一键返回页面顶部。 背景:ElementUI的版本(vue.global.js 3.2.36, index.css 2.4.4, index.full.js 2.4.4) 废话不多说,先看动…

VSCode远程开发配置和SSH免密登录

目录 概要远程开发插件安装开始连接SSH免密登录开发环境配置 概要 现在很多公司都是直接远程到服务器上写代码,使用远程开发,可以在与生产环境相同的环境中开发、测试和部署代码,减少因环境不同而导致的问题。本文将详细介绍如何通过VSCode连…

MS713/MS713T:CMOS 低压、4Ω四路单刀单掷开关,替代ADG713

产品简述 MS713/MS713T 是一款单芯片 CMOS 4 路可选择开关,具有低 功耗、高开关速度、低导通阻抗、低漏电和高带宽特性。其工作 电压范围是 1.8V 到 5.5V ,可以广泛应用在电池供电仪器仪表、新 一代的模数转换和数模转换系统中。其高带宽特性可用在 …

【React系列】网络框架axios库的使用

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. axios库的基本使用 1.1. 网络请求的选择 目前前端中发送网络请求的方式有很多种: 选择一:传统的Aj…

【K8S 云原生】Pod资源限制、Pod容器健康检查(探针)

目录 一、docker的重启方式和K8S重启方式 1、Pod的重启方式: 2、docker的重启策略: 二、yaml文件快速生成: 三、pod的状态: 四、Pod的资源限制 1、限制的方式和种类 2、CPU的限制的格式: 五、K8S拉取镜像的策…

一文讲透使用SPSS统计分析软件如何处理缺失值?

推荐采用《SPSS统计分析入门与应用精解(视频教学版)》 杨维忠、张甜 清华大学出版社“1.9 缺失值处理” 的解答。 本节内容选自《SPSS统计分析入门与应用精解(视频教学版)》 杨维忠、张甜 清华大学出版社“1.9 缺失值处理”&#…