Chinaunix首页 | 论坛 | 博客
  • 博客访问: 860218
  • 博文数量: 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, 等等,反正用途比较小,看情况用。

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

流云哭翠2012-08-21 23:07:59

biuuw: 楼主你做过哪些项目,用到过怎么样的多线程,多进程,共享内存的框架?
实现了怎么样的业务?.....
我什么项目都没做过~~我西邮大一的... 这些都只是在网上查来的资料  因为当时不太懂多进程和多线程相比之间的优劣。所以~~总结了一下

biuuw2012-08-21 23:05:37

楼主你做过哪些项目,用到过怎么样的多线程,多进程,共享内存的框架?
实现了怎么样的业务?

流云哭翠2012-08-21 17:54:29

sxcong: 女生做Linux Server,难得.....
学不难得,能学到一定境界才难得  再说别人做不做得到跟我有啥关系  你不许打击我~

sxcong2012-08-21 16:29:28

流云哭翠: 首先…你最多比我大3岁…其次…我是女的….....
女生做Linux Server,难得

流云哭翠2012-08-20 19:58:46

Bean_lee: 兄弟你这是要逆天啊, 开博一个月比我一年发的都多,呵呵.....
首先…你最多比我大3岁…其次…我是女的…