Chinaunix首页 | 论坛 | 博客
  • 博客访问: 859370
  • 博文数量: 82
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 2007
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 22:19
文章分类

全部博文(82)

文章存档

2012年(82)

分类: LINUX

2012-08-20 10:39:11

通常会说:
进程之间的地址空间是独享的,而线程是共享进程的地址空间,线程的资源比进程小,创建线程比创建进程快,线程间切换快,线程间通信快,线程资源利用率好.

下面做个补充:
1,线程挂则可能导致进程挂,稳定性差。对长时间运行的serve程序,这一点尤为重要。所以为了兼顾稳定性和性能,很多程序中采用multi-process +multi-thread.
2,线程受进程资源的限制,比如:ulimit -a可以看到的若干。
3,线程在同一进程内,方便的共享内存。进程则需做内存映射,相关的互斥量等也需要设置为进程共享。
4,同步相对复杂,不利于资源的管理和维护。

在开发经验中你会懂得:
1)web服务器都支持master-worker多进程架构
2)apache还在worker进程里采取主线程,监听线程,线程池的架构。
3)  lighttpd/nginx用epoll I/O复用取代Apache的多线程架构,线程切换少了,进程稳定了。
4)  I/O复用接口效率高,并发量不再受线程数限制了。
5)  多进程更有利于权限控制,通常web服务器的worker进程都会setuid到普通用户,避免拥有过高权限受到漏洞攻击,而master进程拥有root权限才能bind 80。
6)  多进程有利于架构级别的扩展,更利于部署,但多线程并不是影响这个问题的关键因素。
7)  如果功能点不会变动或者变动小,做在线程池里让功能更加内聚了。 但如果是一个通用模块,把它做成可扩展的独立进程,甚至通过程序架构设计动态库加载,可配置回调等等,让它为更多的项目服务,做成进程当然更合适。

另外一个问题:
在使用共享内存的时候,要注意什么?除了共享内存没有同步机制,使用共享内存的时候,程序员要自己实现同步,还有别的要注意么?

1,创建任何东西先带着CREAT | EXCL去创建,失败了则直接打开,这是原子性必备的。
2,共享内存初始化之前如何同步? 设置mode的X位后开始初始化共享内存,结束后取消X位,任何进程打开共享内存后stat轮询检查X位是否复位,复位后才可以开始操作。
3,进程共享的mutex, cond,你应该都会用,不会用看书或者man pthread.h找接口。
4,共享内存可以做成chunk list内存块链表,一般用于在共享内存中建立树型数据结构,或者建死的多级hash表,或者循环队列,都是可以做的。
5,其他同步机制,信号量,FIFO, 等等,反正用途比较小,看情况用。

阅读(13697) | 评论(17) | 转发(12) |
给主人留下些什么吧!~~

hua9072012-10-06 12:47:52

omg!大一就接触这些了,输在了起跑线上,不服老都不行了!

流云哭翠2012-09-17 16:29:27

Bean_lee: 呵呵 这些东西 太宏大了,总结这些东西,我估计你也理解不了多深刻,呵呵我也不理解

你还年轻,就是一点一滴的学习基础,到你毕业的时候,你也已经不.....
不是我写的~~是转的  觉得会有用  所以就留下来了  怕以后找不到了

C011413072012-09-17 15:11:20

善于总结,有前途。

gongping112012-09-16 21:07:41

在大一就开始做总结确实是一个非常不错的想法,但更多的要去自己验证,别人说的不一定正确,特别是国内许多的专家说的不一定正确。

Bean_lee2012-09-16 11:00:27

呵呵 这些东西 太宏大了,总结这些东西,我估计你也理解不了多深刻,呵呵我也不理解

你还年轻,就是一点一滴的学习基础,到你毕业的时候,你也已经不得了了。写这些东西,看起来很酷,对你不一定有太大的提高。

纸上得来终觉浅,自己跑跑程序,查查bug,思考思考,验证验证,这才能学得深刻。

呵呵年龄比你大好多,有点倚老卖老了,勿怪!