构造并发程序的三种基本方法和优缺点

构造并发程序的三种基本方法

进程

用这种方法,每个逻辑控制流都是一个进程,由内核来调度维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制.

I/O多路复用

在这种形式的并发编程中,应用程序在一个进程的上下文中显式地调度它们自己的逻辑流.逻辑流被模型化为状态机,数据到达文件描述符后,主程序显式地从一个状态转换到另一个状态.因为程序是一个单独的进程,所以所有的流都共享同一个地址空间.

假设要求编写一个echo服务器,它也能对用户从标准输入键入的交互命令做出响应.在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起连接请求,2)用户在键盘上键入命令行.我们先等待哪个事件呢?没有哪个选择是理想的.如果在accept中等待一个连接请求,我们就不能响应输入的命令.类似的,如果在read中等待一个输入命令,我们就不能响应任何连接请求.

针对这种困境的一个解决办法就是I/O多路复用技术.基本的思路就是使用select函数,要求内核挂起进程,只有一个或多个I/O事件发生后,才将控制返回给应用程序.

线程

线程是运行在一个单一进程上下文中的逻辑流,由内核进行调度.你可以把线程看成是其他两种方式的混合体,像进程流一样由内核进行调度,而像I/O多路复用流一样共享同一个虚拟地址空间.

在一些重要方面,线程执行是不同于进程的.因为一个线程的上下文要比一个进程的上下文小得多,线程的上下文切换要比进程的上下文切换快得多.另一个不同就是线程不像进程那样,不是按照严格的父子层次来组织的.和一个进程相关的线程组成一个对等(线程)池,独立于其他线程创建的线程.主线程和其他线程的区别仅在于它总是进程中第一个运行的线程.对等(线程)池概念的主要影响是,一个线程可以杀死它的任何对等线程,或者等待它的任意对等线程终止.另外,每个对等线程都能读写相同的共享数据.

构造并发程序的三种基本方法的优劣

进程的优劣

在父进程与子进程间共享状态信息,进程有一个非常清晰的模型: 共享文件表,但是不共享用户地址空间.进程有独立的地址空间既是优点也是缺点.这样一来,一个进程不可能不小心覆盖另一个进程的虚拟地址,这就消除了许多令人疑惑的错误--这是一个明显的优点.

另一方面,独立的地址空间使得进程共享状态信息变得更加困难.为了共享信息,它们必须使用显式的IPC(进程间通信).基于进程的设计的另一个缺点是,它们往往比较慢,因为进程控制和IPC的开销很高.

I/O多路复用的优劣

事件驱动设计的一个优点是,它比基于进程的设计给了程序员更多的对程序行为的控制.

另一个优点是,一个基于I/O多路复用的事件驱动服务器是运行在单一进程上下文中的,因此每个逻辑流都能访问该进程的全部地址空间.这使得流之间共享数据变得很容易.一个与作为单个进程运行相关的优点是,你可以利用熟悉的调试工具来调试你的并发服务器,就像对顺序程序那样.最后,事件驱动设计常常比基于进程的设计要高效很多,因为他们不需要进程上下文切换来调度新的流.

事件驱动设计的一个明显缺点就是编码复杂,随着并发粒度的减小,复杂性还会上升.基于事件的设计另一个重要缺点是它们不能充分利用多核处理器.

原文地址:https://www.cnblogs.com/agichen/p/10348725.html

时间: 2024-08-21 05:54:12

构造并发程序的三种基本方法和优缺点的相关文章

Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

原文:Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了Raspberry安装Win10 IoT系统及搭建Visual Studio 2015开发环境的方法(http://www.cnblogs.com/cloudtech/p/5562120.html)

WordPress程序打开速度慢的三种解决方法

WordPress程序打开速度慢的三种解决方法 最近好多用户反应,在使用WordPress程序的网站时,不论打开网站前台或是后台,速度都是非常慢.联想近期的GOOGLE断网事件,不难发现,原来是GOOGLE"故障"所致,以致WP内置的字体链接失效://fonts.googleapis.com/css?family=Open+Sans%3A300italic%2C400italic%2C600italic%2C300%2C400%2C600&subset=latin%2Clati

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

C#使用DataSet Datatable更新数据库的三种实现方法

本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参考之用.具体方法如下: 一.自动生成命令的条件 CommandBuilder 方法 a)动态指定 SelectCommand 属性 b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand

JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链 JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法 1.Object类 在JS中,Object是所有类的基

Liunx 环境下vsftpd的三种实现方法(超详细参数)

以下文章介绍Liunx 环境下vsftpd的三种实现方法 ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz,目前已经到2.0.3版本.假设我们已经将vsftpd-2.0.3.tar.gz文件下载到服务器的/home/xuchen目录 代码: # cd /home/xuchen # tar xzvf vsftpd-2.0.3.tar.gz //解压缩程序 # cd vsftpd-2.0.3 三.三种方式的实现            

水晶报表的三种筛选方法

目录: 一.解决方案一:报表数据访问使用推模型 二.解决方案二:记录选定公式运行时自定义 三.解决方案三:将参数合并到记录选定公式 ---------------------------------- 解决方案一: 报表数据访问使用推模型 需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表.该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来. ---------------

Python库安装的三种简单方法

我使用的是python3.4 第一种: pip3 install 库名 pip install 库名 第二种:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应文件的whl,然后直接这样就可以了 第三种,到各种库官方地址下载源代码 转到文件对应目录,直接命令下 python setup.py install 关于三种安装方法,可能用cx-Freeze打包后,程序会缺库,建议把主要的源代码扔到Lib\site-packages下