.net开发人员应该知道(一)
描述線程與進程的區別?
線程是比進程更小的處理模塊。
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。進程和線程的區別在于:?
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.?
線程的劃分尺度小于進程,使得多線程程序的并發性高。?
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。?
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。?
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。?
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.?
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.?
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
線程的引入:例如,有一個Web服務器要進程的方式并發地處理來自不同用戶的網頁訪問請求的話,可以創建父進程和多個子進程的方式來進行處理,但是創建一個進程要花費較大的系統開銷和占用較多的資源。除外,這些不同的用戶子進程在執行的時候涉及到進程上下文切換,上下文切換是一個復雜的過程。所以,為了減少進程切換和創建的開銷,提高執行效率和節省資源,人們在操作系統中引入了"線程(thread)"的概念。
?進程的作用和定義:進程是為了提高CPU的執行效率,減少因為程序等待帶來的CPU空轉以及其他計算機軟硬件資源的浪費而提出來的。進程是為了完成用戶任務所需要的程序的一次執行過程和為其分配資源的一個基本單位,是一個具有獨立功能的程序段對某個數據集的一次執行活動。
線程和進程的區別:
??????1、線程是進程的一部分,所以線程有的時候被稱為是輕權進程或者輕量級進程。
??????2、一個沒有線程的進程是可以被看作單線程的,如果一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
??????3、系統在運行的時候會為每個進程分配不同的內存區域,但是不會為線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU之外(線程在運行的時候要占用CPU資源),計算機內部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
??????4、與進程的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所保存的線程狀態比PCB表中少多了。
??????5、進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,并不依賴線程而獨立存在。
??????????進程與程序的區別:
??????程序是一組指令的集合,它是靜態的實體,沒有執行的含義。而進程是一個動態的實體,有自己的生命周期。一般說來,一個進程肯定與一個程序相對應,并且只有一個,但是一個程序可以有多個進程,或者一個進程都沒有。除此之外,進程還有并發性和交往性。簡單地說,進程是程序的一部分,程序運行的時候會產生進程。
總結:
??????線程是進程的一部分,進程是程序的一部分。
什么是Windows服務,它的生命周期與標準的EXE程序有什么不同
Windows Service 是主要用于服務器環境而長期運行的應用程序, 這類程序不需要有用戶界面或者任何模擬輸出。 任何的用戶消息通常都是記錄在Windows 事件日志里。Windows Service可以在操作系統啟動的時候開始,一直在后臺運行,當有需要時也可以手動啟動,我們可以通過管理工具里面的服務進行統一管理。
當系統啟動完畢后,Windows服務并不需要通過登陸頁面后才能啟動,而我們啟動一般的exe文件卻要先登陸Windows后才能啟動它。
Windows Service 是一種可隨 Windows 操作系統啟動而啟動的,在后臺運行的,通常不和用戶產生交互的程序。它無法通過雙擊來運行,類似于 Unix 守護進程(daemon processes),當用戶注銷時它也不會停止。
Windows 服務由三部分組成:1.一個服務可執行文件;2.一個服務控制程序(SCP);3.服務控制管理器(SCM),負責在 HKLM\SYSTEM\CurrentControlSet\Services 下創建服務鍵值。用戶可通過 SCP 控制服務的啟動、停止、暫停等,SCP 會通過 SCM 調用服務程序。
Window 標準的exe可執行程序通常有一個用戶界面,Console或GUI,通常由用戶來啟動或停止
Windows服務是運行在windows后臺指定用戶下(默認System)的應用程序,它沒有標準的UI界面,想比標準的EXE程序,Windows服務是在服務開始的時候創建,而在服務結束的時候銷毀,而且可以設置服務是否與操作系統一起啟動,一起關閉。它支持三種方式:1)自動方式 2)手動方式 3)禁用 。自動方式的時候,windows服務將在OS啟動后自動啟動運行,而手動方式則必須手工啟動服務,禁用的情況下服務將不能被啟動。另外標準的EXE默認使用的當前登錄的用戶,而windows服務則默認使用System用戶,這在對系統資源訪問的時候特別需要注意。
Windows上的單個進程所能訪問的最大內存量是多少?它與系統的最大虛擬內存一樣嗎?這對于系統設計有什么影響?
32?位Windows上單個進程所能訪問的最大內存量是4G,單由于操作系統需要給系統核心分配2G的空間,所以一般用戶程序的進程可使用的最大內存為2G。
不一定一樣,32位的操作系統的進程可訪問的最大內存量是4G,這4G包含了虛擬內存,而一個進程可訪問的最大內存量也是4G,所以進程內存訪問量在物理內存大于等于4G的時候跟虛擬內存無關,而當物理內存小于4G時,進程訪問的內存量隨著虛擬內存的增加而增加,直到4G
Windows使用一個系統:虛擬尋址系統。該系統把程序可用的內存地址映射到硬件內存中的實際地址上,這些任務完全有Windows后臺管理,其實際結 果是32位處理器上的每個進程都可以使用4GB的內存------無論計算機上有多少硬盤空間(在64位處理器上這個數值會更大)。這個4GB內存實際上 包含了程序的所有部分------包括可執行代碼,代碼加載的所有dll,以及程序運行時使用的所有變量的內容。這個4GB內存稱為虛擬地址空間,或虛擬 內存。
EXE和DLL之間的區別是什么?
EXE就是可執行文件,你可要雙擊它, 它就可以運行,而DLL是一個動態鏈接庫文件,就是說,它不可以自己運行,它是須要一個程序的其它功能運行的時候,它才能運行,打個比方,如果你的QQ要升級,那QQ里面有關升級的DLL文件它就會運行.
EXE是帶有程序入口(Main)的能被終端用戶直接執行的應用程序,隨著它的啟動系統會產生一個相應的進程。
DLL是動態鏈接庫,不包含程序執行入口,不能被終端用戶直接執行,本身需要附加到現有的進程中才可以運行。
但兩者都是基于PE格式,運行時由磁盤中的映像載入被調用者的內存或者共享空間中執行,包含程序的數據信息,只是EXE還包括程序的代碼信息。
DLL可被多個程序共用,而EXE則不行,只能單獨執行。
什么是強類型,什么是弱類型?哪種更好些?為什么?
弱類型語言允許將一塊內存看做多種類型。比如直接將整型變量與字符變量相加。C and C++ 是靜態語言,也是弱類型語言;Perl and PHP 是動態語言,但也是弱類型語言。
強類型語言在沒有強制類型轉化前,不允許兩種不同類型的變量相互操作。Java、C# 和 Python 等都是強類型語言。
使用哪種語言還是要按需而定。編寫簡單小應用,使用弱類型語言可節省很多代碼量,有更高的開發效率。而對于構建大型項目,使用強類型語言可能會比使用弱類型更加規范可靠。
強類型是指使用內存中的數據時必須做類型轉化,否則不能使用,弱類型不需要程序轉化,運行時系統自動處理數據直接的類型。
使用強類型的好處:支持智能輸入提示、編譯時檢測出潛在的運行問題、接口中避免數據不一致問題,并且使用強類型可以加快程序的開發速率和程序的運行速度。
PID是什么?在做系統的故障排除時如何使用它?
PID是系統進程的全局唯一標志符,在排除系統故障時可以根據PID找到對應的進程進而找到對應的程序。
PID = Process Identifier, 是一個全局唯一的用來標識進程的整數。在多任務系統中,可用來診斷系統中發生錯誤的進程。單個TCP/IP端口上能夠偵聽多少個進程?
可能只有一個。如果你需要創建另一個TCP/IP監聽,你必須建立另一個不同的端口
什么是GAC?它解決了什么問題?
Gloal Assembly Cache,全局應用程序集緩存。它解決了幾個程序共享某一個程序集的問題。不必再將那個被共享的程序集拷貝到應用程序目錄了,其實這道理很簡單,.net應用程序在加載的時候,會首先查看全局應用程序集緩存,如果有就可以直接使用,沒有再到應用程序目錄進行查找。
每一個CLR(Common Language Runtime)所在的計算機都有一個全局程序集緩存(Global Assembly Cache,GAC)。部署在GAC上的程序集必須有一個強名稱。一種由.net framework sdk提供的名叫 "GlobalAssembly Cache tool" (Gacutil.exe)的開發工具,可以把程序集部署到GAC上。GAC存儲專門指定的程序集以供計算機上多個應用程序共享。它也為我們提供了克服"DLL地獄"的問題。
百度百科上的解釋:
GAC全稱是Global Assembly Cache
作用是可以存放一些有很多程序都要用 到的公共Assembly,例如System.Data、System.Windows.Forms等等。這樣,很多程序就可以從GAC里面取得 Assembly,而不需要再把所有要用到的Assembly都拷貝到應用程序的執行目錄下面。舉例而言,如果沒有GAC,那么勢必每個WinForm程 序的目錄下就都要從C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷貝一份 System.Windows.Forms.dll,這樣顯然不如都從GAC里面取用方便,也有利于Assembly的升級和版本控制。?
?? 除了系統默認放置在GAC中的Assembly如System.Windows.Forms以外,我們也可以添加自己的Assembly:?
?? 1)創建一個strong-name的Assembly,例如ToolbarComponent.dll?
?? 2)運行gacutil -i ToolbarComponent.dll,把這個Assembly添加到GAC?
?? 3)在程序中動態裝載:?
?? System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f");?
?? MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);?
?? 在 上面的程序中,ToolbarComponent就是從GAC裝載而不是從程序的運行目錄下的dll文件中裝載,程序目錄下不需要放置 ToolbarComponent.dll程序也能正常運行。另外,Assembly.Load()中的參數可以通過"gacutil -l"查到。?
?? 另外,上面提到了GAC中的Assembly必須是strong-name的。創建strong-name的Assembly的步驟大致如下:?
?? a) 在命令行運行“sn -k keyPair.snk”創建一個密鑰文件。這里的sn.exe也是.NET附帶的一個工具。?
?? b) 在VS.NET里面修改“AssemblyInfo.cs”文件:?
?? [assembly: AssemblyDelaySign(false)] ???
?? [assembly: AssemblyKeyFile("..\\..\\keyPair.snk")] ???
?? c) 編譯項目,就能得到一個strong-name的Assembly。?
?? MSDN中有一些對GAC的介紹,您可以參考:?
?? 1)《Assembly Cache Viewer (Shfusion.dll)》?
?? 2)《Global Assembly Cache》?
?? .NET Framework中附帶了一些和GAC有關的工具,其中包括:?
?? 1)Gacutil.exe,一個命令行的工具,用于在GAC中瀏覽、添加、刪除Assembly?
?? 2)Ngen.exe,也是一個命令行的工具,用于在GAC中創建Native Image?
?? 3)mscorcfg.msc,一個MMC終端,可以圖形化完成Gacutil.exe的主要功能。
-----本文由觀海看云整理。若有問題,歡迎大家提出意見。
?????? 謝謝@吳峰--對 “單個TCP/IP端口上能夠偵聽多少個進程?
可能只有一個。如果你需要創建另一個TCP/IP監聽,你必須建立另一個不同的端口”,其實不然,還有端口復用的指出!
轉載于:https://www.cnblogs.com/liuwei8278/archive/2011/03/23/1993043.html
總結
以上是生活随笔為你收集整理的.net开发人员应该知道(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC3 权限验证
- 下一篇: 安装Apache的步骤