一、死鎖
定義:
指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。 由於資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象:死鎖.
解決辦法:
1.有序資源分配法
申請不同類資源時,必須按各類設備的編號依次申請
2 .銀行家算法
檢查申請者對資源的最大需求量,如果系統現存的各類資源可以滿足申請者的請求,就滿足申請者的請求。
二、線程池ThreadPool
可用於發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。線程池允許在后台運行多個工作,而不需要為每個任務頻繁地創建和銷毀單獨的線程,從而減少了開銷.
*注意*
線程池中的線程都是后台線程
不能手動設置每個線程的屬性,比如設置為前台線程、優先級等等
當執行一些比較短的任務是考慮使用線程池,長時間執行的任務不要使用線程池來創建,而要使用Thread手動創建一個線程。
三、委托的異步調用
BeginInvoke 異步調用,BeginInvoke(被調用的方法的參數,回調函數,回調函數的參數);
EndInvoke 獲取異步調用的(方法)返回值
IAsyncResult 異步操作的狀態
AsyncResult 異步操作的結果(可以獲取當前執行的委托對象)
using System.Runtime.Remoting.Messaging;
AsyncState獲取回調函數的參數。
注意:委托的異步調用只對單播委托\
四、網絡協議
網絡五層:應用層、傳輸層、網絡層、鏈路層、物理層。一般因特網現在都是用的是五層協議,把表示層與會話層的功能都交給了具體的應用程序來做了。
網絡七層:應用層、表示層、會話層、傳輸層、網絡層、鏈路層、物理層
1.應用層:(HTTP、FTP、SMTP)報文Message
2.表示層:通信的應用程序能夠解釋交換數據的含義。數據壓縮、加密解密、數據描述等。
3..會話層:定義了數據交換的定界、同步、建立檢查點等功能,例如如何開始、控制結束一個會話。保證接收消息的連續性,完整性。
4.傳輸層(TCP、UDP)報文段Segment,為運行在不同主機上的應用程序進程間提供數據傳輸服務。通過套接字(Socket)實現。
a>TCP(傳輸控制協議)面向連接的、可靠(應用:ftp、smtp、http等都是基於tcp)
B>UDP(用戶數據報協議)無連接的、不可靠的(數據報)應用:視頻會議、網絡電話、DNS解析。(速度快,能容忍部分數據丟失)
5.網絡層(IP)數據報datagram,把數據從一台主機移動到另一台主機,主機間通信。IP協議不可靠,有丟包。
6.鏈路層(以太網、WiFi、點對點)幀Frame,負責將數據報傳遞給下一個節點。不同的鏈路層有特定的鏈路層協議。一系列路由器、交換機。
7.物理層:負責把數據一個bit一個bit的從一個節點移動到下一個節點,該層中的協議仍然與鏈路層相關。例如,以太網具有許多物理層協議:雙絞銅線的、同軸電纜的、光纖的。
網絡簡單的四層
應用層 (Application):應用層是個很廣泛的概念,有一些基本相同的系統級 TCP/IP 應用以及應用協議,也有許多的企業商業應用和互聯網應用。
傳輸層 (Transport):傳輸層包括 UDP 和 TCP,UDP 幾乎不對報文進行檢查,而 TCP 提供傳輸保證。
網絡層 (Network):網絡層協議由一系列協議組成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
鏈路層 (Link):又稱為物理數據網絡接口層,負責報文傳輸。
網絡層協議
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,需要建立連接(像手機)
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議,只管發送(像電報)。它是屬於TCP/IP協議族中的一種。
TCP/IP 連接需要三次握手
1.確定a能發給b
2.b告訴a接受能破解,b能發給a數據
3.a告訴b能破解
端口
1.用來修飾同一地址內的,不同的程序的
2.一個端口同以時間只能被一個程序所監聽
3.一個程序綁定一個獨有的端口
socket
socket的英文原義是“孔”或“插座”。作為進程通信機制,取后一種意思。通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的。),是對網絡層的抽象,方便客戶端和服務端的傳輸
1.定義:進程通信機制,通常稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。
2.端口范圍:0-65535之間。端口的意義:用來區分不同的進程。
分類
(1)公認端口:(Well Known Ports):從0到1023,它們緊密綁定(binding)於一些服務。通常這些端口的通訊 明確表明了某種服務的協議。例如:80端口實際上總是HTTP通訊,ftp21,smtp25,....。
(2)注冊端口(Registered Ports):從1024到49151。它們松散地綁定於一些服務。也就是說有許多服務綁定於 這些端口,這些端口同樣用於許多其它目的。例如:許多系統處理動態端口從1024左右開始。
(3)動態和/或私有端口(Dynamic and/or Private Ports):從49152到65535。理論上,不應為服務分配這些端 口。實際上,機器通常從1024起分配動態端口。但也有例外:SUN的RPC端口從32768開始。
3.兩種類型:
a.流式Socket(STREAM): 是一種面向連接的Socket,針對於面向連接的TCP服務應用,安全,但是效率 低;發送數據是以流的方式,發送方可以有自己的緩沖區大小,接收方也可以有自己的緩沖區大小,不必一致,只要發送的數據都接收到就可以了。一次發10個字節,發3次。接收方一次接6個字節,接5 次。只要保證最后是完整的就可以。
b.數據報式Socket(DATAGRAM): 是一種無連接的Socket,對應於無連接的UDP服務應用.不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但效率高.發送方每次發送一個數據報,接收方必須一次也接收一個完整的數據報。
創建和使用socket
//第一步:創建socket:第一個參數:設置網絡層的協議,第二個參數設置傳輸數據的方式,第三個參數:傳輸層的協議
Socket listenSocket=new Socket(AddressFamily.InterNetwor,SocketType.Stream,ProtocolTypt.Tcp);
//第二步:綁定一個端口和Ip地址
//根據字符串創建一個ip地址對象
IpAddress ip=IpAddress.parse(this.txtIp.Text);//127.0.0.1
//創建一個節點
IpEndpoint endpoint =new IpEndpoint(ip,int.Parse(this.txtport.Text));
listenSocket.Bind(endpoint);
//第三步:開始監聽端口
listensocket.Listen(10);//連接隊列的最大數
//第四步:開始接受用戶的連接
//Accept會阻塞主線程,直到客戶端連接上來后,方法執行完成並返回代理Socket
Socket proxSocket=listenSocket.Accept();
//給客戶端傳輸一個字符串
var buffer =Encoding.Default.GetBytes("asdf ");
proxSocket.Send(buffer);
六、Socket編程模型
服務器端:
1.創建Socket對象。設置協議、傳輸方式等(連接Socket)
2.綁定IP與端口(設置要監聽的IP與端口)。Bind()
3.開啟監聽。Listen()
4.開始接受客戶端連接。Accept();//阻塞線程,同時也需要循環不斷接受用戶連接。
5.接受了客戶端的連接,生成一個新的Socket對象(通信Socket)
6.接受(Receive)和發送(Send)消息//需要循環不斷接收用戶的消息
7.Shutdown()禁用發送與接收功能。
8.Close()關閉釋放資源
客戶端:
1.創建Socket對象。設置協議、傳輸方式等(連接Socket)
2.Connect()連接服務器(IP與端口)
3.向服務器發送、接受消息
4.Shutdown()禁用發送與接收功能。
5.Close();關閉釋放資源
HttpHandler(一般處理程序)
HttpHandler是一個實現了IHttpHandler接口的特殊類。任何一個實現了IHttpHandler接口的類,是作為一個外部請求的目標程序的前提。如果是沒有實現這個接口的類,就不能被瀏覽器請求。我們可以通過創建一個我們自己的HttpHandler程序來生成瀏覽器代碼,發送回客戶端瀏覽器!當我們不需要返回過多的Html代碼的時候可以使用它哦 (.ashx)
IHttpHandler的定義是這樣的:
...public interface IHttpHandler
{
...bool IsReusable{get;}
...void ProcessRequest(HttpContext context);
}
其中ProcessRequest就是我們處理請求的主要代碼;
IsReusable屬性用來表示在IHttpHandlerFactory對象創建IHttpHandler的時候是否能夠將這個Handler存入池中以便重用。
IHttpHandlerFactory的定義是這樣的:
...public interface IHttpHandlerFactory
{
...IHttpHandler GetHandler(HttpContext context,string requestType,string url,string pathYranslated);
...void ResaseHandler(IHttpHandler handler);
}
GetHandler(),返回實現了IHttpHandler接口的類的實例。
ReleaseHandler(),使得Factory可以重復使用一個已經存在的Handler實例
案例:使用HttpHandler實現圖片防盜鏈
public void ProcessRequest(HttpContext context){
context.Response.ContentType="text/plain";
//獲取文件服務器端物理路徑
string FileName=context.Server.MapPath(context.Request.FliePath);
//如果UrlReferrer為空,則顯示一張默認的禁止盜鏈的圖片
if(context.Request.UrlReferrer.Host==null)
{
context.Response.ContentType="image/JPEG";
context.Response.WriteFile("/error.jpg");
}
//如果urlRefferrer中不包含自己站點的主機域名,則顯示一張默認的禁止盜鏈的圖片
else
{
if(coontext.Request.UrlReferrer.Host.IndexOf("hezhiqiang.com")>0)
{
context.Respones.ContentType="image/JPEG";
context.Response.WriteFile(FileName);
}
else
{
context.Respones.ContentType="image/JPEG";
context.Response.WriteFile("/error.jpg");
}
}
}