回調緩存區
① C# Cache回調函數問題,多次執行該方法,執行兩次後就馬上執行了onRemove,求助
執行兩次,肯定會馬上執行onremove。
因為你調用了HttpRuntime.Cache.Remove(Key);把cache刪除了。肯定會調用移除通知的方法。
② java Nio讀寫為什麼是雙向
作者:美團技術團隊
鏈接:https://zhuanlan.hu.com/p/23488863
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
NIO(Non-blocking I/O,在Java領域,也稱為New I/O),是一種同步非阻塞的I/O模型,也是I/O多路復用的基礎,已經被越來越多地應用到大型應用伺服器,成為解決高並發與大量連接、I/O處理問題的有效方式。
那麼NIO的本質是什麼樣的呢?它是怎樣與事件模型結合來解放線程、提高系統吞吐的呢?
本文會從傳統的阻塞I/O和線程池模型面臨的問題講起,然後對比幾種常見I/O模型,一步步分析NIO怎麼利用事件模型處理I/O,解決線程池瓶頸處理海量連接,包括利用面向事件的方式編寫服務端/客戶端程序。最後延展到一些高級主題,如Reactor與Proactor模型的對比、Selector的喚醒、Buffer的選擇等。
註:本文的代碼都是偽代碼,主要是為了示意,不可用於生產環境。
傳統BIO模型分析
讓我們先回憶一下傳統的伺服器端同步阻塞I/O處理(也就是BIO,Blocking I/O)的經典編程模型:
{
ExecutorService executor = Excutors.newFixedThreadPollExecutor(100);//線程池
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(8088);
while(!Thread.currentThread.isInturrupted()){//主線程死循環等待新連接到來
Socket socket = serverSocket.accept();
executor.submit(new ConnectIOnHandler(socket));//為新的連接創建新的線程
}
class ConnectIOnHandler extends Thread{
private Socket socket;
public ConnectIOnHandler(Socket socket){
this.socket = socket;
}
public void run(){
while(!Thread.currentThread.isInturrupted()&&!socket.isClosed()){死循環處理讀寫事件
String someThing = socket.read()....//讀取數據
if(someThing!=null){
......//處理數據
socket.write()....//寫數據
}
}
}
}
這是一個經典的每連接每線程的模型,之所以使用多線程,主要原因在於socket.accept()、socket.read()、socket.write()三個主要函數都是同步阻塞的,當一個連接在處理I/O的時候,系統是阻塞的,如果是單線程的話必然就掛死在那裡;但CPU是被釋放出來的,開啟多線程,就可以讓CPU去處理更多的事情。其實這也是所有使用多線程的本質:
利用多核。
當I/O阻塞系統,但CPU空閑的時候,可以利用多線程使用CPU資源。
線程的創建和銷毀成本很高,在Linux這樣的操作系統中,線程本質上就是一個進程。創建和銷毀都是重量級的系統函數。
線程本身佔用較大內存,像Java的線程棧,一般至少分配512K~1M的空間,如果系統中的線程數過千,恐怕整個JVM的內存都會被吃掉一半。
線程的切換成本是很高的。操作系統發生線程切換的時候,需要保留線程的上下文,然後執行系統調用。如果線程數過高,可能執行線程切換的時間甚至會大於線程執行的時間,這時候帶來的表現往往是系統load偏高、CPU sy使用率特別高(超過20%以上),導致系統幾乎陷入不可用的狀態。
容易造成鋸齒狀的系統負載。因為系統負載是用活動線程數或CPU核心數,一旦線程數量高但外部網路環境不是很穩定,就很容易造成大量請求的結果同時返回,激活大量阻塞線程從而使系統負載壓力過大。
現在的多線程一般都使用線程池,可以讓線程的創建和回收成本相對較低。在活動連接數不是特別高(小於單機1000)的情況下,這種模型是比較不錯的,可以讓每一個連接專注於自己的I/O並且編程模型簡單,也不用過多考慮系統的過載、限流等問題。線程池本身就是一個天然的漏斗,可以緩沖一些系統處理不了的連接或請求。
不過,這個模型最本質的問題在於,嚴重依賴於線程。但線程是很"貴"的資源,主要表現在:
所以,當面對十萬甚至百萬級連接的時候,傳統的BIO模型是無能為力的。隨著移動端應用的興起和各種網路游戲的盛行,百萬級長連接日趨普遍,此時,必然需要一種更高效的I/O處理模型。
NIO是怎麼工作的
很多剛接觸NIO的人,第一眼看到的就是Java相對晦澀的API,比如:Channel,Selector,Socket什麼的;然後就是一坨上百行的代碼來演示NIO的服務端Demo……瞬間頭大有沒有?
我們不管這些,拋開現象看本質,先分析下NIO是怎麼工作的。
常見I/O模型對比
所有的系統I/O都分為兩個階段:等待就緒和操作。舉例來說,讀函數,分為等待系統可讀和真正的讀;同理,寫函數分為等待網卡可以寫和真正的寫。
需要說明的是等待就緒的阻塞是不使用CPU的,是在「空等」;而真正的讀寫操作的阻塞是使用CPU的,真正在"幹活",而且這個過程非常快,屬於memory ,帶寬通常在1GB/s級別以上,可以理解為基本不耗時。
下圖是幾種常見I/O模型的對比:

以上都是小編收集了大神的靈葯,喜歡的拿走吧!喜歡小編就輕輕關注一下吧!
③ c#如何使用緩存提高程序效率
緩存的技術應用應該是非廣泛的。而它的作用也是為了提高系統或者網站的執行效率。下面是四種常見的緩存技術:
一.OutputCaching
由於IIS的一些特性,默認情況下OutputCache是打開的,但是要對某些請求進行緩存,還需要開發者進行定製,而且默認情況下,Output Cache 會被緩存到硬碟上,我們可以通過修改DiskCacheable的屬性來設置其是否緩存,還可以通過Web config里配置緩存文件的大小。
<%@ OutputCacheDuration="3600" VaryByParam="state" DiskCacheable="true" %>
一般用硬碟緩存是考慮到頁面送顯的數據比較大,相對內存緩存來說,它的容量大,但是訪問速度慢點,如果把周期設太短,使用硬碟緩存的效率就不大好。對於Output Cache的定製,有兩種方法,一種是基於底層的API技術,一種是基於高層的@OutputCaching:
1.基於高層的@OutputCaching
A.由參數改變緩存內容:有些時候我們需要根據用戶的請求來生成頁面,但是用戶的請求只有有限的幾種組合,這個時候就可以根據用戶請求來生成幾種緩存頁面,來進行緩存。
<%@ OutputCache Duration ="60" VaryByParam = "state" %>
<asp:sqlDataSourceID="SqlDataSource1" runat="server">
<SelectParameters>
<asp:QueryStringParameter Name="state"QueryStringField="state" DefaultValue="CA" />
</SelectParameters>
</asp:SqlDataSource>
B.回調緩存:可以針對每個請求在頁面中插入動態的部分,以彌補單獨使用靜態緩存的不足:
動態的部分用Substitution控制項,Substitution控制項是一個容器
<asp:SubstitutionID="Substitution1" runat="server" MethodName =""/>
MethodName 裡面放入要調用的方法內容。
2. 使用API定製緩存:
通過設置System.Web.HttpCachePolicy屬性來進行配置
<%@ OutputCache Duration="60"VaryByParam="none" %>
就可以寫成
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
二.FragmentCaching
作為Output的緩存的附加功能,還提供一種緩存技術,專門用於緩存用戶控制項。在用戶控制項中設置:
<%@ OutputCache Duration="60"VaryByParam="none" %>
但在引用用戶控制項的頁面不設置緩存。這樣的話,頁面中除了用戶控制項是靜態的,其他都是動態的。
緩存用戶空間同樣還可以使用控制項作為參數來源。通過指定控制項作為緩存控制項的數據來源,可以達到緩存控制項數據的目的,和上面一樣。
三.DataCaching
Asp.net提供了一種非常快捷的方法進行資料庫緩存,用戶可以非常簡單方便的對頁面變數進行緩存。並以此提高程序效率。一個頁面變數的緩存生命周期與應用程序的緩存生命周期相同
實現是把數據放在Cache中,如:
source = new DataView(ds);
Cache("MyCache") = source;
MyCache這個變數其實就是一個XML文件。
四.SQL Caching
通過配置資料庫連接池,只有當資料庫數據被改變的時候,緩存才會改變。
開個DOS窗口:
C:\>dir aspnet_regsql.exe/s ——這個文件是專門注冊SQL連接池的,它對SQLSever 7.0以上都有專門的支持,我們通過寫一些專門的語句來配置這個注冊連接池,可以把連接池和本地的應用程序(Asp.net伺服器,即IIS)做一個連接。連接池只能監視有限的幾個庫,不然連接池的負載太大。使用SQL Caching:
先注冊,如: aspnet_regsql.exe-S".\SQLExpress"-E-d"pubs"-ed
aspnet_regsql.exe-S".\SQLExpress"-E-d"pubs"-et-t"authors"
其中:- S".\SQLExpress" 表示要使用的SQL Server實例為".\SQLExpress"。-E 表示使用當前windows憑證進行身份驗證。-d"pubs"表示用於應用程序服務的資料庫名稱叫"pubs"。-ed表示為SQL 緩存依賴項啟用資料庫。-et 表示為SQL 緩存依賴項啟用表。-t"authors"表的名稱為"authors"。
然後頁面上:
<%@ OutputCacheDuration="99999999" VaryByParam="none"SqlDependency="Pubs.Authors" %>
就OK了。
④ OpenGL如何使用固定管線下的著色器渲染一個正方形,並用特殊鍵控制移動
雙緩沖窗口 、 RGBA顏色模式 、 深度測試 、 模板緩沖區 。
GLUT 內部運行著一個本地消息循環,用來調用我們不同時間注冊進來的回調函數。我們可以注冊2個回調函數:1,為窗口改變大小而設置的一個回調函數;2,包含OpenGL渲染的回調函數。
注冊的重塑函數 changeSize 方法的實現,通過 glViewport (GLint x, GLint y, GLsizei width, GLsizei height); 來重新設置窗口的大小,x,y 參數代表窗口中視圖的左下角坐標,而寬度、高度是像素,為表示,通常x,y 都是為0。
注冊的顯示函數 void RenderScene(void) 實現,顯示函數的具體實現步驟
第一步 : 在該方法中我們需要清除一個或者一組特定的緩存區;
緩存區是一塊存著圖像信息的存儲空間,紅色、綠色、藍色和alpha分量通常一起作為顏色緩存區或像素緩存區引用。OpenGL 中不止一種緩沖區(顏色緩存區、深度緩存區和模板緩存區)清除緩存區對數值進行預置; 參數:指定將要清除的緩存的 GL_COLOR_BUFFER_BIT :指示當前激活的用來進行顏色寫入緩沖區 GL_DEPTH_BUFFER_BIT :指示深度緩存區 GL_STENCIL_BUFFER_BIT:指示模板緩沖區。
第二步 :使用一組浮點數來表示紅色,設置繪制需要的顏色
第三步 :將設置的顏色傳遞到存儲著色器,即 GLT_SHADER_IDENTITY 著色器,這個著色器只是使用指定顏色以默認笛卡爾坐標第在屏幕上渲染幾何圖形
第四步 :提交著色器
第五步 :將後台緩沖區進行渲染,然後結束後交換給前台, 在開始的設置openGL 窗口的時候,我們指定要一個雙緩沖區的渲染環境。這就意味著將在後台緩沖區進行渲染,渲染結束後交換給前台。這種方式可以防止觀察者看到可能伴隨著動畫幀與動畫幀之間的閃爍的渲染過程。緩沖區交換平台將以平台特定的方式進行。
第一步 :設置清屏顏色
第二步 :沒有著色器,在OpenGL 核心框架中是無法進行任何渲染的。初始化一個渲染管理器。
第三步 :指定頂點。
⑤ matlab 輸入緩沖區的大小設置

應該是32KByte
⑥ 調用BeginSend後,怎樣將緩沖區發送出去啊
參考:
http://msdn.microsoft.com/zh-cn/library/vstudio/ms145136.aspx
你要調用EndSend
