1. 程式人生 > >多程序共享記憶體續篇-大鎖

多程序共享記憶體續篇-大鎖

讀寫鎖,就是多人可以同時訪問,但是同時只有一個人可以修改的規則。

由於鎖本身的申請和釋放,對於效能有很大的消耗,那麼一般寫只發生在特殊情況,也就是很少發生。

讀鎖常在就是效能的優化方案,只有在申請寫鎖的時候,才會釋放讀鎖。

和之前有什麼不一樣呢,例如,連續的在不同地方的100次讀,以前是要100次讀鎖的申請和釋放,現在只有初始的一次申請讀鎖,中間完全沒有別的消耗。

程式碼如何實現呢?

過程如下:

當有一個程序需要寫,那麼就要等所有的程序的讀鎖釋放,所以在申請和釋放讀鎖的地方,申請的動作還在。

首先,需要一個共享變數,當一個程序申請寫鎖,所有程序可以知曉。

然後,以前申請和釋放讀鎖的地方,實際不是申請和釋放,而是對於寫程序的共享變數的判斷。

所謂的判斷,如果有程序申請寫程序,那麼所有程序都會根據共享變數,手動釋放一次讀鎖,然後申請一次讀鎖。

由於寫申請在前,那麼在手動釋放讀鎖後,寫鎖獲得許可權,申請讀鎖就要等寫鎖的釋放。

總結:一個程序內的變數read_flag=0,程序開始時候申請讀鎖,只會申請一次,變數置1。後面再申請和釋放,對多程序的共享變數write_flag判斷

write_flag=0:無程序申請寫鎖

申請讀鎖函式,read_flag==1,進來直接退出;read_flag==0,初次申請;

釋放讀鎖函式,直接return,不用對變數進行判斷。

write_flag=1:有程序申請寫鎖

申請讀鎖函式,手動申請一次讀鎖,然後手動釋放一次讀鎖;

釋放讀鎖函式,手動申請一次讀鎖,然後手動釋放一次讀鎖。

寫鎖很簡單,只需要將共享變數置位,然後去申請寫鎖就OK了。

注意這裡對共享變數的操作,是在沒有獲得寫鎖的時候,修改共享變數,如何保證唯一性?

其實不需要唯一性:

其他程序同時申請寫鎖,那麼修改變數都是一個目的,把它置1;

修改的同時,有讀鎖操作,可能會當時沒有讀到或讀錯?那麼下次再讀唄,只是多了一次讀的時間;


相關推薦

程序共享記憶體續篇-

讀寫鎖,就是多人可以同時訪問,但是同時只有一個人可以修改的規則。 由於鎖本身的申請和釋放,對於效能有很大的消耗,那麼一般寫只發生在特殊情況,也就是很少發生。 讀鎖常在就是效能的優化方案,只有在申請寫鎖的時候,才會釋放讀鎖。 和之前有什麼不一樣呢,例如,連續的在不同地方的10

python程序共享記憶體,我喜歡解除安裝思維導圖裡面,現在還沒有寫全,python得ctype,還沒有特別得熟悉

多程序與多執行緒頭大啊 1.C++ 將程序執行在指定的CPU上 1.1.https://blog.csdn.net/w2014qian/article/details/51941549 2.多程序 2.1.管道通訊 2.1.1.程序start啟動程序 join阻

程序+共享記憶體+訊號量綜合例項

測試框架 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sy

程序程序共享記憶體

這樣也可節約很多空間啊,找到了這片部落格寫的很好,怎麼能錯過記錄。感謝原作者。 HANDLE hmapfile = OpenFileMapppingA(FILE_MAP_READ, FALSE, "shijiaxing");    //開啟共享記憶體,可以用於程序通訊,

python 程序共享類物件

理論上2和3版本都能用 from multiprocessing import Process, Value, Lock from multiprocessing.managers import BaseManager class Employee(object):

Python程序,同步互斥,訊號量,補充上一篇文章

