进程间的通信:
1.无名管道(PIPE)
在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,一般使用fork函数实现父子进程的通信。
速度慢,容量有限,只有父子进程能通讯 (fork),且是单工的。
2.有名管道(FIFO)
在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以进程间通信。
任何进程间都能通讯,但速度慢
3.消息队列
在内核中创建一队列,队列中每个元素是一个数据报,不同的进程可以通过句柄去访问这个队列。
每个消息队 列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有⼀个上限(MSGMNI)
容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号
信号是Linux系统中用于进程之间通信或操作的一种机制,信号可以在任何时候发送给某一进程,而无须知道该进程的状态。如果该进程并未处于执行状态,则该信号就由内核保存起来,知道该进程恢复执行并传递给他为止。如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
5.信号量
在内核中创建一个信号量集合(本质是个数组),数组的元素(信号量)都是1,使用P操作进行-1,使用V操作+1,
不能传递复杂消息,只能用来同步
6.共享内存区:
将同一块物理内存一块映射到不同的进程的虚拟地址空间中,实现不同进程间对同一资源的共享。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。
特点:
1,不用从用户态到内核态的频繁切换和拷贝数据,直接从内存中读取就可以。
2,共享内存是临界资源,所以需要操作时必须要保证原子性。使用信号量或者互斥锁都可以。
6.socket
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口
线程间:
1.锁
2.信号量
网友评论