高併發大流量專題---八、動態語言的併發處理

高併發大流量專題---八、動態語言的併發處理

1、總結

一句話總結:

和本科畢業論文連起來了:基於消息中間件Rocket MQ的研究;用於併發處理的消息隊列

 

一、什麼是進程、線程、協程?

進程(Process)是計算機中的【程序關於某數據集合上的一次運行活動】,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎
線程,有時被稱爲【輕量級進程】(Lightweight Process,LWP),是程序執行流的最小單元。
協程是一種【用戶態的輕量級線程】,協程的調度徹底由用戶控制。協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快。

 

 

二、進程的三態模型(多道程序系統中,進程在處理器上交替運行,狀態不斷地發生變化)?

運行、就緒、阻塞

運行:當一個進程在處理機上運行時,則稱該進程處於運行狀態。處於此狀態的進程的數目小於等於處理器的數目,對於單處理機系統,處於運行狀態的進程只有一個。在沒有其餘進程能夠執行時(如全部進程都在阻塞狀態),一般會自動執行系統的空閒進程。
就緒:當一個進程得到了除處理機之外的一切所需資源,一旦獲得處理機便可運行,則稱此進程處於就緒狀態。就緒進程能夠按多個優先級來劃分隊列。例如,當一個進程因爲時間片用完而進入就緒狀態時,排入低優先級隊列;當進程由I/O操做完成而進入就緒狀態時,排入高優先級隊列。
阻塞:也稱爲等待或睡眠狀態,一個進程正在等待某一事件發生(例如請求I/O而等待I/O完成等)而暫時中止運行,這時即便把處理機分配給進程也沒法運行,故稱該進程處於阻塞狀態。php

 

三、進程的五態模型(對於一個實際的系統,進程的狀態及其轉換更爲複雜)?

新建態、活躍就緒/靜止就緒、運行、活躍阻塞/靜止阻塞、終止態

新建態:對應於進程剛剛被建立時沒有被提交的狀態,並等待系統完成建立進程的全部必要信息。
終止態:進程已結束運行,回收除進程控制塊以外的其餘資源,並讓其餘進程從進程控制塊中收集有關信息。
活躍就緒:是指進程在主存而且可被調度的狀態。
靜止就緒(掛起就緒):是指進程被對換到輔存時的就緒狀態,是不能被直接調度的狀態,只有當主存中沒有活躍就緒態進程,或者是掛起就緒態進程具備更高的優先級,系統將把掛起就緒態進程調回主存並轉換爲活躍就緒。
活躍阻塞:是指進程已在主存,一旦等待的事件產生便進入活躍就緒狀態。
靜止阻塞:進程對換到輔存時的阻塞狀態,一旦等待的事件產生便進入靜止就緒狀態。react

 

 

四、操做系統中線程的概念爲何被引進?

因爲用戶的併發請求,爲每個請求都建立一個進程顯然是行不通的,從系統資源開銷方面或是響應用戶請求的效率方面來看。所以操做系統中線程的概念便被引進了。

 

五、線程的特色?

線程是進程中的一個實體:是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點兒在運行中必不可少的資源但它可與同屬一個進程的其它線程共享進程所擁有的所有資源。
一個線程能夠建立和撤消另外一個線程:同一進程中的多個線程之間能夠併發執行。
線程是程序中一個單一的順序控制流程:進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。

 

六、多線程是什麼?

在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。

 

七、線程和進程的數量關係?

每個程序都至少有一個線程,若程序只有一個線程,那就是程序自己。

 

八、線程的狀態?

就緒、阻塞、運行

就緒狀態:線程具有運行的全部條件,邏輯上能夠運行,在等待處理機。
運行狀態:線程佔有處理機正在運行。
阻塞狀態:線程在等待一個事件(如某個信號量),邏輯上不可執行。web

 

九、線程與進程的區別?

1.線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間
2.進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
3.線程是處理器調度的基本單位,但進程不是
4.每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制


1.線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間
2.進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
3.線程是處理器調度的基本單位,但進程不是
4.兩者都可併發執行
5.每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制數據庫

 

十、線程與協程的區別?

1.一個線程能夠多個協程,一個進程也能夠單獨擁有多個協程
2.線程進程都是同步機制,而協程則是異步
3.協程能保留上一次調用時的狀態,每次過程重入時,就至關於進入上一次調用的狀態

 

十一、什麼是多進程、多線程?

多進程:同一個時間裏,同一個計算機系統中若是容許兩個或兩個以上的進程處於運行狀態,這就是多進程。邊看慕課網視頻,邊使用WebIDE;多開一個進程,多分配一份資源,進程間通信不方便
多線程:線程就是把一個進程分爲不少片,每一片均可以是一個獨立的流程。與多進程的區別是隻會使用一個進程的資源,線程間能夠直接通訊

 

十二、進程線程組合例子?

單進程單線程:一我的在一個桌子上吃菜
單進程多線程:多我的在同一個桌子上一塊兒吃菜
多進程單線程:多我的每一個人在本身的桌子上吃菜

 

1三、同步阻塞中的多進程、多線程?

最先的服務器端程序都是經過多進程、多線程來解決併發IO的問題
多進程:一個請求建立一個進程,而後子進程進入循環同步堵塞地與客戶端鏈接進行交互,收發處理數據
多線程:用多線程模式實現很是簡單,線程中能夠直接向某一個客戶端鏈接發送數據

 

1四、同步阻塞中 多線程 步驟 總結?

|||-begin編程

