网络工程师 (7)进程管理

一、进程相关的概念

(一)定义

       进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。进程是程序的一次执行实例,具有动态性、并发性、独立性、异步性和结构性等基本特性。

(二)结构

       进程由多个元素组成,主要包括程序代码、数据、进程控制块(PCB)以及系统资源等。其中,程序代码是进程执行的具体指令;数据是程序处理的对象;进程控制块是操作系统用于描述进程状态和控制进程运行的数据结构,是进程的唯一标识;系统资源则包括处理器、内存、I/O设备等。

(三)状态

       进程在其生命周期中会经历多种状态,主要包括就绪状态、运行状态和阻塞状态。就绪状态是指进程已经获得了除处理器以外的所有资源,等待被调度执行;运行状态是指进程正在处理器上执行;阻塞状态则是指进程因等待某种资源(如I/O操作)而无法继续执行。进程的状态之间可以相互转换。

(四)特性

  1. 动态性:进程是程序的一次执行过程,它随着程序的运行而不断变化。
  2. 并发性:多个进程可以在同一个处理器上并发执行,提高系统效率。
  3. 独立性:每个进程都有自己独立的运行环境和资源,互不干扰。
  4. 异步性:进程的执行速度不可预知,可能受到多种因素的影响。
  5. 结构性:进程由多个部分组成,包括程序、数据和进程控制块等。

(五)进程与程序的区别

       程序是静态的,它是一组有序的指令集合,用于描述计算机执行的任务。而进程则是程序的一次执行实例,是动态的、有生命周期的。程序可以多次执行,每次执行都会创建一个新的进程。进程包含了程序执行时的所有信息,如代码、数据、状态等。

(六)通信

       在操作系统中,进程之间需要进行通信以共享数据或协调行动。进程的通信方式有多种,包括管道、消息队列、共享内存、信号量、套接字等。这些通信方式各有优缺点,适用于不同的应用场景。

(七)调度与管理

       进程调度是操作系统的一项核心功能,它负责决定哪个进程应该获得处理器的使用权。进程调度的目标是提高系统吞吐量和响应速度,同时确保系统资源的公平分配。操作系统的进程管理功能包括进程的创建、终止、挂起、唤醒等,以及进程间的同步和互斥控制。

(八)进程与线程的关系

       进程是系统进行资源分配和调度的基本单位,而线程则是进程内的一条执行路径。一个进程可以包含多个线程,这些线程共享进程的资源,并可以并发执行。线程具有更小的开销和更高的执行效率,因为线程之间的切换比进程之间的切换要快得多。然而,线程也带来了并发控制的问题,如线程间的同步和互斥控制等。

二、死锁问题

