簡體   English   中英

在Linux中進行處理器間通信的最佳方法是什么?

[英]What is the best way for interprocessor communication in Linux?

我在芯片上有兩個CPU,它們有一個共享內存。 這不是SMP體系結構。 芯片上只有兩個CPU具有共享內存。

第一個CPU上有一個類似Unix的操作系統,第二個CPU上有一個Linux操作系統。

第一個CPU做一些工作,此工作的結果是一些數據。 在第一個CPU完成其工作后,應告訴另一個CPU該工作已完成,第二個CPU必須處理該數據。

處理處理器間通信的方式是什么? 我應該使用哪種算法來做到這一點?

任何有關該文章的參考將不勝感激。

一切都取決於硬件。 如果您擁有的只是共享內存,而沒有其他通信方式,則您必須使用某種輪詢。

您的兩個處理器都運行Linux嗎? 他們如何處理共享內存? 一個好的解決方案是將鏈接列表用作fifo。 在此fifo上放置數據描述符,例如地址和大小。

例如,您可以有一個輸入和輸出fifo,如下所示:

  • 處理器A進行一些計算
  • 處理器A將數據描述符推送到輸出fifo
  • 處理器A等待輸入fifo上的數據描述符
  • 處理器B等待輸出fifo上的數據描述符

  • 處理器B處理數據
  • 處理器B將使用過的數據描述符推送到輸入fifo

當然,最困難的部分是鎖定。 也許您應該重新編寫您的問題,以強調這不是“標准” SMP。

如果您沒有原子測試並設置了內存上的可用位操作,那么我想您必須采用一種方案,其中某個內存區域僅對一個處理器寫入,而對另一個處理器僅讀取。

編輯:有關將消息從一個處理器傳遞到另一個處理器的方法,請參見Hasturkun答案,使用有序寫入而不是原子性來提供對某些預定義數據的序列化訪問。

好。 我理解這個問題。我已經解決了此類問題。

現在,您需要了解的第一件事是2個CPU之間存在的共享內存的工作。 由於可以通過不同的方式訪問這些共享內存,因此您需要確定最適合您的內存。

大多數情況下,將在共享內存中提供硬件信號燈以及硬件​​中斷,以通知從一個處理器到另一處理器的消息傳輸。

因此,首先看一下。

一個非常好的方法是僅使用套接字來回發送IP數據包。 這樣做的好處是您可以在芯片外進行測試-例如,如果您有網絡連接,則可以在PC上運行一個進程的測試版本。

如果兩個處理器都由一個操作系統管理,那么您可以使用任何標准IPC進行相互通信,因為操作系統可以處理所有事情。 如果它們在不同的操作系統上運行,那么套接字將是您的最佳選擇。

編輯

快速單向版:

  • 就緒標志
  • 完成標志

在里面:

init()
{
    ready = 0;
    done = 1;
}

作家:

send()
{
    while (!done)
        sleep();

    /* copy data in */
    done = 0;
    ready = 1;
}

讀者:

poll()
{
    while (1)
    {
        if (ready)
        {
            recv();
        }
        sleep();
    }
}

recv()
{
    /* copy data out */
    ready = 0;
    done = 1;
}

通過共享內存構建消息傳遞系統(應保持一致,通過對兩個處理器都進行不緩存,​​或使用緩存刷新/無效調用)。

您的共享內存結構應該(至少)具有以下字段:

  • 當前所有者
  • 消息處於活動狀態(應閱讀)
  • 請求使用情況字段

流大概是這樣的:(假設發送/接收同步,不要同時運行)

poll()
{
    /* you're better off using interrupts instead, if you have them */
    while(1)
    {
        if (current_owner == me)
        {
            if (active)
            {
                recv();
            }
            else if (!request[me] && request[other])
            {
                request[other] = 0;
                current_owner = other;
            }
        }
        sleep();
    }
}

recv()
{
    /* copy data... */
    active = 0;
    /* check if we still want it */
    if (!request[me] && request[other])
    {
        request[other] = 0;
        current_owner = other;
    }
}

send()
{
    request[me] = 1;
    while (current_owner != me || active)
    {
        sleep();
    }

    request[me] = 0;

    /* copy data in... */

    /* pass to other side */
    active = 1;
    current_owner = other;
}

如何使用共享內存?

我現在沒有很好的鏈接,但是如果您用google搜索IPC +共享內存,我敢打賭,您會找到一些不錯的信息:)

您確定需要這樣做嗎? 以我的經驗,最好讓編譯器和操作系統管理進程如何使用多個CPU。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM