面试归来,狠狠的鄙视了自己一下,重新复习一下关于进程与线程的一些概念性东西,在此请大家指正.

lonoaer 2008-08-22 01:18:43
Windows进程与线程复习笔记

进程
进程是应用程序的执行实例。进程就是一大堆对象的集合。包括内存(虚拟内存)、文件句柄、线程、一大串DLL模块(被载入这一进程的地址空间)等资源。

线程
线程是比进程更小的执行单元,是进程中某一个单一顺序的控制流,一个进程可以包含多个线程,且必须至少包含一个线程。一个进程内的所有线程共享进程的虚拟地址空间和资源。CPU的调度与时间分配皆以线程为对象。
每个线程产生时配有自己的一组CPU寄存器和一个堆栈。如果堆栈不需要,操作系统会将它动态扩充。
注:在MFC中,线程被分为两类,即工作线程和用户界面线程。如果一个线程,只完成后台计算不需要和用户交互,那么可以使用工作线程;如果需要创建一个处理用户界面的线程,则应使用用户界面线程。这两者的主要区别在于,MFC框加会给用户界面线程增加一个消息循环,这样用户界面线程就可以处理自己的消息队列中的消息。

为什么有了多进程还需要多线程?
1、 提高应用程序的响应频率。并不是每一个程序都需要多线程,然而多线程使程序的效率得以高度发挥。线程可以改善用户对于软件操作的感受,在同一时间的一台服务器上提供对成百上千用户的支持而用户确感觉不到其对结果输出的影响。
2、 改善程序结构,方便程序员编程,可以将一个复杂的进程划分为多个线程。
3、 线程的创建和销毁所需资源相对于进程的创建和销毁明显要少得多,对系统资源的冲击也相对比较小。
4、 线程之间共享进程的虚拟空间和资源,所以交换数据非常方便。
5、 可以跟随硬件(CPU)性能的提升而提升系统性能,操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU之上。
6、 CPU或者说是操作系统在调度切换进程比调度切换线程上所用开销要多得多。
7、 进程间无法共享内存,进程间的通信相比同一个进程内的线程间通信要麻烦得多。

多线程的缺点
1、 多线程的优点和缺点实际上是统一对立的。支持多线程的程序(进程)可以取得真正的并行,由于线程共享进程的内存(包括Code,Data,Stack),故线程间通信也是方便的。它的缺点也是由于线程共享进程地址空间,因此会导致资源的竞争,因此对某一个有多个线程访问的的资源要进行同步处理。
2、 CPU在调度切换线程时需要保存线程状态等,如果线程过多,频繁调度切换,需要占用相当的时间,所以线程也不是越多越好,有一句话怎么说来着,适合你的就是最好的。
3、 多线程没有内存隔离,单个线程的崩溃会导致整个程序的崩溃。
4、 多线程程序必须小心设计,多线程程序测试困难,出现BUG不容易定位。
...全文
525 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
luojiadashao 2012-03-13
  • 打赏
  • 举报
回复
学习。。。。。
huli_fox1 2010-12-28
  • 打赏
  • 举报
回复
今天正在琢磨这两者的区别,在这里受教了。谢谢楼主。
zlHandler 2010-11-05
  • 打赏
  • 举报
回复
进程包含线程
Xuzheng1111 2010-07-10
  • 打赏
  • 举报
回复
感觉LZ还是缺乏自己的实践啊……

更多的还是依靠背书来掌握知识。
计算机这个东西我个人认为你掌握了一个概念一定可以用很精炼很形象的比喻将它描述出来的……

个人认为6楼是正解 ……
paulin 2008-09-23
  • 打赏
  • 举报
回复
jf
XXSingle 2008-09-21
  • 打赏
  • 举报
回复
想不到进程和线程还能说出那么多关系,学习了
lextm 2008-09-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 firetoucher 的回复:]
复习得很认真,不过怎么看怎么像背书?:)

1. 现在的发展,其实还有比“线程”更小的“超线程”。所以“CPU的调度与时间分配皆以线程为对象”并不准确,或者说需要看这句话所指的范围。
2. 进程间是可以共享内存的。
3. “单个线程的崩溃会导致整个程序的崩溃”?!
4. 你很喜欢用“CPU在调度切换线程”。CPU是不懂风情的,它并不知道是线程还是进程,这是OS的事情。
......

[/Quote]
也来参与一下。

超线程好像是Intel的广告词吧,不是真正的OS概念。因此说超线程比线程小,那就更加离谱了。从绝大部分专业书籍的内容来看,“CPU的调度与时间分配皆以线程为对象”还是比较准确的。
lihuasoft 2008-09-21
  • 打赏
  • 举报
回复
或者两个人在一根藤上摸瓜

个人见解:这样去理解“线程”是“代码的一条执行路径”。
lihuasoft 2008-09-21
  • 打赏
  • 举报
回复
要先抛开高级语言去 理解进程和线程

假设你就是CPU,给你一根在你控制范围内的藤,让你摸瓜,你就要“顺藤摸瓜”

如果有两根藤,你再约一个人,一人摸一根;如果只有你自己,你可以摸摸这根,再摸摸那根...
gooddancer 2008-09-21
  • 打赏
  • 举报
回复
学习,谢谢
GDTOPONE 2008-09-21
  • 打赏
  • 举报
回复
我只明白:
1.求学不是求分数.

2.纹身多未必就是老大.

3.分数高未必就是赚钱多.

4.读书不成未必就是不能做个老板.

5.人生在世要说是:时也、命也、运也.
JeffChung 2008-09-21
  • 打赏
  • 举报
回复
接分
gwhdaxia 2008-09-21
  • 打赏
  • 举报
回复
我对这个也很糊涂
五维思考 2008-09-21
  • 打赏
  • 举报
回复
接分
喝口水 2008-09-21
  • 打赏
  • 举报
回复
接分
mygodsos 2008-09-21
  • 打赏
  • 举报
回复
澄澄城
不得闲 2008-09-14
  • 打赏
  • 举报
回复
沙发,顶,接分
UnixStudier 2008-09-14
  • 打赏
  • 举报
回复
原来做delphi的时候从来没用到进程这个概念,线程倒是用过。
我觉得理解进程、线程的概念的最好办法就是找个开源的操作系统(minix,FreeBD,OpenSolaris,linux ...),
看看它的进程结构里都有什么东西。如果能看懂大部分的成员,那对进程的理解就比较好了。
tangyulong520 2008-09-13
  • 打赏
  • 举报
回复
fox009521 2008-08-31
  • 打赏
  • 举报
回复
学习一下 都是高手 呵呵
加载更多回复(18)

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