并发编程-进程
-
进程
-
线程
-
线程和进程的区别
-
进程间通讯
-
管道
-
消息队列
-
信号量
-
共享内存
-
套接字
-
消息队列和管道的区别
没有行动,懒惰就会生根发芽。
没有梦想,堕落就会生根发芽。
时间越长,根就越深,
到时候想站起来就是件很困难的事!
进程
进程是操作系统分配资源的最小单位,每个进程都是一个在运行中的程序,在windows中一个运行的xx.exe就是一个进程,他们都拥有自己独立的一块内存空间,一个进程可以有多个线程
线程
线程是操作系统调度的最小单元,负责当前进程中程序的执行,一个进程可以运行多个线程,多个线程之间可以共享数据
线程和进程的区别
-
本质区别:进程是操作系统资源分配的最小单元,线程是处理器任务调度和执行的最小单位
-
资源开销:每个进程都有独立的代码和数据空间,进程之间的切换会有较大的开销,线程可以看做轻量级的进程
进程间通讯
管道
管道是内核管理的一个缓冲区,相当于内存中一个的小纸条,管道的一端连接着一个进程的输入,一端连接着另一个进程的输出,当管道中没有信息的话,从管道中读的进程会阻塞,直到另一端的进程放入信息,当管道中信息放满时,尝试放入信息的进程会阻塞,直到另一个端进程取出信息,当两个进程都结束时,管道也就结束了
特点:单向的,一端输入一端输出,采用先进先出FIFO模式,大小4K,满时写阻塞,空时读阻塞
分类:普通管道(仅父子进程间通讯)位于内存,命名管道位于文件系统,没有情缘关系的管道只要知道管道名也可以通讯
消息队列
消息队列可以看做是一个消息链表,只要线程有足够的权限,就可以往消息队列里面存消息和取消息,他独立于发送进程和接收进程,提供了一种从一个进程向另一个进程发送数据块的方法,每一个数据块都有一个消息类型(频道)和消息内容(节目),每个类型相互不受影响,类似于一个独立的管道
特点:全双工可读可写,生命周期跟随内核,每个数据块都有一个类型,接收者可以有不同的类型值,每个消息的最大长度是有上限的(MSGMAX),字节数也是有上限的(MSGMNB),系统上的消息队列总数也是有上限的(MSGMNI),
信号量
信号量本质上是一个计数器,它不以传送数据为目的,主要是用来保护共享资源,使得资源在一个时刻只有一个进程独享
原理:信号量只有等待和发送两种操作,即P(sv)和V(sv)两个操作都属于原子操作
P(sv):如果sv的值大于0,就给它减1;如果它的值为0,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因sv而挂起,就给他加1
共享内存
共享内存就是允许两个进程或多个进程共享一定的存储区,当一个进程改变了这个内存区域中的内容时,其他进程都会觉察到这个更改
特点:数据不需要在客户端和服务端之间来回复制,数据直接写到内存,减少了数次数据拷贝,是很快的一种IPC
缺点:共享内存没有任何的同步和互斥机制,需要使用信号量来实现对共享内存的存取和同步
套接字
套接字是一种允许两个不同进程进行通信的编程接口,通过套接字接口,可以使一台机器之间的进程可以相互通信,也可以使不同机器上的进程进行网络通信,套接字明确把客户端和服务端分开,实现了多个客户端连接到一个服务端
原理
服务端应用程序调用socket创建一个套接字,它是系统分配给服务端进程类似文件描述符的资源,不能与其他进程共享,服务端进程给这个套接字起一个名字,本地套接字的名字是Linux文件系统中的文件名,一般在/tmp或/usr/tmp中,网络套接字的名字与客户端连接的特定网络有关,通常叫做服务标识符(端口号),系统调用bind给套接字命名后,服务端进程就开始等待客户端的连接,命名后系统调用一个listen创建一个队列,用于存放客户端的连接,服务端用accept来接收客户端的连接,当有客户端连接时,服务端进程会创建一个与原有命名不同的新的套接字,这个套接字只用于与这个特定的客户端进行通信,原有套接字继续处理其他客户端的连接。
套接字的域:
-
AF_INET域:internet网络,是Novell NetWare网络协议的实现,也就是我们常说的IPV4
-
AF_INET6域:internet网络,是Novell NetWare网络协议的实现,我们常说的IPV6
-
AF_UNIX:unix文件系统域,底层协议的文件的输入和输出,地址就是文件名
-
AF_ISO域:基于ISO标准协议的网络
-
AF_XFS域:基于施乐(Xerox)的网络
AF_INET域中的类型
-
流套接字:通过TCP/IP连接实现,提供一个有序,可靠,双向字节流的连接,保证发送的数据不会丢失,复制,或乱序到达
-
数据报套接字:通过UDP/IP实现,提供一个无序的,不可靠的服务,他不需要建立和维护连接,作为一个单独的网络消息被传输,可能会丢失,复制或乱序的到达,但开销很小,适用于单次查询,不保留连接信息
消息队列和管道的区别
-
管道是跟随进程的,消息队列是跟随内核的,也就是说进程结束后,管道就结束了,但消息队列还会存在
-
管道是文件,访问速度慢,消息队列是数据结构存放在内存,访问速度快
-
管道是数据流式存取,消息队列是数据块式存取
人有两条路要走,一条是必须走的,一条是想走的,
你必须把必须走的路走漂亮,才可以走想走的路。