from multiprocessing import Event,Process from time import sleep def wait_event1(): print("1想操作臨界區資源") e.wait() print("1開始操作臨界區資源",e.is_set()

【swoole快速入門11】程序共享資料

由於PHP語言不支援多執行緒,因此Swoole使用多程序模式。在多程序模式下存在程序記憶體隔離,在工作程序內修改global全域性變數和超全域性變數時,在其他程序是無效的。 程序隔離 $fds = array(); $server->on('connect', fu

程序共享同一埠和平滑升級程式的程式模型

/* File Name: server.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #in

Pytorch學習 ( 十三 ) ----- Pytorch自定義層出現Variable共享記憶體錯誤

錯誤資訊: RuntimeError: in-place operations can be only used on variables that don’t share storage with

Linux共享記憶體與互斥

Linux共享記憶體 共享記憶體是從系統的空閒記憶體池中分配,並希望訪問它的每個程序都能連線它。連線的過程稱為對映。對映後,每個程序都可通過訪問自己的記憶體而訪問共享記憶體區域,進而與其它程序進行通訊。 共享記憶體相關函式 開啟建立共享記憶體檔案 int shm_op

python程序共享變數Value使用tips

前言:   在使用tornado的多程序時,需要多個程序共享一個狀態變數,於是考慮使用multiprocessing.Value(對於該變數的具體細節請查閱相關資料)。在根據網上資料使用Value時,由於共享的是字串,但網上介紹的都是整數或者字元,於是遇到了很多阻礙,通

生產者程序和消費者程序共享記憶體解決方法---迴圈陣列

#define BUFFER_SIZE 10 typedef struct { something; }item; item buffer[BUFFER_SIZE]; int in=0; int out=0; /*----------------------------

程序共享記憶體

多程序鎖 當我們用多程序來讀寫檔案的時候,如果一個程序是寫檔案,一個程序是讀檔案,如果兩個檔案同時進行,肯定是不行的,必須是檔案寫結束以後,才可以進行讀操作。或者是多個程序在共享一些資源的時候,同時只

ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))

檔案記憶體對映mmap解決檔案快速讀寫問題和程序共享記憶體

mmap函式主要用途有三個: 1、將一個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代I/O讀寫,以獲得較高的效能; 2、將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間; 3、為無關聯的程序提供共享記憶體空間,一般也是將一個普通檔案對映到

程序程式設計——共享記憶體

程序間通訊有四種方式:訊號量、管道、訊息佇列、共享記憶體 我們之前已著重介紹過訊號量、管道。 現著重介紹一下共享記憶體。 共享記憶體        共享記憶體是最高效的IPC機制,因為它不涉及程序之間任何的資料傳輸。這種高效率帶來的問題是,我們

【Multiprocessing】Python程序記憶體共享資料佇列SMQueue

0x00 前言 自從先前研究了下Python的多程序計算(原文連結)之後, 深深地感受到多程序處理的美好,並決定運用到模型訓練時, 作為 feed data 的資料處理模組使用,實現工具類 SharedMemoryQueue。 但是眾所周知,python的程序間

shmget 共享記憶體 同步讀寫檔案一個程序寫,程序讀,讀和寫同步,邊寫邊讀

首先,看看老大給我的任務:實現一個模組間的記憶體管理庫, 實現以下功能 1、該記憶體庫通訊的資料量不確定, 最大5Mbit/s  2、該記憶體庫用於模組間的資料互動 3、該記憶體庫只允許一個模組寫入, 但可多個模組讀取, 但需要各個讀取模組沒有任何相互干擾, 比如一個模組

C# 基礎(十四)C#單例模式:首先介紹 單執行緒、執行緒、加 單例模式。然後介紹單例模式的執行緒同步:執行緒有序訪問共享記憶體

一、簡介 本篇文章將介紹如何使用單例模式,也就是類的例項化,在整個專案的生命週期內,只例項化一次。在單例模式中,往往可以看到如SourceCode.cs:這樣的結構的。 SourceCode.cs: public class Singleton { private static

共享記憶體程序間通訊,程序間同步使用訊號量來實現

Linux 環境下C程式設計指南,通過共享記憶體進行程序間通訊的例子,程序間同步使用訊號量來實現。 程式碼 11-5 使用說明:這是一個簡單的伺服器和客戶端程式,如果啟動程式時不帶引數,則執行伺服器程式; 如果帶引數,則執行客戶端程式,所帶引數只有一個,就是伺服器端所顯