windows查询每个线程占用的内存_C#多线程
一、基本概念
1、進(jìn)程
首先打開任務(wù)管理器,查看當(dāng)前運(yùn)行的進(jìn)程:
從任務(wù)管理器里面可以看到當(dāng)前所有正在運(yùn)行的進(jìn)程。那么究竟什么是進(jìn)程呢?
進(jìn)程(Process)是Windows系統(tǒng)中的一個(gè)基本概念,它包含著一個(gè)運(yùn)行程序所需要的資源。一個(gè)正在運(yùn)行的應(yīng)用程序在操作系統(tǒng)中被視為一個(gè)進(jìn)程,進(jìn)程可以包括一個(gè)或多個(gè)線程。線程是操作系統(tǒng)分配處理器時(shí)間的基本單元,在進(jìn)程中可以有多個(gè)線程同時(shí)執(zhí)行代碼。進(jìn)程之間是相對(duì)獨(dú)立的,一個(gè)進(jìn)程無法訪問另一個(gè)進(jìn)程的數(shù)據(jù)(除非利用分布式計(jì)算方式),一個(gè)進(jìn)程運(yùn)行的失敗也不會(huì)影響其他進(jìn)程的運(yùn)行,Windows系統(tǒng)就是利用進(jìn)程把工作劃分為多個(gè)獨(dú)立的區(qū)域的。進(jìn)程可以理解為一個(gè)程序的基本邊界。是應(yīng)用程序的一個(gè)運(yùn)行例程,是應(yīng)用程序的一次動(dòng)態(tài)執(zhí)行過程。
二、線程
在任務(wù)管理器里面查詢當(dāng)前總共運(yùn)行的線程數(shù):
線程(Thread)是進(jìn)程中的基本執(zhí)行單元,是操作系統(tǒng)分配CPU時(shí)間的基本單位,一個(gè)進(jìn)程可以包含若干個(gè)線程,在進(jìn)程入口執(zhí)行的第一個(gè)線程被視為這個(gè)進(jìn)程的主線程。在.NET應(yīng)用程序中,都是以Main()方法作為入口的,當(dāng)調(diào)用此方法時(shí)系統(tǒng)就會(huì)自動(dòng)創(chuàng)建一個(gè)主線程。線程主要是由CPU寄存器、調(diào)用棧和線程本地存儲(chǔ)器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄當(dāng)前所執(zhí)行線程的狀態(tài),調(diào)用棧主要用于維護(hù)線程所調(diào)用到的內(nèi)存與數(shù)據(jù),TLS主要用于存放線程的狀態(tài)信息。
二、多線程
多線程的優(yōu)點(diǎn):可以同時(shí)完成多個(gè)任務(wù);可以使程序的響應(yīng)速度更快;可以讓占用大量處理時(shí)間的任務(wù)或當(dāng)前沒有進(jìn)行處理的任務(wù)定期將處理時(shí)間讓給別的任務(wù);可以隨時(shí)停止任務(wù);可以設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化程序性能。
那么可能有人會(huì)問:為什么可以多線程執(zhí)行呢?總結(jié)起來有下面兩方面的原因:
1、CPU運(yùn)行速度太快,硬件處理速度跟不上,所以操作系統(tǒng)進(jìn)行分時(shí)間片管理。這樣,從宏觀角度來說是多線程并發(fā)的,因?yàn)镃PU速度太快,察覺不到,看起來是同一時(shí)刻執(zhí)行了不同的操作。但是從微觀角度來講,同一時(shí)刻只能有一個(gè)線程在處理。
2、目前電腦都是多核多CPU的,一個(gè)CPU在同一時(shí)刻只能運(yùn)行一個(gè)線程,但是多個(gè)CPU在同一時(shí)刻就可以運(yùn)行多個(gè)線程。
然而,多線程雖然有很多優(yōu)點(diǎn),但是也必須認(rèn)識(shí)到多線程可能存在影響系統(tǒng)性能的不利方面,才能正確使用線程。不利方面主要有如下幾點(diǎn):
(1)線程也是程序,所以線程需要占用內(nèi)存,線程越多,占用內(nèi)存也越多。
(2)多線程需要協(xié)調(diào)和管理,所以需要占用CPU時(shí)間以便跟蹤線程。
(3)線程之間對(duì)共享資源的訪問會(huì)相互影響,必須解決爭(zhēng)用共享資源的問題。
(4)線程太多會(huì)導(dǎo)致控制太復(fù)雜,最終可能造成很多程序缺陷。
當(dāng)啟動(dòng)一個(gè)可執(zhí)行程序時(shí),將創(chuàng)建一個(gè)主線程。在默認(rèn)的情況下,C#程序具有一個(gè)線程,此線程執(zhí)行程序中以Main方法開始和結(jié)束的代碼,Main()方法直接或間接執(zhí)行的每一個(gè)命令都有默認(rèn)線程(主線程)執(zhí)行,當(dāng)Main()方法返回時(shí)此線程也將終止。
一個(gè)進(jìn)程可以創(chuàng)建一個(gè)或多個(gè)線程以執(zhí)行與該進(jìn)程關(guān)聯(lián)的部分程序代碼。在C#中,線程是使用Thread類處理的,該類在System.Threading命名空間中。使用Thread類創(chuàng)建線程時(shí),只需要提供線程入口,線程入口告訴程序讓這個(gè)線程做什么。通過實(shí)例化一個(gè)Thread類的對(duì)象就可以創(chuàng)建一個(gè)線程。創(chuàng)建新的Thread對(duì)象時(shí),將創(chuàng)建新的托管線程。Thread類接收一個(gè)ThreadStart委托或ParameterizedThreadStart委托的構(gòu)造函數(shù),該委托包裝了調(diào)用Start方法時(shí)由新線程調(diào)用的方法,示例代碼如下:
Thread thread=new Thread(new ThreadStart(method));//創(chuàng)建線程
thread.Start(); //啟動(dòng)線程
上面代碼實(shí)例化了一個(gè)Thread對(duì)象,并指明將要調(diào)用的方法method(),然后啟動(dòng)線程。ThreadStart委托中作為參數(shù)的方法不需要參數(shù),并且沒有返回值。ParameterizedThreadStart委托一個(gè)對(duì)象作為參數(shù),利用這個(gè)參數(shù)可以很方便地向線程傳遞參數(shù),示例代碼如下:
Thread thread=new Thread(new ParameterizedThreadStart(method));//創(chuàng)建線程
thread.Start(3); //啟動(dòng)線程
創(chuàng)建多線程的步驟:
1、編寫線程所要執(zhí)行的方法
2、實(shí)例化Thread類,并傳入一個(gè)指向線程所要執(zhí)行方法的委托。(這時(shí)線程已經(jīng)產(chǎn)生,但還沒有運(yùn)行)
3、調(diào)用Thread實(shí)例的Start方法,標(biāo)記該線程可以被CPU執(zhí)行了,但具體執(zhí)行時(shí)間由CPU決定
2.1 System.Threading.Thread類
Thread類是是控制線程的基礎(chǔ)類,位于System.Threading命名空間下,具有4個(gè)重載的構(gòu)造函數(shù):
ThreadStart是一個(gè)無參的、返回值為void的委托。委托定義如下:
public delegate void ThreadStart()
通過ThreadStart委托創(chuàng)建并運(yùn)行一個(gè)線程:
運(yùn)行結(jié)果
除了可以運(yùn)行靜態(tài)的方法,還可以運(yùn)行實(shí)例方法
運(yùn)行結(jié)果:
如果為了簡(jiǎn)單,也可以通過匿名委托或Lambda表達(dá)式來為Thread的構(gòu)造方法賦值
運(yùn)行結(jié)果:
ParameterizedThreadStart是一個(gè)有參的、返回值為void的委托,定義如下:
public delegate void ParameterizedThreadStart(Object obj)
注意:ParameterizedThreadStart委托的參數(shù)類型必須是Object的。如果使用的是不帶參數(shù)的委托,不能使用帶參數(shù)的Start方法運(yùn)行線程,否則系統(tǒng)會(huì)拋出異常。但使用帶參數(shù)的委托,可以使用thread.Start()來運(yùn)行線程,這時(shí)所傳遞的參數(shù)值為null。
本文轉(zhuǎn)載自博客園:https://www.cnblogs.com/dotnet261010/p/6159984.html
總結(jié)
以上是生活随笔為你收集整理的windows查询每个线程占用的内存_C#多线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle中orand使用,Postg
- 下一篇: bs cs架构区别_软件架构设计分层模型