NotifyMyFrontEnd 函數背后的數據緩沖區(一)

async.c的 ?

static void?
NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid) 函數中的主要邏輯是這樣的:

復制代碼
if (whereToSendOutput == DestRemote)?
{ ? ?
StringInfoData buf; ? ?
pq_beginmessage(&buf, 'A'); ? ? //cursor 為 A ? ?
pq_sendint(&buf, srcPid, sizeof(int32)); //追加 srcPid ? ?
pq_sendstring(&buf, channel); ? ? //追加消息通道名 ? ?

if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3) ? ?
pq_sendstring(&buf, payload); ? ? //追加消息字節流 ? ?
pq_endmessage(&buf); ? ? //發送消息
...... ? ?
}
復制代碼
從上面看到,向StringInfoData 數據結構填充信息,就表示信息發送結束。

static void?

NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)

pq_endmessage是 pqformat.c 中函數它 調用 pqcomm.c 中的 pq_putmessage函數
pq_putmessage 調用 internal_putbyes函數
internal_putbyes 中 對pqSendPointer 進行操作

關于 pqSendPointer/pqRevPointer,有如下定義:

--------------------------------------------------------------------------------------------
static char PqSendBuffer[PQ_BUFFER_SIZE];
static int PqSendPointer; /* Next index to store a byte in PqSendBuffer */

static char PqRecvBuffer[PQ_BUFFER_SIZE];
static int c; /* Next index to read a byte from PqRecvBuffer */
static int PqRecvLength; /* End of data available in PqRecvBuffer */
---------------------------------------------------------------------------------------------

查閱文檔資料:《PostgreSQL數據庫內核分析》中2.6.6中也有所說明。

從 internal_putbyes 中的代碼邏輯看到,移動指針未加任何鎖定機制。

復制代碼
static int ? ?
internal_putbytes(const char *s, size_t len) ? ?
{ ? ?
size_t ? ? amount; ? ?
while (len > 0) ? ?
{ ? ?
/* If buffer is full, then flush it out */ ? ?
if (PqSendPointer >= PQ_BUFFER_SIZE) ? ?
if (internal_flush()) ? ?
return EOF;


amount = PQ_BUFFER_SIZE - PqSendPointer; ? ?
if (amount > len) ? ?
amount = len;

memcpy(PqSendBuffer + PqSendPointer, s, amount); ? ?
PqSendPointer += amount; ? ?
s += amount; ? ?
len -= amount; ? ?
} ? ?
return 0; ? ?
} ? ?
復制代碼
既然未加鎖,那么就可以這樣推斷:

在每一對客戶端和服務器端進程之間,都有這樣一個內存緩沖區。
換句話說,有多少個客戶端,就會產生多少個這樣的 內存緩沖區。

具體如何,還需進一步的驗證。









本文轉自健哥的數據花園博客園博客,原文鏈接:http://www.cnblogs.com/gaojian/archive/2012/07/17/2594718.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391901.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最后期限 軟件工程_如何在軟件開發的最后期限內實現和平

最后期限 軟件工程D E A D L I N E…最后期限… As a developer, this is one of your biggest nightmares or should I say your enemy? Name it whatever you want.作為開發人員,這是您最大的噩夢之一,還是我應該說您的敵人? 隨便命名。 …

SQL Server的復合索引學習【轉載】

概要什么是單一索引,什么又是復合索引呢? 何時新建復合索引,復合索引又需要注意些什么呢?本篇文章主要是對網上一些討論的總結。一.概念單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上。用戶可以在多個列上建立索引,這種索…

leetcode 1423. 可獲得的最大點數(滑動窗口)

幾張卡牌 排成一行,每張卡牌都有一個對應的點數。點數由整數數組 cardPoints 給出。 每次行動,你可以從行的開頭或者末尾拿一張卡牌,最終你必須正好拿 k 張卡牌。 你的點數就是你拿到手中的所有卡牌的點數之和。 給你一個整數數組 cardPoi…

pandas處理excel文件和csv文件

一、csv文件 csv以純文本形式存儲表格數據 pd.read_csv(文件名),可添加參數enginepython,encodinggbk 一般來說,windows系統的默認編碼為gbk,可在cmd窗口通過chcp查看活動頁代碼,936即代表gb2312。 例如我的電腦默認編碼時gb2312&…

tukey檢測_回到數據分析的未來:Tukey真空度的整潔實現

tukey檢測One of John Tukey’s landmark papers, “The Future of Data Analysis”, contains a set of analytical techniques that have gone largely unnoticed, as if they’re hiding in plain sight.John Tukey的標志性論文之一,“ 數據分析的未來 ”&#x…

spring— Spring與Web環境集成

ApplicationContext應用上下文獲取方式 應用上下文對象是通過new ClasspathXmlApplicationContext(spring配置文件) 方式獲取的,但是每次從容器中獲 得Bean時都要編寫new ClasspathXmlApplicationContext(spring配置文件) ,這樣的弊端是配置文件加載多次…

