1-4_基本概念_进程间通信及同步

内存映射

  调用系统函数mmap()的进程,会在其虚拟地址空间中创建一个新的内存映射。

  映射分为两类:

  1、文件映射:将文件的部分区域映射入调用进程的虚拟内存。映射一旦完成,对文件映射内容的访问则转化为对相应内存区域的字节操作。映射页面会按需自动从文件中加载。

  2、相映成趣的是并无文件与之对应的匿名映射,其映射页面的内容会被初始化为0。

  有某一进程所映射的内存可以与其他进程的映射共享。达成共享的方式有二:

  其一是两个进程都对某一文件的相同部分加以映射

  其二是由fork()创建的子进程自父进程处继承映射。

  当两个或多个进程共享的页面相同时,进程之一对页面内容的改动是否为其他进程所见呢?这取决于创建映射时所传入的标志参数。若传入标志参数为私有,则某进程对映射内容的修改对于其他进程是不可见的,而且这些改动也不会真的落实到文件上;若传入标志为共享,对映射内容的修改就会为其他进程所见,并且这些修改也会造成对文件的改动。

  内存映射用途很多,其中包括:以可执行文件的相应段来初始化进程的文本段、内存(内容填充为0)分配、文件I/O(即映射内存I/O)以及进程间通信(通过共享映射)。

进程间通信(IPC)机制

  读写磁盘文件中的信息是进程间通信的方法之一。可是,对许多程序来说,这种方法既慢又缺乏灵活性。因此,Linux提供了丰富的进程间通信(IPC)机制。

  信号(signal),用来表示事件的发生。

  管道(亦即shell用户所熟悉的“|”操作符)和FIFO,用于在进程间传递数据。

  套接字(socket),供同一台主机或是联网的不同主机上所运行的进程之间传递数据。

  文件锁定,为防止其他进程读取或更新文件内容,允许某进程对文件的部分区域加以锁定。

  消息队列,用于在进程间交换消息(数据包)。

  信号量(semaphore),用来同步进程动作。

  共享内存,允许两个及两个以上进程共享一块内存。当某进程改变了共享内存的内容时,其他所有进程会立即了解到这一变化。

信号

  尽管将信号视为IPC的方法之一,但其在其他方面的广泛应用则更为普遍。

  人们往往将信号称为“软件中断”。进程收到信号,就意味着某一事件或异常情况的发生。信号的类型很多,每一种分别标识不同的事件或情况。采用不同的整数来标识各种信号类型,并以SIGxxxx形式的符号名加以定义。

  内核、其他进程(只要具有相应的权限)或进程自身均可向进程发送信号。

  发生下列情况之一时,内核可向进程发送信号:

  用户键入中断字符(通常为Control-c)

  进程的子进程之一已经终止。

  由进程设定的定时器(告警时钟)已经到期。

  进程尝试访问无效的内存地址。

  在shell中,可使用kill命令向进程发送信号。在程序内部,系统调用kill()可提供相同功能。

  收到信号时,进程会根据信号采取如下动作之一:

  忽略信号。

  被信号“杀死”

  先挂起,之后再被专门信号唤醒。

  就大多数信号类型而言,程序可选择不采取默认的信号动作,而是忽略信号(当信号的默认处理行为并非忽略此信号时,会派上用场)或建立自己的信号处理器。

  信号处理器是由程序员定义的函数,会在进程收到信号时自动调用,根据信号的产生条件执行相应动作。

  信号从产生直至送达至进程期间,一直处于挂起状态。通常,系统会在接收进程下次调度时,将处于挂起状态的信号同时送达。如果接收进程正在运行,则会立即将信号送达。然而,程序可以将信号纳入所谓“信号屏蔽”以求阻塞该信号。如果产生的信号处于“信号屏蔽”之列,那么此信号将一直保持挂起状态,直至解除对该信号的组设。

时间: 2024-10-06 00:45:05

1-4_基本概念_进程间通信及同步的相关文章

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

事务概念_四大特性

1.事务概念_四大特性 一.事务 事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成. 事务的管理:默认情况下,数据库会自动管理事务,管理的方式是一条语句就独占一个事务. 如果需要自己控制事务也可以通过如下命令开启/提交/回滚事务 start transaction; commit; rollback; JDBC中管理事务: conn.setAutoCommit(false); conn.commit(); conn.rollback(); SavePoint sp = c

基本概念_同步、异步有什么区别

1.同步.异步有什么区别 在进行网络编程时,我们通常会看到同步.异步.阻塞.非阻塞四种调用方式以及他们的组合. 其中同步方式.异步方式主要是由客户端(client)控制的,具体如下: 同步(Sync) 所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行.我们在说同步.异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务. 简单来说,同步就是必须一件一件事做,等前

nginx源码分析--进程间通信机制 & 同步机制

Nginx源码分析-进程间通信机制 从nginx的进程模型可以知道,master进程和worker进程需要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号,master进程主要就是监控.接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是阻塞在sigsuspend()函数调用上.Worker进程屏蔽了所有的外部信号,那么Master进程就通过套接字和worker进程通信,worker进程修改全局变量,使得worker进程接受

线程概念及线程的同步与互斥

线程概念:它是运行在进程内部的的一个基本执行流,多线程的控制流程可以长期并存,一个进程中的数据段和代码段都是被该进程中的多个线程共享的,若定义一个函数,每个线程都可以调用,若定义一个全局变量,每个线程都可以访问. 线程还共享进程的以下内容:1.文件描述符表 2.当前的工作目录 3.用户id(uid)和组id(gid) 4.每种信号的处理方式. 但每个线程还必须有自己的私有部分:1.线程id 2.硬件上下文(硬件寄存器的值,栈指针等) 3.自己的栈空间(运行时的临时数据都要保存在自己的栈空间上)

JVM基础学习之基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的 架构 .对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现 问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的

驱动程序分层分离概念_总线驱动设备模型_P

分层概念: 驱动程序向上注册的原理: 比如:输入子程序一个input.c作为一层,下层为Dev.c和Dir.c,分别编写Dev.c和Dir.c向上Input.c注册:如图所示 分离概念: 分离概念主要是讲,设备驱动程序分成两个部分,也将引进另一个新概念bus_dri_dev模型 总线-驱动-设备模式,是讲吧一个驱动分成两个部分,分别挂载到一条总线上的链表中,总线上有.match函数还对两个链表相同名字相匹配,匹配成功跳到driver驱动程序的probe函数来实现驱动的操作. 一下例子主要编写总线

第一章 基本概念_因子和。给一个正整数n,请求n所有因子的累加和

#include <stdio.h>//1172.因子和 #include <math.h> int main() {    long n;          int i, sum;          while(scanf("%d", &n)&&n!=0)        {              sum = 0;              if(n==1){printf("1\n");continue;}    

进程间通信和同步

半双工管道 原型:int pipe(int filedes[2]); 实质上是创建两个文件描述符,filedes[0]用于读,filedes[1]用于写. 当写入数据的数目小于PIPE_BUF时,写入是原子的,当大于PIPE_BUF时,可能不是原子的. 如果管道是空的,那么read会被阻塞,如果管道是满的,那么write会被阻塞. 命名管道 原型:int mkfifo(const char *pathname,mode_t mode);      //可用shell命令mkfifo创建 FIFO