建立一個socket
進入while循環,阻塞在進程accept操做上,等待客戶端鏈接進入
主進程在多進程模型下經過fork建立子進程
多線程模型下能夠建立子線程
子進程/線程建立成功後進入while循環,阻塞在recv調用上,等待客戶端向服務器發送數據
收到數據後服務器程序進行處理而後使用send向客戶端發送響應
當客戶端鏈接關閉時,子進程/線程退出並銷燬全部資源。主進程/線程會回收掉此子進程/線程。

|||-endjson

socket和多線程的結合

 

 

1五、同步阻塞模型的缺點?

這種模型 【嚴重依賴進程的數量】  解決併發問題
啓動大量進程會帶來額外的【進程調度消耗】

 

1六、php 異步非阻塞 實現?

epoll:如今各類高併發異步IO的服務器程序都是基於epoll實現的
Reactor模型:IO複用異步非阻塞程序使用經典的Reactor模型,Reactor顧名思義就是反應堆的意思,它自己不處理任何數據收發。只是能夠監視一個socket句柄的事件變化

 

1七、異步非阻塞 Reactor有4個核心的操做?

1.add添加socket監聽到reactor
2.set修改事件監聽,能夠設置監聽的類型,如可讀、可寫
3.del從reactor中移除,再也不監聽事件
4.callback,事件發生後對應的處理邏輯,通常在add/set時制定

 

Reactor模型
Add:添加一個SOCKET到Reactor
Set:修改SOCKET對應的事件,如可讀可寫
Del:從Reactor中移除
Callback:事件發生後回調指定的函數服務器

 

1八、異步非阻塞模型實例?

Nginx:多線程Reactor
Swoole:多線程Reactor+多進程Worker

 

1九、PHP併發編程實踐?

PHP的Swoole擴展
消息隊列
接口的併發請求

 

20、PHP的Swoole擴展 介紹?

異步、並行、高性能網絡通訊引擎:PHP的異步、並行、高性能網絡通訊引擎,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,異步Redis,數據庫鏈接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢
多個併發數據結構和IPC通訊機制:除了異步IO的支持以外,Swoole爲PHP多進程的模式設計了多個併發數據結構和IPC通訊機制,能夠大大簡化多進程併發編程的工做。
協程:Swoole2.0支持了相似Go語言的協程,可使用徹底同步的代碼實現異步程序

 

2一、swoole WebSocket Server 實例?

|||-beginwebsocket

WebSocket Server
<?php
$server = new swoole_websocket_server("127.0.0.1", 9502);

$server->on('open', function($server, $req) {
    echo "connection open: {$req->fd}\n";
});

$server->on('message', function($server, $frame) {
    echo "received message: {$frame->data}\n";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

$server->on('close', function($server, $fd) {
    echo "connection close: {$fd}\n";
});

$server->start();

|||-endswoole

官網有實例代碼,比較好上手

 

 

2二、消息隊列應用場景?

二、應用解耦:用戶下單後,訂單系統須要通知庫存系統
三、流量削鋒:秒殺活動,流量瞬時激增,服務器壓力大
四、日誌處理:解決大量日誌的傳輸
五、消息通訊:多個客戶端訂閱同一主題,進行消息發佈和接收

 

一、用戶註冊後,須要發註冊郵件和註冊短信

網絡

 

2三、超級大量 用戶註冊後,須要發註冊郵件和註冊短信,如何解決(用消息隊列)?

串行方式:將註冊信息寫入數據庫成功後,發送註冊郵件,再發送註冊短信
並行方式:將註冊信息寫入數據庫成功後,發送註冊郵件的同時,發送註冊短信
消息隊列方式:將註冊信息寫入數據庫成功後,將成功信息寫入隊列,此時直接返回成功給用戶,寫入隊列的時間很是短,能夠忽略不計,而後異步發送郵件和短信

 

2四、超級大量 用戶下單後,訂單系統須要通知庫存系統,如何解決(用消息隊列作 應用解耦)?

一、消息隊列:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功
二、發佈訂閱:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操做

消息隊列 的另外一種應用:應用解耦
場景說明:用戶下單後,訂單系統須要通知庫存系統。
假如庫存系統沒法訪問,則訂單減庫存將失敗,從而致使訂單失敗

訂單系統與庫存系統解耦

引用隊列
用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功
訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操做

 

2五、秒殺活動,流量瞬時激增,服務器壓力大,如何解決(用消息隊列作 流量削鋒)?

發起請求,服務器接收後,先寫入消息隊列。假如消息隊列長度超過最大值,則直接報錯或提示用戶。後續程序讀取消息隊列再作處理

 

消息隊列 的另外一種應用:流量削鋒

應用場景:秒殺活動,流量瞬時激增,服務器壓力大。
發起請求,服務器接收後,先寫入消息隊列。假如消息隊列長度超過最大值,則直接報錯或提示用戶。後續程序讀取消息隊列再作處理

2六、消息隊列 用於 流量削鋒的好處?

控制請求量
緩解高流量

 

2七、解決大量日誌的傳輸,如何解決(用消息隊列 作 日誌處理)?

日誌採集程序將程序寫入消息隊列,而後經過日誌處理程序的訂閱消費日誌

消息隊列 的另外一種應用:日誌處理

應用場景:解決大量日誌的傳輸

日誌採集程序將程序寫入消息隊列,而後經過日誌處理程序的訂閱消費日誌

 

 

2八、聊天室中,消息隊列如何解決消息通信?

多個客戶端訂閱同一主題,進行消息發佈和接收

 

消息隊列 的另外一種應用:消息通信

應用場景:聊天室

多個客戶端訂閱同一主題,進行消息發佈和接收

 

2九、常見消息隊列產品?

Kafka、ActiveMQ、ZeroMQ、RabbitMQ、Redis等

 

30、php如何作接口的併發請求?

php的curl_multi_init函數 系列

 

 

2、內容在總結中

相關文章
相關標籤/搜索