我的程序生活

爱程序,爱生活

导航

Community Server专题附录一: 什么是Threads & Processes

Posted on 2006-11-24 18:01  Mark Hu  阅读(220)  评论(0编辑  收藏  举报

 

请用批判的眼光来看下面的文字:

线程和进程(Threads and Processes) 简单说,你启动一个程序,就启动了一个进程,早期win3.x的系统以进程为单位(嘿嘿,其实我没有用过win3.x),win98后每个进程还可以启动几个线程,因此以线程为单位。在如今的操作系统下线程间是独立运行的,但是他们共享一些内存中的片断,如:全局变量等。

问题来了:CS在服务器上运行是多线程的吗?每个用户的Http请求CS做了什么?CS系统在被第一次访问的时候由asp.net运行机制启动一个CS进程,启动进程是需要给该进程分配独立的内存地址的,该地址不受其他的进程影响和操作。也就是说如果你还有其他的Web程序是无法访问这段内存空间的(正常情况下进程与进程之间是安全的)。有了CS的进程还不够,前面说过win98后的操作系统执行的最小单元时线程而不是进程。因此接下来会为这个请求启动一个线程(对于web程序来说,Http请求的线程启动过程不需要你使用System.Threading命名空间下的方法,启动的过程右asp.net运行机制完成),由于一个进程的所有线程都共享它的内存地址空间、全局变量和操作系统资源,因此这个请求可以根据共享的资源为自己建立一个上下文Context,然后处理相关的请求操作,请求完成后线程会被释放,他的生存周期也就结束了(因此说Http请求是无状态的,因为同一个用户的两次Http请求会建立两个不同的线程,他们的Context是不同的,而且有前后顺序。但是为了保存一些必要的状态信息因此有了CookiesSession)。当有第二个http请求发出的时候,很有可能第一个http请求还没有处理完成,因此这里就牵涉到了多线程执行下的线程安全问题。

线程安全,是指一个方法(method)可以在多线程的环境下安全的有效的访问进程级的数据(这些数据是与其他线程共享的)。要保证线程安全关键是同步,保证多个线程同时开始执行,并行运行、不同时访问相同的对象实例、不同时执行同一段代码,.net下我们可以通过一些手段来保证我们的数据是安全的,如采用System.Threading.Monitor加锁以确保对共享数据访问的同步性。其实在MSDN中我经常都会看到对一个方法介绍时候都会加以说明该方法是Thread Safe,也就是线程安全的。线程安全是一个高级议题,不能再往下说了,不然就见底了。

其实只要不重新启动IIS那么CS的进程就一直存在,而且只有一个。但是CS的线程就多了,根据不同的Http请求会有多个线程,同时CS中还使用了Timer,它也会启动新的处理线程,该线程的生命周期一直持续到TimerDispose

可以看出CS是一个复杂的多线程程序,当然所有的web app都是多线程的,因此分析之前很有必要了解线程与进程的概念