Elasticsearch集群知識筆記

Elasticsearch集群知識筆記 Elasticsearch內部提供了一個rest接口用于查看集群內部的健康狀況: curl -XGET http://localhost:9200/_cluster/healthresponse結果: {"cluster_name": "format-es","status": "green&qu…

Item 14 In public classes, use accessor methods, not public fields

在public類中使用訪問方法,而非公有域 這標題看起來真晦澀。。解釋一下就是,如果類變成public的了--->那就使用getter和setter,不要用public成員。 要注意它的前提,如果是private的class(內部類..)或者p…

子集和與一個整數相等算法_背包問題的一個變體:如何解決Java中的分區相等子集和問題...

子集和與一個整數相等算法by Fabian Terh由Fabian Terh Previously, I wrote about solving the Knapsack Problem (KP) with dynamic programming. You can read about it here.之前,我寫過有關使用動態編程解決背包問題(KP)的文章。 你可以在這里閱讀 。 Today …

matplotlib圖表介紹

Matplotlib 是一個python 的繪圖庫,主要用于生成2D圖表。 常用到的是matplotlib中的pyplot,導入方式import matplotlib.pyplot as plt 一、顯示圖表的模式 1.plt.show() 該方式每次都需要手動show()才能顯示圖表,由于pycharm不支持魔法函數&a…

到2025年將保持不變的熱門流行技術

重點 (Top highlight)I spent a good amount of time interviewing SMEs, data scientists, business analysts, leads & their customers, programmers, data enthusiasts and experts from various domains across the globe to identify & put together a list that…

spring—SpringMVC的請求和響應

SpringMVC的數據響應-數據響應方式 頁面跳轉 直接返回字符串 RequestMapping(value {"/qq"},method {RequestMethod.GET},params {"name"})public String method(){System.out.println("controller");return "success";}<bea…

Maven+eclipse快速入門

1.eclipse下載 在無外網情況下&#xff0c;無法通過eclipse自帶的help-install new software輸入url來獲取maven插件&#xff0c;因此可以用集成了maven插件的免安裝eclipse(百度一下有很多)。 2.jdk下載以及環境變量配置 JDK是向前兼容的&#xff0c;可在Eclipse上選擇編譯器版…

源碼閱讀中的收獲

最近在做短視頻相關的模塊&#xff0c;于是在看 GPUImage 的源碼。其實有一定了解的伙伴一定知道 GPUImage 是通過 addTarget 鏈條的形式添加每一個環節。在對于這樣的設計贊嘆之余&#xff0c;想到了實際開發場景下可以用到的場景&#xff0c;借此分享。 我們的項目中應該有很…

馬爾科夫鏈蒙特卡洛_蒙特卡洛·馬可夫鏈

馬爾科夫鏈蒙特卡洛A Monte Carlo Markov Chain (MCMC) is a model describing a sequence of possible events where the probability of each event depends only on the state attained in the previous event. MCMC have a wide array of applications, the most common of…

PAT乙級1012

題目鏈接 https://pintia.cn/problem-sets/994805260223102976/problems/994805311146147840 題解 就比較簡單&#xff0c;判斷每個數字是哪種情況&#xff0c;然后進行相應的計算即可。 下面的代碼中其實數組是不必要的&#xff0c;每取一個數字就可以直接進行相應計算。 // P…

我如何在昌迪加爾大學中心組織Google Hash Code 2019

by Neeraj Negi由Neeraj Negi 我如何在昌迪加爾大學中心組織Google Hash Code 2019 (How I organized Google Hash Code 2019 at Chandigarh University Hub) This is me !!! Neeraj Negi — Google HashCode Organizer這就是我 &#xff01;&#xff01;&#xff01; Neeraj …

leetcode 665. 非遞減數列(貪心算法)

給你一個長度為 n 的整數數組&#xff0c;請你判斷在 最多 改變 1 個元素的情況下&#xff0c;該數組能否變成一個非遞減數列。 我們是這樣定義一個非遞減數列的&#xff1a; 對于數組中所有的 i (0 < i < n-2)&#xff0c;總滿足 nums[i] < nums[i 1]。 示例 1: …

django基于存儲在前端的token用戶認證

一.前提 首先是這個代碼基于前后端分離的API,我們用了django的framework模塊,幫助我們快速的編寫restful規則的接口 前端token原理: 把(token加密后的字符串,keyname)在登入后發到客戶端,以后客戶端再發請求,會攜帶過來服務端截取(token加密后的字符串,keyname),我們再利用解密…

數據分布策略_有效數據項目的三種策略

數據分布策略Many data science projects do not go into production, why is that? There is no doubt in my mind that data science is an efficient tool with impressive performances. However, a successful data project is also about effectiveness: doing the righ…