国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

lamport面包店算法簡介

zhunjiee / 1799人閱讀

摘要:序面包店算法是解決多個線程并發訪問一個共享的單用戶資源的互斥問題的算法。面包店一次只能接待一位顧客的采購。已知有位顧客要進入面包店采購,按照次序安排他們在前臺登記一個簽到號碼。顧客根據簽到號碼的由小到大的順序依次入店購貨。

Lamport面包店算法是解決多個線程并發訪問一個共享的單用戶資源的互斥問題的算法。由萊斯利·蘭波特發明。

算法類比

Lamport把這個并發控制算法非常直觀地類比為顧客去面包店采購。

面包店一次只能接待一位顧客的采購。

已知有n位顧客要進入面包店采購,按照次序安排他們在前臺登記一個簽到號碼。該簽到號碼逐次增加1。

顧客根據簽到號碼的由小到大的順序依次入店購貨。

完成購買的顧客在前臺把其簽到號碼歸0。如果完成購買的顧客要再次進店購買,就必須重新排隊。

這個類比中的顧客就相當于線程,而入店購貨就是進入臨界區獨占訪問該共享資源。由于計算機實現的特點,存在兩個線程獲得相同的簽到號碼的情況,這是因為兩個線程幾乎同時申請排隊的簽到號碼,讀取已經發出去的簽到號碼情況,這兩個線程讀到的數據是完全一樣的,然后各自在讀到的數據上找到最大值,再加1作為自己的排隊簽到號碼。

為此,該算法規定如果兩個線程的排隊簽到號碼相等,則線程id號較小的具有優先權。

原理

Lamport時間戳原理如下:

每個事件對應一個Lamport時間戳,初始值為0

如果事件在節點內發生,時間戳加1

如果事件屬于發送事件,時間戳加1并在消息中帶上該時間戳

如果事件屬于接收事件,時間戳 = Max(本地時間戳,消息中的時間戳) + 1

5個原則

為了請求資源,進程A發送消息(Tm:A)給所有的其他進程,并且把這個消息放到進程隊列中,Tm是消息的時間戳

當進程B接收到了進程A的(Tm:A)請求后,會把它放到自己的請求隊列,然后發送一個帶時間戳的確認消息給A

為了釋放資源,進程A移除所有(Tm:A)的請求消息,然后發送帶時間戳的A釋放資源請求消息給其他所有的進程

當進程B接收到進程A釋放資源的請求,它會移除隊列中任意的(Tm:A)的資源請求

當滿足以下兩個條件時,進程A會被分配該資源:

a)有一個(Tm:A)的請求,按照=>關系排在隊列第一位;

b)A接收到了一個時間戳大于Tm的來自所有其他進程的消息

