进程间通讯机制

进程间通讯机制
进程间通讯机制

进程间通讯机制

进程在核心的协调下进行相互间的通讯。Linux支持大量进程间通讯(IPC)

机制。除了信号和管道外,Linux 还支持Unix系统V中的IPC机制。

信号

信号是Unix系统中的最古老的进程间通讯方式。它们用来向一个或多个进程发送异步事件信号。信号可以从键盘中断中产生,另外进程对虚拟内存的非法存取等系统错误环境下也会有信号产生。信号还被shell程序用来向其子进程发送任务控制命令。

系统中有一组被详细定义的信号类型,这些信号可以由核心或者系统中其它具有适当权限的进程产生。使用kill命令(kill -l)可以列出系统中所有已经定义的信号。在我的系统(Intel系统)上运行结果如下:

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD

18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN

22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

30) SIGPWR

当我在Alpha AXP中运行此命令时,得到了不同的信号个数。除了两个信号外,进程可以忽略这些信号中的绝大部分。其一是引起进程终止执行的SIGSTOP信号,另一个是引起进程退出的SIGKILL信号。至于其它信号,进程可以选择处理它们的具体方式。进程可以阻塞信号,如若不阻塞,则可以在自行处理此信号和将其转交核心处理之间作出选择。如果由核心来处理此信号,它将使用对应此信号的缺省处理方法。比如当进程接收到SIGFPE(浮点数异常)时,核心的缺省操作是引起core dump和进程的退出。信号没有固有的相对优先级。如果在同一时刻对于一个进程产生了两个信号,则它们将可能以任意顺序到达进程并进行处理。

同时Linux并不提供处理多个相同类型信号的方式。即进程无法区分它是收到了1个还是42个SIGCONT信号。

Linux通过存储在进程task_struct中的信息来实现信号。信号个数受到处理器字长的限制。32位字长的处理器最多可以有32个信号而64位处理器如Alpha AXP 可以有最多64个信号。当前未处理的信号保存在signal域中,并带有保存在blocked中的被阻塞信号的屏蔽码。除了SIGSTOP和SIGKILL外,所有的信号都能被阻塞。当产生可阻塞信号时,此信号可以保持一直处于待处理状态直到阻塞释放。Linux保存着每个进程处理每个可能信号的信息,它们保存在每个进程task_struct中的sigaction数组中。这些信息包括进程希望处理的信号所对应的过程地址,或者指示是忽略信号还是由核心来处理它的标记。通过系统调用,进程可以修改缺省的信号处理过程,这将改变某个信号的sigaction以及阻塞屏蔽码。

并不是系统中每个进程都可以向所有其它进程发送信号:只有核心和超级用户具有此权限。普通进程只能向具有相同uid和gid的进程或者在同一进程组中的进程发送信号。信号是通过设置task_struct结构中signal域里的某一位来产生的。如果进程没有阻塞信号并且处于可中断的等待状态,则可以将其状态改成Running,同时如确认进程还处在运行队列中,就可以通过信号唤醒它。这样系统下次发生调度时,调度管理器将选择它运行。如果进程需要缺省的信号处理过程,则Linux可以优化对此信号的处理。例如SIGWINCH(X窗口的焦点改变)信号,其缺省处理过程是什么也不做。

信号并非一产生就立刻交给进程,而是必须等待到进程再次运行时才交给进程。每次进程从系统调用中退出前,它都会检查signal和blocked域,看是否有可以立刻发送的非阻塞信号。这看起来非常不可靠,但是系统中每个进程都在不停地进行系统调用,如向终端输出字符。当然进程可以选择去等待信号,此时进程将一直处于可中断状态直到信号出现。对当前不可阻塞信号的处理代码放置在sigaction结构中。

如果信号的处理过程被设置成缺省则由核心来应付它。SIGSTOP信号的缺省处理过程是将当前进程的状态改变成为Stopped并运行调度管理器以选择一个新进程继续运行。SIGFPE的缺省处理过程则是引起core dump并使进程退出。当然,进程可以定义其自身的信号处理过程。一旦信号产生,这个过程就将被调用。它的地址存储在sigaction结构中。核心必须调用进程的信号处理例程,具体如何去做依赖于处理器类型,但是所有的CPU 必须处理这个问题:如果信号产生时,当前进程正在核心模式下运行并且马上要返回调用核心或者系统例程的进程,而该进程处在用户模式下。解决这个问题需要操纵进程的堆栈及寄存器。进程的程序计数器被设置成其信号处理过程的地址,而参数通过调用框架或者寄存器传递到处理例程中。当进程继续执行时,信号处理例程好象普通的函数调用一样。

Linux是POSIX兼容的,所以当某个特定信号处理例程被调用时,进程可以设定哪个信号可以阻塞。这意味着可以在进程信号处理过程中改变blocked屏蔽码。当信号处理例程结束时,此blocked屏蔽码必须设置成原有值。因此,Linux 添加了一个过程调用来进行整理工作,通过它来重新设置被发送信号进程调用栈

中的原有blocked屏蔽码。对于同一时刻几个信号处理过程,Linux通过堆栈方式来优化其使用,每当一个处理过程退出时,下一个处理过程必须等到整理例程结束后才执行。

管道

一般的Linux shell程序都允许重定向。如

$ ls | pr | lpr

在这个管道应用中,ls列当前目录的输出被作为标准输入送到pr程序中,而pr 的输出又被作为标准输入送到lpr程序中。管道是单向的字节流,它将某个进程的标准输出连接到另外进程的标准输入。但是使用管道的进程都不会意识到重定向的存在,并且其执行结果也不会有什么不同。shell程序负责在进程间建立临时的管道。

管道

在Linux中,管道是通过指向同一个临时VFS inode的两个file数据结构来实现的,此VFS inode指向内存中的一个物理页面。图5.1中每个file数据结构指向不同的文件操作例程向量,一个是实现对管道的写,另一个从管道中读。

这样就隐藏了读写管道和读写普通的文件时系统调用的差别。当写入进程对管道写时,字节被拷贝到共享数据页面中,当读取进程从管道中读时,字节从共享数据页面中拷贝出来。Linux必须同步对管道的访问。它必须保证读者和写者以确定的步骤执行,为此需要使用锁、等待队列和信号等同步机制。

当写者想对管道写入时,它使用标准的写库函数。表示打开文件和打开管道的描叙符用来对进程的file数据结构集合进行索引。Linux系统调用使用由管道file数据结构指向的write过程。这个write过程用保存在表示管道的VFS inode 中的信息来管理写请求。

如果没有足够的空间容纳对所有写入管道的数据,只要管道没有被读者加锁。则Linux为写者加锁,并把从写入进程地址空间中写入的字节拷贝到共享数据页面中去。如果管道被读者加锁或者没有足够空间存储数据,当前进程将在管道inode的等待队列中睡眠,同时调度管理器开始执行以选择其它进程来执行。如果写入进程是可中断的,则当有足够的空间或者管道被解锁时,它将被读者唤醒。当数据被写入时,管道的VFS inode被解锁,同时任何在此inode的等待队列上睡眠的读者进程都将被唤醒。

