您好、欢迎来到现金彩票网!
当前位置:秒速牛牛开奖 > 同步通信量 >

进程线程 协程 通信理解

发布时间:2019-08-09 03:48 来源:未知 编辑:admin

  区分这些之间的不同以及之间的通信原则, 也是真正理解和使用并发的基础, 如果这些关系理解不透彻那么也 并发开发也是一句空话。

  对理解数据库设置的连接池, 全局变量 最后算应该有多少个连接数的时候用的到。

  每个进程都有自己的地址空间。 两个进程中的地址即使相同, 实际指向的位置也是不同的。

  线程也被称为轻权进程, 同一进程的线程共享全局变量和内存。使得线程之间共享数据是很容易的, 但会带来某些共享数据的互斥问题。

  父子进程的派生是非常昂贵的,而且父子进程的通讯需要ipc或者其他方法来实现,比较麻烦。而线程的创建就花费少得多,并且同一进程内的线程共享全局存储区,所以通讯方便。

  线程的缺点也是由它的优点造成的,主要是同步,异步和互斥的问题,值得在使用的时候小心设计

  只有进程间需要通信, 同一进程的线程共享地址空间, 没有通信的必要。但是要做好同步 /互斥mutex 来保护共享的全局变量。线程有自己的栈,同步/互斥是原语primitives.

  进程间的通信无论是信号, 管道pipe还是共享内存都是由操作系统保证的, 是系统调用。

  线程间通信:由于多线程共享地址空间和数据空间, 所以多线程间的通信是一个线程的数据可以直接提供给其他的线程使用,而不必通过操作系统, 也就是内核的调度。

  进程间通信:他的数据空间的独立性决定了他的通信相对比较复杂, 需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信

  管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

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

  信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

  消息队列( messagequeue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

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

  套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

  条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用

  线程间的通信目的主要用于线程同步, 所以线程没有像进程通信中用于数据交换的通信机制

  信号通信的目的:某某事件发生!此时需要处理什么,进程间(可以是不相关的进程)传递信号

  场景:信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行

  alarm(秒数) :定时产生一个SIGALRM信号,调用alarm方法之后,只会产生一次该信号

  接收信号:signal(信号,函数指针) //对该信号接收,并调用自己的函数指针进行处理

  每打开一个文件,就会产生一个文件控制块,而文件控制块与文件描述符是一一对应的,通过对文件描述符的操作进而对文件进行操作

  通过文件系统对文件描述符的读/写控制,进程间一方对文件写,一方对文件读,达到文件之间的通信;可以是不相关进程间的通信

  为了能够实现两个进程通过文件进行有序的数据交流,还得借助于信号的处理机制

  (1)、通过pause()等待对方发起一个信号,已确认可以开始执行下一次读/写操作;

  (2)、通过kill(,SIGUSR1)方法向对方发出明确的信号:可以开始下一步执行(读、写)

  缺点:i、文件通信没有访问规则,ii、(因为CPU 内存 文件)是低速的

  在通信的进程间构建一个单向的数据流动的通道,数据通过管道从一个进程流向另一个进程是具有时间先后顺序的,所以是半双工通信;管道文件是一种临时文件,不是磁盘上真真正正的文件,是一块内存区域

  无名管道:只能用于亲缘关系的父子进程,fd = pipe(),得到的是管道文件描述符,通过fd,用的是write()和read()读写数据;

  mkfifo会在文件系统中创建一个管道文件,然后使其映射内存的一个特殊区域,凡是能够打开mkfifo创建的管道文件进程(通过这个文件描述符),都可以使用该文件实现FIFO的数据流动

  mkfifo(文件名, O_CREAT O_EXCL 0755);创建了2个管道文件,在客户端创建一个读的管道文件,在服务器创建一个写的管道文件,然后当做文件操作即可

  socketpair可以创建双向管道,fd[0]、fd[1]都是同时具有读和写的属性;

  优点:(1)、有强制的访问规则FIFO,(2)、用内存模仿文件,也就是用文件的方式操作内存

  (1)、如果管道为空,从管道读取数据的一方会阻塞。直到管道中有新的数据为止

  (3)、管道数据的读取与发送并没有次数限制,而是管道是否为空时最重要的指标

  (4)、这种管道的使用具有一个最大的局限性:只适用于父子进程之间。从程序的设计中可以看到,管道的创建是父进程完成的,而且是在创建子进程之前,从而才使得子进程拥有了管道文件描述符,才能够使得父子进程约定持有管道的入口或出口

  各个进程都能够共同访问的共享的内存区域;是独立于所有的进程空间之外的地址区域; (不相关)进程之间的通信

  (1)、申请创建一个共享内存区域(操作系统内核是不可能主动为进程创建共享内存的!),操作系统内核得到申请然后创建

  (3)、申请释放共享内存区域(操作系统内核也是不可能主动释放共享内存区域的!),操作系统内核得到申请然后释放

  i、key_t是一个long类型,是IPC资源外部约定的key(关键)值,通过key值映射对应的唯一存在的某一个IPC资源

  ii、通过key_t的值就能够判断某一个对应的共享内存区域在哪,是否已经创建等等。

  iii、一个key值只能映射一个共享内存区域,但同时还可以映射一个信号量,而且还能同时映射一个消息队列资源,于是就可以使用一个key值管理三种不同的资源

  ii、根据文件的inode编号生成。需要调用的API:ftok(./tmp/a.c, 3)方法,该方法是获取指定文件的inode编号在根据第二个参数计算得到最终的一个整型量。

  iii、如果对于共享内存的使用结束,此时就要断开与共享内存的映射

  当共享内存处于dest(待回收状态),则将其资源设为私有(只能将该共享资源分享给其子进程,其它进程无法创建于该资源的使用),当所有的使用该共享内存的进程都退出,此时操作系统才回收共享内存

  共享内存的控制信息可以通过shmctl()方法获取,会保存在struct_shmid_ds结构体中

  cmd:看执行什么操作(1、获取共享内存信息;2、设置共享内存信息;3、删除共享内存)

  原因:进程在访问共享资源是存在冲突的,必须的有一种强制手段说明这些共享资源的访问规则------信号量

  ii、当有进程需要访问对应的共享资源的时候,则需要先查看(申请),根据资源对应的当前可用数量进行申请。(申请所需要使用的资源个数)

  iii、资源的管理者(操作系统内核),就使用当前的资源个数减去要申请的资源个数,结果 =0,表示有可用资源,允许该进程继续访问;否则表示资源不可用,则告诉进程(暂停或者立即返回)

  iv、资源数量的变化就表示资源的占用和释放。占用:使得可用资源减少;释放:使得可用资源增加

  信号量ID事实上是信号量集合的ID,一个ID对应的是一组信号量。此时就使用信号量ID设置整个信号量集合,这种操作分为2种大的可能性

  i、针对信号量集合中的一个信号量进行设置;信号量集合中的信号量是按照数组的方式被管理起来的,从而可以直接使用信号的数组下标来进行访问

  如果cmd是GETALL、SETALL、GETVAL、SETVAL…的话,则需要提供第四个参数。第四个参数是一个共用体,这个共用体在程序中必须的自己定义(作用:初始化资源个数),定义格式如下:

  如果有进程通过信号量申请共享资源,而且此时资源个数已经小于0,则此时对于该进程,有两种可能性:等待资源,不等待。

  如果此时进程选择等待资源,则操作系统内核会针对该信号量构建进程等待队列,将等待的进程加入到该队列之中。

  如果此时有进程释放资源,则会:(1)、先将资源个数增加;(2)、从等待队列中抽取第一个进程;(3)、根据此时资源个数和第一个进程需要申请的资源个数进行比较,结果大于0,则唤醒该进程;结果小于0,则让该进程继续等待。

  就是在进程间架起通道,从宏观上看是一样的,但是管道在字节流上是连续的,消息队列在发送数据时,分为一个一个独立的数据单元,也就是消息体,每个消息体都是固定大小的存储块,在字节流上不连续;

  消息队列与管道不同的地方在于:管道中的数据并没有分割为一个一个的数据独立单位,在字节流上是连续的。然而,消息队列却将数据分成了一个一个独立的数据单位,每一个数据单位被称为消息体。每一个消息体都是固定大小的存储块儿,在字节流上是不连续的。

  (1)、msgsnd()方法在发送消息的时候,是在消息体结构体中指定,当前的消息发送到消息队列集合中的哪一个消息队列上。

  (2)、消息体结构体中就必须包含一个type值,type值是long类型,而且还必须是结构体的第一个成员。而结构体中的其他成员都被认为是要发送的消息体数据。

  (3)、无论是msgsnd()发送还是msgrcv()接收时,只要操作系统内核发现新提供的type值对应的消息队列集合中的消息队列不存在,则立即为其创建该消息队列

  总结:为了能够顺利的发送与接收,发送方与接收方需要约定:i、同样的消息体结构体;(2)、发送方与接收方在发送和接收的数据块儿大小上要与消息结构体的具体数据部分保持一致! 否则:将不会读出正确的数据

  消息结构体被发送的时候,只是发送了消息结构体中成员的值,如果结构体成员是指针,并不会将指针所指向的空间的值发送,而只是发送了指针变量所保存的地址值。数组作为消息体结构体成员是可以的。因为整个数组空间都在消息体结构体中

  long mtype制定消息队列编号,下面的数组才是要发送的数据,计算大小,也是这个数组所申请的空间大小。接收方倒数第二个参数为:mtype的值(制定的消息队列编号)。

  进程、线程和协程的理解进程、线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。线程拥有自己独立的栈和共享的堆,共...博文来自:loving_fire的博客

  什么是进程和线程进程是什么呢?直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程又是什么呢?线程...博文来自:WJWFighting的博客

  进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程...博文来自:

  1GIL线程全局锁​线程全局锁(GlobalInterpreterLock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,...博文来自:

  1gt;进程、线程和协程的认识:进程是系统进行资源分配和调度的独立单位;线程是进程的实体,是CPU调度和分派的基本单位;协程也是线程,称微线程,自带CPU上下文,是比线程更小的执...博文来自:

  几个问题先抛出来:1、GIL是什么干什么用,垃圾回收机制又是什么,GIL和垃圾回收有关系么?2、进程、线程、协程?python中多进程多线程指什么,forexample,是否加入多线程程序运行一定快,...博文来自:不负如来不负卿

  进程、线程和协程之间的区别:进程是资源分配的单位线程是操作系统调度的单位进程切换需要的资源很最大,效率很低线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)协程切换任务资源很小,效率高多...博文来自:IT_心如止水的博客

  多任务并发:同一时间段执行多个任务—gt;如:单核基于时间片的CPU轮转并行:同一时间点执行多个任务—gt;如:多核实现方式有:进程,线程,协程(代码层)原谅我的低级画功进程vs线...博文来自:吃不胖的程序猿历程

  描述对于python来说,多线程是python的软肋。在官方文档表明,根据程序的不同类型,如是I/O密集型,CPU密集型,分别使用多线程,多进程会使性能达到最佳。本文的主要目的是笔者在面试过程中,提及...博文来自:hea_gui_lion的博客

  说到线程,很多人最直观的感受就是多线程。本章不讨论高并发、多线程之类的。返璞归真,咱们来讨论讨论线程这个东西到底是什么东西,着眼于线程本身,我们怎么玩?为了了解线程,这里我不得不搬出来线程的概念了:进...

  进程是资源分配的单位 线程是操作系统调度的单位 协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高 进程切换需要的资源很最大,效率很低 一个程序至少有一个进程,一个进程...

  python提高02-17python提高 主要进程线程协程 网络编程 生成器迭代器装饰器

  并发的方式 并发处理是同一时间段内有几个程序都在一个cpu中处于运行状态,但任一时刻只有一个程序在cpu上运行。多进程、多线程、IO多路复用(通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一...

  QQ程序如果没有运行,那它只是程序,而不是进程,一旦运行了QQ程序,那它就成了进程。QQ程序一旦运行成了进程,操作系统如windows就要分配给QQ运行的内存空间,CPU运行的时间以及其它资源,这样Q...

  前言之前看Python教程的时候了解了一些协程的概念,相对还是比较肤浅,但是协程对Python语言而言是一个很重要的特性,加上近期看了我司架构师标哥的一篇讲协程的文章,感觉豁然开朗。为什么需要协程协程...

  阅读数 551.进程进程是**操作系统**进行**资源分配**和调度的基本单位,比如qq,微信都是一个进程;由于都是些抽象的概念,所以拿生活中的例子来解释一下:把进程想成现实生活中的公司,公司可以给员工提供办公资...博文

  12-25阅读数 933简单总结进程是资源分配的单位线程是操作系统调度的单位进程切换需要的资源很最大,效率很低线程切换需要的资源一般,效率一般协程切换任务资源很小,效率高多进程、多线程根据cpu核数不一样可能是并行的也可能是...

  协程理解1.协程概念协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调...

  Num01–协程的定义协程,又称微线程,纤程。英文名Coroutine。首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适...博文来自:IT晓可程序员之路

  python中多线程和多进程的最大区别是稳定性和效率问题多进程互相之间不影响,一个崩溃了不影响其他进程,稳定性高多线程因为都在同一进程里,一个线程崩溃了整个进程都完蛋多进程对系统资源开销大,多线程对系...博文来自:张昆

  go语言的创作者的一句话:“不要通过共享内存来通讯,要通过通讯来共享内存”我们已经使用过channel,但是在前面几例中都是使用time.Sleep()方法来保障主线不被那么快的结束,从而让子协程中的...博文来自:wangqiang9x的博客

  Unity协程的一些理解使用Unity开发游戏过程中,难免会使用到协程。现在总结下使用过程中的一些理解及使用过程中遇到的一些坑。1.使用协成必须继承MonoBehaviour。开发过程中我们会单独写个...博文来自:kangluo1的博客

  概述go在语言层面对并发编程提供支持,通过goroutine(协程)机制;goroutine是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务,只需要在函数调用语句前添加go关键字,即可创建...博文来自:PEACEFUL000的专栏

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程,有时被称为轻量进程(LightweightProcess,LWP)...博文来自:

  一提到并发耗时之类的就会联系到多进程线程协程之类的,可是你真的了解他们么?进程###进程(process)是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。对于操作系统来说...

  阅读数 180跟HR打过交道的朋友可能80%会碰见一道面试题:说说进程和线程的区别!  其实linux当中线程跟进程的关系与差别并不难理解,生活中好多点都体现到了这种思想。首先解释何为进程:进程是资源(CPU,内存...

  线程依赖于进程,协程依赖于线程,效率最好的是协程,其次到线程,再到进程。总结:单线程会阻塞,协程不会阻塞。主要看会不会阻塞,其次看耗不耗资源。对比之下协程是最好的。 主线程结束,子线程才会结束。程序...博文来自:代码改变世界

  授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

  授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。

http://4kci.com/tongbutongxinliang/579.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有