登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Liberation Of Secula

Health |&| Free Coder

 
 
 

日志

 
 

并发编程(二)  

2012-07-26 08:23:58|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1.多线程与多进程
2.进程间通信
3.多线程同步
4.原子操作
5.自旋锁
6.读写自旋锁
7.信号量
8.读写信号量
9.自旋锁与信号量
10.完成变量
11.大内核锁
12.序列锁
13.禁止抢占
14.顺序与屏障
15.互斥锁
16.文件的并发
17.测试代码

一、多进程与多线程

1.多线程与多进程比较
进程与线程最重要的区别是子线程与父线程共享堆,而子进程与父进程并不共享堆数据。目前linux内核与mysql服务器都是使用多线程技术。


 比较因素 多进程 多线程
 内存占用量 较多,进程发生分支时不必
要地复制大型内存程序段
 较少,限制在所需堆栈和线程管理器簿记内存
 访问全局数据
实现的难易程度              
 较难,需要使用特殊的技术
共享进程全局数据使得共享
全局数据非常麻烦
 较容易,可使用互斥锁或互斥体
 创建时间
花费代价
 较长,因为需要复制堆数据
可能非常大linux内核做了优化
copy-on-write
 较短,因为不需要复制堆数据
 实例切换时
内核调度所
花时间长短
 较长,进程上下文保存与启动
耗时较长,需要切换页,
文件描述附表以及其他内容息,
工作时间少
 较短,保存线程现场数据量少,省时间给程序
留下更多CPU时间处理工作
 代码编写
难易程度
 较不易出错,独立分支进程
独立地址空间编写难度相对较小
不会连带其他分支进程,
相互干扰度不那么大
 编程错误代价惨重,一个线程崩溃整个服务器
瘫痪,互相干扰,程序员需要考虑其他线程行为,
需要额外的防范机制编程
 同步漏洞容易重现,各分支进程独立
内存地址空间,没有太多交互
 需要较高水平才能克服,测试难以复现,
使用共享内存更多线程交互,漏洞发生率很高
 互斥体争用 无 难以控制,如果有太多线程期望获得同一互斥体,
导致过度线程切换,大量CPU时间消耗在内核调度
上,几乎没有时间执行有效工作
 32位机地址
空间受限问题
 每个分支进程都仅
限制于32位机4G
 受限单进程4G RAM,所有分线程合在一起不超过
4G,实际时地址空间在小得多的限值下如1.5G拥挤
 32位机堆栈
空间自适应性
 无,满空间4G 低效,32位机每个线程创建时都会创建stack空间,
即便不用系统也会为其保留,
后续线程所能分配的stack越来越少,
受限于4G因素,即便物理内存再大也难以使用
大型缓冲,大量并发线程,
以及同时为每个线程提供足够的堆栈空间

   


2.进程间共享全局变量
windows/DDL可以通过#pragma data_seg()实现,子进程fork完父进程后,也拷贝了一份全局变量,但各自互不干扰。
进程间同步可以通过进程间通信IPC来实现,IPC机制较多,如下表。

名称 说明 范围 用途
 文件 在典型的 UNIX 文件中读写数据。任意数量的进程都可以互操作。 本地 共享大数据集
 管道使用专用的文件描述符在两个进程之间传输数据。通信只在父进程和子进程之间进行。  本地 简单的数据共享,比如生产者和消费者
 命名管道 通过专用的文件描述符在进程之间交换数据。通信可以在同一主机上的任意两个对等进程之间进行。  本地 生产者和消费者或命令-控制,比如 MySQL 和它的命令行查询工具
 信号 通过中断通知应用程序某一情况。 本地 无法在信号中传输数据,所以信号主要用于进程管理
 共享内存  
 通过在同一内存段中读写数据共享信息。 本地 任何类型的协作,尤其适合需要安全性的情况
 套接字                         
 完成特殊的设置过程之后,使用一般的输入/输出操作传输数据。 本地         
 FTP、ssh 和 Apache Web Server 等网络服务
  

2.linux多线程同步技术
windows多线程同步技术,参考《windows核心编程》第八(用户模式线程同步),九(用内核对象线程同步),十(同步设备I/O与异步设备I/O),十一章(windows线程池)。限于篇幅本文仅讨论服务器通常运行的linux环境的同步技术,其实windows/linux同根同源,很多都可以互相借鉴。

UNIX环境下用pthread库(https://computing.llnl.gov/tutorials/pthreads/)提供了并发控制。当然pthread也因操作系统不同有多个不同分支版本。
互斥锁Mutex(互斥体)
条件变量Condition Variable
完成变量Completion  Variable
自旋锁Spinlock
读写自旋锁RWlock
信号量Semaphore
读写信号量RWsem
大内核锁BKL
序列锁SeqLock
禁止抢占preempt_disable
内存屏障Barrier
文件锁


原子操作
   原子操作可以保证机器指令以院子的方式被执行,执行过程不会被打断,该指令要么不做,要么做完。两个原子操作绝对不可能并发的访问同一个变量。linux内核提供两种原子操作接口,一组针对整数,一组针对单独的位进行操作。







  评论这张
 
阅读(145)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018