从管道中读出数据的过程和写入类似。

进程允许进行非阻塞读(这依赖于它们打开文件或者管道的方式),此时如果没有数据可读或者管道被加锁,则返回错误信息表明进程可以继续执行。阻塞方式则使读者进程在管道inode的等待队列上睡眠直到写者进程结束。当两个进程对管道的使用结束时,管道inode和共享数据页面将同时被遗弃。

Linux还支持命名管道(named pipe),也就是FIFO管道,因为它总是按照先进先出的原则工作。第一个被写入的数据将首先从管道中读出来。和其它管道不一样,FIFO管道不是临时对象,它们是文件系统中的实体并且可以通过mkfifo 命令来创建。进程只要拥有适当的权限就可以自由使用FIFO管道。打开FIFO

管道的方式稍有不同。其它管道需要先创建(它的两个file数据结构,VFS inode 和共享数据页面)而FIFO管道已经存在,只需要由使用者打开与关闭。在写者进程打开它之前,Linux必须让读者进程先打开此FIFO管道;任何读者进程从中读取之前必须有写者进程向其写入数据。FIFO管道的使用方法与普通管道基本相同,同时它们使用相同数据结构和操作。

套接口

系统V IPC机制

Linux支持Unix系统V(1983)版本中的三种进程间通讯机制。它们是消息队列、信号灯以及共享内存。这些系统V IPC机制使用共同的授权方法。只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源。这些系统V IPC对象使用与文件系统非常类似的访问控制方式。对象的引用标志符被用来作为资源表中的索引。这个索引值需要一些处理后才能得到。

系统中所有系统V IPC对象的Linux数据结构包含一个ipc_perm结构,它含有进程拥有者和创建者及组标志符。另外还有对此对象(拥有者,组及其它)的存取模式以及IPC对象键。此键值被用来定位系统V IPC对象的引用标志符。这样的键值一共有两组:公有与私有。如果此键为公有,则系统中任何接受权限检查的进程都可以找到系统V IPC对象的引用标志符。系统V IPC对象绝不能用一个键值来引用,而只能使用引用标志符。

消息队列

消息队列允许一个或者多个进程向它写入与读取消息。Linux维护着一个msgque 消息队列链表,其中每个元素指向一个描叙消息队列的msqid_ds结构。当创建新的消息队列时,系统将从系统内存中分配一个msqid_ds结构,同时将其插入到数组中。

系统V IPC消息队列

每个msqid_ds结构包含一个ipc_perm结构和指向已经进入此队列消息的指针。另外,Linux保留有关队列修改时间信息,如上次系统向队列中写入的时间等。msqid_ds包含两个等待队列:一个为队列写入进程使用而另一个由队列读取进程使用。

每次进程试图向写入队列写入消息时,系统将把其有效用户和组标志符与此队列的ipc_perm结构中的模式进行比较。如果允许写入操作,则把此消息从此进程的地址空间拷贝到msg数据结构中,并放置到此消息队列尾部。由于 Linux严格限制可写入消息的个数和长度,队列中可能容纳不下这个消息。此时,此写入进程将被添加到这个消息队列的等待队列中,同时调用调度管理器选择新进程运行。当由消息从此队列中释放时,该进程将被唤醒。

从队列中读的过程与之类似。进程对这个写入队列的访问权限将被再次检验。读取进程将选择队列中第一个消息(不管是什么类型)或者第一个某特定类型的消息。如果没有消息可以满足此要求,读取进程将被添加到消息队列的读取等待队列中,然后系统运行调度管理器。当有新消息写入队列时,进程将被唤醒继续执行。

信号灯

信号灯最简单的形式是某个可以被多个进程检验和设置(test&set)的内存单元。这个检验与设置操作对每个进程而言是不可中断或者说是一个原子性操作;一旦启动谁也终止不了。检验与设置操作的结果是信号灯当前值加1,这个值可以是正数也可以是负数。根据这个操作的结果,进程可能可以一直睡眠到此信号灯的值被另一个进程更改为止。信号灯可用来实现临界区(critical region):某一时刻在此区域内的代码只能被一个进程执行。

如果你有多个协作进程从一个数据文件中读取与写入记录。有时你可能需要这些文件访问遵循严格的访问次序。那么可在文件操作代码上使用一个初始值为1的信号灯,它带有两个信号灯操作,一个检验并对信号灯值减1,而另一个检验并加1。第一个访问文件的进程将试图将信号灯值减1,如果获得成功则信号灯值变成了 0。此进程于是开始使用这个数据文件,但是此时如果另一进程也想将信号灯值减1,则信号灯值将为-1,这次操作将会失败。它将挂起执行直到第一个进程完成对此数据文件的使用。此时这个等待进程将被唤醒,这次它对信号灯的操作将成功。

统V IPC信号灯

每个系统V IPC信号灯对象对应一个信号灯数组,Linux使用semid_ds结构来表示。系统中所有semid_ds结构由一组semary指针来指示。在每个信号灯数组中有一个sem_nsems,它表示一个由sem_base指向的sem结构。授权的进程可以使用系统调用来操纵这些包含系统V IPC信号灯对象的信号灯数组。这个系统调用可以定义许多种操作,每个操作用三个输入来描叙:信号灯索引、操作值和一组标志。信号灯索引是一个信号灯数组的索引,而操作值是将被加到信号灯上的数值。首先Linux将检查是否所有操作已经成功。如果操作值与信号灯当前数值相加大于0,或者操作值与信号灯当前值都是0,操作将会成功。如果所有信号灯操作失败,Linux仅仅会把那些操作标志没有要求系统调用为非阻塞类型的进程挂起。进程挂起后,Linux必须保存信号灯操作的执行状态并将当前进程放入等待队列。系统还在堆栈上建立sem_queue结构并填充各个域。这个sem_queue 结构将被放到此信号灯对象等待队列的尾部(使用 sem_pending和

sem_pending_last指针)。系统把当前进程置入sem_queue结构中的等待队列(sleeper)中,然后启动调度管理器选择其它进程运行。

如果所有这些信号灯操作都成功则无需挂起当前进程,Linux将对信号灯数组中的其他成员进行相同操作,然后检查那些处于等待或者挂起状态的进程。首先,Linux将依次检查挂起队列(sem_pending) 中的每个成员,看信号灯操作能否继续。如果可以则将其sem_queue结构从挂起链表中删除并对信号灯数组发出信号灯操作。Linux还将唤醒处于睡眠状态的进程并使之成为下一个运行的进程。如果在对挂起队列的遍历过程中有的信号灯操作不能完成则Linux将一直重复此过程,直到所有信号灯操作完成且没有进程需要继续睡眠。

