并发编程-进程

  • 进程

  • 线程

  • 线程和进程的区别

  • 进程间通讯

  • 管道

  • 消息队列

  • 信号量

  • 共享内存

  • 套接字

  • 消息队列和管道的区别

没有行动,懒惰就会生根发芽。
没有梦想,堕落就会生根发芽。
时间越长,根就越深,
到时候想站起来就是件很困难的事!

进程

进程是操作系统分配资源的最小单位,每个进程都是一个在运行中的程序,在windows中一个运行的xx.exe就是一个进程,他们都拥有自己独立的一块内存空间,一个进程可以有多个线程

线程

线程是操作系统调度的最小单元,负责当前进程中程序的执行,一个进程可以运行多个线程,多个线程之间可以共享数据

线程和进程的区别

  1. 本质区别:进程是操作系统资源分配的最小单元,线程是处理器任务调度和执行的最小单位

  2. 资源开销:每个进程都有独立的代码和数据空间,进程之间的切换会有较大的开销,线程可以看做轻量级的进程

进程间通讯

管道

管道是内核管理的一个缓冲区,相当于内存中一个的小纸条,管道的一端连接着一个进程的输入,一端连接着另一个进程的输出,当管道中没有信息的话,从管道中读的进程会阻塞,直到另一端的进程放入信息,当管道中信息放满时,尝试放入信息的进程会阻塞,直到另一个端进程取出信息,当两个进程都结束时,管道也就结束了

特点:单向的,一端输入一端输出,采用先进先出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来接收客户端的连接,当有客户端连接时,服务端进程会创建一个与原有命名不同的新的套接字,这个套接字只用于与这个特定的客户端进行通信,原有套接字继续处理其他客户端的连接。

套接字的域:

  1. AF_INET域:internet网络,是Novell NetWare网络协议的实现,也就是我们常说的IPV4

  2. AF_INET6域:internet网络,是Novell NetWare网络协议的实现,我们常说的IPV6

  3. AF_UNIX:unix文件系统域,底层协议的文件的输入和输出,地址就是文件名

  4. AF_ISO域:基于ISO标准协议的网络

  5. AF_XFS域:基于施乐(Xerox)的网络

    AF_INET域中的类型

  6. 流套接字:通过TCP/IP连接实现,提供一个有序,可靠,双向字节流的连接,保证发送的数据不会丢失,复制,或乱序到达

  7. 数据报套接字:通过UDP/IP实现,提供一个无序的,不可靠的服务,他不需要建立和维护连接,作为一个单独的网络消息被传输,可能会丢失,复制或乱序的到达,但开销很小,适用于单次查询,不保留连接信息

消息队列和管道的区别

  1. 管道是跟随进程的,消息队列是跟随内核的,也就是说进程结束后,管道就结束了,但消息队列还会存在

  2. 管道是文件,访问速度慢,消息队列是数据结构存放在内存,访问速度快

  3. 管道是数据流式存取,消息队列是数据块式存取

人有两条路要走,一条是必须走的,一条是想走的,
你必须把必须走的路走漂亮,才可以走想走的路。

posted @ 2023-03-11 15:20  无回实验室  阅读(24)  评论(0编辑  收藏  举报