- 浏览: 564733 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (618)
- java (109)
- Java web (43)
- javascript (52)
- js (15)
- 闭包 (2)
- maven (8)
- 杂 (28)
- python (47)
- linux (51)
- git (18)
- (1)
- mysql (31)
- 管理 (1)
- redis (6)
- 操作系统 (12)
- 网络 (13)
- mongo (1)
- nginx (17)
- web (8)
- ffmpeg (1)
- python安装包 (0)
- php (49)
- imagemagic (1)
- eclipse (21)
- django (4)
- 学习 (1)
- 书籍 (1)
- uml (3)
- emacs (19)
- svn (2)
- netty (9)
- joomla (1)
- css (1)
- 推送 (2)
- android (6)
- memcached (2)
- docker、 (0)
- docker (7)
- go (1)
- resin (1)
- groovy (1)
- spring (1)
最新评论
-
chokee:
...
Spring3 MVC 深入研究 -
googleyufei:
很有用, 我现在打算学学Python. 这些资料的很及时.
python的几个实用网站(转的) -
hujingwei1001:
太好了找的就是它
easy explore -
xiangtui:
例子举得不错。。。学习了
java callback -
幻影桃花源:
太好了,謝謝
Spring3 MVC 深入研究
我看书有个特点,不写笔记,就感觉好像没有看过书,印象不深刻(虽然写了也未必深刻),所以我看书会比较慢,笔记会很多。这里总结一下并发。
最近学习《深入理解计算机系统》,最后一章中讲到了并发。之前一直以为并发是为了提高性能,书中将并发理解为逻辑控制流在时间上的重叠。简单的说,就是让机器
能够同时处理多个事情,充分利用机器的能力。特别是现在多核机器的普遍,并发可能越来越重要。
现代操作系统提供了三种基本的方法用于构造并发:进程,I/O多路复用,线程。我们公司在工作中用的最多的其实是第二种。你也许知道,他是无法利用CPU的多核的。
不过还好,我们的服务器上一般会跑多个程序(系统划分为多个程序模块)。
某些语言也从语言层面提供了一种并发的机制:协程,比如lua和python,go好像也提供了这种机制。我比较熟悉的是python的协程。
1、进程
收到客户端的请求后,就申请一个新的进程来处理这个请求。这是利用进程并发的基本模式。
“进程有一个清晰的模型:共享文件表,但不共享用户地址空间。”——我实际尝试了一下,准确的说,应该是子进程会继承他生成时父进程打开的文件描述符。当子进
程开始运行后,父进程或者子进程在打开的文件描述符将不会被他们共享。
被共享的文件描述符是引用计数,所以一般情况下,fork返回后,当父进程和子进程分别执行的时候,他们一般都要各自把不需要的文件描述符关闭掉。
linux2.4.22提供了另一种新进程创建函数:clone()系统调用。它允许调用者控制那部分由父子进程共享。
优点:独立的地址空间,这样各个进程隔绝,一个进程不会一不小心进入另外一个进程,减少了程序的复杂性,不易出错。
缺点:1)进程间共享信息变得困难,需要通过进程间通信(IPC)来解决。2)多个进程要在cpu上进行上下文切换,可能会降低运行速度(如果为了利用多核,进程数目和cpu核数一致则另当别论)。另外IPC也会有开销。
2、I/O多路复用
这是我们用的比较多的一种方式。之前写过这方面的一篇文章:表驱动法
。
书中叫做并发事件驱动程序,在事件驱动程序中,逻辑流程一般会被模型化为状态机,当收到一个逻辑流开始请求后,我们就申请一个新的状态机来处理这个请求以及后续的相关请求(状态机我们一般情况下叫做通道)。
一个逻辑流的完成往往需要很多的事件,对于后续的事件,我们一般会首先找到时那个状态机在处理它,然后根据事件类型,状态机状态来选择相应的处理函数进行处理,以此推动状态机的前进。
优点:1)一个进程可以处理多个逻辑流程;2)它比基于进程的设计给了程序员更多的控制权;3)每个逻辑流都能够访问进程的全部的地址空间,使得流之间共享数据变得更加简单;4)因为没有进程的上下文切换,可能会更加高效。
缺点:1)增加了代码的复杂度。事件驱动机制使得对流程的处理被打的七零八散,整个程序只见事件,不见流程——流程隐藏在事件处理的转移和衔接中,降低可读性的同时,也增加了实现的复杂性。2)无法有效的利用多核处理器。
3、线程
线程的调度和进程的调度一样,都是系统进行调度的,但是线程的切换要比进程快很多。同时,线程之间是对等的,没有父子概念:“主线程和其他线程的区别仅在于它
是第一个运行的线程。”“每个线程都有独立的线程上下文,包括线程ID,栈,栈指针,程序计数器,条件码和通用目的寄存器值。每个线程都和其他线程共享进程上下文的其他部分:代码段,数据段,BSS段,堆以及所有共享库代码和数据区域。线程通用共享打开文件的集合”
我在开发过程中发现很多人使用线程会遇到两个问题:
1)线程没有真正释放。线程释放有两种方式,要么通过pthread_join显示回收,但是这回阻塞主线程。要么分离每个线程,这样,线程结束的时候会自动释放。
2)线程安全。这是线程最为人诟病的地方,他会明显的增加程序的复杂性。具体的还是看这篇文章:http://blog.csdn.net/lanphaday/article/details/7218611
优点:1)线程的切换比进程要快,而且是操作系统支持的。2)相对进程,更容易在线程间共享信息。3)也能够利用多核的优势。
缺点:1)线程会增加程序的复杂度,特别是线程安全问题,需要加倍小心。2)增加线程的同时性能可能会出现下降,因为线程的切换也会有开销。
4、协程
这个是书上没有,我最近接触的。他也可以提供并发。目前所讨论的协程,一般是编程语言提供支持的。目前我所知提供协程支持的语言包括python,lua,go,据说
scala和rust也支持。
协程不同于线程的地方在于协程不是操作系统进行切换,而是由程序员编码进行切换的,也就是说切换是由程序员控制的,这样就没有了线程所谓的安全问题。
所有的协程都共享整个进程的上下文,这样协程间的交换也非常方便。
相对于第二种方案(I/O多路复用),使得使用协程写的程序将更加的直观,而不是将一个完整的流程拆分成多个管理的事件处理。
协程的缺点可能是无法利用多核优势,不过,这个可以通过协程+进程的方式来解决。
协
程可以用来处理并发来提高性能,也可以用来实现状态机来简化编程。我用的更多的是第二个。去年年底接触python,了解到了python的协程概念,后
来通过pycon china2011接触到处理yield,greenlet也是一个协程方案,而且在我看来是更可用的一个方案,特别是用来处理状态
机。
目前这一块已经基本完成,后面抽时间总结一下。
总结一下:
1)多进程能够利用多核优势,但是进程间通信比较麻烦,另外,进程数目的增加会使性能下降,进程切换的成本较高。程序流程复杂度相对I/O多路复用要低。
2)I/O多路复用是在一个进程内部处理多个逻辑流程,不用进行进程切换,性能较高,另外流程间共享信息简单。但是无法利用多核优势,另外,程序流程被事件处理切割成一个个小块,程序比较复杂,难于理解。
3)线程运行在一个进程内部,由操作系统调度,切换成本较低,另外,他们共享进程的虚拟地址空间,线程间共享信息简单。但是线程安全问题导致线程学习曲线陡峭,而且易出错。
4)协程有编程语言提供,由程序员控制进行切换,所以没有线程安全问题,可以用来处理状态机,并发请求等。但是无法利用多核优势。
上面的四种方案可以配合使用,我比较看好的是进程+协程
的模式。
发表评论
-
chm文件打开看不到内容的问题
2014-07-08 09:46 593chm文件打开看不到内容 ... -
Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
2013-11-23 21:33 13342011年04月26日 下午 7:59 ... -
Ubuntu安装FFmpeg编码出MP4文件的方法
2013-11-22 12:43 2026http://wiki.ubuntu.org.cn/U ... -
Ubuntu视频转换工具-mencoder命令行参数
2013-11-22 12:42 785Ubuntu视频转换工具-menco ... -
Ubuntu如何转换mp4与x264和h.264
2013-11-22 12:41 1204FFmpeg是Ubuntu下强大的视频、音频编解码工 ... -
lisp链接
2013-10-16 18:04 585http://acl.readthedocs.org/en/l ... -
如果编程语言是女人
2013-09-06 13:43 433PHP是你的豆蔻年华的 ... -
开发者必备的 6 款源码搜索引擎
2013-08-09 09:42 632在推动技术变革上,开源运动发挥了非常显著的作用。而Linux ... -
30个开发ide
2013-01-24 12:06 926Most people know about jsFiddl ... -
工作经验积累(自己看)
2012-12-05 11:41 868三年半的工作经验积累稍微总结一下: 第一年:主要学习j ... -
在windows下用virtualbox虚拟ubuntu,并通过ssh登录
2012-11-15 14:16 1346出于种种原因,最近感觉还是在自己机器上装个linux写程 ... -
windows下redis安装和php的redis扩展安装
2012-10-25 17:13 1407http://blog.phpwind.me/?p=152 ... -
redis安装手册,中文配置手册,php-redis模块安装方法,Web管理phpRedisAdmin
2012-10-25 17:05 1048redis官方网站及最新版本下载地址:http://redis ... -
redis安装手册,中文配置手册,php-redis模块安装方法,Web管理phpRedisAdmin
2012-10-25 17:03 915redis官方网站及最新版本下载地址:http://redis ... -
memcached图形化监控
2012-10-25 16:16 1135Memcached的图形化监控 2009/04/26 05: ... -
WebIM通信实现
2012-10-15 15:34 1435转自:http://blog.csdn.net/Pant ... -
消息系统该Push/Pull模式分析
2012-10-15 15:30 905信息推拉技术简介 “智能信息推拉(IIPP)技 ... -
推拉模式与观察者模式
2012-10-15 15:29 1069转自:http://leign.iteye.com/blog/ ... -
Linux 必备指令
2012-06-12 15:25 753Linux 必 ... -
linux学习笔记-近期整理的linux命令
2012-05-23 13:32 14411. some cmds 7za (^ 压缩和解 ...
相关推荐
- **CPU**:多核心处理器有助于提升并发处理能力。 - **内存**:充足的内存对于缓存数据极为重要,尤其是在使用InnoDB存储引擎时。 - **硬盘**:SSD相较于传统HDD能够显著提升读写速度。 - **操作系统**:选择适合...
《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果...
BCM帧流程精要 在以太网交换领域,博通(Broadcom)交换芯片因其高效和灵活的特性而被广泛采用。本文档将深入解析BCM交换芯片的数据帧处理流程,帮助理解二层(L2)和三层(L3)交换的核心机制。 1、帧流程概述 帧...
### MySQL初装优化精要点解析 #### 一、MySQL初装优化概述 在初次安装MySQL之后,进行合理的优化能够显著提升其性能,并确保系统的稳定性和可靠性。本文将围绕硬件选择、参数配置、SQL优化以及系统架构等方面展开...
本文档总结了2021年计算机专业复试面试习题的精要内容,涵盖了计算机科学的多个领域,包括程序设计、计算机网络、数据库系统、操作系统等。下面是对每个问题的详细解释: 1. 程序局部性是指程序在运营时呈现出局部...
《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果...
本文将基于给定的标题“简单直观-实战体会Java多线程编程的精要”来详细阐述Java多线程的核心概念、实现方式以及实战中的关键点。 一、Java多线程基础 1. **线程定义**:线程是程序执行的最小单位,一个进程中可以...
### MongoDB管理与开发...以上是对《MongoDB管理与开发精要》这本书的部分内容的总结和解释,旨在帮助读者理解MongoDB的核心概念、基本操作以及高级用法。希望这些知识点能为学习MongoDB的开发者们提供有价值的参考。
《软件工程知识点精要》 软件工程是一门融合了计算机科学、工程技术和管理原则的学科,旨在解决20世纪60年代以来的“软件危机”,即软件生产效率和质量无法满足社会需求的问题。软件工程的核心在于,通过工程化的...
《C++面试精要:大厂进阶指南》 C++作为一门强大的系统级编程语言,广泛应用于游戏开发、嵌入式系统、高性能计算以及金融领域。对于C++程序员而言,掌握其核心知识并能够在面试中展现出深厚的功底至关重要。这份...
### Delphi函数精要解析 Delphi是一种强大的编程语言,广泛应用于Windows应用程序开发。本文将深入探讨Delphi中的一些核心函数,这些函数涵盖了数据转换、数学运算、字符串操作、文件处理等多个方面,对于理解和...
《网络编程精要》 网络编程是计算机科学领域的一个重要分支,主要研究如何在不同的计算设备之间进行数据传输。在本文中,我们将深入探讨“网络编程”,特别关注Linux环境下的网络编程及其关键技术——socket编程,...
### Java知识精要详解 #### 一、Java的起源与特性 ##### 1. Java的历史背景 Java源自SUN公司的GREEN项目,最初的目标是为家用消费电子产品创建一个分布式代码系统,以便通过发送信息来控制各类电器如电视和冰箱。...
### Kafka学习笔记精要 #### 一、Kafka架构概览 Kafka 是一款分布式流处理平台,由 Apache 软件基金会开发并维护。它主要用于构建实时数据管道以及流应用,能够处理大规模数据流。Kafka 的核心概念包括 Broker、...
### Java课堂笔记精要 #### 第一章 SQL Server 基本操作 ##### SQL Server 操作须知 1. **安装路径**: 安装文件及其安装路径都不能包含中文字符,否则可能会导致安装失败或出现其他错误。 2. **版本有效期**: 如果...
### Oracle数据库架构精要 #### 引言:深入探索Oracle数据库架构 本书旨在为读者提供一个深入了解Oracle数据库架构的机会,无论您是经验丰富的数据库管理员还是正在努力构建可靠且强大Oracle应用的开发人员,都能...
MySQL 面试题精要 本文旨在为读者提供 MySQL 相关知识点的详细总结,以帮助读者更好地理解 MySQL 的各个方面。 锁机制 MySQL 中有三种锁机制:表级锁、行级锁和页面锁。表级锁开销小,加锁快,不会出现死锁,锁定...
### 《阿里巴巴Java工作手册》学习笔记精要 #### 概述 《阿里巴巴Java工作手册》是一份由阿里巴巴集团发布的内部开发规范文档,其目的是为了提高软件开发的质量和效率,减少潜在的技术债务,并且帮助开发者形成...