但是信号灯的使用可能产生一个严重的问题:死锁。当一个进程进入临界区时它改变了信号灯的值而离开临界区时由于运行失败或者被kill而没有改回信号灯时,死锁将会发生。Linux通过维护一组描叙信号灯数组变化的链表来防止该现象的发生。它的具体做法是让Linux将把此信号灯设置为进程对其进行操作前的状态。这些状态值被保存在使用该信号灯数组进程的semid_ds和task_struct 结构的sem_undo结构中。

信号灯操作将迫使系统对它引起的状态变化进行维护。Linux为每个进程维护至少一个对应于信号灯数组的sem_undo结构。如果请求进行信号灯操作的进程没有该结构,则必要时Linux会为其创建一个。这个sem_undo 结构将同时放入此进程的task_struct结构和此信号灯数组的semid_ds结构中。当对信号灯进行操作时,信号灯变化值的负数被置入进程的sem_undo结构中该信号的入口中。所以当操作值为2时,则此信号灯的调整入口中将加入一个-2。

象正常退出一样,当进程被删除时,Linux将遍历该进程的sem_undo集合对信号灯数组使用调整值。如果信号灯集合被删除而sem_undo数据结构还在进程的task_struct结构中则此信号灯数组标志符将被置为无效。此时信号灯清除代码只需丢弃sem_undo结构即可。

共享内存

共享内存允许一个或多个进程通过同时出现在它们虚拟地址空间中的内存来通讯。此虚拟内存的页面出现在每个共享进程页表中。但此页面并不一定位于所有共享进程虚拟内存的相同位置。和其它系统V IPC对象的使用方法一样,对共享内存区域的访问是通过键和访问权限检验来控制的。一旦内存被共享,则再不会检验进程对对象的使用方式。它依赖于其它机制,如系统V信号灯,来同步对共享内存的访问。

系统V IPC共享内存

每个新创建的共享内存区域由一个shmid_ds数据结构来表示。它们被保存再shm_segs数组中。 shmid_ds数据结构描叙共享内存的大小,进程如何使用以及共享内存映射到其各自地址空间的方式。由共享内存创建者控制对此内存的存取权限以及其键是公有还是私有。如果它由足够权限,它还可以将此共享内存加载到物理内存中。

每个使用此共享内存的进程必须通过系统调用将其连接到虚拟内存上。这时进程创建新的vm_area_struct来描叙此共享内存。进程可以决定此共享内存在其虚拟地址空间的位置,或者让Linux选择一块足够大的区域。新的vm_area_struct 结构将被放到由shmid_ds指向的vm_area_struct链表中。通过vm_next_shared 和vm_prev_shared 指针将它们连接起来。虚拟内存在连接时并没有创建;进程访问它时才创建。

当进程首次访问共享虚拟内存中的页面时将产生页面错。当取回此页面后,Linux 找到了描叙此页面的vm_area_struct数据结构。它包含指向使用此种类型虚拟内存的处理函数地址指针。共享内存页面错误处理代码将在此shmid_ds对应的页表入口链表中寻找是否存在此共享虚拟内存页面。如果不存在,则它将分配物理页面并为其创建页表入口。同时还将它放入当前进程的页表中,此入口被保存在shmid_ds结构中。这意味着下个试图访问此内存的进程还会产生页面错误,共享内存错误处理函数将为此进程使用其新创建的物理页面。这样,第一个访问虚拟内存页面的进程创建这块内存,随后的进程把此页面加入到各自的虚拟地址空间中。

当进程不再共享此虚拟内存时,进程和共享内存的连接将被断开。如果其它进程还在使用这个内存,则此操作只影响当前进程。其对应的vm_area_struct结构将从shmid_ds结构中删除并回收。当前进程对应此共享内存地址的页表入口也

将被更新并置为无效。当最后一个进程断开与共享内存的连接时,当前位于物理内存中的共享内存页面将被释放,同时还有此共享内存的shmid_ds结构。

当共享内存没有被锁入物理内存时,情况将更加复杂。此时共享内存页面可能会在内存使用高峰期,被交换到系统的交换磁盘上。共享内存如何被交换与调入物理内存将在mm一章中详细描叙。

水俣病案例分析

