標籤: 收購3c

  • 【algo&ds】8.最小生成樹

    【algo&ds】8.最小生成樹

    1.最小生成樹介紹

    什麼是最小生成樹?

    最小生成樹(Minimum spanning tree,MST)是在一個給定的無向圖G(V,E)中求一棵樹T,使得這棵樹擁有圖G中的所有頂點,且所有邊都是來自圖G中的邊,並且滿足整棵樹的邊權值和最小。

    2.prim算法

    和Dijkstra算法很像!!請看如下Gif圖,prim算法的核心思想是對圖G(V,E)設置集合S,存放已被訪問的頂點,然後每次從集合V-S中選擇與集合S的最短距離最小的一個頂點(記為u),訪問並加入集合S。之後,令頂點u為中間點,優化所有從u能到達的頂點v與集合s之間的最短距離。這樣的操作執行n次,直到集合s中包含所有頂點。

    不同的是,Dijkstra算法中的dist是從源點s到頂點w的最短路徑;而prim算法中的dist是從集合S到頂點w的最短路徑,以下是他們的偽碼描述對比,關於Dijkstra算法的詳細描述請

    算法實現:

    #include<iostream>
    #include<vector>
    #define INF 100000
    #define MaxVertex 105
    typedef int Vertex; 
    int G[MaxVertex][MaxVertex];
    int parent[MaxVertex];   // 並查集 
    int dist[MaxVertex]; // 距離 
    int Nv;    // 結點 
    int Ne;    // 邊 
    int sum;  // 權重和 
    using namespace std; 
    vector<Vertex> MST;  // 最小生成樹 
    
    // 初始化圖信息 
    void build(){
        Vertex v1,v2;
        int w;
        cin>>Nv>>Ne;
        for(int i=1;i<=Nv;i++){
            for(int j=1;j<=Nv;j++)
                G[i][j] = 0;  // 初始化圖 
            dist[i] = INF;   // 初始化距離
            parent[i] = -1;  // 初始化並查集 
        }
        // 初始化點
        for(int i=0;i<Ne;i++){
            cin>>v1>>v2>>w;
            G[v1][v2] = w;
            G[v2][v1] = w;
        }
    }
    
    // Prim算法前的初始化 
    void IniPrim(Vertex s){
        dist[s] = 0;
        MST.push_back(s);
        for(Vertex i =1;i<=Nv;i++)
            if(G[s][i]){
                dist[i] = G[s][i];
                parent[i] = s;
            } 
    }
    
    // 查找未收錄中dist最小的點 
    Vertex FindMin(){
        int min = INF;
        Vertex xb = -1;
        for(Vertex i=1;i<=Nv;i++)
            if(dist[i] && dist[i] < min){ 
                min = dist[i];
                xb = i;
            }
        return xb;
    }
    
    void output(){
        cout<<"被收錄順序:"<<endl; 
        for(Vertex i=1;i<=Nv;i++)
            cout<<MST[i]<<" ";
        cout<<"權重和為:"<<sum<<endl; 
        cout<<"該生成樹為:"<<endl; 
        for(Vertex i=1;i<=Nv;i++)
            cout<<parent[i]<<" ";
    }
    
    void Prim(Vertex s){
        IniPrim(s);
        while(1){
            Vertex v = FindMin();
            if(v == -1)
                break;
            sum += dist[v];
            dist[v] = 0;
            MST.push_back(v);
            for(Vertex w=1;w<=Nv;w++)
                if(G[v][w] && dist[w])
                    if(G[v][w] < dist[w]){
                        dist[w] = G[v][w];
                        parent[w] = v;
                    }
        }
    }
    
    
    int main(){
        build();
        Prim(1);
        output();
        return 0;
    } 

    關於prim算法的更加詳細講解請

    3.kruskal算法

    Kruskal算法也可以用來解決最小生成樹的問題,其算法思想很容易理解,典型的邊貪心,其算法思想為:

    • 在初始狀態時隱去圖中所有的邊,這樣圖中每個頂點都是一個單獨的連通塊,一共有n個連通塊
    • 對所有邊按邊權從小到大進行排序
    • 按邊權從小到大測試所有邊,如果當前測試邊所連接的兩個頂點不在同一個連通塊中,則把這條測試邊加入當前最小生成樹中,否則,將邊捨棄。
    • 重複執行上一步驟,直到最小生成樹中的邊數等於總頂點數減一 或者測試完所有邊時結束;如果結束時,最小生成樹的邊數小於總頂點數減一,說明該圖不連通。

    請看下面的Gif圖!

    算法實現:

    #include<iostream>
    #include<string>
    #include<vector>
    #include<queue>
    #define INF 100000
    #define MaxVertex 105
    typedef int Vertex; 
    int G[MaxVertex][MaxVertex];
    int parent[MaxVertex];   // 並查集最小生成樹 
    int Nv;    // 結點 
    int Ne;    // 邊 
    int sum;  // 權重和 
    using namespace std; 
    struct Node{
        Vertex v1;
        Vertex v2;
        int weight; // 權重 
        // 重載運算符成最大堆 
        bool operator < (const Node &a) const
        {
            return weight>a.weight;
        }
    };
    vector<Node> MST;  // 最小生成樹 
    priority_queue<Node> q;   // 最小堆 
    
    // 初始化圖信息 
    void build(){
        Vertex v1,v2;
        int w;
        cin>>Nv>>Ne;
        for(int i=1;i<=Nv;i++){
            for(int j=1;j<=Nv;j++)
                G[i][j] = 0;  // 初始化圖
            parent[i] = -1;
        }
        // 初始化點
        for(int i=0;i<Ne;i++){
            cin>>v1>>v2>>w;
            struct Node tmpE;
            tmpE.v1 = v1;
            tmpE.v2 = v2;
            tmpE.weight = w;
            q.push(tmpE); 
        }
    }
    
    //  路徑壓縮查找 
    int Find(int x){
        if(parent[x] < 0)
            return x;
        else
            return parent[x] = Find(parent[x]);
    } 
    
    //  按秩歸併 
    void Union(int x1,int x2){
        if(parent[x1] < parent[x2]){
            parent[x1] += parent[x2];
            parent[x2] = x1;
        }else{
            parent[x2] += parent[x1];
            parent[x1] = x2;
        }
    } 
    
    void Kruskal(){
        // 最小生成樹的邊不到 Nv-1 條且還有邊 
        while(MST.size()!= Nv-1 && !q.empty()){
            Node E = q.top();  // 從最小堆取出一條權重最小的邊
            q.pop(); // 出隊這條邊 
            if(Find(E.v1) != Find(E.v2)){  // 檢測兩條邊是否在同一集合 
                sum += E.weight; 
                Union(E.v1,E.v2);     // 並起來 
                MST.push_back(E);
            }
        }
        
    } 
    
    
    void output(){
        cout<<"被收錄順序:"<<endl; 
        for(Vertex i=0;i<Nv;i++)
            cout<<MST[i].weight<<" ";
        cout<<"權重和為:"<<sum<<endl; 
        for(Vertex i=1;i<=Nv;i++)
            cout<<parent[i]<<" ";
        cout<<endl;
    }
    
    
    int main(){
        build();
        Kruskal();
        output();
        return 0;
    } 

    關於kruskal算法更詳細的講解

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

  • I/O多路復用模型

    背景

    在文章中提到了五種I/O模型,其中前四種:阻塞模型、非阻塞模型、信號驅動模型、I/O復用模型都是同步模型;還有一種是異步模型。

    想寫一個系列的文章,介紹從I/O多路復用到異步編程和RPC框架,整個演進過程,這一系列可能包括:

    1. Reactor和Proactor模型
    2. 為什麼需要異步編程
    3. enable_shared_from_this用法分析
    4. 網絡通信庫和RPC

    為什麼有多路復用?

    多路復用技術要解決的是“通信”問題,解決核心在於“同步事件分離器”(de-multiplexer),linux系統帶有的分離器select、poll、epoll網上介紹的比較多,大家可以看看這篇介紹的不錯的文章:。通信的一方想要知道另一方的狀態(以決定自己做什麼),有兩種方法: 一是輪詢,二是消息通知。

    輪詢

    輪詢的一種典型的實現可能是這樣的:當然這裏的epoll_wait()也可以使用poll()或者select()替換。

    whiletrue) {
        active_stream[] = epoll_wait(epollfd)
        for i in active_stream[] {
            read or write till
        }
    }

    輪詢方式主要存在以下不足:

    • 增加系統開銷。無論是任務輪詢還是定時器輪詢都需要消耗對應的系統資源。
    • 無法及時感知設備狀態變化。在輪詢間隔內的設備狀態變化只有在下次輪詢時才能被發現,這將無法滿足對實時性敏感的應用場合。
    • 浪費CPU資源。無論設備是否發生狀態改變,輪詢總在進行。在實際情況中,大多數設備的狀態改變通常不會那麼頻繁,輪詢空轉將白白浪費CPU時間片。

    消息通知

    其實現方式通常是: “阻塞-通知”機制。阻塞會導致一個任務(task_struct,進程或者線程)只能處理一個”I/O流”或者類似的操作,要處理多個,就要多個任務(需要多個進程或線程),因此靈活性上又不如輪詢(一個任務足夠),很矛盾。

     

    select、poll、epoll對比

    矛盾的根源就是”一”和”多”的矛盾: 希望一個任務處理多個對象,同時避免處理阻塞-通知機制的內部細節。解決方案是多路復用(muliplex)。多路復用有3種基本方案,select()/poll()/epoll(),都是來解決這一矛盾的。

    • 通知代理: 用戶把需要關心的對象註冊給select()/poll()/epoll()函數。
    • 一對多: 所有的被關心的對象,只要有一個對象有了通知事件,select()/poll()/epoll()就會結束阻塞狀態。
    • 方便性: 用戶(程序員)不用再關心如何阻塞和被通知,以及哪些情況下會有通知產生。這件事情已經由上述幾個系統調用做了,用戶只需要實現”通知來了我該做什麼”。

     

    那麼上面3個系統調用的區別是什麼呢?
    第一個select(),結合了輪詢和阻塞兩種方式,沒有問題,每次有一個對象事件發生的時候,select()只是知道有事件發生了,具體是哪個對象發生的,不知道,需要從頭到尾輪詢一遍,複雜度是O(n)。poll函數相對select函數變化不大,只是提升了最大的可輪詢的對象個數。epoll函數把時間複雜度降到O(1)。

     

    為什麼select慢而epoll效率高?
    select()之所以慢,有幾個原因: select()的參數是一個FD數組,意味着每次select調用,都是一次新的註冊-阻塞-回調,每次select都要把一個數組從用戶空間拷貝到內核空間,內核檢測到某個對象狀態變化並寫入后,再從內核空間拷貝回用戶空間,select再把這個數組讀取一遍,並返回。這個過程非常低效。

    epoll的解決方案相當於是一種對select()的算法優化: 它把select()一個函數做的事情分解成了3步,首先epoll_create()創建一個epollfd對象(相當於一個池子),然後所有被監聽的fd通過epoll_ctrl()註冊到這個池子,也就是為每個fd指定了一個內部的回調函數(這樣,就沒有了每次調用時的來回拷貝,用戶空間的數組到內核空間只有這一次拷貝)。epoll_wait阻塞等待。在內核態有一個和epoll_wait對應的函數調用,把就緒的fd,填入到一個就緒列表中,而epoll_wait讀取這個就緒列表,做到了快速返回(O(1))。

    詳細的對比可以參考select、poll、epoll之間的區別總結:

     

    有了上面的原理介紹,這裏舉例來說明下epoll到底是怎麼使用的,加深理解。舉兩個例子:

    一個是比較簡單的父子進程通信的例子,單個小程序,不需要跑多個應用實例,不需要用戶輸入。
    一個是比較實戰的socket+epoll,畢竟現實案例中哪有兩個父子進程間通訊這麼簡單的應用場景。

    有了多路復用,難道還不夠?

    有了I/O復用,有了epoll已經可以使服務器併發幾十萬連接的同時,維持高TPS了,難道這還不夠嗎?答案是,技術層面足夠了,但在軟件工程層面卻是不夠的。例如,總要有個for循環去調用epoll,總來處理epoll的返回,這是每次都要重複的工作。for循環體裏面寫什麼—-通知返回之後,做事情的程序最好能以一種回調的機制,提供一個編程框架,讓程序更有結構一些。另一方面,如果希望每個事件通知之後,做的事情能有機會被代理到某個線程裏面去單獨運行,而線程完成的狀態又能通知回主任務,那麼”異步”的進制就必須被引入。

    所以,還有兩個問題要解決,一是”編程框架”,一是”異步”。我們先看幾個目前流行的框架,大部分框架已經包含了某種異步的機制。我們接下來的篇章將介紹“編程框架”和“異步I/O模型”。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • MySQL 5.7 – 通過 BINLOG 恢複數據

    MySQL 5.7 – 通過 BINLOG 恢複數據

    日常開發,運維中,經常會出現誤刪數據的情況。誤刪數據的類型大致可分為以下幾類:

    • 使用 delete 誤刪行
    • 使用 drop table 或 truncate table 誤刪表
    • 使用 drop database 語句誤刪數據庫
    • 使用 rm 命令誤刪整個 MySQL 實例。

    不同的情況,都會有其優先的解決方案:

    • 針對誤刪行,可以通過 Flashback 工具將數據恢復
    • 針對誤刪表或庫,一般採用通過 BINLOG 將數據恢復。
    • 而對於誤刪 MySQL 實例,則需要我們搭建 HA 的 MySQL 集群,並保證我們的數據跨機房,跨城市保存。

    本篇主要討論的內容是誤刪表或者庫,會先介紹有關 BINLOG 的操作命令,然後會對誤刪表的這種情況進行實際的模擬。

    BINLOG 常見操作命令

    BINLOG 的查詢方式一般分為兩種,一種是進入 MySQL 控制台進行查詢,另一種是通過 MySQL 提供的工具 mysqlbinlog 進行查詢,兩者的不同會在下面介紹。

    通過 MySQL Cli 查詢 BINLOG 信息

    在 cli 中,常見的命令如下:

    # 查詢 BINLOG 格式
    show VARIABLES like 'binlog_format';
    
    # 查詢 BINLOG 位置
    show VARIABLES like 'datadir';
    
    # 查詢當前數據庫中 BINLOG 名稱及大小
    show binary logs;
    
    # 查看 master 正在寫入的 BINLOG 信息
    show master status\G;
    
    # 通過 offset 查看 BINLOG 信息
    show BINLOG events in 'mysql-bin.000034' limit 9000,  10;
    
    # 通過 position 查看 binlog 信息
    show BINLOG events in 'mysql-bin.000034' from 1742635 limit 10;

    使用 show BINLOG events 的問題:

    • 使用該命令時,如果當前 binlog 文件很大,而且沒有指定 limit,會引發對資源的過度消耗。因為 MySQL 客戶端需要將 binlog 的全部內容處理,返回並显示出來。為了防止這種情況,mysqlbinlog 工具是一個很好的選擇。

    通過 mysqlbinlog 查詢 BINLOG 信息

    在介紹 mysqlbinlog 工具使用前,先來看下 BINLOG 文件的內容:

    # 查詢 BINLOG 的信息
    mysqlbinlog  --no-defaults mysql-bin.000034 | less
    # at 141
    #100309  9:28:36 server id 123  end_log_pos 245
      Query thread_id=3350  exec_time=11  error_code=0
    • at 表示 offset 或者說事件開始的起始位置
    • 100309 9:28:36 server id 123 表示 server 123 開始執行事件的日期
    • end_log_pos 245 表示事件的結束位置 + 1,或者說是下一個事件的起始位置。
    • exec_time 表示在 master 上花費的時間,在 salve 上,記錄的時間是從 Master 記錄開始,一直到 Slave 結束完成所花費的時間。
    • rror_code=0 表示沒有錯誤發生。

    在大致了解 binlog 的內容后,mysqlbinlog 的用途有哪些?:

    • mysqlbinlog 可以作為代替 cli 讀取 binlog 的工具。
    • mysqlbinlog 可以將執行過的 SQL 語句輸出,用於數據的恢復或備份。

    查詢 BINLOG 日誌:

    # 查詢規定時候后發生的 BINLOG 日誌
    mysqlbinlog --no-defaults --base64-output=decode-rows -v  --start-datetime  "2019-11-22 14:00:00" --database sync_test  mysql-bin.000034 | less

    導出 BINLOG 日誌,用於分析和排查 sql 語句:

    mysqlbinlog --no-defaults --base64-output=decode-rows -v  --start-datetime  "2019-11-22 14:00:00" --database sync_test  mysql-bin.000034 > /home/mysql_backup/binlog_raw.sql

    導入 BINLOG 日誌

    # 通過 BINLOG 進行恢復。
    mysqlbinlog --start-position=1038 --stop-position=1164 --database=db_name  mysql-bin.000034 | mysql  -u cisco -p db_name
    
    # 通過 BINLOG 導出的 sql 進行恢復。
    mysql -u cisco -p db_name < binlog_raw.sql.sql

    mysqlbinlog 的常用參數:

    • --database 僅僅列出配置的數據庫信息
    • --no-defaults 讀取沒有選項的文件, 指定的原因是由於 mysqlbinlog 無法識別 BINLOG 中的 default-character-set=utf8 指令
    • --offset 跳過 log 中 N 個條目
    • --verbose 將日誌信息重建為原始的 SQL 陳述。
      • -v 僅僅解釋行信息
      • -vv 不但解釋行信息,還將 SQL 列類型的註釋信息也解析出來
    • --start-datetime 显示從指定的時間或之後的時間的事件。
      • 接收 DATETIME 或者 TIMESTRAMP 格式。
    • --base64-output=decode-rows 將 BINLOG 語句中事件以 base-64 的編碼显示,對一些二進制的內容進行屏蔽。
      • AUTO 默認參數,自動显示 BINLOG 中的必要的語句
      • NEVER 不會显示任何的 BINLOG 語句,如果遇到必須显示的 BINLOG 語言,則會報錯退出。
      • DECODE-ROWS 显示通過 -v 显示出來的 SQL 信息,過濾到一些 BINLOG 二進制數據。

    MySQL Cli 和 mysqlbinlog 工具之間的比較

    如果想知道當前 MySQL 中正在寫入的 BINLOG 的名稱,大小等基本信息時,可以通過 Cli 相關的命令來查詢。

    但想查詢,定位,恢復 BINLOG 中具體的數據時,要通過 mysqlbinlog 工具,因為相較於 Cli 來說,mysqlbinlog 提供了 --start-datetime--stop-position 等這樣更為豐富的參數供我們選擇。這時 Cli 中 SHOW BINLOG EVENTS 的簡要語法就變得相形見絀了。

    使用 BINLOG 恢複數據

    恢復的大致流程如下:

    1. 會創建數據庫和表,並插入數據。
    2. 誤刪一條數據。
    3. 繼續插入數據。
    4. 誤刪表。
    5. 最後將原來以及之後插入的數據進行恢復。

    準備數據

    準備數據庫,表及數據:

    # 創建臨時數據庫
    CREATE DATABASE IF NOT EXISTS test_binlog default charset utf8 COLLATE utf8_general_ci; 
    
    
    # 創建臨時表
    CREATE TABLE `sync_test` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    # 添加數據
    insert into sync_test (id, name) values (null, 'xiaoa');
    insert into sync_test (id, name) values (null, 'xiaob');
    insert into sync_test (id, name) values (null, 'xiaoc');
    
    # 查看添加的數據
    select * from sync_test;

    刪除表或者數據

    誤刪操作:

    # 刪除 name=xiaob 的數據
    delete from sync_test where id=3
    
    # 插入幾條數據
    insert into sync_test (id, name) values (null, 'xiaod');
    insert into sync_test (id, name) values (null, 'xiaoe');
    insert into sync_test (id, name) values (null, 'xiaof');
    
    # 刪除表
    DROP TABLE sync_test;

    數據的恢復

    在執行數據恢復前,如果操作的是生產環境,會有如下的建議:

    • 使用 flush logs 命令,替換當前主庫中正在使用的 binlog 文件,好處如下:
      • 可將誤刪操作,定位在一個 BINLOG 文件中,便於之后的數據分析和恢復。
      • 避免操作正在被使用的 BINLOG 文件,防止發生意外情況。
    • 數據的恢復不要在生產庫中執行,先在臨時庫恢復,確認無誤后,再倒回生產庫。防止對數據的二次傷害。

    通常來說,恢復主要有兩個步驟:

    1. 在臨時庫中,恢復定期執行的全量備份數據。
    2. 然後基於全量備份的數據點,通過 BINLOG 來恢復誤操作和正常的數據。

    使用 BINLOG 做數據恢復前:

    # 查看正在使用的 Binlog 文件
    show master status\G;
    # 显示結果是: mysql-bin.000034
    
    # 執行 flush logs 操作,生成新的 BINLOG
    flush logs;
    
    # 查看正在使用的 Binlog 文件
    show master status\G;
    # 結果是:mysql-bin.000035

    確定恢複數據的步驟:

    這裏主要是有兩條誤刪的操作,數據行的誤刪和表的誤刪。有兩種方式進行恢復。

    • 方式一:首先恢復到刪除表操作之前的位置,然後再單獨恢復誤刪的數據行。
    • 方式二:首先恢復到誤刪數據行的之前的位置,然後跳過誤刪事件再恢複數據表操作之前的位置。

    這裏採用方式一的方案進行演示,由於是演示,就不額外找一個臨時庫進行全量恢復了,直接進行操作。

    查詢創建表的事件位置和刪除表的事件位置

    #  根據時間確定位置信息
    mysqlbinlog --no-defaults --base64-output=decode-rows -v  --start-datetime  "2019-11-22 14:00:00" --database test_binlog  mysql-bin.000034 | less

    創建表的開始位置:

    刪除表的結束位置:

    插入 name=’xiaob’ 的位置:

    # 根據位置導出 SQL 文件
    mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-position "2508132" --stop-position "2511004" --database test_binlog  mysql-bin.000034 > /home/mysql_backup/test_binlog_step1.sql
     
     
    mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-position "2508813" --stop-position "2509187" --database test_binlog  mysql-bin.000034 > /home/mysql_backup/test_binlog_step2.sql
     
    
    # 使用 mysql 進行恢復
    mysql -u cisco -p < /home/mysql_backup/test_binlog_step1.sql
    mysql -u cisco -p < /home/mysql_backup/test_binlog_step2.sql

    MySQL 5.7 中無論是否打開 GTID 的配置,在每次事務開啟時,都首先會出 GTID 的一個事務,用於并行複製。所以在確定導出開始事務位置時,要算上這個事件。

    在使用 –stop-position 導出時,會導出在指定位置的前一個事件,所以這裏要推后一個事務。

    對於 DML 的語句,主要結束位置要算上 COMMIT 的位置。

    總結

    在文章開始時,我們熟悉了操作 BINLOG 的兩種方式 CLI 和 mysqlbinlog 工具,接着介紹了其間的區別和使用場景,對於一些大型的 BINLOG 文件,使用 mysqlbinlog 會更加的方便和效率。並對 mysqlbinlog 的一些常見參數進行了介紹。

    接着通過使用 mysqlbinlog 實際模擬了數據恢復的過程,並在恢複數據時,提出了一些需要注意的事項,比如 flush logs 等。

    最後在恢複數據時,要注意 start-positionend-position 的一些小細節,來保證找到合適的位置。

    參考

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 網絡相關的命令工具研究報告

    網絡相關的命令工具研究報告

    主機配置:DHCP

      DHCP(動態主機配置協議),是在一台主機啟動后,第一個運行的客戶/服務器應用程序。換言之,當一台主機啟動后,如果它認為自己當前應當連接到因特網上,但又不知道自己的IP地址時,DHCP就以引導程序的身份發揮作用。

      每個連接到TCP/IP互聯網的計算機都必須知道自己的IP地址、一個路由器的IP地址、一個名字服務器的IP地址以及自己的子網掩碼這四種信息。

     DHCP分組格式:

     

     

    一、曾經使用過的協議

      在DHCP成為正式的主機配置協議之前,還有過一些其他的協議。

    1.RARP:

      在因特網時代的初期,人們曾設計了一個稱為逆地址解析協議(Reverse Address Resolution Protocol,RARP)來向被引導的主機提供IP地址。實際上,RARP是ARP的一個版本。ARP將一個IP地址映射為一個物理地址,而RARP則將一個物理地址映射成為一個IP地址。但是RARP已經被淘汰了,原因有兩個:首先,RARP利用了數據鏈路層的廣播服務,這也就表示每個網絡上都必須存在一台RARP服務器。第二,RARP只能提供計算機的IP地址,但如今的計算機需要前面提到的所有四種信息。

    2.BOOTP:

      引導程序協議(BOOTstrap Protocol,BOOTP)是DHCP的先驅。它是一個客戶/服務器協議,被設計用來克服RARP協議存在的缺陷。但是BOOTP是一個靜態配置協議,當客戶請求自己的IP地址時,BOOTP服務器就諮詢一張表,將客戶的物理地址映射成相應的IP地址。這就意味着客戶的物理地址和IP地址之間的綁定是已經存在的。這個綁定關係是事先設定好的。

      在某些場合,我們需要的是一個動態配置協議。例如,當一台主機從一個物理網絡移動到另一個物理網絡時,它的物理地址就改變了。再比如,有時候主機需要在某一段時間內使用一個臨時的IP地址。BOOTP無法處理這種狀況,因為物理地址和IP地址之間的綁定是靜態的,是固定存放在一張表中的,除非管理員更改這張表。

      而DHCP的設計就是為了解決這些不足之處。

    3. DHCP:

      動態主機配置協議(Dynamic Host Configuration Protocol,DHCP)是一種客戶/服務器協議,設計這個協議是為了將上述四種信息傳遞給無盤計算機或者第一次啟動的計算機。DHCP是BOOTP的繼承者,並且能夠兼容BOOTP。 

    二、DHCP操作

      DHCP客戶和DHCP服務器可以在同一個網絡上,也可以位於不同的網絡。

    1.DHCP客戶和DHCP服務器在同一個網絡

      雖然這種情況不是很常見,不過管理員可以把客戶和服務器放在同一個網絡中。如圖所示:

     

    這種情況的操作如下:

    (1)DHCP服務器在UDP端口67發出被動打開命令,等待客戶請求。

    (2)被引導的客戶在UDP端口68發出主動打開命令。這個報文被封裝成UDP用戶報,其目的端口是67,源端口號是68。這個UDP用戶數據報在封裝成IP數據包。客戶使用的是全0的源地址和全1的目的地址。

    (3)服務器或者用廣播報文,或者用單播報文來響應這個用戶,它使用了UDP源端口號67和目的端口68.這個響應可以是單播的,因為服務器知道客戶的IP地址,同時也知道客戶的物理地址,也就是說它不需要使用ARP的服務進行從邏輯地址到物理地址的映射。但是某些系統不允許旁路掉ARP,結果就要使用廣播地址。

    2. DHCP客戶和DHCP服務器在不同的網絡

    如圖所示:

     
      像其他應用層的進程一樣,客戶可以在某個網絡上,而服務器可以在相隔好幾個網絡之外的另一網絡上。這就帶來了一個必須要解決的問題。DHCP請求是廣播發送的,因為客戶不知道服務器的IP地址。而廣播的IP數據報不能通過任何路由器。路由器收到這樣的分組就丟棄它。

      要解決這個問題,就需要一个中介物。某台主機(或是一台能夠配置為在應用層工作的路由器)可以用來充當中繼。在這種情況下,該主機就稱為中繼代理。中繼代理知道DHCP服務器的單播地址,並在端口67監聽廣播報文。當它收到這種類型的分組后,就把它封裝成一個單播數據報,並且把此請求發送給DHCP服務器。攜帶了單播目的地址的分組可以被任何一個路由器轉發,最終到達DHCP服務器。DHCP服務器知道這個報文來自中繼代理,因為在請求報文中有一個字段定義了中繼代理的IP地址。中繼代理在收到回答后,再把它發送給DHCP客戶。 

    三、配置

      人們設計DHCP是為了提供靜態和動態的地址分配。

    1.靜態地址分配

      對於靜態地址分配,DHCP有一個專門的數據庫,可以靜態地吧物理地址綁定到IP地址。

    2.動態地址分配

      DHCP還有第二個數據庫,包括一個可用的IP地址池。第二個數據庫使DHCP成為動態的。當DHCP客戶請求臨時的IP地址時,DHCP服務器就從可用(即為使用的)IP地址池中取出一個IP地址進行指派,這個IP地址的使用時間長短可協商。

      當DHCP客戶想DHCP服務器發送請求是,服務器首先檢查它的靜態數據庫。若靜態數據庫中存在所請求物理地址的表項,則返回給這個客戶的永久IP地址。反之,若靜態數據庫中沒有這個表項,服務器就從可用IP地址池中選擇一個IP地址,並把這個地址指派給客戶,然後再把相應的表項加入到動態數據庫中。

      如果主機要從一個網絡移動到另一個網絡,或者與一個網絡時連時斷,那麼DHCP的這種動態特性就有了用武之地。DHCP可以在有限時間內提供一個臨時的IP地址。

    從地址池指派的地址都是臨時地址。DHCP服務器向客戶授予某一段時間內對該地址池的租用權。當租用時效過期,客戶或者停止使用這個IP地址,或者續租。服務器有權力選擇同意或不同意續租。若服務器不同意,客戶就停止使用這個地址。

    3.轉換狀態

      為了提供動態的地址分配,DHCP客戶可以像狀態機那樣從一個狀態轉換到另一個狀態,狀態轉換取決於收到的報文和發送的報文。在這種情況下,報文的類型是由包含在DHCP分組中的標記為53的選項來定義的。標記為53 的選項如圖所示:

     

    DHCP的不同狀態:

    (1)INIT狀態

      當DHCP客戶首次啟動時,它處於INIT狀態(初始化狀態)。客戶使用端口67廣播DHCPDISCOVER報文(一個帶有DHCPDISCOVER選項的請求報文)。

    (2)SELECTING狀態

      在發送DHCPDISCOVER報文後,客戶就進入SELECTING(選擇)狀態。能夠提供這種類型服務的服務器要用DHCPOFFER報文進行相應。在此類報文中,服務器提供了一個IP地址。它們還要提供租用時間長度,其默認值是1小時。在發送DHCPOFFER報文的服務器,把提供的IP地址鎖定,使這個地址不會再提供給任何其他的客戶。客戶選擇所提供的地址中的一個,並向所選擇的服務器發送DHCPREQUEST報文。然後就進入REQUESTING狀態。如果客戶沒有收到DHCPOFFER報文,它還要再嘗試四次,每一次間隔2秒。如果對這些DHCPDISCOVER都沒有收到回答,客戶就睡眠5分鐘后再試。

    (3)REQUESTING狀態

      客戶保持在這個REQUESTING(請求)狀態,直至它收到來自服務器的DHCPACK報文為止,這個報文創建了客戶物理地址和它的IP地址之間的綁定。客戶收到DHCPACK報文後進入BOUND狀態。

    (4)BOUND狀態

      在這種狀態下,客戶可以使用該IP地址,直到租用時間到期。當到達租用時間的50%時,客戶就再發送一個DHCPREQUEST報文以請求更新。於是,客戶進入RENEWING。在BOUND(綁定)狀態時,客戶也可以取消租用,並進入到初始化狀態。

    (5)RENEWING狀態

      客戶保持在RENEWING(更新)狀態,直至下面兩個事件之一發生。客戶可以收到更新租用協定的DHCPACK報文。在這種情況下,客戶把計時器複位,然後回到BOUND狀態。或者,如果沒有收到DHCPACK,同時到達租用時間的87.5%時,客戶就進入REBINDING狀態。

    (6)REBINDING狀態

      客戶保持在REBINDING(重新綁定)狀態,直至下面三個事件之一發生。若客戶收到一個DHCPNACK報文或者租用時間到期,則回到初始化狀態,並嘗試得到另一個IP地址。若客戶收到DHCPACK報文,它就進入綁定狀態,並把計時器複位。

    DHCP不同狀態的轉換圖:

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

  • 高性能網絡通訊原理

    高性能網絡通訊原理

    目錄

    高性能網絡通訊原理

    前言

    本來想對netty的源碼進行學習和探究,但是在寫netty之前許多底層的知識和原理性的東西理解清楚,那麼對學習網絡通訊框架的效果則會事半功倍。

    本篇主要探討高性能網絡通訊框架的一些必要知識和底層操作系統相關的原理。在探討如何做之前,我們先討論下為什麼要做。

    隨着互聯網的高速發展,用戶量呈指數形式遞增,從原來的PC普及到現在的移動設備普及。用戶量都是千萬甚至億為單位計算,尤其是實時通訊軟件,在線實時互動的應用出現,在線用戶數從原來的幾十上百到後來的上萬甚至上千萬。單台服務的性能瓶頸和網絡通訊瓶頸慢慢呈現。應用架構從單應用到應用數據分離,再到分佈式集群高可用架構。單台服務的性能不足可以通過構建服務集群的方式水平擴展,應用性能瓶頸被很好的解決。但是橫向擴展帶來了直接的經濟成本。

    一個高性能的網絡通訊框架從硬件設備到操作系統內核以及用戶模式都需要精心設計。只要有任何地方有疏漏都會出現短板效應。

    I/O訪問

    當我們在讀取socket數據時,雖然我們在代碼僅僅是調用了一個Read操作,但是實際操作系統層面做了許多事情。首先操作系統需要從用戶模式轉換為內核模式,處理器會通過網卡驅動對網卡控制器進行操作,網卡控制器則控制網卡。

    處理器不會直接操控硬件。

    為了提高CPU利用率,I/O訪問方式也發生了很大變化。

    1. 早期的CPU直接控制外圍設備,後來增加了控制器或I/O模塊。處理器開始將I/O操作從外部設備接口分離出來。處理器通過向I/O模塊發送命令執行I/O指令。然而當I/O操作完成時並不會通知處理器I/O,因此處理器需要定時檢查I/O模塊的狀態,它會進行忙等待,因此效率並不高。
    2. 後來CPU支持了中斷方式,處理器無需等待執行I/O操作,通過中斷控制器產生中斷信號通知I/O操作完成,大大的提高了處理器利用效率。這時的I/O操作使用特定的in/out(I/O端口)指令或直接讀寫內存的方式(內存映射I/O)。但是這些方式都需要處理器使用I/O寄存器逐個內存單元進行訪問,效率並不高,在I/O操作時需要消耗的CPU時鐘周期。
    3. 為了提高效率,後來增加了DMA控制器,它可以模擬處理起獲得內存總線控制權,進行I/O的讀寫。當處理器將控制權交給DMA控制器之後,DMA處理器會先讓I/O硬件設備將數據放到I/O硬件的緩衝區中,然後DMA控制器就可以開始傳輸數據了。在此過程中處理器無需消耗時鐘周期。當DMA操作完成時,會通過中斷操作通知處理器。

    I/O訪問的發展趨勢是盡可能減少處理器干涉I/O操作,讓CPU從I/O任務中解脫出來,讓處理器可以去做其他事情,從而提高性能。

    對於I/O訪問感興趣的同學可以看《操作系統精髓與設計原理(第5版)》第十一章I/O管理相關內容和《WINDOWS內核原理與實現》第六章I/O論述相關內容

    I/O模型

    在討論I/O模型之前,首先引出一個叫做C10K的問題。在早期的I/O模型使用的是同步阻塞模型,當接收到一個新的TCP連接時,就需要分配一個線程。因此隨着連接增加線程增多,頻繁的內存複製,上下文切換帶來的性能損耗導致性能不佳。因此如何使得單機網絡併發連接數達到10K成為通訊開發者熱門的討論話題。

    同步阻塞

    前面提到,在最原始的I/O模型中,對文件設備數據的讀寫需要同步等待操作系統內核,即使文件設備並沒有數據可讀,線程也會被阻塞住,雖然阻塞時不佔用CPU始終周期,但是若需要支持併發連接,則必須啟用大量的線程,即每個連接一個線程。這樣必不可少的會造成線程大量的上下文切換,隨着併發量的增高,性能越來越差。

    select模型/poll模型

    為了解決同步阻塞帶來線程過多導致的性能問題,同步非阻塞方案產生。通過一個線程不斷的判斷文件句柄數組是否有準備就緒的文件設備,這樣就不需要每個線程同步等待,減少了大量線程,降低了線程上下文切換帶來的性能損失,提高了線程利用率。這種方式也稱為I/O多路復用技術。但是由於數組是有數組長度上限的(linux默認是1024),而且select模型需要對數組進行遍歷,因此時間複雜度是\(O_{(n)}\)因此當高併發量的時候,select模型性能會越來越差。

    poll模型和select模型類似,但是它使用鏈表存儲而非數組存儲,解決了併發上限的限制,但是並沒有解決select模型的高併發性能底下的根本問題。

    epoll模型

    在linux2.6支持了epoll模型,epoll模型解決了select模型的性能瓶頸問題。它通過註冊回調事件的方式,當數據可讀寫時,將其加入到通過回調方式,將其加入到一個可讀寫事件的隊列中。這樣每次用戶獲取時不需要遍歷所有句柄,時間複雜度降低為\(O_{(1)}\)。因此epoll不會隨着併發量的增加而性能降低。隨着epoll模型的出現C10K的問題已經完美解決。

    異步I/O模型

    前面講的幾種模型都是同步I/O模型,異步I/O模型指的是發生數據讀寫時完全不同步阻塞等待,換句話來說就是數據從網卡傳輸到用戶空間的過程時完全異步的,不用阻塞CPU。為了更詳細的說明同步I/O與異步I/O的區別,接下來舉一個實際例子。

    當應用程序需要從網卡讀取數據時,首先需要分配一個用戶內存空間用來保存需要讀取的數據。操作系統內核會調用網卡緩衝區讀取數據到內核空間的緩衝區,然後再複製到用戶空間。在這個過程中,同步阻塞I/O在數據讀取到用戶空間之前都會被阻塞,同步非阻塞I/O只知道數據已就緒,但是從內核空間緩衝區拷貝到用戶空間時,線程依然會被阻塞。而異步I/O模型在接收到I/O完成通知時,數據已經傳輸到用戶空間。因此整個I/O操作都是完全異步的,因此異步I/O模型的性能是最佳的。

    在我的另一篇文章對windows操作系統I/O原理做了簡要的敘述,感興趣的同學可以看下。

    I/O線程模型

    從線程模型上常見的線程模型有Reactor模型和Proactor模型,無論是哪種線程模型都使用I/O多路復用技術,使用一個線程將I/O讀寫操作轉變為讀寫事件,我們將這個線程稱之為多路分離器。

    對應上I/O模型,Reacor模型屬於同步I/O模型,Proactor模型屬於異步I/O模型。

    Reactor模型

    在Reactor中,需要先註冊事件就緒事件,網卡接收到數據時,DMA將數據從網卡緩衝區傳輸到內核緩衝區時,就會通知多路分離器讀事件就緒,此時我們需要從內核空間讀取到用戶空間。

    同步I/O採用緩衝I/O的方式,首先內核會從申請一個內存空間用於存放輸入或輸出緩衝區,數據都會先緩存在該緩衝區。

    Proactor模型

    Proactor模型,需要先註冊I/O完成事件,同時申請一片用戶空間用於存儲待接收的數據。調用讀操作,當網卡接收到數據時,DMA將數據從網卡緩衝區直接傳輸到用戶緩衝區,然後產生完成通知,讀操作即完成。

    異步I/O採用直接輸入I/O或直接輸出I/O,用戶緩存地址會傳遞給設備驅動程序,數據會直接從用戶緩衝區讀取或直接寫入用戶緩衝區,相比緩衝I/O減少內存複製。

    總結

    本文通過I/O訪問方式,I/O模型,線程模型三個方面解釋了操作系統為實現高性能I/O做了哪些事情,通過提高CPU使用效率,減少內存複製是提高性能的關鍵點。

    參考文檔

    1. 《操作系統精髓與設計原理(第5版)》
    2. 《WINDOWS內核原理與實現》

    微信掃一掃二維碼關注訂閱號傑哥技術分享
    出處:
    作者:傑哥很忙
    本文使用「CC BY 4.0」創作共享協議。歡迎轉載,請在明顯位置給出出處及鏈接。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 馬斯克遇程咬金,第一台電動卡車不姓特斯拉

    馬斯克遇程咬金,第一台電動卡車不姓特斯拉

    馬斯克近日才剛在推特上表示,近期將推出全電動的半掛式卡車,令市場相當的看好,然而如今第一個達成創舉的廠商,卻不是特斯拉。

    特斯拉將在9 月發表載貨用的全電動半掛卡車(Tesla Semi)原型,雖然業界一直在質疑其負載及續航力,不過若成功的話也等於是對市場投下一個震撼彈。畢竟相較汽柴油車的引擎,電動車的維護成本較低,假如電池成本也持續降低,在配合環保法規的情況下,相當的有市場。

    不過如今一家原本專做柴油及天然氣發動機的龍頭廠商康明斯(Cummins)推出了相當於第7 級重型卡車的電動車,其配備了先進的140 kWh 的電池組,並預計將於2019 年開始交付給客戶。這台卡車被命名為AEOS,應該是取意於希臘神話中替太陽神阿波羅拉車的火焰飛馬。

     

    AEOS in motion: Raw footage of our first fully electric heavy duty demonstration Urban Hauler Tractor.

    — Cummins Inc. (@Cummins)

     

    且Cummins 也能僅提供動力系統總成,將可應用於電動巴士等其他車型。電動巴士製造商 Proterra 的總裁Ryan Popple 指出,這是相當令人震驚的消息,是邁向完全電氣化交通的一大步,隨著各國正積極修訂法規鼓勵電動車,目前這方面的市場相當大,巴士及校車等訂單幾乎滿載。

    據Cummins 表示,這輛電動卡車動力總成與一般柴油車相當,可牽引4,4000 磅的重量,近20 噸,單次充電可行駛約100 英里,並可加掛額外的電池組將行程擴展到300 英里,還可安裝太陽能電池板,還有再生制軔(Regenerative brake)及低阻力輪胎的研發將可望進一步提昇其行駛距離。目前的充電站設計,將可在1 小時內充滿,而Cummins 的目標是希望,能夠在2020 年以前,將充電時間縮短到20 分鐘。

    不過Cummins 的執行長Thomas Linebarger 也坦言,依目前電池科技的進展,第7 級重型卡車的應用已是極限,第8 級的重型拖車目前仍遙遙無期。所以也將推出同型的高效率柴油引擎及混合動力車款。儘管有所突破,但目前電動系統仍較適用於商用卡車,Cummins 一舉超越特斯拉也同樣宣示了將進軍此市場的意圖。

    當然特斯拉就算被搶得頭籌,也不代表無法反擊,據之前透露的消息,其產品可能將定位於行程達200-300 英里的運輸範圍,性能可能比AEOS 還強。但Cummins 此舉或許更大意義在於強調,他們這些傳統龍頭,儘管受到挑戰,仍有相當強的底蘊,在不同動力系統的研發上,有超乎市場想像的潛力。

    (合作媒體:。圖片出處:)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 電動車需求高、鋰價漲,澳洲Orocobre擴產

    電動車需求高、鋰價漲,澳洲Orocobre擴產

    澳洲礦商Orocobre Limited聲稱鋰礦需求強、報價攀高,將擴產碳酸鋰,消息傳來激勵股價在8月31日飆高。

    Barron’s.com、The Australian報導,Orocobre公布的全年度財報首度轉虧為盈,淨利來到1,940萬美元、遠優於去年的淨損2,200萬美元,而用於電池等工業產品的碳酸鋰,也將擴充產能。

    Orocobre估計,2018會計年度的碳酸鋰產出,將從2017年度的11,862公噸擴充到14,000公噸,而2018年度的碳酸鋰均價,每噸則有望超過1萬美元。該公司在2017年度共計售出12,296公噸的碳酸鋰,每噸均價為9,763美元,4-6月當季的均價則是10,696美元,生產成本為3,710美元。

    執行長Richard Seville說,全球鋰礦市場的基本面依舊穩健,不但需求強勁、供給吃緊,報價也相當具有吸引力。為了滿足特定電池夥伴的需求,Orocobre會分階段擴充Olaroz鋰礦廠的產能。

    依據Orocobre計畫,位於阿根廷的Olaroz鋰礦廠,產能料將倍增。另外,該公司還會跟豐田通商(Toyota Tsusho Corporation)一同打造一座廠房,預計將年產10,000公噸的氫氧化鋰(lithium hydroxide)。

    採用鋰電池的電動車需求日增、電池榮景全無降溫跡象,隨著鋰礦供給愈來愈難尋、未來恐有短缺之虞。

    OilPrice.com 8月22日報導,特斯拉(Tesla Inc.)內華達州的Gigafactory超級電池廠,估計一年要生產50萬顆車用電池,另外還有諸多車用鋰電池廠也在加緊趕工,顯示未來鋰礦的需求將只增不減,且大部分將來自中國。全球如今有51%的鋰電池是在中國生產,僅10%產自美國。據統計,大陸業者規劃中的車用電池廠,產能預料會在2021年底前達到120億瓦小時(GW hours),是特斯拉內華達州電池廠的三倍之多。

    然而,採集鋰礦在技術上其實有相當難度,成本不但高昂,且由於採礦過程牽涉到蒸餾法,產出也頗難預估。Orocobre在阿根廷北部設立的新礦場,鋰礦產出就比預期少逾20%。

    假如鋰礦產能無法順利擴充、或是新開礦場產出不如預期,那麼電動車的榮景可能因而受阻。Electrek報導,福斯汽車(Volkswagen)研發部主管Ulrich Eichhorn 6月底就曾預估,業界需要多達40座規模跟特斯拉Gigafactory類似的超大電池廠,才能滿足電動車需求,假如新建礦場、工廠無法如期上線,那麼市場恐陷入短缺。

    (本文內容由授權使用。圖片出處:public domain CC0)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

  • 孫宇晨回顧區塊鏈歷程:不走熱點走心

    孫宇晨回顧區塊鏈歷程:不走熱點走心

      10 月 26 日上午,波場創始人孫宇晨發布微博回顧其投身區塊鏈過程,在經歷了王小川口水仗、巴菲特天價午餐之後,孫宇晨稱不走熱點說些走心的話,“2013 年回國推廣區塊鏈,那時慘到連區塊鏈這個詞都不存在,六年了,我們沒成先烈,還活着。對於區塊鏈造福每个中國人的未來,即便在公司即將倒閉的夜晚,我都從未懷疑。”

      在孫宇晨看來,區塊鏈是互聯網的 2.0 形態,互聯網的 1.0 形態是信息網絡,而 2.0 形態是價值網絡。互聯網第一步傳播信息,就如同今天的互聯網,第二步傳播價值,價值包括通證:貨幣、股票、債券等所有人類的價值所有物。

      在長文最後,孫宇晨表示:“互聯網已經到了下半場,區塊鏈卻還沒開始預備賽。對於即將打響的預備賽,我想說,我準備好了!”

      以下為孫宇晨微博全文:

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 首發!Apache Flink乾貨合集打包好了,速來下載

    首發!Apache Flink乾貨合集打包好了,速來下載

      最近的一份市場調查報告显示,Apache Flink 是 2018 年開源大數據生態中發展“最快”的引擎,和 2017 年相比增長了 125% 。為了讓大家更為全面地了解 Flink,我們製作了一本电子乾貨合集:《不僅僅是流計算:Apache Flink 實踐》,融合了 Apache Flink 在國內各大頂級互聯網公司的大規模實踐,希望對大家有所幫助。

      在這本合集里,你可以了解到:

      Flink 如何為整個阿里集團平穩度過雙十一立下汗馬功勞?

      如何為滿足滴滴極為複雜的業務需求提供簡單直觀的 API 支持?

      如何在字節跳動逐步取代原有的 JStorm 引擎,成為公司內部流式數據處理的唯一標準?

    《不僅僅是流計算:Apache Flink 實踐》目錄一覽

      下載地址:

      https://102.alibaba.com/downloadFile.do?file=1543409877893%2fApache+Flink.pdf

      Apache Flink 已經被業界公認是最好的流計算引擎。然而 Flink 的計算能力不僅僅局限於做流處理。Apache Flink 的定位是一套兼具流、批、機器學習等多種計算功能的大數據引擎。在最近的一段時間,Flink 在批處理以及機器學習等諸多大數據場景都有長足的突破。此次專刊,旨在對 Flink 在大數據智能計算方面做一些簡要的介紹。後續我們還將發布更多關於 Flink 在新場景的應用乾貨。

      下面,我們邀請阿里資深技術專家、Apache Flink Committer 王紹翾老師(花名“大沙”),帶領大家走進 Flink 的世界。

      在全面介紹 Flink 的新進展之前,我先來介紹一些大數據和人工智能計算的背景。大數據計算的種類非常多,比較典型的,且被大規模使用的主要是 3 種類型:

    • 批計算

    • 流計算

    • 交互式分析計算

      批計算的特點是要計算的數據量比較大,但是往往對延遲不是特別敏感。流計算對延遲的要求非常高,這些作業的查詢 query 往往是固定的。因此流計算作業往往需要提前調度起來,一旦數據到來就可以做快速的處理,節省了調度的開銷。

      最後一種是交互式分析,這種類型的大數據計算的特點是用戶的查詢 query 是不固定的,這些 query 往往是由用戶隨機的發出的。雖然查詢不固定,在這種場景下,用戶對查詢的返回時間是有一定的要求的,這個時間介於批處理和流處理之間,越快越好,最好能做到秒級。

      人工智能計算的種類很多,但是整體架構大多和上圖所描述的類似。一個常見的 ML pipeline 通常涉及一系列的數據預處理、特徵提取和轉換、模型訓練以及驗證。如果驗證后的效果符合預期,就可以將模型推到線上服務。如果不符合預期,算法工程師就需要調整算法模型或者參數,然後再做一次模型的訓練和驗證,直到對結果滿意后,再將訓練好的模型推上線服務。整個計算過程可以是對一個確定大小的數據按照批計算模式計算,也可以接入實時數據按照流計算模式進行計算。上面這個 pipeline 是人工智能計算最基礎的流程,如果算法工程師對數據以及業務特點非常熟悉,他們就能設計出合理的算法模型和參數。但是往往更常見的情況是,算法工程師需要分析工具幫助他們理解數據。只有在很好地理解了數據特點之後,才能提取出更有用的特徵,設計出更好的模型。因此,如下圖所示,做好人工智能計算,不可或缺的一部分就是交互式分析。有了交互式分析,算法工程師可以對數據做各種 ad-hoc query,從而幫助他們更好地理解數據。

      綜上所述,可以看出人工智能計算和大數據計算是密不可分的。雖然人工智能計算變得越來越炙手可熱,人們越來越多的提及人工智能而不是大數據,但是我們不能忘記,人工智能計算的基礎是大數據計算,沒有大數據計算提供算力和功能,人工智能計算只能停留在紙上談兵的階段。接下來,我把基於大數據計算的人工智能計算簡稱為“大數據智能計算”。

      大數據和 AI 全景–2018(來源:http://mattturck.com/bigdata2018/)

      那麼怎麼來搭建一套大數據智能計算系統呢?http://mattturck.com 收集了所有大數據和 AI 的軟件和平台。上面提到的每一種大數據計算場景都有好幾種軟件的選擇,調研和選型這些軟件本身就是一項巨大的工程。即使最後為每一套場景都選型了一種軟件,那麼後期的開發迭代和運維也難做到高效。因為每一套軟件都需要專門的開發和運維團隊負責,無論是在人力還是機器資源上都不能橫向打通,勢必會造成浪費。

      因此,阿里巴巴一直在思考是否可能有一套計算引擎解決如上的所有問題。經過仔細的選型,我們選擇了 Apache Flink,並圍繞着 Flink 在打造一款通用計算引擎。Flink 已經被業界公認是最好的流計算引擎。

      它所具有的低延遲、高吞吐、保障 Exactly-once 的計算模式,使得它具有金融級的大數據處理能力。在批處理方面,基於流式的 flow 來處理批數據有着潛在的優勢和擴展性。阿里巴巴利用 Flink 的天然特性,做了若干批計算方面的優化,使得 Flink 也成為了一款性能卓越的批計算引擎。在人工智能和交互式分析方面,我們也在逐步地完善 Flink 的易用性,生態,以及性能。另外,不得不提的是,Flink 的流處理架構還天然的適合於正在快速崛起的本質更像流計算的 IoT 的場景。

      Flink 的社區和生態一直在壯大。在流計算和批計算等場景慢慢使用 Flink 成為主流的同時,我們期望設計和推廣出更多更完善的批流融合的場景。所有對 Lamda 架構有訴求的應用應該都可以用 Flink 完美的解決。早期的 Lamda 架構的設計也許很快會成為歷史。

      在易用性和生態方面,我們一方面幫助 Flink 社區在 tableAPI,Python,以及 ML 等諸多領域發力,持續提升用戶做 Data science 和 AI 計算的體驗。另一方面,我們也在努力完善 Flink 和其他開源軟件的融合,包括 Hive,以及 Notebook(Zeppelin, Jupyter)等等。這些諸多的努力,都是為了最終實現我們“一套引擎完美解決大數據智能計算”的初衷。Apache Flink 自 2014 年開源至今也才 4 年,我們期待更多的企業和開發者們和我們一起參與到 Apache Flink 的社區和生態建設中來,共同把它打造成為全球最一流的開源大數據引擎。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

  • 谷歌打擊流氓索權APP:限制第三方移動軟件訪問用戶數據

    谷歌打擊流氓索權APP:限制第三方移動軟件訪問用戶數據

      騰訊科技訊,手機軟件的“流氓索權”行為遭到了全球輿論的炮轟,媒體譴責流氓軟件大肆採集用戶的隱私信息,侵犯消費者權益。據外媒最新消息,谷歌最近宣布了一項新政策,對於違規採集手機短信和通話記錄的軟件,將做出撤架的懲罰。谷歌也將允許通話有關的軟件,繼續訪問用戶數據。

      據國外媒體報道,為了應對谷歌社交網絡 Google+ 之前爆出的隱私漏洞,該公司宣布了“閘門計劃”,準備限制第三方移動軟件訪問用戶數據,保護消費者隱私權已。

      谷歌規定,在安卓操作系統中,只有特定的客戶端軟件才能夠訪問用戶的短信和通話記錄。據報告,谷歌日前正式對外宣布,該公司將很快開始刪除發現違反規定的 Play 軟件商店中的應用程序。

      在很大程度上,谷歌希望將安卓手機上的短信記錄和通話歷史訪問權限限定於特定的安卓軟件,其中包括短信工具和撥號軟件。谷歌準備限制其他和通信功能無關的應用軟件採集用戶的通信歷史。

      谷歌公司表示:“我們的新政策旨在確保請求這些權限的應用程序對敏感數據進行全面和持續的訪問,以完成應用程序的主要使用功能,並確保用戶理解為什麼應用程序需要這些數據才能運行。”

      自去年 10 月以來,谷歌一直通過电子郵件與安卓應用軟件開發者聯繫,給他們 90 天的時間讓他們的應用程序符合最新規定的要求,或者請求谷歌破例待遇。谷歌規定允許開發人員在 3 月 9 日之前進行軟件更新,調整採集用戶數據的權限。

      該公司日前分享了在法規遵循方面的一些進展,包括最近幾個月如何根據開發人員的反饋擴展批準的應用軟件清單。“數以萬計的開發人員”要麼更新了應用程序以遵循新的政策,要麼請求擴展。谷歌還指出,它自己的應用程序也遵循同樣的標準。據悉,對破例情況進行審查的過程如下:

      ——普通用戶可能會理解為什麼這類應用程序需要完全訪問數據。

      ——該功能的用戶優勢。

      ——與應用程序的核心功能相關的權限的重要性。

      ——使用此用例的所有應用程序都存在訪問此敏感數據的風險。

      ——啟用該功能的備選方案的可用性。

      雖然某些使用功能不再被允許,但谷歌公司指出,該公司審核的許多安卓應用軟件,可以通過一個範圍更窄的軟件開發接口(API)來實現軟件的某些功能,而不是要求獲得訪問用戶隱私的權限。

      谷歌舉例說,使用短信功能進行用戶身份認證的開發人員可以選擇使用 SMS Shareever API,而希望使用短信功能共享內容的應用程序可以預先填充一條消息,並觸發默認的 SMS 應用程序加以显示。

      谷歌也表示,與此同時,未請求功能擴展的安卓應用程序將在“未來幾周內”從谷歌 Play 軟件商店中刪除。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!