Linux IPC实践(1) -- 概述

简介: 进程的同步与互斥   进程同步: 多个进程需要相互配合共同完成一项任务。   进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区. Linux IPC发展   Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。

进程的同步与互斥

   进程同步: 多个进程需要相互配合共同完成一项任务。

   进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源, 而在进程中涉及到互斥资源的程序段叫临界区.

 

Linux IPC发展

   Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;而BSD则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux则把两者的优势都继承了下来.


进程间通信分类

   文件

   文件锁

   管道(pipe)和命名管道(FIFO)

   信号(signal)

   消息队列

   共享内存

   信号量

   互斥量

   条件变量

   读写锁

   套接字(socket)


进程间共享信息方式

 

IPC对象的持续性

   随进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO(进程结束,数据删除))

   随内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量)

   随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现

     [IPC对象是由Linux内核管理的]


进程死锁及处理

   死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。

死锁产生的四个必要条件

(1)互斥条件

   进程对资源进行排它性使用,即在一段时间内某资源仅为一个进程所占用。 

(2)请求和保持条件

   当进程因请求资源而阻塞时,对已获得的资源保持不放。 

(3)不可剥夺条件

   进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 

(4)环路等待条件

   各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源

 

死锁预防

   资源一次性分配:(破坏请求和保持条件)

   可剥夺资源:破坏不可剥夺条件)

   资源有序分配法:(破坏循环等待条件)

 

死锁避免

   预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。

   由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

银行家算法

为保证资金的安全,银行家规定: 

   (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; 

   (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量

   (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款

   (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 

 

哲学家就餐问题

五个哲学家围在一个圆桌就餐,每个人都必须拿起两把叉子才能用餐;

哲学家就餐问题解法:

   (1)服务生解法: 将服务生看作是一个管理者, 哲学家在拿叉子之前需要征得服务生的同意;

   (2)最多4个哲学家;

   (3)仅当一个哲学家两边筷子都可用时才允许他拿筷子;

   (4)给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之;

 

信号量

   信号量和P、V原语由Dijkstra(迪杰斯特拉)提出, 迪杰斯特拉的三大贡献: goto有害, PV原语, 迪杰斯塔拉最短路算法; 

信号量值含义

   S>0:S表示可用资源的个数

   S=0:表示无可用资源,无等待进程

   S<0:|S|表示等待队列中进程个数

 

PV操作

//信号量定义
typedef struct{
   int value;
   struct process_control_block *list;
}semaphore;
//P原语
//P(semaphore *S)
wait(semaphore *S)
{
    -- S->value;
    if (S->value < 0)
    {
        //将当前进程设置为阻塞状态
        //将当前进程的PCB插入相应的阻塞队列S->list末尾
        block(S->list);
    }
}
//V原语
//V(semaphore *S)
signal(semaphore *S)
{
    ++ S->value;
    if (S->value <= 0)  //表示有进程处于阻塞状态
    {
        //唤醒阻塞队列S->list中等待的一个进程,将其置为就绪态;
        //将其插入就绪队列;
        wakeup (S->list);
    }
}

目录
相关文章
|
2月前
|
Ubuntu Linux vr&ar
IM跨平台技术学习(十二):万字长文详解QQ Linux端实时音视频背后的跨平台实践
本文详细记录了新版QQ音视频通话在 Linux 平台适配开发过程中的技术方案与实现细节,希望能帮助大家理解在 Linux 平台从 0 到 1 实现音视频通话能力的过程。
123 2
|
22天前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
18天前
|
Linux 测试技术 API
Linux PWM接口概述 【ChatGPT】
Linux PWM接口概述 【ChatGPT】
|
1月前
|
存储 安全 Linux
Linux存储安全:系统更新和补丁管理的策略与实践
【8月更文挑战第19天】安全是一个持续的过程,需要不断地评估、更新和改进策略。
33 0
|
1月前
|
存储 安全 Linux
Linux存储安全:数据加密的实践与策略
【8月更文挑战第19天】数据加密是Linux存储安全的基石之一。通过使用LUKS进行磁盘加密和使用GnuPG进行文件加密,可以显著提高数据的安全性。
43 0
|
1月前
|
存储 监控 安全
Linux存储安全:访问控制的实践与策略
【8月更文挑战第18天】Linux存储安全:访问控制的实践与策略
39 0
|
1月前
|
存储 安全 Linux
Linux存储安全:深入实践与案例分析
【8月更文挑战第18天】Linux存储安全是一个多层次、多维度的问题,需要从物理安全、访问控制、数据加密、审计监控、系统更新、备份策略等多个方面综合考虑。通过本文介绍的具体措施和案例代码,读者可以更好地理解如何在Linux系统中实施存储安全措施。安全是一个持续的过程,需要不断地评估、更新和改进策略。
60 0
|
2月前
|
监控 安全 Linux
Linux命令ssltap的深入解析与应用实践
`ssltap`是一个假想的Linux命令,用于模拟SSL/TLS流量分析。它捕获、解密(如果有密钥)并分析加密流量,提供实时监控、协议解析和安全审计。特点包括实时性、灵活性、可扩展性和安全性。示例用法包括捕获特定端口流量和实时监控会话状态。在实际操作中应注意私钥安全、性能影响及合规性,建议定期审计和自动化监控。
|
2月前
|
数据可视化 安全 Linux
探索Linux命令repo-graph:深入解析与应用实践
`repo-graph`是Linux的Yum-utils工具,用于可视化仓库中软件包的依赖关系,简化复杂网络管理。它通过分析元数据生成图形,支持自定义输出格式和特定包分析。例如,`repo-graph --repoid=updates`显示更新仓库的依赖,而`--packages=httpd`则专注httpd包。注意权限、复杂性和选择合适输出格式。定期分析和图形化展示是最佳实践。
|
2月前
|
Linux 编译器 调度
【Linux】对共享库加载问题的深入理解——基本原理概述
【Linux】对共享库加载问题的深入理解——基本原理概述