惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
爱范儿
爱范儿
罗磊的独立博客
美团技术团队
Jina AI
Jina AI
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
IT之家
IT之家
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
月光博客
月光博客
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)

博客园 - 阿昆

[分享]真正的分页存储过程,借鉴了CSDN上众多力量,除BUG版,分享给大家 CommunityServer页面间关系 CommunityServer研习心得 CommunityServer皮肤主题的更换 CommunityServer实例分析 CommunityServer布局 - 阿昆 - 博客园 Community Server系列之七:快速找到需要修改的文件[技巧] Community Server系列之六:CS2中的关键词及数据结构 Community Server系列之八:CS2中的CSContext Community Server系列之四:Ajax在CS2.0中的应用1 Community Server配置对网址中的www信息处理功能分析 Community Server架构:博客业务详细分析 如何在 Microsoft Visual Studio 2005 中直接Debug Community Server 2.0 的代码 与 Visual Studio 2005 Web Application Projects Community Server2.0专注细节一 邮件提醒按钮实现(上) Community Server专题九:MemberRole之Profile Community Server专题八:MemberRole之Membership深入篇 Community Server专题八:MemberRole之Membership Community Server专题七: Job & Timer Community Server专题六:Delegates & Events
Community Server专题附录一: 什么是Threads & Processes
阿昆 · 2006-06-02 · via 博客园 - 阿昆
 

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

线程和进程(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都是多线程的,因此分析之前很有必要了解线程与进程的概念