实习三环境污染案例讨论 【目的要求】熟悉环境污染案例的调查分析方法;了解环境污染所致公害事件的危害性及防治。 【案例】水俣病公害事件 【资料1】水俣湾位于日本九州岛西侧不知火海东岸。水俣市是以新日本氮肥厂为中心建立起来的市镇,人口大约10万。 1956年4月,一名5岁11个月的女孩被送到水俣工厂附属医院就诊,其主要症状为脑障碍:步态不稳,语言不清,谵语等。在以后的五周内,病儿的妹妹和近邻中的四人也出现了同样的症状。1956年5月1日,该院院长向水俣市卫生当局作了报告,说“发生了一种不能确诊的中枢神经系统疾病的流行”。因这些人的症状和当地猫发生的“舞蹈病”症状相似,又因病因不明,故当地人称这为“猫舞蹈病”或“奇病”。 经过工厂附属医院、市卫生当局、市医院及当地医师会的调查,发现儿童及成年人中都有病例发生,初步调查共发现了30例患者,其中一部分自1953年就已发病并多数住在渔村。过去对这些患者的诊断不一,有的被诊断为乙型脑炎,有的被诊断为酒精中毒、梅毒、先天性运动失调及其它。因患者发病时期正赶上各种传染病流行期,且呈地方性和聚集性,故判定为一种传染病并采取了相应的措施。 [问题讨论1] 1.为什么当时会判定在人群中流行的病为传染病?(因患者发病时期正赶上各种传染病的流行期,且呈地方性和聚集性,故判定为一种传染病。) 2.要找出引起本事件的原因,应作哪些调查?(应做病例-对照研究和现况研究,获得病因线索后,再用群组研究和实验研究证实)请设计一个调查方案?(调查目的:寻找该病的致病因素,疾病在人群中的分布规律及疾病前的状态,并证实病因,根据调查结果,采取措施,消除污染源,改造环境,控制并消除疾病的发展。调查方法:采用病例-对照研究和现况研究,获得病因线索后,再选用群组研究和实验研究证实。 调查内容:水俣湾环境污染源调查及环境监测;人群患病情况调查;致病因素的调查及实验证实。具体方法:1、选择病例:医院病例、人群中的全部病例、新发病例、死亡病例;2、对人群进行询问,了解其饮食、劳作等习惯与情况;3、对患病及暴露人群、暴露环境中的表现出病态的生物,如鱼鸟猫等进行监测,如体液、组织中的有害物质浓度;4、人群中患病率的测量,人群及动物机体功能的测量;5、水俣湾一带水

Linux系统编程实验六进程间通信

实验六:进程间通信 实验目的: 学会进程间通信方式:无名管道,有名管道,信号,消息队列, 实验要求: (一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一消息队列,实现向队列中存放数据和读取数据 实验器材: 软件:安装了Linux的vmware虚拟机 硬件:PC机一台 实验步骤: (一)无名管道的使用 1、编写实验代码pipe_rw.c #include #include #include #include #include #include int main() { int pipe_fd[2];//管道返回读写文件描述符 pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r));//将buf_r初始化 char str1[]=”parent write1 “holle””; char str2[]=”parent write2 “pipe”\n”; r_num=30; /*创建管道*/ if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; } /*创建子进程*/ if((pid=fork())==0) //子进程执行代码 {

//1、子进程先关闭了管道的写端 close(pipe_fd[1]); //2、让父进程先运行,这样父进程先写子进程才有内容读sleep(2); //3、读取管道的读端,并输出数据 if(read(pipe_fd[0],buf_r, r_num)<0) { printf(“read error!”); exit(-1); } printf(“%s\n”,buf_r); //4、关闭管道的读端,并退出 close(pipe_fd[1]); } else if(pid>0) //父进程执行代码 { //1、父进程先关闭了管道的读端 close(pipe_fd[0]); //2、向管道写入字符串数据 p_wbuf=&str1; write(pipe_fd[1],p_wbuf,sizof(p_wbuf)); p_wbuf=&str2; write(pipe_fd[1],p_wbuf,sizof(p_wbuf)); //3、关闭写端,并等待子进程结束后退出 close(pipe_fd[1]); } return 0; } /*********************** #include #include #include #include #include #include int main() { int pipe_fd[2];//管道返回读写文件描述符 pid_t pid; char buf_r[100]; char* p_wbuf; int r_num;

脑出血的病因及发病机制

脑出血的病因及发病机制 (一)发病原因 引起脑出血的病因很多最常见的病因是高血压动脉粥样硬化其次为先天性脑血管畸形或动脉瘤血液病脑外伤抗凝或溶血栓治疗淀粉样血管病等引起的脑出血根据病因分类如下 1?根据血管病理常见有微动脉瘤或者微血管瘤脑动静脉畸形(AVM)淀粉样脑血管病囊性血管瘤颅内静脉血栓形成脑膜动静脉畸形特异性动脉炎真菌性动脉炎烟雾病和动脉解剖变异等 2?根据血流动力学有高血压和偏头痛血液因素有抗凝抗血小板或溶栓治疗嗜血杆菌感染白血病血栓性血小板减少症等 3. 其他颅内肿瘤酒精中毒及交感神经兴奋药物等 4. 原因不明如特发性脑出血 此外有些因素与脑血管病的发生有一定的关系可能是导致脑血管病的诱因:①血压波动:如高血压患者近期没有服用降压药物或生气着急等引起血压增高以收缩压升高尤为重要②脾气急躁或情绪紧张:常见于生气与人争吵后③不良嗜好:如吸烟酗酒食盐过多体重过重④过分疲劳:如体力和脑力劳动过度排便用力运动 (二)发病机制 1脑出血的发生机制 在发生机制上实际上每一例脑出血并不是单一因素引起而可能是几种综合因素所致高血压形成脑出血的机制有许多说法比较公认的是微动脉瘤学说一般认为单纯的血压升高不足以引起脑出血脑出血常在合并脑血管病变的基础上发生 (1) 微动脉瘤破裂:因脑内小动脉壁长期受高血压引起的张力影响使血管壁薄弱部位形成动脉瘤其直径一般500卩m高血压患者的脑内穿通动脉上形成许多微动脉瘤多分布在基底核的纹状动脉脑桥大脑白质和小脑中直径在100?300卩m的动脉上这种动脉瘤是在血管壁薄弱部位形成囊状当血压突然升高时这种囊性血管容易破裂造成脑出血 (2) 脂肪玻璃样变或纤维坏死:长期高血压对脑实质内直径100?300卩m小穿通动脉管壁内膜起到损害作用血浆内的脂质经损害的内膜进入内膜下使管壁增厚和血浆细胞浸润形成脂肪玻璃样变最后导致管壁坏死当血压或血流急剧变化时容易破裂出血 (3) 脑动脉粥样硬化:多数高血压患者的动脉内膜同时存在多样病变包括局部脂肪和复合糖类积聚出血或血栓形成纤维组织增长和钙沉着脑动脉粥样硬化患者易发生脑梗死在大块脑缺血软化区内的动脉易破裂出血形成出血性坏死病灶 (4) 脑动脉的外膜和中层在结构上薄弱:大脑中动脉与其所发生的深穿支-豆纹动脉呈直角这种解剖结构在用力激动等因素使血压骤然升高的情况下该血管容易破裂出血 2. 脑出血的病理生理机制 (1) 主要病理生理变化:血管破裂形成血肿其周围组织在血肿形成30min后出现海绵样变性;6h后邻近的脑实质内随时间变化由近及远有坏死层出血层海绵样变性及水肿等 血肿周围脑组织的这些变化除了机械压迫外主要是血浆血球成分如血红 蛋白及其他血管活性物质等起着重要作用

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码。细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的Binder接口了。 熟悉Android系统的读者,应该能想到应用程序框架中的基于Java语言的Binder接口是通过JNI来调用基于C/C++语言的Binder运行库来为Java应用程序提供进程间通信服务的了。JNI在Android系统中用得相当普遍,SDK中的Java 接口API很多只是简单地通过JNI来调用底层的C/C++运行库从而为应用程序服务的。 这里,我们仍然是通过具体的例子来说明Binder机制在应用程序框架层中的Java接口,主要就是Service Manager、Server和Client这三个角色的实现了。通常,在应用程序中,我们都是把Server实现为Service的形式,并且通过IServiceManager.addService接口来把这个Service添加到Service Manager,Client也是通过IServiceManager.getService接口来获得Service接口,接着就可以使用这个Service提供的功能了,这个与运行时库的Binder接口是一致的。 前面我们学习Android硬件抽象层时,曾经在应用程序框架层中提供了一个硬件访问服务HelloService,这个Service运行在一个独立的进程中充当Server的角色,使用这个Service的Client运行在另一个进程中,它们之间就是通过Binder机制来通信的了。这里,我们就使用HelloService这个例子来分析Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码。所以希望读者在阅读下面的内容之前,先了解一下前面在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务这篇文章。 这篇文章通过五个情景来学习Android系统进程间通信Binder机制在应用程序框架层的Java接口:1. 获取Service Manager的Java远程接口的过程;2. HelloService接口的定义;3. HelloService的启动过程;4. Client获取HelloService 的Java远程接口的过程;5. Client通过HelloService的Java远程接口来使用HelloService提供的服务的过程。 一. 获取Service Manager的Java远程接口

最新日本水俣病事件对中国未来发展的启示

日本水俣病事件对中国未来发展的启示

班级:化本162 姓名:秦芳婕 学号:2016019025 题目:日本水俣病事件对中国未来发展的启示 内容: 1.简介日本水俣病事件 2.日本水俣病灾害的发生过程及形成原因 3.日本水俣病灾害灾情分析 4.日本水俣病事件影响后果

5.日本水俣病事件对中国未来发展的启示 格式要求:A4纸打印 封皮:题目,班级,姓名,学号 内容:标题小四黑体,内容五号宋体 字数:3000以上

1.简介日本水俣病事件 日本水俣病事件,在1956年日本水俣湾出现的一种奇怪的病。这种“怪病”是日后轰动世界的“水俣病”,是最早出现的由于工业废水排放污染造成的公害病。症状表现为轻者口齿不清、步履蹒跚、面部痴呆、手足麻痹、感觉障碍、视觉丧失、震颤、手足变形,重者神经失常,或酣睡,或兴奋,身体弯弓高叫,直至死亡。被称为世界八大公害事件之一。 2.日本水俣病灾害的发生过程及形成原因 日本熊本县水俣湾外围的“不知火海”是被九州本土和天草诸岛围起来的内海,那里海产丰富,是渔民们赖以生存的主要渔场。水俣镇是水俣湾东部的一个小镇,有4万多人居住,周围的村庄还居住着1万多农民和渔民。“不知火海”丰富的渔产使小镇格外兴旺。 1925年,日本氮肥公司在这里建厂,后又开设了合成醋酸厂。1949年后,这个公司开始生产氯乙烯(C2H5Cl),年产量不断提高,1956年超过6000吨。与此同时,工厂把没有经过任何处理的废水排放到水俣湾中。 1956年,水俣湾附近发现了一种奇怪的病。这种病症最初出现在猫身上,被称为“猫舞蹈症”。病猫步态不稳,抽搐、麻痹,甚至跳海死去,被称为“自杀猫”。随后不久,此地也发现了患这种病症的人。患者由于脑中枢神经和末梢神经被侵害,症状如上。当时这种

Linux进程间通信(2)实验报告

实验六:Linux进程间通信(2)(4课时) 实验目的: 理解进程通信原理;掌握进程中信号量、共享内存、消息队列相关的函数的使用。实验原理: Linux下进程通信相关函数除上次实验所用的几个还有: 信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。要调用的第一个函数是semget,用以获得一个信号量ID。 int semget(key_t key, int nsems, int flag); key是IPC结构的关键字,flag将来决定是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。 semctl函数用来对信号量进行操作。 int semctl(int semid, int semnum, int cmd, union semun arg); 不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。 semop函数自动执行信号量集合上的操作数组。 int semop(int semid, struct sembuf semoparray[], size_t nops); semoparray是一个指针,它指向一个信号量操作数组。nops规定该数组中操作的数量。 ftok原型如下: key_t ftok( char * fname, int id ) fname就是指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。 当成功执行的时候,一个key_t值将会被返回,否则-1 被返回。 共享内存 共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。首先要用的函数是shmget,它获得一个共享存储标识符。 #include #include #include int shmget(key_t key, int size, int flag); 当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。 void *shmat(int shmid, void *addr, int flag); shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地

Windows进程间各种通信方式浅谈

Windows进程间各种通信方式浅谈 1、Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指不同进程间进行数据共享和数据交换。 正因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题, 下面本文将对Win32中进程通信的几种方法加以分析和比较。 2、进程通信方法 2.1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。 Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象。 (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。 (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。 (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、

病因学及发病机制题库1-1-8

病因学及发病机制题 库1-1-8

问题: [单选,A2型题,A1A2型题]慢性支气管炎的主要发病相关因素,不正确的有(). A.大气污染 B.吸烟 C.支气管哮喘 D.职业性粉尘和化学物质 E.感染

问题: [单选,A2型题,A1A2型题]COPD的主要病理改变正确的有(). A.早期气道上皮坏死,溃疡形成 B.纤毛变性倒伏、变短、部分脱落 C.缓解期上皮增生、修复,鳞状化生 D.杯状细胞数目增多,支气管腺体增生肥大,分泌亢进 E.腺体肥厚,与支气管壁的厚度比值常大于0.85

问题: [单选,A2型题,A1A2型题]诊断COPD的必备条件是气流的不完全可逆受限,其确定标准是(). A.FEV180%预计值,FEV1/FVC%70% B.FEV170%预计值,FEV1/FVC%60% C.FEV180%预计值,FEV1/FVC%60% D.FEV170%预计值,FEV1/FVC%80% E.FEV190%预计值,FEV1/FVC%70% (辽宁11选5 https://www.360docs.net/doc/57607288.html,)

问题: [单选,A2型题,A1A2型题]COPD的主要体征不正确的有(). A.早期可无异常体征 B.随着病情的发展,可出现桶状胸、呼吸浅快等 C.叩诊可发现过清音,心浊音界缩小,肺肝界下移 D.双肺呼吸音低,吸气时间延长 E.部分患者可闻及干、湿性啰音

问题: [单选,A2型题,A1A2型题]有关支气管哮喘的描述,下列说法最正确的是(). A.是由多种细胞和细胞组分参与的气道慢性炎症 B.气道痉挛狭窄为不可逆 C.病情多在下午发作 D.症状主要是咳嗽和胸闷 E.必须经治疗后才会缓解

Android下Camera框架解析

Android 下Camera 构架分析 一. Android Camera 层次结构 Android 下Camera 子系统从上到下可以分为应用层、框架层、运行库层及内核层,其结构如下图所示。从整体上看,它还是属于Android 下典型的client/service 的结构,运行在两个进程中,一个是client 进程,主要包括JA V A 代码与一些Native c/c++代码;另一个是service 进程,属于服务端,是native c/c++代码,并且,camera service 属于Android 系统的一个native 服务,用native c/c++代码实现,主要负责和Linux kernel 中的Camera Driver 交互,搜集Linux kernel 中Camera Driver 上传的数据,并交给显示系统(surface)显示。 client 进程与service 进程通过Binder 机制通信,client 端通过调用service 端的接口实现各个具体的功能。但真正的preview 数据不会通过Binder IPC 机制从service 端复制到client 端,而是通过回调函数与消息的机制将preview 数据buffer 的地址传到client 端,最终可在Java 应用中操作处理这个preview 数据。 android_hardware.camera Camera Apps Libandroid_runtime.so (android_hardware_Camera.cpp) libcamera_client.so (Camara.cpp) 应用层框架层运行库层 硬件层 Libcamera.so (HAL)libcameraservice.so (CameraService.cpp)Linux 内核层 V4L2 Kernel Driver Camera Hardware BinderIPC JNI Client Service 二. Android Camera 的代码结构 1)应用层 Camera 的应用层在Android 上表现为直接调用SDK API 开发的一个

水俣病事件的启示

水俣病事件的启示——发展经济不能以牺牲环境和人们健康为代价 1925年,日本氮肥公司在这里建厂,随后开设了合成醋酸厂。1949年,这个公司又开始生产氯乙烯。长期以来,工厂把没有经过任何处理的废水排放到水俣湾中。1956年,水俣湾附近发现了一种奇怪的病,这种病最初出现在猫身上,被称为“猫舞蹈症”。病猫步态不稳,抽搐、麻痹,甚至跳海死去,被称为“自杀猫”。随后不久,发现也有人患有这种病。患者由于脑中枢神经和末梢神经被侵害,口齿不清、步履蹒跚、面部痴呆、手足麻痹或变形、视觉丧失,严重者神经失常,或酣睡,或兴奋,身体弯弓高叫直至死亡。 这种怪病就是日后轰动世界的“水俣病”,是由于工业废水排放污染造成的公害病。“水俣病”的罪魁祸首是当时处于世界化工业尖端的氮生产企业。氮用于肥皂、化学调味料等日用品以及醋酸、硫酸等工业用品的制造上。然而,这个“先驱产业”的肆意发展,却给当地居民及其生存环境带来了无尽的灾难。在制造氯乙烯和醋酸乙烯的过程中,要使用含汞的催化剂,这使排放的废水中含有大量的汞。当汞在水中被水生生物食用后,会转化成甲基汞。这种剧毒物质只要有挖耳勺一半大小就可以致人死亡。水俣湾由于常年被工业废水严重污染,这里的鱼虾类也由此被污染。这些被污染的鱼虾通过食物链进入动物和人的体内,甲基汞被人的肠胃吸收,侵害脑部和身体其他器官。进入脑部的甲基汞会使脑萎缩,侵害神经细胞,破坏掌握身体平衡的小脑和知觉系统。 “水俣病”使日本政府和企业日后为此付出了极其昂贵的治理、治疗和赔偿的代价。迄今为止,因水俣病而提起的旷日持久的法庭诉讼仍然没有完结。 日本工业在第二次世界大战后飞速发展,但由于没有环境保护措施,工业污染和各种公害病泛滥成灾。经济虽然得到发展,但环境破坏和贻害无穷的公害病使日本政府和企业付出了极其昂贵的代价。水俣病引发的诉讼旷日持久,时至今日依然没完没了。 从日本水俣病事件发生的时代,与中国目前经济高速发展有不少相类似之处,因此,日本水俣病事件的发生、处理和各利益相关者的斗争和博弈,对中国未来发展有重要的启示 即: 如何处理环境保护与经济发展之间的关系。对于中国作为后工业化发展的国家,目前经济依然处于高速发展的时代,因此,处理好环境保护与经济发展是一个很大的难题,需要从战略思考的层面在战略规划的层面下功夫,否则我们也会重走日本工业化进程中的不少老路,即先污染后治理。这样的代价并不符合经济和社会可持续发展的普遍规律。 我国要走以降低资源能源消耗为核心的新型工业化道路。能耗的降低必然使得环境污染问题迎刃而解。在资源的开发利用中,我国应广泛采用先进的信息技术,力求工业设计、制造以及管理的最优化。同时,通过对各种生活和消费过程进行数字化、智能化的实时监控和调节,也可以达到降低各种资源消耗的目的。此外,绿色制造技术以及循环经济概念的大力推广,对于减少生态环境的破坏同样具有重要意义。我国应努力营造一个节约型的社会。这既是由于我们面临着资源短缺的严峻形势,更是对于我们子孙后代和世界全人类高度负责的一种必然选择。 真正做到消除污染是一个漫长的过程,需要的是全社会范围内所有公民的环保意识的普遍提高。政府是这一过程中的最有利推手,只有政府能够承担起环境保护的责任,力行污染治理的措施,有效顺利的保障社会范围内公众意识的唤醒, 我们的美好愿望才可以实现,绿色生活才能真正的在这个星球上被推崇。

进程间通信的四种方式

一、剪贴板 1、基础知识 剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该内存区域中取出数据。 2、函数说明: (1)、BOOL OpenClipboard( ) CWnd类的OpenClipboard函数用于打开剪贴板。若打开剪贴板成功,则返回非0值。若其他程序或当前窗口已经打开了剪贴板,则该函数返回0值,表示打开失败。若某个程序已经打开了剪贴板,则其他应用程序将不能修改剪贴板,直到前者调用了CloseClipboard函数。 (2)、BOOL EmptyClipboard(void) EmptyClipboard函数将清空剪贴板,并释放剪贴板中数据的句柄,然后将剪贴板的所有权分配给当前打开剪贴板的窗口。 (3)、HANDLE SetClipboardData(UINT uFormat, HANDLE hMem) SetClipboardData函数是以指定的剪贴板格式向剪贴板上放置数据。uFormat指定剪贴板格式,这个格式可以是已注册的格式,或是任一种标准的剪贴板格式。CF_TEXT表示文本格式,表示每行数据以回车换行(0x0a0x0d)终止,空字符作为数据的结尾。hMem指定具有指定格式的数据的句柄。hMem参数可以是NULL,指示采用延迟提交技术,则该程序必须处理WM_RENDERFORMA T和WM_RENDERALLFORMATS消息。应用程序在调用SetClipboardData函数之后,就拥有了hMem参数所标识的数据对象,该应用程序可以读取该数据对象,但在应用程序调用CloseClipboard函数之前,它不能释放该对象的句柄,或者锁定这个句柄。若hMem标识了一个内存对象,那么这个对象必须是利用GMEM_MOVEABLE标志调用GlobalAlloc函数为其分配内存。 注意:调用SetClipboardData函数的程序必须是剪贴板的拥有者,且在这之前已经打开了剪贴板。 延迟提交技术:当一个提供数据的进程创建了剪贴板数据之后,直到其他进程获取剪贴板数据之前,这些数据都要占据内存空间。若在剪贴板上放置的数据过大,就会浪费内存空间,降低对资源的利用率。为了避免这种浪费,就可以采用延迟提交计数,也就是由数据提供进程先提供一个指定格式的空剪贴板数据块,即把SetClipboardData函数的hMem参数设置为NULL。当需要获取数据的进程想要从剪贴板上得到数据时,操作系统会向数据提供进程发送WM_RENDERFORMA T消息,而数据提供进程可以响应这个消息,并在此消息的响应函数中,再一次调用SetClipboardData函数,将实际的数据放到剪贴板上。当再次调用SetClipboardData函数时,就不再需要调用OpenClipboard函数,也不再需要调用EmptyClipboard函数。也就是说,为了提高资源利用率,避免浪费内存空间,可以采用延迟提交技术。第一次调用SetClipboardData函数时,将其hMem参数设置为NULL,在剪贴板上以指定的剪贴板格式放置一个空剪贴板数据块。然后直到有其他进程需要数据或自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据。 (4)、HGLOBAL GlobalAlloc( UINT uFlags,SIZE_T dwBytes); GlobalAlloc函数从堆上分配指定数目的字节。uFlags是一个标记,用来指定分配内存的方式,uFlags为0,则该标记就是默认的GMEM_FIXED。dwBytes指定分配的字节数。

糖尿病病因及发病机制

培训记录 时间: 地点: 主讲人: 参加人员签到: 糖尿病的有关知识 一.糖尿病病因及发病机制十分复杂,目前尚未完全阐明,传统学说认为与以下因素有关: 1、遗传因素 举世公认,糖尿病是遗传性疾病,遗传学研究表明,糖尿病发病率在血统亲属中与非血统亲属中有显著差异,前者较后者高出5倍。在糖尿病Ⅰ型的病因中遗传因素的重要性为50%,而在糖尿病Ⅱ型中其重要性达90%以上,因此引起糖尿病Ⅱ型的遗传因素明显高于糖尿病Ⅰ型。 2、精神因素 近十年来,中、外学者确认了精神因素在糖尿病发生、发展中的作用,认为伴随着精神的紧张、情绪的激动及各种应激状态,会引起升高血糖激素的大量分泌,如生长激素、去甲肾上腺素、胰升糖素及肾上腺皮质激素等。 3、肥胖因素 目前认为肥胖是糖尿病的一个重要诱发因,约有60%-80%的成年糖尿病患者在发病前均为肥胖者,肥胖的程度与糖尿病的发病率呈正比,有基础研究材料表明:随着年龄增长,体力活动逐渐减少时,人体肌肉与脂肪的比例也在改变。自25岁至75岁,肌肉组织逐渐减少,由占体重的47%减少到36%,而脂肪由20%增加到36%,此系老年人,特别是肥胖多脂肪的老年人中糖尿病明显增多的主要原因之一。 4、长期摄食过多 饮食过多而不节制,营养过剩,使原已潜在有功能低下的胰岛素β细胞负担过重,而诱发糖尿病。现在国内外亦形成了“生活越富裕,身体越丰满,糖尿病越增多”的概念。 5、感染 幼年型糖尿病与病毒感染有显著关系,感染本身不会诱发糖尿病,仅可以使隐形糖尿病得以外显。 6、妊娠

有关专家发现妊娠次数与糖尿病的发病有关,多次妊娠易使遗传因素转弱诱发糖尿病。 7、基因因素 目前科学认为糖尿病是由几种基因受损所造成的:Ⅰ型糖尿病———人类第六对染色体短臂上的HLA-D基因损伤;Ⅱ型糖尿病—胰岛素基因、胰岛素受体基因、葡萄糖溶酶基因和线粒体基因损伤。总之,不管哪种类型的糖尿病,也不论是因为遗传易感而发病,还是环境因素、病毒感染发病,归根结底都是基因受损所致。换言之糖尿病是一种基因病。 二糖尿病的症状 糖尿病早期症状自查离不开对糖尿病症状的了解,主要有多尿、多食、多饮、体重减轻等情况,还可能出现的症状有疲倦、皮肤搔痒、出汗异常、视力模糊、肢体发麻等。 1、多食、多饮、多尿、消瘦:这是糖尿病常见的三多一少的症状表现,但这种三多一少的症状并不是每个糖尿病患者都有,由于病情轻重或发病方式的不同,不同的人还会出现一些其它的症状。 2、疲乏无力:由于血糖不能进入细胞,细胞缺乏能量所致。据报告2/3的糖尿病患者有无力的症状,甚至超过消瘦的人数。 3、皮肤感觉异常:感觉神经障碍引起四肢末梢部位皮肤感觉异常,如蚁走感,麻木,针刺感,瘙痒,尤其女性外阴瘙痒可为首发症状。 4、性功能障碍:糖尿病引起血管、神经系统病变以及心理障碍等引发男性阳痿,女性性冷漠、月经失调等性功能障碍。 5、容易感染:糖尿病影响免疫功能,以致抵抗力降低,容易出现皮肤疥肿,呼吸、泌尿胆道系统的各种炎症,且治疗困难。 6、视力障碍:糖尿病可引起眼睛各个部位的合并症,以至出现视力减退、黑朦、失明等。 糖尿病症状表现在许多方面,一般都能够在生活中有所体现,如果人们能够细心观察自身的变化,那么可以及时发现糖尿病症状,在糖尿病发生的早期接受专业的治疗有助于药物治疗和手术治疗发挥出较好的作用,由此可见掌握正确的糖尿病症状表现非常有必要。

linux进程间通讯的几种方式的特点和优缺点

1. # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 # 消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 # 信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存( shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 管道的主要局限性正体现在它的特点上: 只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等; 2. 用于进程间通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix和system v消息队列) 2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯) 3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区) 4. 过程调用(Solaris门,Sun RPC) 消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区

进程间通信方式比较

进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 2.信号(signal): 信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致得。 3.消息队列(message queue): 消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。 消息缓冲通信技术是由Hansen首先提出的,其基本思想是:根据”生产者-消费者”原理,利用内存中公用消息缓冲区实现进程之间的信息交换. 内存中开辟了若干消息缓冲区,用以存放消息.每当一个进程向另一个进程发送消息时,便申请一个消息缓冲区,并把已准备好的消息送到缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程收到发送里程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出所需的信息,然后把消息缓冲区不定期给系统.系统负责管理公用消息缓冲区以及消息的传递. 一个进程可以给若干个进程发送消息,反之,一个进程可以接收不同进程发来的消息.显然,进程中关于消息队列的操作是临界区.当发送进程正往接收进程的消息队列中添加一条消息时,接收进程不能同时从该消息队列中到出消息:反之也一样. 消息缓冲区通信机制包含以下列内容:

(1) 消息缓冲区,这是一个由以下几项组成的数据结构: 1、消息长度 2、消息正文 3、发送者 4、消息队列指针 (2)消息队列首指针m-q,一般保存在PCB中。 (1)互斥信号量m-mutex,初值为1,用于互斥访问消息队列,在PCB中设置。 (2)同步信号量m-syn,初值为0,用于消息计数,在PCB中设置。(3)发送消息原语send (4)接收消息原语receive(a) 4.共享内存(shared memory): 可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。 这种通信模式需要解决两个问题:第一个问题是怎样提供共享内存;第二个是公共内存的互斥关系则是程序开发人员的责任。 5.信号量(semaphore): 主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。 6.套接字(socket); 这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 https://www.360docs.net/doc/57607288.html,/eroswang/archive/2007/09/04/1772350.aspx linux下的进程间通信-详解

日本水俣病事件

日本水俣病事件 背景 日本熊本县水俣湾外围的“不知火海”是被九州本土和天草诸岛围起来的内海,那里海产丰富,是渔民们赖以生存的主要渔场。水俣镇是水俣湾东部的一个小镇,有4万多人居住,周围的村庄还(居)住着1万多农民和渔民。“不知火海”丰富的渔产使小镇格外兴旺。 1925年,日本氮肥公司在这里建厂,后又开设了合成醋酸厂。1949年后,这个公司开始生产氯乙烯,年产量不断提高,1956年超过6000吨。与此同时,工厂把没有经过任何处理的废水(含重金属元素汞)排放到水俣湾中。 原因 日本熊本县水俣镇一家氮肥公司排放的废水中含有汞,汞也称水银,是我们常用的温度表里显示多少度的银白色金属,它是一种剧毒的重金属,具有较强的挥发性。汞对于生物的毒性不仅取决于它的浓度,而且与汞的化学形态以及生物本身的特征有密切关系。一般认为,汞是通过海洋生物体表(皮肤和鳃)的渗透或摄含汞的食物进入体内的。这些废水排入海湾后经过某些生物的转化,形成甲基汞。这些汞在海水、底泥和鱼类中富集,又经过食物链使人中毒。 造成的危害 1956年,水俣湾附近发现了一种奇怪的病。这种病症最初出现在猫身上,被称为“猫舞蹈症”。病猫步态不稳,抽搐、麻痹,甚至跳海死去,被称为“自杀猫”。随后不久,此地也发现了患这种病症的人。患者由于脑中枢神经和末梢神经被侵害,轻者口齿不清、步履蹒跚、面部痴呆、手足麻痹、感觉障碍、视觉丧失、震颤、手足变形,重者神经失常,或酣睡,或兴奋,身体弯弓高叫,直至死亡。当时这种病由于病因不明而被叫做“怪病”。这种“怪病”就是日后轰动世界的“水俣病”,是最早出现的由于工业废水排放污染造成的公害病。早在多年前,就屡屡有过关于“不知火海”的鱼、乌、猫等生物异变的报道,有的地方甚至连猫都绝迹了。“水俣病”危害了当地人的健康和家庭幸福,使很多人身心受到摧残,经济上受到沉重的打击,甚至家破人亡。更可悲的是,由于甲基汞污染,水俣湾的鱼虾不能再捕捞食用,当地渔民的生活失去了依赖,很多家庭陷于贫困之中。“不知火海”失去了生命力,伴随它的是无期的萧索。 事后思考 水俣病事件带给我们的思考远不止这些,在1956年确认日本氮肥公司的排污为病源之后,日本政府毫无作为,以至于该公司肆无忌惮地继续排污12年,直到1968年为止。后来,46名受害者联合向日本最高法院起诉日本政府在水俣病事件中的无作为,并在2004年获得胜诉。法院判决认为日本政府在1956年知道水俣病病因后应当立即责令污染企业停止侵害,但直到12年后政府才做出决定,为此,日本政府应当对未能及时做出决定而导致水俣病伤害范围扩大而承担行政责任。 日本工业在第二次世界大战后飞速发展,但由于没有环境保护措施,工业污

呼吸衰竭的病因和发病机制

总言: 慢性呼吸衰竭同急性呼吸衰竭不同的是,多在原有肺疾病的基础上发展而来,最常见原因是COPD。早期可表现为I型呼衰,随着病情加重、肺功能减退,表现为II型呼衰;慢性呼吸衰竭稳定期,虽然PaO2降低、PaCO2升高,但机体通过代偿,(代偿阶段,PH正常)患者仍可以从事一般的日常工作和活动;一旦呼吸道感染加重或其他诱因,可表现为PO2明显降低、PCO2明显升高,此时称为慢性呼吸衰竭急性发作,这是我国临床上最常见的慢性呼吸衰竭的类型。 呼吸衰竭的病因 1、支气管气道病变:如异物、炎症、肿瘤使中央气道狭窄或阻塞,更为多见的是细支气管炎、支气管哮喘、慢性支气管炎、COPD等引起外周气道的阻塞; 2、肺部病变:各种类及肺泡和间质的病变,如肺炎、肺气肿、严重肺结核、弥漫性肺纤维化,肺水肿、矽肺等,导致肺泡减少,有效弥散面积减少、肺顺应性减低,通气/血流比值失调,产生缺氧和二氧化碳潴留; 3、肺血管病变:肺栓塞、肺血管炎等可引起通气/血流比值失调,或动静脉分流,导致呼吸衰竭; 4、胸廓及胸膜病变:胸部外伤造成连枷胸、气胸、脊柱畸形、胸腔积液、胸膜粘连、强直性脊柱炎,影响胸廓和肺的扩张,造成通气减少,导致呼吸衰竭; 5、神经及呼吸肌病变:脑血管意外、药物中毒,脊髓灰质炎、重症肌无力、有机磷农药中毒、严重钾代谢紊乱,均可累及呼吸肌,造成呼吸肌无力、疲劳、麻痹,导致呼吸动力不足而引起肺通气不足。 呼吸衰竭的发病机制 肺的主要生理功能就是气体交换:分三个步骤完成: 1、机体通过肺组织从外界摄取氧气、排出机体代谢产生的CO2; ---外呼吸:包括肺通气、肺换气(肺泡和血液之间的气体交换) 2、气体在体内的运输主要通过血液循环来完成; 3、组织细胞则从血液及组织液内环境中摄取氧并排出CO2。 ---内呼吸:血液、组织液与组织之间的气体交换 呼吸衰竭主要涉及的机制主要是外呼吸(即肺通气和肺换气) (一)肺通气功能障碍 肺通气是指通过呼吸运动使肺泡与外界气体交换的过程,其功能正常与呼吸动力、阻力有关,所以凡能影响肺通气动力和阻力的因素都会影响肺的通气功能; 在静息状态下,总肺泡通气量约为4L/min,才能维持正常的氧分压和CO2分压,否则(通气不足)就会出现PO2降低,同时PCO2升高,即II型呼吸衰竭。-------肺通气功能障碍时; 肺通气功能障碍可为二种:阻塞性、限制性通气功能障碍; 一、阻塞性通气功能障碍:气道阻力增高引起的 凡是由于气道狭窄和阻塞引起的因素都会导致阻塞性通气功能障碍,如支气管水肿、增生、痉挛、分泌物、异物阻塞;肺泡壁破坏、肺泡间隔缺如所致肺组织弹性下降,对气管的牵拉减弱使气管内径变窄等; 肺功能表现为:RV/TLC明显增加,FEV1和FEV1/FVC下降; 解释:阻塞性限制性 TLC—肺总量:正常或增加;减低

进程间的通信

实验三进程间的通信 【实验类型】 综合性实验 【目的要求】 学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通讯,并加深对上述通信机制的理解。 【内容提要】 1、了解系统调用pipe()、msgget()、msgsnd()、msgrcv ()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。 2、编写一段程序,使其用管道来实现父子进程之间的进程通讯。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent!”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。 3、编写一段程序,使用系统调用fork()来创建两个子进程CLIENT进程和SERVER进程,使其用消息缓冲队列来实现CLIENT进程和SERVER进程之间的通信。SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一条消息后显示一句“(server) received”。CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client) sent”。父进程在SERVER和CLIENT均退出后结束。 4、编写一个与3具有类似功能的程序,使其用共享存储区来实现两个进程之间的通讯。 【主要仪器设备】 每人一台计算机,硬件要求:CPU PII以上,64M内存,1OOM硬盘空间即可;软件要求: Linux操作系统。

相关文档
最新文档