(一)死锁的定义

       死锁是指两个或两个以上的线程(或进程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。简单来说,就是每个线程都在等待另一个线程释放资源,而另一个线程又在等待该线程释放资源,从而形成了一个无法打破的循环等待链。

二、死锁产生的条件

  1. 互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅能为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  2. 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
  3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  4. 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{P1, P2, …, Pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有。

(三)死锁产生的原因

  1. 资源竞争:线程之间需要共享有限的资源(如文件、内存、数据库锁等)。当多个线程同时访问并尝试获取多个资源时,就可能形成相互依赖,导致死锁。
  2. 不恰当的锁顺序:多个线程以不同顺序获取锁可能会导致死锁。例如,线程A先获取锁1,再获取锁2;线程B先获取锁2,再获取锁1。两者可能相互等待对方释放锁,从而形成死锁。
  3. 资源分配不当:系统提供的资源个数少于并发进程所要求的该类资源数,也可能导致死锁。

(四)死锁的解决方案

  1. 预防死锁

    • 破坏互斥条件:通过共享资源,避免资源的独占。
    • 破坏保持与等待条件:要求线程在获取资源之前,必须先释放已持有的资源。
    • 破坏不剥夺条件:允许线程强制释放资源,以避免死锁。
    • 破坏循环等待条件:为每个资源设定一个全局顺序,所有线程按顺序请求资源。
  2. 避免死锁

    • 资源请求顺序:规定所有线程必须以相同的顺序请求资源,避免循环等待。
    • 使用锁超时:在获取锁时设置超时时间,超时则放弃请求。
    • 使用更高级的锁机制:例如读写锁或信号量,避免不必要的锁竞争。
    • 死锁避免算法:例如银行家算法,通过预测资源分配的安全性来避免死锁。但需要注意的是,死锁避免算法的执行会增加系统的开销。
  3. 检测与恢复死锁

    • 死锁检测:判断系统是否处于死锁状态。常用的方法包括资源分配图、死锁检测工具(如jstack、VisualVM)等。
    • 死锁恢复:一旦检测到死锁,需要执行恢复策略。常用的方法包括剥夺某个进程所占有的资源(即强制释放资源),并将其分配给其他进程;或者将某些进程回滚到之前的状态,并重新尝试执行。

(五)死锁案例

       假设有两个线程A和B,它们分别需要资源R1和R2。线程A先获取了资源R1,然后尝试获取资源R2;线程B先获取了资源R2,然后尝试获取资源R1。此时,线程A和B都在等待对方释放资源,从而形成死锁。

       为了避免这种情况,可以规定所有线程必须以相同的顺序请求资源。例如,规定所有线程都必须先请求资源R1,再请求资源R2。这样,即使多个线程同时尝试获取资源,也不会形成死锁。

三、进程的互斥和同步 

(一)进程的互斥

  1. 定义

           进程互斥(Mutual Exclusion)是指在多进程或多线程环境下,确保多个进程或线程在同一时刻只能有一个进程或线程访问共享资源的同步机制。

  2. 目的

           互斥是进程同步的一部分,是保证多个进程间不会因同时访问共享资源而发生冲突或数据不一致的关键技术。当多个进程访问共享资源时,如果没有有效的互斥机制,可能会导致竞态条件(Race Condition),即进程的执行结果依赖于执行顺序,从而产生不一致或错误的结果。

  3. 临界区

           临界区指的是访问共享资源的那一段代码。在这段代码执行时,进程可能会改变共享资源的状态。为了防止多个进程同时进入临界区而导致错误或冲突,必须实现进程互斥。

  4. 实现方法

    • 禁用中断:一种最简单的互斥实现方法。在操作系统中禁用中断后,CPU就无法响应外部的中断请求,这意味着没有其他进程能抢占当前正在执行的进程。然而,这种方法只适用于单处理器系统,并且存在不公平的问题,因为禁用中断后,当前进程会一直占用CPU,其他进程无法执行。
    • 互斥锁:操作系统中最常用的同步机制之一。互斥锁用于确保同一时刻只有一个进程能够访问临界区。Lock(加锁):进程尝试获取锁,若当前没有其他进程持有锁,则进程获得锁并进入临界区;如果锁已被其他进程持有,进程将被阻塞。Unlock(解锁):进程执行完临界区代码后释放锁,允许其他进程获取锁并进入临界区。
    • 信号量:用于管理资源的同步工具,通常用来解决互斥问题。二值信号量(Binary Semaphore):只允许值为0或1,常用于实现互斥锁。当信号量的值为1时,进程可以进入临界区;当信号量的值为0时,进程需要等待。计数信号量(Counting Semaphore):允许值为非负整数,表示共享资源的数量。通过适当的增减操作,控制多个进程对资源的访问。
    • 自旋锁:一种简单的互斥锁,常用于多核或多处理器系统中。自旋锁的工作原理是,当一个进程尝试获取锁时,如果锁已经被其他进程持有,它会不断检查锁的状态,等待锁被释放,而不是阻塞自己。自旋锁避免了上下文切换的开销,但会消耗CPU时间,因此只适用于临界区代码执行时间非常短的情况。
  5. 遵循原则

    • 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
    • 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
    • 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。
    • 让权等待:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

(二)进程的同步

  1. 定义

           进程同步是指协调多个进程间的执行次序,确保它们按照某种特定的顺序来访问共享资源或执行特定的操作。

  2. 目的

           进程同步的目的是防止数据竞争和资源争用,确保系统的正确性和性能。

  3. 实现方法

    • 信号量:除了用于解决互斥问题外,信号量还可以用于实现进程同步。通过控制资源访问许可证的数量,信号量可以协调多个进程对共享资源的访问顺序。
    • 条件变量:通常与互斥锁一起使用,用于在某个条件满足时通知一个或多个进程。它允许进程在等待某个条件时释放互斥锁并进入等待状态,直到条件满足时才被唤醒。
    • 读写锁:区分读操作和写操作,允许多个进程同时读取,但只允许一个进程写入。这可以提高系统的并发性能,同时确保写操作的原子性和一致性。
  4. 注意事项

    • 避免死锁:死锁是指两个或多个进程因互相等待对方持有的资源而无法继续执行的情况。合理地申请和释放资源,采用适当的资源分配策略,可以避免死锁的发生。
    • 防止饥饿:饥饿指某个或某些进程由于长期得不到所需的资源而无法继续执行的情况。设计同步机制时需要考虑公平性,确保每个进程都有机会获得所需的资源。

 结语  

健康是最大的财富

没有健康,一切都是浮云

!!!

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

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

相关文章

使用CSS实现一个加载的进度条

文章目录 使用CSS实现一个加载的进度条一、引言二、步骤一:HTML结构与CSS基础样式1、HTML结构2、CSS基础样式 三、步骤二:添加动画效果1、使用CSS动画2、结合JavaScript控制动画 四、使用示例五、总结 使用CSS实现一个加载的进度条 一、引言 在现代网页…

ios swift画中画技术尝试

继上篇:iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画,起初是看到后台模式里有一个picture in picture,去了解了后发现这个就是小窗口视频播放,方便用户执行多任务。看小窗口视频的同时,可以作其他的事情…

论文阅读(二):理解概率图模型的两个要点:关于推理和学习的知识

1.论文链接:Essentials to Understand Probabilistic Graphical Models: A Tutorial about Inference and Learning 摘要: 本章的目的是为没有概率图形模型背景或没有深入背景的科学家提供一个高级教程。对于更熟悉这些模型的读者,本章将作为…

【C++】特殊类设计

目录 一、请设计一个类,不能被拷贝二、请设计一个类,只能在堆上创建对象三、请设计一个类,只能在栈上创建对象四、请设计一个类,不能被继承五、请设计一个类,只能创建一个对象(单例模式)5.1 饿汉模式5.2 懒汉模式 结尾…

SSM开发(七) MyBatis解决实体类(model)的字段名和数据库表的列名不一致方法总结(四种方法)

目录 方法一: 使用@Results和@Result注解(注解方式) 方法二:修改 SQL 查询语句中的别名(注解方式) 方法三: 全局配置别名或结果映射(resultMap,XML配置方式) 方法四:使用@Column注解 在MyBatis中,如果你希望使用注解的方式来操作数据库,但又遇到实体类中的…

USB 3.1-GL3510-52芯片原理图设计

USB 3.1-GL3510-52芯片原理图设计 端口功能与兼容性物理层集成与性能电源相关特性充电功能其他特性原理图接口防护ESD 保护要求 GL3510-52是一款由Genesys Logic(创惟科技)研发的USB转换芯片,具有以下特点: 端口功能与兼容性 它…

LeetCode热题100中 17. 20. 53. 78. 215.

17.电话号码的字母组合: 题目描述: 实现思路: 将回溯过程抽象成树结构,每个叶子节点作为结果的一部分。 我们定义一个数组map,它的下标表示输入的数字所对应的字母,先对特殊情况进行处理:1.输…

高级编码参数

1.跳帧机制 参考资料:frameskipping-hotedgevideo 跳帧机制用于优化视频质量和编码效率。它通过选择性地跳过某些帧并使用参考帧来预测和重建视频内容,从而减少编码所需的比特率,同时保持较高的视频质量。在视频编码过程中,如果…

内网穿透实现MC联机

目录 内网穿透下载安装服务端(你)启动网络启动 MC 客户端(你的朋友) 放寒假了,想和同学玩mc,但是没有服务器怎么办呢?这就不得不提到内网穿透技术了。 注:本文参考视频:…

【每日一A】2015NOIP真题 (二分+贪心) python

题目概述 在起点和终点之间有n个石头,移除某些(不超过m个)石头后,让石头间的距离最大。 求石头间的最短距离d的最大值 跳石头 点此跳转 https://www.lanqiao.cn/problems/364/learning/?page1&first_category_id1&status…

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

FreeRTOS从入门到精通 第十四章(队列集)

参考教程&#xff1a;【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、队列集简介 1、队列集概述 &#xff08;1&#xff09;一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者&#xff1a;本人是一名县级融媒体中心的工程师&#xff0c;多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展&#xff0c;文字转语音&#xff08;Te…

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐&#xff01; 接之前wiki 35、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;五&#xff09; 已经分析完了第一个测试项&#xff0c;输入输出端口测试&#xff0c;接下来分析下环境变量测试&#xff0c;也比较…

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…

Oracle迁移DM数据库

Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS&#xff0c;将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具&#xff0c;点击新建工程&#xff0c;填写好工程信息&#xff0c;如图&#xff1a; 2.2 新建迁…

Base64详解

文章目录 Base64详解一、引言二、Base64编码原理1、Base64的基本概念2、编码过程2.1、分组与填充2.2、二进制转换2.3、字符映射 三、Base64解码原理四、使用示例1、Java实现Base64编码2、Java实现Base64解码 五、总结 Base64详解 一、引言 Base64是一种常见的编码方式&#xf…

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

消息队列篇--通信协议篇--应用层协议和传输层协议理解

在网络通信中&#xff0c;传输层协议和应用层协议是OSI模型中的两个不同层次的协议&#xff0c;它们各自承担着不同的职责。 下文中&#xff0c;我们以TCP/UDP&#xff08;传输层协议&#xff09;和HTTP/SMTP&#xff08;应用层协议&#xff09;为例进行详细解释。 1、传输层协…