IIS执行原理
IIS执行原理
服务器的监听(IIS6.0+版本)
当请求到达服务器时,请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序的请求队列中(可以理解为专门处理http请求的进程),当然在处理请求的过程中,HTTP.SYS进程会维护一个配置表用缓存请求的url和和应用程序池对应的关系。
当一个http请求被捕获到,HTTP.SYS会读取配置表,如果对应的应用程序没有启动,则HTTP.SYS会启动IIS相对应的应用程序。具体运行机制可以理解成为:
HTTP.SYS
HTTP.SYS是TCP之上的一个网络驱动程序,因此,HTTP.SYS不再属于IIS(这里说的IIS都是IIS6.0+版本,下文如果不特殊指明,默认为IIS6.0+版本),它已经从IIS中独立了出来。 Http.Sys独立有以下几个优点:
可靠性: HTTP.SYS运行在内核模式下,作为操作系统的驱动程序运行。因此,HTTP.SYS不会受到用户代码的影响,它始终处于稳定运行状态,对用户的http请求进行监听,并及时作出反应。
高性能: 从用户发送http请求到系统返回响应结果的这一过程都是HTTP.SYS在内核模式下完成的。不需要在内核模式和用户模式下进行切换,这样就极大地节省了系统资源,提高了请求的响应速度。
IIS处理
W3SVC
- W3SVC服务是一个独立运行的程序,寄宿在svchost.exe进程中,负责用户的参数监视和重新启动应用池的工作。 当一个请求进入HTTP.SYS的队列中,会通知W3SVC服务根据IIS中的配置去创建对应的应用进程,进行处理。
W3WP.exe
- 当HTTP.SYS把请求传递给IIS时候,W3SVC会启动对应的应用程序池
- 当用户请求的是静态文件,如:HTML和图片等,IIS会直接读取文件内容,转成二进制文件流,返回给HTTP.SYS。
- 当请求非静态文件,如:.aspx。
- 3-1. w3wp.exe会根据IIS中ISAPI扩展读取对应的处理的Dll,用asp.net举例:当用户访问的网站是asp.net平台,则 类型是.cshtml和.aspx文件类型。根据配置w3wp.exe会加载aspnet_isapi.dll(简称是ISAPI).
IIS中应用程序的映射:
IIS中处理流程:
3-2. 当ISAPI加载后,会启动一个ASP.NET的工作进程,把信息的控制权交给Asp.Net来处理。此处请求的处理由IIS交给了asp.net的程序。
基于对上面的说明,可以把IIS的处理过程理解表示如下图:
说到这里,把IIS请求的流程简单的做了说明,后面的工作就由Asp.Net去完成了。
.Net程序的运行过程
说到Asp.Net的运行,不得不先说下.Net的运行机制(算是为后面的文章做一个铺垫)。
在vs中写了一段C#代码(或者其它.net平台的语言,此处简单的用C#来说明) ,编译器会把代码转译成IL的中间语言程序。当程序运行时,系统调用jit编译器,把中间语言编译成对应的cpu指令,等待cpu的最终调用。具体过程如下:
托管和非托管
定义
托管的概念是在.net框架诞生后出现的。用比较通俗的话解释就是运行在.net框架下,并受.net框架管理的应 用或其他组件称为托管的,反之为非托管的。
区别
1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。性能
对于这个问题,首先澄清.net中的JIT是不同Java中的JVM的(JVM是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码),在.Net中使用的是一种更高级的技术,在程序首次加载的时候,JIT是把代码编译成本地指令(这也就是为什么.Net程序首次运行很慢的原因,但你的程序不可能只跑一次,尤其是在服务器上面的程序!),.NET程序经JIT转换后与非托管程序运行一样了,直接由CPU执行。
但对于JIT来说,恰恰由于是即时编译,对当前的环境认识的比非托管更为深刻(包括当前的CPU最新的指令),在编译时可以进行优化。而非托管代码,在编译的时候要保证兼容性,所以只能使用最通用的cpu指令(公共的CPU指令),所以我个人认为,.Net在执行的效率上更具有优势。
非托管编译运行过程
托管代码编译运行过程
IIS执行原理的更多相关文章
- 第35篇 IIS执行原理
服务器的监听(IIS6.0+版本) 当请求到达服务器时,请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序的请求队列中(可以理解为专门处理http请求 ...
- [转帖]浅析Servlet执行原理
浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...
- Javascript之数据执行原理探究
Javascript在Web服务器端执行原理: 1.客户端请求数据,即我们在上网时在地址栏中输入某个网址,浏览器接收到数据之后,向远程web服务器发送请求报文. 2.web服务器响应请求,web服务器 ...
- Python程序的执行原理(转载)
Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...
- smarty模板执行原理
为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开 ...
- MapReduce调度与执行原理之任务调度
前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...
- MapReduce调度与执行原理之作业提交
前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...
- MapReduce调度与执行原理之作业初始化
前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...
- erlang虚拟机代码执行原理
转载:http://blog.csdn.NET/mycwq/article/details/45653897 erlang是开源的,很多人都研究过源代码.但是,从erlang代码到c代码,这是个不小 ...
随机推荐
- struts2_7_Action类中方法的动态调用
(一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; ...
- 错误代码: 1449 The user specified as a definer ('root'@'%') does not exist
1. 错误描写叙述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:call analyse_use('20150501','201506 ...
- 使用 JS 关闭警告框及监听自定义事件(amaze ui)
使用 JS 关闭警告框及监听自定义事件(amaze ui) 一.总结 1.jquery匿名函数:第8行,jquery匿名函数,$(function(){});,有没有很简单,只是少了jquery的前面 ...
- python3中numpy函数tile的用法
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...
- poj 2063 Investment ( zoj 2224 Investment ) 完全背包
传送门: POJ:http://poj.org/problem?id=2063 ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...
- 对touch事件传递的简单理解
对View事件传递的理解.看的这篇. 对事件传递有了大致的了解. onInterceptTouchEvent 函数决定是否将事件拦截,拦截之后,该控件的全部子控件接收不到这个事件.onTouchEve ...
- js如何将字符串作为函数名调用函数
js将如何字符串作为函数名调用函数 一.总结 一句话总结:用eval来实现.eval可以执行参数字符串. 二.js将字符串作为函数名调用函数 比如我现在有一个字符串str = "func_a ...
- php实现数值的整数次方
php实现数值的整数次方 一.总结 没有考虑到指数为负数的情况 二.php实现数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exp ...
- phpstorm 2018本地激活
这是简书上找到的,害怕以后找不到,记录一下网址为https://www.jianshu.com/p/133af2e4fe3f
- 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试
一:用C++创建DLL 依照[在VS2015中用C++编写可被其他语言调用的动态库DLL]提示创建C++编写的DLL.或參考[在VS2015中用C++创建DLL并用C#调用且同一 ...