[Linux用户空间编程-1]:Linux进程间主要的通信方式

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux用户空间编程-1]:Linux进程间主要的通信方式相关的知识,希望对你有一定的参考价值。


作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊


目录

​第1章 进程​

​1.1 进程概述​

​1.2 线程​

​1.2 进程的资源类型​

​第2章 进程间通信​

​2.1 概述​

​2.2 进程通信的应用场景​

​2.3 进程间通信的方式​


第1章 进程

1.1 进程概述

进程是操作系统内维护程序资源的一个概念。每当我们执行一个可执行程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。

可以认为进程是一个程序所有资源的统称。进程与进程之间的资源是相互隔离的。

1.2 线程

线程​(英语:thread)是​​操作系统​​​能够进行运算​​调度​​​的最小单位。它被包含在​​进程​​​之中,是​​进程​​​中的实际运作单位。一条线程指的是​​进程​​​中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及​​SunOS​​中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如​​Win32​​​线程;由用户进程自行调度的用户线程,如​​Linux​​​平台的​​POSIX​​​ Thread;或者由​​内核​​​与用户进程,如​​Windows 7​​的线程,进行混合调度。

1.3 进程的资源类型

(1)线程

(2)内存地址空间


  • 内存空间
  • 逻辑地址空间
  • 各种全局变量:普通变量、结构体变量等

(3)CPU


  • CPU寄存器上下文
  • CPU运算时隙

第2章 进程间通信

2.1 概述

进程用户空间是相互独立的,一般而言是不能相互访问的。

但很多情况下进程间需要互相通信,来完成系统的某项功能。

进程通过与内核及其它进程之间的互相通信来协调它们的行为。

2.2 ​进程通信的应用场景

(1)数据传输:

一个进程需要将它的​数据​发送给另一个进程,发送的数据量在一个字节到N个字节之间,有可能是少量数据,有可能是大量数据。这个过程需要进行数据的拷贝和传送。

(2)共享数据:

多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

这个过程不需要进行数据的拷贝,不同进程之间共享相同的一份数据。这种情形,常见于两个进程之间有大额数据传输或实时数据传输。

(3)资源共享:

多个进程之间共享同样的资源(不一定是大量的数据),如系统的外设。

为了做到这一点,需要内核提供锁和同步机制。

(4)通知事件:

一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程。

(5)进程控制:

有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

2.3 进程间通信的方式

在Linux中,用户空间的进程之间的所有资源是相互隔离的,因此,他们之间是不能直接通信的。

Linux提供了用户空间与内核空间数据的传递。

因此,用户空间的进程之间的通信,本质上,用户空间的进程借助Linux内核之间进行相互的通信。

[Linux用户空间编程-1]:Linux进程间主要的通信方式_消息队列

(1)管道:pipe

管道分为有名管道和无名管道

无名管道:​是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道:​也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。

(2)信号量:semaphore

信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.

共享资源可以是内核管理的外设,也可以是进行之间的共享内存,也可以线程之间的共享变量。

​Linux​​提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,

(3)消息队列: message queue

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.

(4)共享内存:shared memory

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

(5)套接字:socket

socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。

套接字的特性由3个属性确定,它们分别是:域、类型和协议。

通过套机值通信的本质是通过Linux TCP/IP协议栈进行进程间的通信,TCP/IP协议栈工作在内核空间,可以为不同的进程共享。

(6)信号: Signal

信号是一种比较复杂的通信方式,用于通知接收进程间的某个​异步​事件已经发生.

(7)定时器:timer

定时器除了可以实现周期性定时任务,还可以实现线程间通信,一个线程可以通过定时器传递32bit的定时事件。定时器的本质是signal通信。


作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊


以上是关于[Linux用户空间编程-1]:Linux进程间主要的通信方式的主要内容,如果未能解决你的问题,请参考以下文章

[Linux用户空间编程-1]:Linux进程间主要的通信方式

[Linux用户空间编程-2]:进程间通信 - 消息队列的使用

[Linux用户空间编程-2]:进程间通信 - 消息队列的使用

Linux多进程编程实例

Linux系统调用及用户编程接口(API)

linux c编程:管道