Linux进程间通信

本文介绍了进程间通信(IPC)的基本概念和技术,包括管道、FIFO、消息队列、信号量和共享存储等经典IPC方式。详细阐述了每种方式的工作原理、优缺点及应用场景,并对比了不同IPC机制的特点。

引言

  • 进程间除了可以使用 fork和exec传送打开的文件,也可以使用IPC(Inter Processing Communication)的方式通信。
  • 经典的IPC包括:管道、FIFO、消息队列、信号量、以及共享存储。
  • 在新的程序中要尽可能的避免使用消息队列和信号量,应该考虑全双工管道和记录锁,他们使用会更加的简单。共享存储依然有它的用途,虽然使用mmap函数也能提供同样的功能。
  • 以下的所有的方式,除了POSIX信号量,其他方式生命周期都是随内核,不手动释就不会消失。

管道

  • 管道是UNIX系统最古老的通信方式。有以下局限性:
    1、历史上是半双工的,由于兼容性,只有部分系统支持全双工。
    2、管道只能在公共祖先的两个进程间使用。通过由一个进程f创建,然后fork 之后,管道就能在父子啊进程中使用。FIFO就没有这个局限性。
  • 虽然管道具有一定的局限性,但是目前应用最多的依然还是未命名管道和FIFO(命名管道) 。
  • 使用pipe(int fd[2])创建管道,fd[0]表示读端,fd[1]表示写端,可使用close关闭,也可以使用read/write直接读写。
函数popen和pclose
  • 常见的操作是创建一个链接到另一个进程的管道,然后输入或者输出数据,这两个函数就是标准IO提供的。
	#include <stdio.h>
	// 返回值:若成功返回文件指针,出错返回NULL
	FILE *popen(const char*cmdstring, const char *type);
	//成功返回cmdstring的终止状态,出错返回-1
	int pclose(FILE *fp);
  • 函数popen先执行fork,然后调用exec执行cmdstring,返回一个IO文件指针,若type是r,则是标准输出。如type是“w”,则是标准输入。
  • cmdstring由Bourne shell执行:sh -c cmdstring

协同进程

  • popen函数只提供连接到另一个进程的标准输入或者标准输出的一个单向通道,而协同进程则有连接到另一个进程的两个单向管道:一个标准输入一个标准输出。具体例子详见C++常用函数中的实现。

FIFO

  • FIFO有时候被成为命名管道,未命名的管道只能在两个相关进程间通信,而FIFO可以在不相关的进程间通信
  • 使用mkfifo或者mkfifoat创建FIFO,要用open打开它。
  • FIFO有两个用途:
    1、shell使用FIFO将数据从一个管道传送到另一个管道,无需创建中间临时文件。
    2、在C/S程序中FIFO用作汇聚点,在客户端于服务器之间传递数据。

XSI IPC结构的优缺点

  • XSI IPC 有三种:消息队列、信号量以及共享存储器。
  • 缺点:
    1、IPC结构是系统范围内起作用的,没有引用计数。导致资源的删除不彻底。
    2、IPC在文件系统中没有名字,无法直接的去修改它们的属性。
    3、IPC不使用文件描述符,不能对他们使用多路转接IO函数(select、poll)。
  • 优点:
    1、它们是可靠的、控制流的以及面向记录的。控制流的意思是:当缓冲区短缺的时候,或者接收线程不能接收更多消息的时候,发送线程就要休眠,到控制流条件消失时,发送进程自动唤醒。
    2、它们可以以非先进先出的次序处理。
消息队列
  • 消息队列是消息的链接表,存储在内核中,由消息队列标识符标识。
  • 并不一定要按照先进先出的次序来取得消息,也可以按照消息的字段取得消息。
  • 最大的消息队列还要根据系统安装的RAM数量来决定。
  • 如果需要客户进程于服务器进程要进行双向数据交流,可以使用消息队列或者全双工管道。
  • 消息度列原先的目的是提供高于一般速度的IPC,但是现在与其他的IPC比较,速度方面已经没有太大的差别了。所以在新的应用程序中并不实用。
  • 使用:
    1、调用的第一个函数通常是msgget,其功能是打开一个现有的队列,或者创建一个队列,
    2、msgctl函数对队列执行多种操作。
    3、调用msgsnd将数据放到消息队列中。
    4、调用msgrcv从队列中取用消息。
信号量
  • 进程间的信号量与已经介绍的IPC机构不太一样,他是一个计数器,用于未多个进程提供对共享数据对象的访问。

  • 为了获得共享资源,进程需要执行以下几个步骤:
    1、测试该资源信号量。
    2、若信号量的值为正,则进程可以使用该资源,进程会将信号量的值减1,表示使用了一个资源单位。当进程不再使用时,信号量加1.
    3、若为0,进程进入休眠,直到信号量大于0才被唤醒,并重新进入1中。

  • 常用的信号量使用形式称之为二元信号量,控制单个资源,初始值为1.

  • XSI信号量则要复杂很多,会有以下三种缺陷:
    1、信号量并非单个非负值,当创建信号量的时候,要指定集合中信号量的数量。
    2、信号量的创建(semget)独立于初始化(semctl),无法保证其原子性。
    3、即便线程没有使用XSI IPC了,它们任然存在,有的在程序终止时并没有释放已经分配给它的信号量。

  • 使用:
    1、使用semget来获得一个信号量ID。
    2、调用semctl函数进行多种信号量的操作。
    3、semop函数自动执行信号量集合上的操作数组。

  • 与锁的比较:在Linux上记录锁比信号更快,但是共享的存储中,互斥量的性能比信号量和记录锁都要优越。

共享存储
  • 共享存储允许两个或者多个进程共享一个给定的区域,数据不需要再进程间进行复制,所以速度最快。
  • 若服务器正在将数据放入共享存储区,则在它做完存储操作之前,客户线程不应该去取这些数据。
  • 使用:
    1、调用shmget获得一个共享存储标识符
    2、使用shmctl函数对共享存储段执行多种操作。
    3、一旦创建一个共享存储段,进程可以用shmat将其连接到它的地址空间中。注意将addr置为0,以便系统自己选择地址。
    4、当调用结束,使用shmdt将其分离。
POSIX信号量
  • POSIX信号量解决了XSI信号量的几个缺陷,使用相对更加的简单,上述的所有方式都。
  • 命名信号量使用:
    1、可以调用sem_open函数创建一个新的命名信号量或者使用一个现有信号量。
    2、如果进程没有调用sem_close退出,内核会自动关闭任何打开的信号
    3、可以使用sem_unlink销毁一个命名的信号量;可以使用sem_wait和sem_trywait来实现信号的减1操作
    4、可以使用sem_timewait函数阻塞一段时间。
    5、可以使用sempost函数使得信号增加1
  • 未命名信号量使用:
    1、可以调用sem_init函数创建一个未命名的信号量。
    2、能够使用sem_getvalue检索信号量的值。
    3、使用完信号量时,调用sem_destroy函数丢弃信号量资源。
标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值