代碼示例
private void processRevcMsg(Message m) throws InterruptedException {
        // 原理4 如果事件屬于接收事件,時間戳 = Max(本地時間戳,消息中的時間戳) + 1
        clock.update(m.getTimestamp());
        lastSendMap.put(m.getFrom(), m);
        switch (m.getMsgType()) {
            case REQUEST_RES:
                // rule 2 當進程B接收到了進程A的(Tm:A)請求后,會把它放到自己的請求隊列,然后發送一個帶時間戳的確認消息給A
                addMessageToReqMap(m);
                Message ackMsg = new Message(pid, m.getMsgId(), MessageType.REQUEST_ACK, clock.time());
                // send ack to sender
                sendToTargetProcess(ackMsg,m.getFrom());
                break;
            case REQUEST_ACK:
                break;
            case RELEASE_RES:
                // rule 4 當進程B接收到進程A釋放資源的請求,它會移除隊列中任意的(Tm:A)的資源請求
                dropMessageFromReqMap(m);
                break;
            default:
                break;
        }
        tryToAcquireResource();
    }

    private void tryToAcquireResource() {
        synchronized (reqMap) {
            if(!reqMap.containsKey(pid) || reqMap.get(pid).isEmpty()){
                return ;
            }

            Message myMessage = reqMap.get(pid).get(0);
            int acceptCount = 1;

            // rule 5 當滿足以下兩個條件時,進程A會被分配該資源:a)有一個(Tm:A)的請求,按照=>關系排在隊列第一位;b)A接收到了一個時間戳大于Tm的來自所有其他進程的消息

            // condition (ii) of rule 5
            // A接收到了一個來自所有其他進程的消息,而且時間戳大于Tm
            for (Map.Entry entry : lastSendMap.entrySet()) {
                if (entry.getKey() == pid) {
                    continue;
                }
                if (isFirstEarlier(myMessage, entry.getValue())) {
                    acceptCount++;
                }else{
                    return ;
                }
            }
            if (!coordinator.hasAcceptedAll(acceptCount)){
                return;
            }

            // condition (i) of rule 5
            // 有一個Tm:A的請求,按照=>關系排在隊列第一位
            for (Map.Entry> entry : reqMap.entrySet()) {
                if (entry.getKey() != pid && !entry.getValue().isEmpty()) {
                    if (!isFirstEarlier(myMessage, entry.getValue().get(0))) {
                        return;
                    }
                }
            }

            // remove this request message
            final Message firstMsg = reqMap.get(pid).remove(0);
            workingPool.execute(new Runnable() {
                public void run() {
                    coordinator.acquire(firstMsg.getMsgId(), pid, firstMsg.getTimestamp());
                    // emulate owning resources for a long time
                    try {
                        Thread.sleep(50L);
                        // rule 3 為了釋放資源,進程A移除所有(Tm:A)的請求消息,然后發送帶時間戳的A釋放資源請求消息給其他所有的進程程
                        coordinator.release(firstMsg.getMsgId(), pid, firstMsg.getTimestamp());
                        Message releaseMsg = new Message(pid, firstMsg.getMsgId(),MessageType.RELEASE_RES, clock.time());
                        sendToOtherProcesses(releaseMsg);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            });
        }
    }
doc

Lamport面包店算法

分布式系統理論基礎 - 時間、時鐘和事件順序

分布式系統時序基礎

lamport

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70377.html

相關文章

  • 什么是拜占庭將軍問題

    摘要:在這種狀態下,拜占庭將軍們才能保證有多于支軍隊在同一時間一起發起進攻,從而贏取戰斗拜占庭將軍問題中并不去考慮通信兵是否會被截獲或無法傳達信息等問題,即消息傳遞的信道絕無問題。共識算法的核心就是解決拜占庭將軍問題分布式網絡一致性問題。 本文首發于深入淺出區塊鏈社區原文鏈接:什么是拜占庭將軍問題原文已更新,請讀者前往原文閱讀 接觸區塊鏈的同學,多少都聽說過拜占庭將軍問題,經常看到或聽到某某...

    junnplus 評論0 收藏0
  • Python數據挖掘與機器學習,快速掌握聚類算法和關聯分析

    摘要:摘要前文數據挖掘與機器學習技術入門實戰與大家分享了分類算法,在本文中將為大家介紹聚類算法和關聯分析問題。比如,聚類算法可以實現公司客戶價值自動劃分,網頁自動歸類等。 摘要:前文數據挖掘與機器學習技術入門實戰與大家分享了分類算法,在本文中將為大家介紹聚類算法和關聯分析問題。分類算法與聚類到底有何區別?聚類方法應在怎樣的場景下使用?如何使用關聯分析算法解決個性化推薦問題?本文就為大家揭曉答...

    Anchorer 評論0 收藏0
  • Paxos共識算法詳解

    摘要:只需超過半數的節點達成一致。總結是分布式一致性問題中的重要共識算法。 在一個分布式系統中,由于節點故障、網絡延遲等各種原因,根據CAP理論,我們只能保證一致性(Consistency)、可用性(Availability)、分區容錯性(Partition Tolerance)中的兩個。 對于一致性要求高的系統,比如銀行取款機,就會選擇犧牲可用性,故障時拒絕服務。MongoDB、Redis...

    Meils 評論0 收藏0
  • 【閱讀筆記】——時間復雜度

    摘要:時間復雜度場景一一根長寸的面包,每天吃掉一寸,那么吃完整個面包需要幾天答案自然是天可以記作場景二一根寸的面包,每天吃掉剩余的一半,吃的只剩下寸,需要多少天答案以為底,的對數,簡寫成,所以為天可以記作場景三每天吃掉一個雞腿,那么吃掉整個雞腿需 時間復雜度 場景一:一根長10寸的面包,每3天吃掉一寸,那么吃完整個面包需要幾天?答案自然是:3×10=30天可以記作:T(n) = 3n 場景二...

    keithxiaoy 評論0 收藏0

發表評論

0條評論

zhunjiee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<