任何一個使用.NET的人 javascript
進程是指在系統中正在運行的一個應用程序;線程是系統分配處理器時間資源的基本單元,或者說進程以內獨立執行的一個單元。對於操做系統而言,其調度單元是線程。一個進程至少包括一個線程,一般將該線程稱爲主線程。java
Windows服務只是運行於後臺的一種進程而已,而且它們的絕大部分並不要求用戶交互。由三部分組成:1.一個服務可執行文件;2.一個服務控制程序(SCP);3.服務控制管理器(SCM),負責在 HKLM"SYSTEM"CurrentControlSet"Services 下建立服務鍵值。用戶可經過 SCP 控制服務的啓動、中止、暫停等,SCP 會經過 SCM 調用服務程序。程序員
32位單個進程所能訪問的最大內存量是4G.虛擬內存是用硬盤空間作內存來彌補計算機RAM空間的缺少。當實際RAM滿時(實際上,在RAM滿以前),系統就會使用虛擬內存,應用把虛擬內存和實際內存看做是同樣的。二者不是一個層次的東西。算法
在設計時候應注意到這裏的內存空間是指代碼空間和數據空間的集合。代碼等資源也是佔空間的。spring
Windows系統中,EXE 和 DLL都是可執行文件(沒錯,DLL也是可執行文件),EXE一般是能夠直接運行的可執行文件,包含數據和代碼;而 DLL是動態連接庫文件,同時也有多是純資源文件,只包含數據,不含程序代碼。更多的時候DLL是一個函數的集合,其目的之一就是能被更多的應用程序所複用。EXE 和DLL的區別就是DLL能提供函數級的複用,而EXE比較困難。編程
強類型語言有JAVA、C#等。強類型語言在一塊內存定義的某種類型後是沒法改變其類型的。好比string s;那麼s不能再看成int來使用了,除非進行類型轉換。緩存
弱類型語言有javascript、PHP等。弱類型語言能夠把一塊內存定義爲多種類型的。好比安全
var s="";服務器
s=5;多線程
var a=s+3;//a=8
s在定義了string類後還能再看成int來使用。
沒有好壞之分,但整體來講強類型語言容易維護和容易理解。
PID (Process Identifier), 是一個全局惟一的用來標識進程的整數。在多任務系統中,可用來診斷系統中發生錯誤的進程。
一個進程啓動一個TCP/IP端口去抓取到進來的包,若是有另一個進程想利用這個端口將提示「端口已經被佔用」。
GAC全稱是Global Assembly Cache,簡單的講他是一個能夠存放一些有不少程序都要用到的公共Assembly,或者你能夠理解爲共享文件夾。
好比System.Windows.Forms.DLL就是放在GAC中,否則每一個程序都得拷貝一份System.Windows.Forms.DLL在執行目錄下。
GAC的具體目錄在C:\WINDOWS\Assembly\
中級.NET開發人員
面向對象編程:經過封裝、繼承、多態等更加有效的組織程序。
面向接口編程:經過接口規約對象的屬性和方法,是面向對象一部分。
面向方面編程:把業務的主邏輯和次邏輯分開的一種思想
面向對象很差解釋,能夠理解爲以一切元素都是對象,在設計時以對象爲單位,考慮它的屬性及方法。設計中採用了封裝、繼承、抽象的手法
面向接口自己就是面向對象的,無所謂區別,只不過面向接口的好處是耦合性低
面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其實有點象struts裏的攔截。
舉例:假設有在一個應用系統中,有一個共享的數據必須被併發同時訪問,首先,將這個數據封裝在數據對象中,稱爲Data Class,同時,將有多個訪問類,專門用於在同一時刻訪問這同一個數據對象。
爲了完成上述併發訪問同一資源的功能,須要引入鎖Lock的概念,也就是說,某個時刻,當有一個訪問類訪問這個數據對象時,這個數據對象必須上鎖Locked,用完後就當即解鎖unLocked,再供其它訪問類訪問。
接口能夠理解成一種特殊的類,由常量和抽象方法組成的特殊類。
接口不能實例化;
接口中的方法沒有方法體{};
繼承接口的類必定要實現接口中定義的方法;
類能夠實例化,能夠定義本身的字段,屬性,方法等等;
類能夠繼承多個接口,但只能繼承一個類!
提供了一種使用類名和方法名來訪問方法的機制。
SOAP是簡單對象訪問協議,Web服務正是經過WSDL來約定服務器和客戶端基於xml的SOAP來通信,而不管客戶端和服務器不須要知道對方的平臺、編程語言等信息。
.NET Remoting本質是爲了交互更爲複雜的對象,甚至須要管理遠程對象的生命週期,因此客戶端必須瞭解服務器對象的詳細信息,雖然.NET Remoting支持使用SOAP,但對於客戶端來講仍是必須瞭解服務器對象的詳細信息。
Are the type system represented by XmlSchema and the CLS isomorphic?
我以爲問題是這樣的,XMLSchema和CLS的類型系統類似嗎?
XmlSchema是一個特定的XML文檔必須知足的一套標準。這些標準可以描述不一樣的數據類型。好比:xs:Boolean
CLS無論值類型仍是引用類型都是一套類型系統,好比System.Boolean.
像不像?你說呢?
若是方法在編譯時就肯定就是前期綁定,若是在運行時才肯定的叫後期綁定。
舉個例子,好比spring在運行時才取類和類的對象,就是後期綁定
我的理解其實應該是一個反射,System.Reflection.Assembly.Load.因此嘛確定動態引用了。由於靜態引用在編譯時就已經引用,並使用。
(聲明如下是抄的,我不太瞭解Assembly.LoadFrom)。區別以下:
一、Assembly.LoadFile只載入相應的dll文件,好比Assembly.LoadFile("a.dll"),則載入a.dll,假如a.dll中引用了b.dll的話,b.dll並不會被載入。
Assembly.LoadFrom則不同,它會載入dll文件及其引用的其餘dll,好比上面的例子,b.dll也會被載入。
二、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,好比a.dll有兩個版本(版本1在目錄1下,版本2放在目錄2下),程序一開始時載入了版本1,當使用Assembly.LoadFrom("2\\a.dll")載入版本2時,不能載入,而是返回版本1。
Assembly.LoadFile的話則不會作這樣的檢查,好比上面的例子換成Assembly.LoadFile的話,則能正確載入版本2。
它不是一個文件名,相比文件名,Assembly Qualified Name(程序集限定名稱),更能肯定一個程序集,它包含文件名,但同時包含版本,公鑰,和區域。
Assembly name 有四個部分組成:Friendly Name,Culture, Pubilc Key(Token), Version。因此按他的意思這句話是錯誤的。
強簽名的程序集能夠確認assembly name是惟一的(由於使用了public key token)。
強簽名的程序集能夠作成com。
強簽名程序集能夠安裝到GAC中。
不能爲null,包括int什麼的都不能等於null
.Net程序在第一次運行時會實時(JIT)編譯,將.Net程序文件編譯成cpu認識的彙編機器碼。實時編譯須要消耗額外的cpu和內存資源,這對於服務器端程序是可有可無的,由於實時編譯只在程序第一次運行時編譯,以後就不須要再作了;若是你在作的是一個較大的winform程序或者silverlight等客戶端程序時就須要考慮提早編譯了。
.Net framework安裝目錄下(相似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一個ngen.exe工具,就是作這件事兒的。
JIT即即時編譯 .NET 採用中間語言(IL)機制。Just In Time是指程序第一次運行的時候才進行把中間語言(IL)編譯成機器代碼,JIT增長了執行效率。本機映像生成器 (Ngen.exe) 是一個提升託管應用程序性能的工具。Ngen.exe 建立本機映像(包含經編譯的特定於處理器的機器代碼的文件),並將它們安裝到本地計算機上的本機映像緩存中。運行庫可從緩存中使用本機映像,而不是使用實時 (JIT) 編譯器編譯原始程序集。這是爲何asp.net程序第一次會比較慢,由於他是JIT。
垃圾收集器不能管理對象的生命週期吧??我認爲他只能跟蹤對象的生命週期
先看一個對象的生命週期
1. 調用IL的newobj指令,分配必定空間的內存。
2. 初始化內存空間,好比設置爲string類型。
3. 使用對象。
4. 銷燬對象,執行清理
5. 回收內存
垃圾收集是在第4步。有三種方法:Finalize、Dispose、Close。
但垃圾收集執行的時機不定
的,初學者能夠認爲對象銷燬的時機是在垃圾收集器認爲對象須要被銷燬的時候進行的,
他對於程序員是透明的,初學者根本不須要知道垃圾收集器的存在。
我的理解的垃圾收集器的執行原理:
週期性地遍歷被應用當前引用的全部對象的列表。
在這個搜索過程當中,凡是沒有發現的對象,都將準備予以銷燬(但不併非立刻就銷燬,只是先標記)。
這種算法表示若是對象的最後一個引用也被解除時(意思是該對象不再使用了,便可以銷燬了),這時垃圾收集器並
不會當即接到通知,只有下一次對堆(heap)進行清掃時,才能發現這個狀況。 說明了對象
在何時終結是不肯定的,我認爲這就是非肯定性終結。進一步而言,執行垃圾收集清掃
次數越少,這類算法工做得越好。一般來講,堆的耗滿是收集清掃的觸發條件。
Finalize自動釋放資源,Dispose()用於手動釋放資源。
Finalize很像C++的析構函數,咱們在代碼中的實現形式爲這與C++的析構函數在形式上徹底同樣,但它的調用過程卻大不相同。
~ClassName() {//釋放你的非託管資源}
好比類A中實現了Finalize函數,在A的一個對象a被建立時(準確的說應該是構造函數被調用以前),它的指針被插入到一個finalization鏈表中;在GC運行時,它將查找finalization鏈表中的對象指針,若是此時a已是垃圾對象的話,它會被移入一個freachable隊列中,最後GC會調用一個高優先級線程,這個線程專門負責遍歷freachable隊列並調用隊列中全部對象的Finalize方法,至此,對象a中的非託管資源才獲得了釋放(固然前提是你正確實現了它的Finalize方法),而a所佔用的內存資源則必需等到下一次GC才能獲得釋放,因此一個實現了Finalize方法的對象必需等兩次GC才能被徹底釋放。
因爲Finalize是由GC負責調用,因此能夠說是一種自動的釋放方式。可是這裏面要注意兩個問題:第一,因爲沒法肯定GC什麼時候會運做,所以可能很長的一段時間裏對象的資源都沒有獲得釋放,這對於一些關鍵資源而言是很是要命的。第二,因爲負責調用Finalize的線程並不保證各個對象的Finalize的調用順序,這可能會帶來微妙的依賴性問題。若是你在對象a的Finalize中引用了對象b,而a和b二者都實現了Finalize,那麼若是b的Finalize先被調用的話,隨後在調用a的Finalize時就會出現問題,由於它引用了一個已經被釋放的資源。所以,在Finalize方法中應該儘可能避免引用其餘實現了Finalize方法的對象。
可見,這種「自動」釋放資源的方法並不能知足咱們的須要,由於咱們不能顯示的調用它(只能由GC調用),並且會產生依賴型問題。咱們須要更準確的控制資源的釋放。
Dispose是提供給咱們顯示調用的方法。因爲對Dispose的實現很容易出現問題,因此在一些書籍上(如《Effective C#》和《Applied Microsoft.Net Framework Programming》)給出了一個特定的實現模式:
class DisposePattern :IDisposable { private System.IO.FileStream fs = new System.IO.FileStream("test.txt", System.IO.FileMode.Create); ~DisposePattern() { Dispose(false); } IDisposable Members#region IDisposable Members public void Dispose() { //告訴GC不須要再調用Finalize方法, //由於資源已經被顯示清理 GC.SuppressFinalize(this); Dispose(true); } #endregion protected virtual void Dispose(bool disposing) { //因爲Dispose方法可能被多線程調用, //因此加鎖以確保線程安全 lock (this) { if (disposing) { //說明對象的Finalize方法並無被執行, //在這裏能夠安全的引用其餘實現了Finalize方法的對象 } if (fs != null) { fs.Dispose(); fs = null; //標識資源已經清理,避免屢次釋放 } } } }
在註釋中已經有了比較清楚的描述,另外還有一點須要說明:若是DisposePattern類是派生自基類B,而B是一個實現了Dispose的類,那麼DisposePattern中只須要override基類B的帶參的Dispose方法便可,而不須要重寫無參的Dispose和Finalize方法,此時Dispose的實現爲:
class DerivedClass : DisposePattern { protected override void Dispose(bool disposing) { lock (this) { try { //清理本身的非託管資源, //實現模式與DisposePattern相同 } finally { base.Dispose(disposing); } } } }
固然,若是DerivedClass自己沒有什麼資源須要清理,那麼就不須要重寫Dispose方法了,正如咱們平時作的一些對話框,雖然都是繼承於System.Windows.Forms.Form,但咱們經常不須要去重寫基類Form的Dispose方法,由於自己沒有什麼非託管的咚咚須要釋放。
瞭解GC的脾性在不少時候是很是必要的,起碼在出現資源泄漏問題的時候你不至於手足無措。我寫過一個生成excel報表的控件,其中對excel對象的釋放就讓我忙活了一陣。若是你作過excel開發的話,可能也遇到過結束excel進程之類的問題,特別是包裝成一個供別人調用的庫時,什麼時候釋放excel對象以確保進程結束是一個關鍵問題。固然,GC的內部機制很是複雜,還有許多內容可挖,但瞭解全部細節的成本過高,只需瞭解基礎,夠用就好。
using()能自動調用Dispose方法
好比:using()會自動調用MyObject的Dispose方法
using ( MyObject myObject = new MyObject ( ) ) { Console.WriteLine ( "quit" ) ; }
IDisposiable是顯示釋放對象的接口,實現IDisposiable接口的類,能夠顯示的釋放對象。
,經過編寫Dispose方法來實現顯式釋放資源;
// C# class MyClass : IDisposable { public MyClass() {} // 構造函數 ~MyClass() {} // 析構方法 (不肯定的) (編譯器經過重載virtual void Finalize來實現),與C++/CLI的!MyClass()等效 public void Dispose() {} // Dispose方法 public static void Test() { using(MyClass auto = new MyClass()) { /* 使用auto對象 */ } // 由於使用了using句法,編譯器自動調用auto.Dispose() // 以上代碼等效於: MyClass user = new MyClass(); try { /* 使用user對象 */ } finally { user.Dispose(); } } }
列出全部使用了以" mscor"做爲開頭的dll或者exe的進程和模塊信息
in-proc是進程內,進程內能共享代碼和數據塊,out-of-proc是進程外,進程外的互操做須要用進程間通信來實現。
.Net Remoting技術或者WCF技術
Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exe
Windows 2003 : w3wp.exe