拜登宣示重返巴黎協定 澳洲總理樂觀其成_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

摘錄自2020年11月9日中央社報導

澳洲總理莫里森今天(9日)表示,如果美國總統當選人拜登率美國重返巴黎協定,澳洲樂觀其成。與此同時,莫里森自己再度面臨壓力,得更加緊努力降低澳洲碳排放。

莫里森(Scott Morrison)告訴記者:「我們歡迎美國重回巴黎協定(Paris Agreement),這是我們一直支持的協議。」他說,也歡迎美國重返其他全球性組織,例如世界衛生組織(WHO)。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

美國上週正式退出巴黎氣候協定,但拜登承諾將重新加入,並在2050年達到淨零碳排放。

雖然澳洲各州和領地的政府都採行同樣的2050年淨零碳排放目標,但莫里森的聯邦政府尚未這樣做。澳洲是主要的化石燃料出口國,特別是煤。

氣候變遷
國際新聞
澳洲
巴黎協定
淨零碳排
拜登

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

Mobileye 自駕開發成果說明,與 Intel 合作打造整合 SoC 提高安全性_網頁設計公司

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

Intel 近年來大舉進軍自駕車市場,在 2017 年時收購了自駕技術公司 Mobileye,經過數年的潛心開發,隨 CES 2021 如火如荼開展, Intel 高級副總裁暨 Mobileye 首席執行官 Amnon Shashua 在今日(1/12)的直播中向全球說明了 Mobileye 與眾不同的目標與豪情壯志。

Mobileye 自駕開發成果說明,與 Intel 合作打造整合 SoC 提高安全性

Shashua 在描述技術的三位一體特色時,著重強調了為何感測器數量比人工駕駛時更多且更高階的重要性,將 REM 映射技術(Road Experience Management)、以規則為基礎的 RSS(Responsibility-Sensitive Safety)駕駛策略、與內建雷達與雷射雷達技術的兩個獨立攝影機等整合成有效解決方案。Mobileye 從技術和業務兩個角度同時切入,將技術降低至可負擔的成本以因應未來的自駕車市場,這點對於全球性的擴散推廣至關重要,整套解決方案利用成本較低的攝影機作為主要感測器,加上相輔相成的輔助系統,從而實現比人類駕駛高出三階的安全標準。Mobileye 採用 True Redundancy 系統,可以更快且更低成本地驗證效能水準。

Shashua 解釋道,未來自駕車將強化對於無線電和光的檢測、測距能力,這方面可以進一步提升道路安全標準,目前 Mobileye 與 Intel 所開發的解決方案,能利用 Intel 自家的製造技術將雷達與雷射雷達放在單一晶片上,同時對演算進行最佳化並有效降低成本。Mobileye 還將推出全新的軟體定義雷達系統,透過全數位化和訊號處理,不同的掃描模式、豐富的原始偵測和多幀跟踪,每秒對物體進行 50 萬次掃描,使其技術更上一層樓。Shashua 還說明了利用 Intel XPU 策略、專業和製造力開發出一種雷射雷達系統單 SoC,有望在 2025 年開始將此技術提供 Mobileye 用於自駕車上。 

Mobileye 現有的技術可以自動繪製世界地圖,每天追踪繪製近 800 萬公里,迄今為止已完成近 10 億公里,此映射過程與其他方法的不同之處在於,它對細節的關注程度不同,這對自駕車的理解和具象環境化的能力相當重要。為了使自駕車實現其挽救生命的目標,它們必須進行推廣並能夠在幾乎所有地區行駛,Mobileye 的自動地圖繪製過程已配屬在各地近 100 萬輛已配備 Mobileye 駕駛輔助技術的車輛上。

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

為了展示這些自動地圖的可擴展性特色,Mobileye 將開始在四個新的國家/ 地區擴展測試車隊。該公司會將車輛運送到目的地的團隊後,經過適當的安全培訓,這些車輛將可以上路駕駛,在 2020 年初將在底特律、東京、上海、巴黎和紐約(審核中)啟用新車 。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

第 11 代 Intel Core H 系列處理器發表,賦予新一代電競筆電更驚人的效能_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

自從去年 Intel 發表了首批第 11 代 Intel Core 處理器之後,Intel 在這次的 CES 2021 線上發表會中首先秀出的就是大家敲碗很久的第 11 代 Intel Core H 系列處理器,這系列高效能系列將 Tiger Lake 的優勢大大施展出來,以後千萬不要小瞧了輕薄電競筆電。

第 11 代 Intel Core H 系列處理器發表,賦予新一代電競筆電更驚人的效能

全新發表的第 11 代 Intel Core H 系列為 35W 功率的處理器,它的出現打破了輕薄遊戲筆電的極限,未來更小、更輕的遊戲筆電也會開始超越其體型限制,擁有強大的效能潛力。具體來說,這系列新處理器以時脈提高到 5Hz 的 Intel Core i7-11375H 特別版為首, 擁有 4 核心架構,可支援 8 個執行緒。

內部整合了 Xe-LP 顯卡,但另外還採用 PCIe Gen 4.0 架構,可供 OEM 廠商添加最新的獨立顯卡。第 11 代 Intel Core H 系列還支援 Intel Killer Wi-Fi 6 或 6E 無線網路連接,並且將對 Thunderbolt 4 的支援納入其中,可使用 3200MHz DDR4 記憶體與 4266MHz LPDDR4 或 LPDDR4X 記憶體。

如果你想要在筆電上擁有桌機的遊戲和創作效能,Intel 還預告在本季稍晚會上市一款 8 核心、時脈 5GHz ,且擁有 20 通道 PCIe Gen 4.0 架構、支援 Intel Killer Wi-Fi 6E(Gig+) 的筆電處理器。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

首批採用第 11 代 Intel Core H 系列的筆電將有望在 CES 2021 接下來的發表會上看到,其中包括 Acer、Asus、Msi 與 Vaio 都將會有新品出現,Intel 預估在今年上半將可看到超過 40 種機型登場。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

為商務打造 Intel vPro 與 Intel Evo vPro 新平台,著重安全性、速度與生產力_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

在去年底,Intel 發表了適用於主流筆電的第 11 代 Core U 系列處理器,而後更是積極推動了旗下對輕薄筆電的全新認證 Intel Evo,隨著 CES 2021 推出 H 系列處理器後,更推行了最新的 vPro 平台,為商業用途制定高標準的安全性與可管理性,另外還有將兩者合而為一的 Intel Evo vPro 平台,為商務用戶提供更多選擇性。

為商務打造 Intel vPro 與 Intel Evo vPro 新平台,著重安全性、速度與生產力

依照過去的慣例, 對於企業來說,安全性對於保密或防犯方面至關重要,Intel vPro 本質上以商務為核心,將 Intel 的企業管理和安全技術整合在一起,諸如 Intel 的主動管理技術(AMT)以及其他安全功能皆會納入其中。現在,Intel 將這些功能結合到硬體防護中,並且涵蓋了像是 Intel 自家的 TXT 技術(Trusted Execution Technology)之類的內容。整體而言,vPro 並不是 Intel 的硬體產品,而該視之為一個平台,透過將支援的處理器等晶片整合在具備適當 BIOS 的完整系統中來實現。

在最新版本中,Intel 將 vPro 擴展涵蓋了第 11 代 Core 系列處理器,並且導入了一些全新 vPro 功能。
首先是 Intel Hardware Shield,這項技術可為企業提供全面性的硬體深度安全防護,並且搭載全球首款植基於矽晶的 AI 威脅偵測,幫助抵抗勒索病毒和加密挖礦攻擊等,它還配備有 CET 技術( Intel Control Flow Enforcement Technology),強化系統內的指令流,防止惡意軟體挾持或是利用安全漏洞攻擊,改變長此以往單從軟體來進行防護的薄弱。

藉助於第 11 代 Core 系列處理器,vPro 與競爭對手相比,在運行 Office 365 文書處理工具時速度快上 23%,進行視訊會議時的速度也可比過去快 50%。由於 AI 效能較前代速度提升 8 倍,在進行影片編輯時還能比前一世代快上 2.3 倍,較競爭對手快了 1.8 倍。

此外,Intel Evo vPro 平台亦同步推出,為商務用戶提供最佳筆電體驗。透過 Intel Evo vPro平台認證的筆電設計具備時尚、纖薄與輕巧,提供令人驚豔的身歷其境視覺體驗。它們同樣提供出色的回應能力、立即喚醒、與真實世界的電池續航力,結合 vPro 的安全性與可管理能力以及 Intel  Evo 驚人的行動體驗,在今年預計會有超過 60 款新筆電問世。

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

最後英特爾還宣布 Intel Evo 認證的 Chromebook 產品即將登場,為旗艦型 Chromebook 打開新局面。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

Intel 第 11 代「Rocket Lake」與第 12 代「Alder Lake」搶先看_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

在本次 CES 發表會中,Intel 除發表系列第 11 代行動處理器外,還花了一些時間來預告即將問世的第 11 代桌上處理器「Rocket Lake」與命名為「Alder Lake」的第 12 代Core 處理器,雖然並沒有講得太多新細節,但已經夠讓人流口水了。

Intel 第 11 代「Rocket Lake」與第 12 代「Alder Lake」搶先看

「Alder Lake」與其前身 Lakefield 一樣將會採用與 Arm 的 BIG.little 相似的方式,將高效能核心與高速率核心封裝在一起,以實現功率與效率兩方面的最大化,但不同之處是 Lakefield 主要用在筆電上,而下一世代的 Alder Lake 將可用於桌上電腦與筆電,而首批搭載這種可擴展功率系統的產品將會在下半年出現。第 12 代 Alder Lake 處理器將採用在第 11 代 Tiger Lake 中已經存在的 10nm SuperFin 設計強化版本,並結合了新的大功率核心 Golden Lake 和新的 Gracemont 核心來提高效率。在發表會中更直接展示了搭載 Alder Lake 的電腦開啟狀態(上圖),讓大家先睹為快。

桌上型電腦用戶敲碗許久的第 11 代「Rocket Lake」即將問世,正式名稱 Intel Core S 系列處理器以旗艦 i9-11900K 為首,IPC 提高 19%,內顯效能提高 50%,另外也首度將 AI 運算能力導入主流 PC 平台中。雖說已預計在 3 月份推出,但此次並沒有透漏太多新的細節,也並未完全展示整個第 11 代 Rocket Lake-S 陣容,僅簡單講述全新核心架構、14nm 製程,以及處理器可提供 20 條 PCIe 4.0 通道,可容納 x16 顯卡與 x4 SSD。 

在實力展示方面,以第 11 代 Intel Core i7 8 核心處理器與 AMD R9 12 核心處理器對比,在配備相同 GPU 的情況下執行 Metro Exodus,可以看到 Intel 在 FPS 上的平均表現優於對手。

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

小米智慧攝影機雲台版2K 在台開賣:升級 2K 高畫質和 F1.4 大光圈,售價 1,095元_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

小米智慧攝影機雲台版已經在台灣銷售一段時間,隨著近年民眾對於日常生活監控有更高畫質需求,在去年四月於中國率先推出了升級 2K 高畫質的更新機型,終於在今(13)日稍早「小米智慧攝影機雲台版 2K」終於在台灣正式開賣。新一代升級 2K 超高畫質版本的小米智慧攝影機雲台版在外型大致上延續前一代簡約的設計,在鏡頭圈處改為金黃色的搭配。

小米智慧攝影機雲台版2K 在台開賣:升級 2K 高畫質和 F1.4 大光圈,售價 1,095元

作為許多家庭的「看家神器」,不少人會選擇小米的智慧攝影機系列產品,而之前除了小米智慧攝影機雲台版 2K Pro ,對於想求價格更便宜的智慧攝影機消費者而言,「小米智慧攝影機雲台版」則是相對更符合需求的選擇,不過之前小米台灣只率先引進 2K Pro ,直到今日才正式在台灣發售小米智慧攝影機雲台版 2K 。

全新在台販售的小米智慧攝影機雲台版 2K 在畫質方面升級 2K(2340*1296)解析度的 300 萬像素,擁有更清晰的畫質、能呈現更多畫面細節。

光圈部分則升級為 F1.4 大光圈鏡頭,增加進光量使得微弱光線環境能捕捉到更多畫面細節。

鏡頭全面升級為 6P 鏡片,有效降低光線折損率、讓成像更清晰、透亮和細膩。

小米智慧攝影機雲台版 2K 內建 940nm 紅外線補光燈,搭配高感光靈敏度感光元件,開啟「微光全彩」功能,在微光調降下也能呈現彩色影像。

小米智慧攝影機雲台版 2K 無論正向安裝或者倒轉安裝,都能 180° 翻轉畫面進行居家監控。另外,由於採用雙電機雲台設計,可 360° 水平調整可視角度、 108° 調整垂直可視角度,只要透過米家 App 就能直接操控。

小米智慧攝影機雲台版 2K 亦支援雙向語音即時通話,即便在外也能透過 App 連接攝影機與在家的家人進行即時通話。

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

售價方面,小米智慧攝影機雲台版 2K 在台灣的建議售價為 1,095 元,今日已經在台灣正式開賣:

以下為小米智慧攝影機雲台版 1080P、小米智慧攝影機雲台版 2K 以及小米智慧攝影機雲台版 2K Pro 之間的功能差異:

小米智慧攝影機雲台版 2K:點我前往購買(小米台灣)

圖片/消息來源:小米台灣

延伸閱讀:
Redmi K40 系列 S888 旗艦新機確定將於 2 月發表,官方提前公布售價約 12,912 元起

小米11 Pro 最新高清晰概念渲染圖曝光!傳聞搭載 50MP 四鏡頭主相機,支持 120x 混合變焦

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

說了這麼多次 I/O,但你知道它的原理么_網頁設計公司

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

IO 軟件目標

設備獨立性

現在讓我們轉向對 I/O 軟件的研究,I/O 軟件設計一個很重要的目標就是設備獨立性(device independence)。啥意思呢?這意味着我們能夠編寫訪問任何設備的應用程序,而不用事先指定特定的設備。比如你編寫了一個能夠從設備讀入文件的應用程序,那麼這個應用程序可以從硬盤、DVD 或者 USB 進行讀入,不必再為每個設備定製應用程序。這其實就體現了設備獨立性的概念。

再比如說你可以輸入一條下面的指令

sort 輸入 輸出

那麼上面這個 輸入 就可以接收來自任意類型的磁盤或者鍵盤,並且 輸出 可以寫入到任意類型的磁盤或者屏幕。

計算機操作系統是這些硬件的媒介,因為不同硬件它們的指令序列不同,所以需要操作系統來做指令間的轉換。

與設備獨立性密切相關的一個指標就是統一命名(uniform naming)。設備的代號應該是一個整數或者是字符串,它們不應該依賴於具體的設備。在 UNIX 中,所有的磁盤都能夠被集成到文件系統中,所以用戶不用記住每個設備的具體名稱,直接記住對應的路徑即可,如果路徑記不住,也可以通過 ls 等指令找到具體的集成位置。舉個例子來說,比如一個 USB 磁盤被掛載到了 /usr/cxuan/backup 下,那麼你把文件複製到 /usr/cxuan/backup/device 下,就相當於是把文件複製到了磁盤中,通過這種方式,實現了向任何磁盤寫入文件都相當於是向指定的路徑輸出文件。

錯誤處理

除了設備獨立性外,I/O 軟件實現的第二個重要的目標就是錯誤處理(error handling)。通常情況下來說,錯誤應該交給硬件層面去處理。如果設備控制器發現了讀錯誤的話,它會盡可能的去修復這個錯誤。如果設備控制器處理不了這個問題,那麼設備驅動程序應該進行處理,設備驅動程序會再次嘗試讀取操作,很多錯誤都是偶然性的,如果設備驅動程序無法處理這個錯誤,才會把錯誤向上拋到硬件層面(上層)進行處理,很多時候,上層並不需要知道下層是如何解決錯誤的。這就很像項目經理不用把每個決定都告訴老闆;程序員不用把每行代碼如何寫告訴項目經理。這種處理方式不夠透明。

同步和異步傳輸

I/O 軟件實現的第三個目標就是 同步(synchronous)異步(asynchronous,即中斷驅動)傳輸。這裏先說一下同步和異步是怎麼回事吧。

同步傳輸中數據通常以塊或幀的形式發送。發送方和接收方在數據傳輸之前應該具有同步時鐘。而在異步傳輸中,數據通常以字節或者字符的形式發送,異步傳輸則不需要同步時鐘,但是會在傳輸之前向數據添加奇偶校驗位。下面是同步和異步的主要區別

比較條件 同步傳輸 異步傳輸
概念 塊頭序列開始 它分別在字符前面和後面使用開始位和停止位。
傳輸方式 以塊或幀的形式發送數據 發送字節或者字符
同步方式 同步時鐘
傳輸速率 同步傳輸比較快 異步傳輸比較慢
時間間隔 同步傳輸通常是恆定時間 異步傳輸時間隨機
開銷 同步開銷比較昂貴 異步傳輸開銷比較小
是否存在間隙 不存在 存在
實現 硬件和軟件 只有硬件
示例 聊天室,視頻會議,電話對話等。 信件,电子郵件,論壇

回到正題。大部分物理IO(physical I/O) 是異步的。物理 I/O 中的 CPU 是很聰明的,CPU 傳輸完成後會轉而做其他事情,它和中斷心靈相通,等到中斷髮生后,CPU 才會回到傳輸這件事情上來。

I/O 分為兩種:物理I/O 和 邏輯I/O(Logical I/O)

物理 I/O 通常是從磁盤等存儲設備實際獲取數據。邏輯 I/O 是對存儲器(塊,緩衝區)獲取數據。

緩衝

I/O 軟件的最後一個問題是緩衝(buffering)。通常情況下,從一個設備發出的數據不會直接到達最後的設備。其間會經過一系列的校驗、檢查、緩衝等操作才能到達。舉個例子來說,從網絡上發送一個數據包,會經過一系列檢查之後首先到達緩衝區,從而消除緩衝區填滿速率和緩衝區過載。

共享和獨佔

I/O 軟件引起的最後一個問題就是共享設備和獨佔設備的問題。有些 I/O 設備能夠被許多用戶共同使用。一些設備比如磁盤,讓多個用戶使用一般不會產生什麼問題,但是某些設備必須具有獨佔性,即只允許單個用戶使用完成后才能讓其他用戶使用。

下面,我們來探討一下如何使用程序來控制 I/O 設備。一共有三種控制 I/O 設備的方法

  • 使用程序控制 I/O
  • 使用中斷驅動 I/O
  • 使用 DMA 驅動 I/O

使用程序控制 I/O

使用程序控制 I/O 又被稱為 可編程I/O,它是指由 CPU 在驅動程序軟件控制下啟動的數據傳輸,來訪問設備上的寄存器或者其他存儲器。CPU 會發出命令,然後等待 I/O 操作的完成。由於 CPU 的速度比 I/O 模塊的速度快很多,因此可編程 I/O 的問題在於,CPU 必須等待很長時間才能等到處理結果。CPU 在等待時會採用輪詢(polling)或者 忙等(busy waiting) 的方式,結果,整個系統的性能被嚴重拉低。可編程 I/O 十分簡單,如果需要等待的時間非常短的話,可編程 I/O 倒是一個很好的方式。一個可編程的 I/O 會經歷如下操作

  • CPU 請求 I/O 操作
  • I/O 模塊執行響應
  • I/O 模塊設置狀態位
  • CPU 會定期檢查狀態位
  • I/O 不會直接通知 CPU 操作完成
  • I/O 也不會中斷 CPU
  • CPU 可能會等待或在隨後的過程中返回

使用中斷驅動 I/O

鑒於上面可編程 I/O 的缺陷,我們提出一種改良方案,我們想要在 CPU 等待 I/O 設備的同時,能夠做其他事情,等到 I/O 設備完成后,它就會產生一个中斷,這个中斷會停止當前進程並保存當前的狀態。一個可能的示意圖如下

儘管中斷減輕了 CPU 和 I/O 設備的等待時間的負擔,但是由於還需要在 CPU 和 I/O 模塊之前進行大量的逐字傳輸,因此在大量數據傳輸中效率仍然很低。下面是中斷的基本操作

  • CPU 進行讀取操作
  • I/O 設備從外圍設備獲取數據,同時 CPU 執行其他操作
  • I/O 設備中斷通知 CPU
  • CPU 請求數據
  • I/O 模塊傳輸數據

所以我們現在着手需要解決的就是 CPU 和 I/O 模塊間數據傳輸的效率問題。

使用 DMA 的 I/O

DMA 的中文名稱是直接內存訪問,它意味着 CPU 授予 I/O 模塊權限在不涉及 CPU 的情況下讀取或寫入內存。也就是 DMA 可以不需要 CPU 的參与。這個過程由稱為 DMA 控制器(DMAC)的芯片管理。由於 DMA 設備可以直接在內存之間傳輸數據,而不是使用 CPU 作為中介,因此可以緩解總線上的擁塞。DMA 通過允許 CPU 執行任務,同時 DMA 系統通過系統和內存總線傳輸數據來提高系統併發性。

I/O 層次結構

I/O 軟件通常組織成四個層次,它們的大致結構如下圖所示

每一層和其上下層都有明確的功能和接口。下面我們採用和計算機網絡相反的套路,即自下而上的了解一下這些程序。

下面是另一幅圖,這幅圖显示了輸入/輸出軟件系統所有層及其主要功能。

下面我們具體的來探討一下上面的層次結構

中斷處理程序

在計算機系統中,中斷就像女人的脾氣一樣無時無刻都在產生,中斷的出現往往是讓人很不爽的。中斷處理程序又被稱為中斷服務程序 或者是 ISR(Interrupt Service Routines),它是最靠近硬件的一層。中斷處理程序由硬件中斷、軟件中斷或者是軟件異常啟動產生的中斷,用於實現設備驅動程序或受保護的操作模式(例如系統調用)之間的轉換。

中斷處理程序負責處理中斷髮生時的所有操作,操作完成后阻塞,然後啟動中斷驅動程序來解決阻塞。通常會有三種通知方式,依賴於不同的具體實現

  • 信號量實現中:在信號量上使用 up 進行通知;
  • 管程實現:對管程中的條件變量執行 signal 操作
  • 還有一些情況是發送一些消息

不管哪種方式都是為了讓阻塞的中斷處理程序恢復運行。

中斷處理方案有很多種,下面是 《ARM System Developer’s Guide

Designing and Optimizing System Software》列出來的一些方案

  • 非嵌套的中斷處理程序按照順序處理各个中斷,非嵌套的中斷處理程序也是最簡單的中斷處理
  • 嵌套的中斷處理程序會處理多个中斷而無需分配優先級
  • 可重入的中斷處理程序可使用優先級處理多个中斷
  • 簡單優先級中斷處理程序可處理簡單的中斷
  • 標準優先級中斷處理程序比低優先級的中斷處理程序在更短的時間能夠處理優先級更高的中斷
  • 高優先級 中斷處理程序在短時間能夠處理優先級更高的任務,並直接進入特定的服務例程。
  • 優先級分組中斷處理程序能夠處理不同優先級的中斷任務

下面是一些通用的中斷處理程序的步驟,不同的操作系統實現細節不一樣

  • 保存所有沒有被中斷硬件保存的寄存器
  • 為中斷服務程序設置上下文環境,可能包括設置 TLBMMU 和頁表,如果不太了解這三個概念,請參考另外一篇文章
  • 為中斷服務程序設置棧
  • 對中斷控制器作出響應,如果不存在集中的中斷控制器,則繼續響應中斷
  • 把寄存器從保存它的地方拷貝到進程表中
  • 運行中斷服務程序,它會從發出中斷的設備控制器的寄存器中提取信息
  • 操作系統會選擇一個合適的進程來運行。如果中斷造成了一些優先級更高的進程變為就緒態,則選擇運行這些優先級高的進程
  • 為進程設置 MMU 上下文,可能也會需要 TLB,根據實際情況決定
  • 加載進程的寄存器,包括 PSW 寄存器
  • 開始運行新的進程

上面我們羅列了一些大致的中斷步驟,不同性質的操作系統和中斷處理程序能夠處理的中斷步驟和細節也不盡相同,下面是一個嵌套中斷的具體運行步驟

設備驅動程序

在上面的文章中我們知道了設備控制器所做的工作。我們知道每個控制器其內部都會有寄存器用來和設備進行溝通,發送指令,讀取設備的狀態等。

因此,每個連接到計算機的 I/O 設備都需要有某些特定設備的代碼對其進行控制,例如鼠標控制器需要從鼠標接受指令,告訴下一步應該移動到哪裡,鍵盤控制器需要知道哪個按鍵被按下等。這些提供 I/O 設備到設備控制器轉換的過程的代碼稱為 設備驅動程序(Device driver)

為了能夠訪問設備的硬件,實際上也就意味着,設備驅動程序通常是操作系統內核的一部分,至少現在的體繫結構是這樣的。但是也可以構造用戶空間的設備驅動程序,通過系統調用來完成讀寫操作。這樣就避免了一個問題,有問題的驅動程序會幹擾內核,從而造成崩潰。所以,在用戶控件實現設備驅動程序是構造系統穩定性一個非常有用的措施。MINIX 3 就是這麼做的。下面是 MINI 3 的調用過程

然而,大多數桌面操作系統要求驅動程序必須運行在內核中。

操作系統通常會將驅動程序歸為 字符設備塊設備,我們上面也介紹過了

在 UNIX 系統中,操作系統是一個二進製程序,包含需要編譯到其內部的所有驅動程序,如果你要對 UNIX 添加一個新設備,需要重新編譯內核,將新的驅動程序裝到二進製程序中。

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

然而隨着大多數個人計算機的出現,由於 I/O 設備的廣泛應用,上面這種靜態編譯的方式不再有效,因此,從 MS-DOS 開始,操作系統轉向驅動程序在執行期間動態的裝載到系統中。

設備驅動程序具有很多功能,比如接受讀寫請求,對設備進行初始化、管理電源和日誌、對輸入參數進行有效性檢查等。

設備驅動程序接受到讀寫請求后,會檢查當前設備是否在使用,如果設備在使用,請求被排入隊列中,等待後續的處理。如果此時設備是空閑的,驅動程序會檢查硬件以了解請求是否能夠被處理。在傳輸開始前,會啟動設備或者馬達。等待設備就緒完成,再進行實際的控制。控制設備就是對設備發出指令

發出命令后,設備控制器便開始將它們寫入控制器的設備寄存器。在將每個命令寫入控制器后,會檢查控制器是否接受了這條命令並準備接受下一個命令。一般控制設備會發出一系列的指令,這稱為指令序列,設備控制器會依次檢查每個命令是否被接受,下一條指令是否能夠被接收,直到所有的序列發出為止。

發出指令后,一般會有兩種可能出現的情況。在大多數情況下,設備驅動程序會進行等待直到控制器完成它的事情。這裏需要了解一下設備控制器的概念

設備控制器的主要主責是控制一個或多個 I/O 設備,以實現 I/O 設備和計算機之間的數據交換

設備控制器接收從 CPU 發送過來的指令,繼而達到控制硬件的目的

設備控制器是一個可編址的設備,當它僅控制一個設備時,它只有一個唯一的設備地址;如果設備控制器控制多個可連接設備時,則應含有多個設備地址,並使每一個設備地址對應一個設備。

設備控制器主要分為兩種:字符設備和塊設備

設備控制器的主要功能有下面這些

  • 接收和識別命令:設備控制器可以接受來自 CPU 的指令,並進行識別。設備控制器內部也會有寄存器,用來存放指令和參數

  • 進行數據交換:CPU、控制器和設備之間會進行數據的交換,CPU 通過總線把指令發送給控制器,或從控制器中并行地讀出數據;控制器將數據寫入指定設備。

  • 地址識別:每個硬件設備都有自己的地址,設備控制器能夠識別這些不同的地址,來達到控制硬件的目的,此外,為使 CPU 能向寄存器中寫入或者讀取數據,這些寄存器都應具有唯一的地址。

  • 差錯檢測:設備控制器還具有對設備傳遞過來的數據進行檢測的功能。

在這種情況下,設備控制器會阻塞,直到中斷來解除阻塞狀態。還有一種情況是操作是可以無延遲的完成,所以驅動程序不需要阻塞。在第一種情況下,操作系統可能被中斷喚醒;第二種情況下操作系統不會被休眠。

設備驅動程序必須是可重入的,因為設備驅動程序會阻塞和喚醒然後再次阻塞。驅動程序不允許進行系統調用,但是它們通常需要與內核的其餘部分進行交互。

與設備無關的 I/O 軟件

I/O 軟件有兩種,一種是我們上面介紹過的基於特定設備的,還有一種是設備無關性的,設備無關性也就是不需要特定的設備。設備驅動程序與設備無關的軟件之間的界限取決於具體的系統。下面显示的功能由設備無關的軟件實現

與設備無關的軟件的基本功能是對所有設備執行公共的 I/O 功能,並且向用戶層軟件提供一個統一的接口。

緩衝

無論是對於塊設備還是字符設備來說,緩衝都是一個非常重要的考量標準。下面是從 ADSL(調製解調器) 讀取數據的過程,調製解調器是我們用來聯網的設備。

用戶程序調用 read 系統調用阻塞用戶進程,等待字符的到來,這是對到來的字符進行處理的一種方式。每一個到來的字符都會造成中斷。中斷服務程序會給用戶進程提供字符,並解除阻塞。將字符提供給用戶程序后,進程會去讀取其他字符並繼續阻塞,這種模型如下

這一種方案是沒有緩衝區的存在,因為用戶進程如果讀不到數據會阻塞,直到讀到數據為止,這種情況效率比較低,而且阻塞式的方式,會直接阻止用戶進程做其他事情,這對用戶來說是不能接受的。還有一種情況就是每次用戶進程都會重啟,對於每個字符的到來都會重啟用戶進程,這種效率會嚴重降低,所以無緩衝區的軟件不是一個很好的設計。

作為一個改良點,我們可以嘗試在用戶空間中使用一個能讀取 n 個字節緩衝區來讀取 n 個字符。這樣的話,中斷服務程序會把字符放到緩衝區中直到緩衝區變滿為止,然後再去喚醒用戶進程。這種方案要比上面的方案改良很多。

但是這種方案也存在問題,當字符到來時,如果緩衝區被調出內存會出現什麼問題?解決方案是把緩衝區鎖定在內存中,但是這種方案也會出現問題,如果少量的緩衝區被鎖定還好,如果大量的緩衝區被鎖定在內存中,那麼可以換進換出的頁面就會收縮,造成系統性能的下降。

一種解決方案是在內核中內部創建一塊緩衝區,讓中斷服務程序將字符放在內核內部的緩衝區中。

當內核中的緩衝區要滿的時候,會將用戶空間中的頁面調入內存,然後將內核空間的緩衝區複製到用戶空間的緩衝區中,這種方案也面臨一個問題就是假如用戶空間的頁面被換入內存,此時內核空間的緩衝區已滿,這時候仍有新的字符到來,這個時候會怎麼辦?因為緩衝區滿了,沒有空間來存儲新的字符了。

一種非常簡單的方式就是再設置一個緩衝區就行了,在第一個緩衝區填滿后,在緩衝區清空前,使用第二個緩衝區,這種解決方式如下

當第二個緩衝區也滿了的時候,它也會把數據複製到用戶空間中,然後第一個緩衝區用於接受新的字符。這種具有兩個緩衝區的設計被稱為 雙緩衝(double buffering)

還有一種緩衝形式是 循環緩衝(circular buffer)。它由一個內存區域和兩個指針組成。一個指針指向下一個空閑字,新的數據可以放在此處。另外一個指針指向緩衝區中尚未刪除數據的第一個字。在許多情況下,硬件會在添加新的數據時,移動第一個指針;而操作系統會在刪除和處理無用數據時會移動第二個指針。兩個指針到達頂部時就回到底部重新開始。

緩衝區對輸出來說也很重要。對輸出的描述和輸入相似

緩衝技術應用廣泛,但它也有缺點。如果數據被緩衝次數太多,會影響性能。考慮例如如下這種情況,

數據經過用戶進程 -> 內核空間 -> 網絡控制器,這裏的網絡控制器應該就相當於是 socket 緩衝區,然後發送到網絡上,再到接收方的網絡控制器 -> 接收方的內核緩衝 -> 接收方的用戶緩衝,一條數據包被緩存了太多次,很容易降低性能。

錯誤處理

在 I/O 中,出錯是一種再正常不過的情況了。當出錯發生時,操作系統必須盡可能處理這些錯誤。有一些錯誤是只有特定的設備才能處理,有一些是由框架進行處理,這些錯誤和特定的設備無關。

I/O 錯誤的一類是程序員編程錯誤,比如還沒有打開文件前就讀流,或者不關閉流導致內存溢出等等。這類問題由程序員處理;另外一類是實際的 I/O 錯誤,例如向一個磁盤壞塊寫入數據,無論怎麼寫都寫入不了。這類問題由驅動程序處理,驅動程序處理不了交給硬件處理,這個我們上面也說過。

設備驅動程序統一接口

我們在操作系統概述中說到,操作系統一個非常重要的功能就是屏蔽了硬件和軟件的差異性,為硬件和軟件提供了統一的標準,這個標準還體現在為設備驅動程序提供統一的接口,因為不同的硬件和廠商編寫的設備驅動程序不同,所以如果為每個驅動程序都單獨提供接口的話,這樣沒法搞,所以必須統一。

分配和釋放

一些設備例如打印機,它只能由一個進程來使用,這就需要操作系統根據實際情況判斷是否能夠對設備的請求進行檢查,判斷是否能夠接受其他請求,一種比較簡單直接的方式是在特殊文件上執行 open操作。如果設備不可用,那麼直接 open 會導致失敗。還有一種方式是不直接導致失敗,而是讓其阻塞,等到另外一個進程釋放資源后,在進行 open 打開操作。這種方式就把選擇權交給了用戶,由用戶判斷是否應該等待。

注意:阻塞的實現有多種方式,有阻塞隊列等

設備無關的塊

不同的磁盤會具有不同的扇區大小,但是軟件不會關心扇區大小,只管存儲就是了。一些字符設備可以一次一個字節的交付數據,而其他的設備則以較大的單位交付數據,這些差異也可以隱藏起來。

用戶空間的 I/O 軟件

雖然大部分 I/O 軟件都在內核結構中,但是還有一些在用戶空間實現的 I/O 軟件,凡事沒有絕對。一些 I/O 軟件和庫過程在用戶空間存在,然後以提供系統調用的方式實現。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

前後端分離,如何在前端項目中動態插入後端API基地址?(in docker)_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

開門見山,本文分享前後端分離,容器化前端項目時動態插入後端API基地址,這是一個很贊的實踐,解決了前端項目容器化過程中受制後端調用的尷尬。

尷尬從何而來

常見的web前後端分離:前後端分開部署,前端項目由nginx承載打包文件,反向代理請求。
應用的某些部分必須是可配置的,比如API調用基地址
前端打包的時候需要統一插入該地址形成完整chunk files。

# ------------------------------------------------------
# generate chunk file
# ------------------------------------------------------
FROM node:10-alpine as builder

# install and cache app dependencies
COPY package.json package-lock.json ./
RUN npm install && mkdir /react-frontend && mv ./node_modules ./react-frontend
WORKDIR /react-frontend
COPY . .
RUN npm run build


# ------------------------------------------------------
# Production Build
# ------------------------------------------------------
FROM nginx:latest
COPY  nginx.conf  /etc/nginx/nginx.conf
COPY --from=builder /react-frontend/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

當在Docker中打包前端,或許會嘗試用鏡像構建參數Arg/Env來傳遞後端API調用基地址,但這樣是很不理想的:
打包時參數被統一插入,打包結果chunk files作為最終鏡像的一部分,導致最終的前端鏡像會與後端API地址強關聯。

或許你會針對不用的後端環境(canary、staging、production)構建不同的前端鏡像,但這是一次又一次的工作量,並不是最佳實踐。

下面分享一個容器執行階段動態插入後端API基地址的實踐

前端獨立部署,動態插入後端API基地址(in Docker)

我希望將API基地址延遲到生成容器階段(與構建鏡像的過程解耦), 這樣我就可以使用一個鏡像,針對不同的環境傳參形成不同的前端容器。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

前端項目插入配置的腳本如下:

// FILE: set-env.ts
...
export const environment = {
  production: ${isProd},
  apiBaseUrl: 'API_BASE_URL',
  version: 'v${require('../package.json').version}'
};
...

我們在前端配置中寫入API_BASE_URL佔位符,按照既定流程前端打包;

Dockerfile CMD指令指示容器如何運行:

  • 用真實值替換前端chunk files中原插入的API_BASE_URL佔位符
  • 使用nginx承載替換后的chunk files
# FILE: Dockerfile
...
EXPOSE 80

COPY --from=builder /react-frontend/replace_api_url.sh /
CMD ["sh", "replace_api_url.sh"]

下面是replace_api_url.sh的內容:

#!/usr/bin/env sh

find '/usr/share/nginx/html' -name '*.js' -exec sed -i -e 's,API_BASE_URL,'"$API_BASE_URL"',g' {} \;
nginx -g "daemon off;"

正常構建鏡像之後;現在生成容器時,可通過環境變量傳參替換原前端chunk files的API_BASE_URL字符串

docker build -t front .
docker run -p 80:80 -e API_BASE_URL=http://somebackend.com/api front

總結輸出

這是一個巧妙的設計,讓我們在前端獨立容器化部署時,能解耦後端API基地址,避免了一次又一次的構建鏡像工作量。

Dockerfile CMD指令包裝的容器啟動腳本:讓我們在nginx承載前端打包文件之前,做一次字符串替換,成功將後端API基地址“延遲”到容器運行階段。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

循序漸進VUE+Element 前端應用開發(6)— 常規Element 界面組件的使用,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理,循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

在我們開發BS頁面的時候,往往需要了解常規界面組件的使用,小到最普通的單文本輸入框、多文本框、下拉列表,以及按鈕、圖片展示、彈出對話框、表單處理、條碼二維碼等等,本篇隨筆基於普通表格業務的展示錄入的場景介紹這些常規Element組件的使用,使得我們對如何利用Element組件有一個大概的認識。

1、列表界面和其他模塊展示處理

在前面隨筆《循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理》介紹了基於列表展示了相關數據,並在列表界面整合了增刪改查等常規的業務操作處理。

 常規的列表展示界面,一般分為幾個區域,一個是查詢區域,一個是列表展示區域,一個是底部的分頁組件區域。查詢區域主要針對常規條件進行布局,以及增加一些全局或者批量的操作,如導入、導出、添加、批量添加、批量刪除等按鈕;而其中主體的列表展示區域,是相對比較複雜一點的地方,需要對各項數據進行比較友好的展示,可以結合Tag,圖標,按鈕等界面元素來展示,其中列表一般後面會包括一些對單行記錄處理的操作,如查看、編輯、刪除的操作,如果是批量刪除,可以放到頂部的按鈕區域。

對於常規按鈕、表格、分頁組件,前面已經做了相關的介紹,這裏就不再贅述。

在介紹具體界面組件的時候,我們先來了解下,整體的界面布局,我們把常規的列表界面,新增、編輯、查看、導入等界面放在一起,除了列表頁面,其他內容以彈出層對話框的方式進行處理,如下界面示意所示。

 每個對話框的:visible的屬性值,則是確定哪個模態對話框的显示和隱藏。

在Vue的JS模塊裏面,我們除了定義對應的對話框显示的變量外,對每個對話框,我們定義一個表單信息用來進行數據的雙向綁定處理。

 常規的新增、編輯、查看、導入等內容的定義,作為一個對話框組件定義,常規的對話框組件的使用代碼如下所示。

<el-dialog
  title="提示"
  :visible.sync="dialogVisible"
  width="30%"
  :before-close="handleClose">
  <span>這是一段信息</span>
  <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="dialogVisible = false">確 定</el-button>
  </span>
</el-dialog>

為了控制對話框的樣式,我們這裏注意下footer的slot,這個我們一般是把處理按鈕放在這裏,如對於查看界面對話框,我們定義如下所示。

  一般來說,對於表單內容比較多的場景,我們一般分開多個選項卡進行展示或者錄入,這樣方便管理,查看界面整體效果如下所示。

 對於對話框的數據綁定,我們在打開對話框前,先通過API模塊請求獲得JSON數據,然後綁定在對應的對話框模型屬性上即可,如對於查看界面,我們的處理邏輯如下所示。

    showView(id) {
      var param = { id: id }
      GetProductDetail(param).then(data => {
        Object.assign(this.viewForm, data);
      })
      this.isView = true
    },

對於表格的雙擊,我們同樣綁定它的查看明細處理操作,如下模板代碼和JS代碼所示。

模板HTML代碼如下:

<el-table
  v-loading="listLoading"
  :data="productlist"
  border
  fit
  stripe
  highlight-current-row
  :header-cell-style="{background:'#eef1f6',color:'#606266'}"
  @selection-change="selectionChange"
  @row-dblclick="rowDbclick"
>

JS邏輯代碼如下  

    rowDbclick(row, column) {
      var id = row.ID
      this.showView(id);
    },

 

2、常規界面組件的使用

 一般情況下,我們使用界面組件的時候,參考下官網《Element組件使用》,尋找對應組件的代碼進行參考,就差不多了,這裏還是就各種常規的Element組件進行大概的介紹吧。

1)表單和表單項、單文本框

對於表單,我們一般定義一個對應的名稱,並設置它的data對應的模型名稱即可,如下所示。

<el-form ref="viewForm" :model="viewForm" label-width="80px">

而表單項,一般是定義好表單項的Label即可,然後在其中插入對應的錄入控件或者展示控件。如對於單文本組件使用,如下所示。

 <el-form-item label="產品編號">
   <el-input v-model="editForm.ProductNo" />
 </el-form-item>

其中 v-model=”editForm.ProductNo”  就是對應綁定的數據。

而表單項,可以添加對字段的驗證處理,在數據提交前,可以校驗客戶的錄入是否有效等。

  <el-form-item
    prop="email"
    label="郵箱"
    :rules="[
      { required: true, message: '請輸入郵箱地址', trigger: 'blur' },
      { type: 'email', message: '請輸入正確的郵箱地址', trigger: ['blur', 'change'] }
    ]"
  >
    <el-input v-model="dynamicValidateForm.email"></el-input>
  </el-form-item>

注意這裏表單項,必須添加一個prop的屬性設置,如 prop=”email” 所示。

一般為了控制布局,我們還結合el-row進行一個布局的處理,如下代碼所示(一行等於span為24,span=12也就是一行放兩個控件組)。

<el-row>
  <el-col :span="12">
    <el-form-item label="產品編號">
      <el-input v-model="editForm.ProductNo" />
    </el-form-item>
  </el-col>
  <el-col :span="12">
    <el-form-item label="條碼">
      <el-input v-model="editForm.BarCode" />
    </el-form-item>
  </el-col>
</el-row>

 

2)、下拉列表控件的綁定

下拉列表的綁定處理,也是通過 v-model 進行值的綁定,而選項則可以通過數據列表進行綁定。

<el-form-item label="商品類型">
  <el-select v-model="editForm.ProductType" filterable="" placeholder="請選擇">
    <el-option
      v-for="(item, key) in typeList"
      :key="key"
      :label="item.value"
      :value="item.key"
    />
  </el-select>
</el-form-item>

而選項中的 typeList,我們可以在頁面初始化的時候獲取出來即可。

  created() {
    // 獲取產品類型,用於綁定字典等用途
    GetProductType().then(data => {
      if (data) {
        data.forEach(item => {
          this.productTypes.set(item.id, item.name)
          this.typeList.push({ key: item.id, value: item.name })
        })

        // 獲取列表信息
        this.getlist()
      }
    });
  },

對於textarea常規的多行文本框,其實和普通單行文本框處理差不多,指定它的type=”textarea” 和 rows的數值即可。

  <el-tab-pane label="說明" name="second">
    <el-form-item label="說明">
      <el-input v-model="editForm.Description" type="textarea" :rows="10" />
    </el-form-item>
  </el-tab-pane>

而對於一些可能需要展示HTML內容的,我們可以使用DIV控件來展示,通過v-html標識來處理包含HTML代碼的內容。

  <el-tab-pane label="詳細說明">
    <el-form-item label="詳細說明">
      <div class="border-radius" v-html="viewForm.Note" />
    </el-form-item>
  </el-tab-pane>

 

3)、圖片展示

對於一些需要展示服務器圖片,我們請求后,根據Element圖片組件的設置處理即可,如下包括單個圖片和多個圖片的展示和預覽操作。

 圖片展示的代碼如下所示。

  <el-tab-pane label="圖片信息">
    <el-form-item label="封面圖片">
      <el-image
        style="width: 100px; height: 100px"
        :src="viewForm.Picture"
        :preview-src-list="[viewForm.Picture]"
      />
    </el-form-item>
    <el-form-item label="Banner圖片">
      <el-image
        style="width: 100px; height: 100px"
        :src="viewForm.Banner"
        :preview-src-list="[viewForm.Banner]"
      />
    </el-form-item>
    <el-form-item label="商品展示圖片">
      <el-image
        v-for="item in viewForm.pics"
        :key="item.key"
        class="border-radius"
        :src="item.pic"
        style="width: 100px; height: 100px;padding:10px"
        :preview-src-list="getPreviewPics()"
      />
    </el-form-item>
  </el-tab-pane>

上圖中,如果是單個圖片,那麼預覽我們設置一個集合為一個url即可,如 [viewForm.Banner],如果是多個圖片,需要通過一個函數來獲取圖片列表,如 getPreviewPics() 函數所示。

    getPreviewPics() {
      // 轉換ViewForm.pics裏面的pic集合
      var list = []
      if (this.viewForm.pics) {
        this.viewForm.pics.forEach(item => {
          if (item.pic) {
            list.push(item.pic)
          }
        })
      }
      return list
    }

 

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

4)、第三方擴展控件

對於一些需要使用擴展組件的,我們一般搜索下解決方案,通過npm安裝對應的組件即可解決,如對於條碼和二維碼,我使用 @chenfengyuan/vue-barcode和 @chenfengyuan/vue-qrcode,一般在Github上搜索下關鍵字,總能找到一些很受歡迎的第三方組件。

  安裝這些組件都有具體的說明,如下所示(如果卸載,直接修改install為uninstall即可)。

npm install @chenfengyuan/vue-barcode vue

以及

npm install @chenfengyuan/vue-qrcode vue

條碼和二維碼的展示效果如下所示

如果全局引入barcode和qrcode 組件,我們在main.js裏面引入即可,如下代碼所示

// 引入barcode,qrcode
import VueBarcode from '@chenfengyuan/vue-barcode';
import VueQrcode from '@chenfengyuan/vue-qrcode';
Vue.component(VueBarcode.name, VueBarcode);

  

 富文本編輯,我這裏採用了 Tinymce 第三方組件來實現編輯處理,展示效果如下所示。

  代碼如下所示

  <el-tab-pane label="詳細說明" name="third">
    <el-form-item label="詳細說明">
      <tinymce v-model="editForm.Note" :height="300" />
    </el-form-item>
  </el-tab-pane>

以上就是一些常規的界面組件的使用,後面在繼續介紹文件上傳和圖片結合的操作。

3、自定義組件的創建使用

使用Vue的比以往BS開發的好處,就是可以很容易實現組件化,這點很好,一旦我們定義好一個控件,就可以在多個界面裏面進行使用,非常方便,而且封裝性可以根據自己的需要進行處理。

查詢區域一般的界面效果如下所示,除了包含一些常用的查詢條件,一般會有一些下拉列表,這些可能是後台字典裏面綁定的內容,可以考慮作為一個通用的字典下拉列表組件來做。

其實界面錄入的時候,也往往需要這些條件下拉列表的。

  那麼我們來定義一個自定義組件,並在界面上使用看看。

在Components目錄創建一個目錄,並創建一個組件的vue文件,命名為my-dictdata.vue,如下所示。

 界面模板代碼我們就一個select組件為主即可。

<template>
  <el-select v-model="svalue" filterable clearable placeholder="請選擇">
    <el-option
      v-for="(item, index) in dictItems"
      :key="index"
      :label="item.Text"
      :value="item.Value"
    />
  </el-select>
</template>

script腳本邏輯代碼如下所示。

<script>
// 引入API模塊類方法
import { GetDictData } from '@/api/dictdata'

export default {
  name: 'MyDictdata', // 組件的名稱
  props: {
    typeName: { // 字典類型方式,從後端字典接口獲取數據
      type: String,
      default: ''
    },
    options: {// 固定列表方式,直接綁定
      type: Array,
      default: () => { return [] }
    }
  },
  data() {
    return {
      dictItems: [], // 設置的字典列表
      svalue: '' // 選中的值
    }
  },
  watch: {
    // 判斷下拉框的值是否有改變
    svalue(val, oldVal) {
      if (val !== oldVal) {
        this.$emit('input', this.svalue);
      }
    }
  },
  mounted() {
    var that = this;

    if (this.typeName && this.typeName !== '') {
      // 使用字典類型,從服務器請求數據
      GetDictData(this.typeName).then(data => {
        if (data) {
          data.forEach(item => {
            if (item && typeof (item.Value) !== 'undefined' && item.Value !== '') {
              that.dictItems.push(item)
            }
          });
        }
      })
    } else if (this.options && this.options.length > 0) {
      // 使用固定字典列表
      this.options.forEach(item => {
        if (item && typeof (item.Value) !== 'undefined' && item.Value !== '') {
          that.dictItems.push(item)
        }
      });
    }
    // 設置默認值
    this.svalue = this.value;
  },
  methods: {

  }
}
</script>

主要就是處理字典數據的獲取,並綁定到模型對象上即可。

在頁面上使用前,需要引入我們定義的組件

import myDictdata from '@/components/Common/my-dictdata'

然後包含進去components裏面即可

export default {
  components: { myDictdata },

那麼原來需要直接使用select組件的代碼

<el-select v-model="searchForm.ProductType" filterable clearable placeholder="請選擇">
  <el-option
    v-for="(item, key) in typeList"
    :key="key"
    :label="item.value"
    :value="item.key"
  />
</el-select>

則可以精簡為一行代碼

<my-dictdata v-model="searchForm.ProductType" type-name="商品類型" />

而對於固定列表的,我們也可以通用的處理代碼

<my-dictdata v-model="searchForm.Status" :options="Status" />

其中Status是定義的一個對象集合

  Status: [
    { Text: '正常', Value: 0 },
    { Text: '推薦', Value: 1 },
    { Text: '停用', Value: 2 }
  ]

是不是非常方便,而得到的效果則不變。

 

 以上就是多個頁面內容,通過對話框層模式整合在一起,並介紹如何使用,以及對界面中常見的Element組件進行介紹如何使用,以及定義一個字典列表的主定義組件,用於簡化界面代碼使用,

 

列出以下前面幾篇隨筆的連接,供參考:

循序漸進VUE+Element 前端應用開發(1)— 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)— Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)— 動態菜單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)— 獲取後端數據及產品信息頁面的處理

循序漸進VUE+Element 前端應用開發(5)— 表格列表頁面的查詢,列表展示和字段轉義處理

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

設計模式之單例模式_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

目錄:

  • 什麼是單例模式
  • 單例模式的應用場景
  • 單例模式的優缺點
  • 單例模式的實現
  • 總借

一、什麼是單例模式

  單例模式顧名思義就是只存在一個實例,也就是系統代碼中只需要一個對象的實例應用到全局代碼中,有點類似全局變量。例如,在系統運行時,系統需要讀取配置文件中的參數,在設計系統的時候讀取配置文件的類往往設計成單例類。因為系統從啟動運行到結束,只需要讀取一次配置文件,這個讀取配置文件全部由該類負責讀取,在全局代碼中只需要使用該類即可。這樣不僅簡化了配置文件的管理,也避免了代碼讀取配置文件數據的不一致性。

 

 單例模式的特點:

  1、該類的構造方法聲明為private,這樣其他類無法初始花該類,只能通過該類的public方法獲取該類的對象。

  2、裏面有個私有的對象成員,該成員對象是類本身,用於public方法返回該類的實例。

  3、該類中提供一個public的靜態方法,返回該類的私有成員對象。

 

二、單例的應用場景

 

  舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次打開一個新的回收站時,Windows系統並不會為你彈出一個新的回收站窗口。,也就是說在整個系統運行的過程中,系統只維護一個回收站的實例。這就是一個典型的單例模式運用。

 

  繼續說回收站,我們在實際使用中並不存在需要同時打開兩個回收站窗口的必要性。假如我每次創建回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複創建該實例的情況下,創建了多個實例,這樣做就會給系統造成不必要的負擔,造成資源浪費。

 

  再舉一個例子,網站的計數器,一般也是採用單例模式實現,如果你存在多個計數器,每一個用戶的訪問都刷新計數器的值,這樣的話你的實計數的值是難以同步的。但是如果採用單例模式實現就不會存在這樣的問題,而且還可以避免線程安全問題。同樣多線程的線程池的設計一般也是採用單例模式,這是由於線程池需要方便對池中的線程進行控制

 

  同樣,對於一些應用程序的日誌應用,或者web開發中讀取配置文件都適合使用單例模式,如HttpApplication 就是單例的典型應用。

 

  從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點:  

 

   適用場景:

  1.需要生成唯一序列的環境

  2.需要頻繁實例化然後銷毀的對象。

  3.創建對象時耗時過多或者耗資源過多,但又經常用到的對象。 

  4.方便資源相互通信的環境

 

 

三、單例模式的優缺點

  優點

    1、在內存中只有一個對象,節省內存空間;

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

    2、避免頻繁的創建銷毀對象,可以提高性能;

    3、避免對共享資源的多重佔用,簡化訪問;

    4、為整個系統提供一個全局訪問點。

  缺點

    1、不適用於變化頻繁的對象;

    2、濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;

    3、如果實例化的對象長時間不被利用,系統會認為該對象是垃圾而被回收,這可能會導致對象狀態的丟失;

 

四、單例模式的實現

  1、餓漢式

public class Mgr{
    //創建自己的實例,並初始化私有靜態final成員
    private static final Mgr mgr = new Mgr();
    //私有構造方法
    private Mgr() {}; 
    //公共方法,返回自己的實例化成員
    public static Mgr getMgr() { 
        return  mgr;
    }
}

  備註:該單例實現方法簡單明了,推薦使用。該類被JVM加到內存的時候,只會加載一次,並且只實例化一個單例,優點是具有線程安全性,缺點是:不用他也在內存中實例化,浪費內存。所以提出了懶散式實現方式。

  2、懶漢式

public class Mgr{
   //聲明私有靜態對象成員,作為返回值
    private static Mgr mgr;
   //私有構造函數
    private Mgr() {}; 
   //懶漢的特點,提供公共靜態方法,如果該成員對象為空,實例化並返回
    public static Mgr getMgr() {
        if(mgr == null){
            mgr =  = new Mgr();
        }
         return  mgr;
     }
}

  備註:(不推薦用)這種實現方法只有程序在調用該類的getMgr方法才實例話對象並返回,特點就是調用的時候再實例化並返回,延遲加載的被動形式。但是該實現方法不是線程安全的,因為當同時有有兩個線程執行到if(mgr==null)語句的時候,由於某些原因其中一個線程先一步執行下一句,實例化了對象並返回;兩一個線程再實例化對象在返回,這兩個線程返回的對象不是同一個對象(這難道還是單例嗎!),所以該實現方法的缺點也很明顯。那為了避免線程不安全問題,在懶漢寫法上提出加鎖的實現方式。

  3、給公共方法加鎖

public class Mgr{
    //聲明私有靜態對象成員,作為返回值
    private static Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //給公共方法加鎖,只有一個線程第一次獲得鎖實例化對象並返回
    public static syncnronized Mgr getMgr() {
        if(mgr == null){
            mgr = new Mgr();
        }
        return  mgr;
   }
}

  備註:(推薦使用)這種實現方式比較完善,既保證了懶散式的延遲加載方式,也保證了線程安全。缺點是在整個方法上加鎖,導致性能下降。因為只有第一次獲得鎖的線程實例化對象並返回,以後的線程獲得鎖的時候執行 if(mgr == null)語句的時候,由於mgr已經實例化了不為空,直接跳過返回實例。整個過程要競爭鎖,不能併發執行導致性能下降。那為優化性能下降問題,那我只在mgr = new Mgr()上加鎖,保證鎖粒度最小化的同時保證單例實例化。

  4、給實例化加鎖

public class Mgr{
    //私有靜態成員對象
    private static Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //公共方法,在實例化語句塊加鎖,保證單例
    public static  Mgr getMgr() {
        if(mgr == null){
            syncnronized(Mgr.class){
                mgr = new Mgr();
            }
        }
         return  mgr;
  }
}

  備註:(不推薦使用)該實現方法雖然相較方法3性能有所提升,但並不能保證線程安全。因為當兩個線程同時執行if(mgr == null)語句時,其中線程1獲取鎖,實例化對象並返回,線程2在獲得鎖又在實例化對象並返回。線程1和線程2獲取的對象並不是同一個。所以在此基礎上提出了雙重判斷方式。

5、雙重判斷加鎖

public class Mgr{
    //私有靜態成員對象
    private static  Mgr mgr;
    //私有構造函數
    private Mgr() {}; 
    //公共方法提供雙重判斷並在實例化代碼塊加鎖
    public static  Mgr getMgr() {
        if(mgr == null){ //第一次判斷
            syncnronized(Mgr.class){
                if(mgr == null){ //第二次判斷
                    mgr =  = new Mgr();
                }      
            }
        }
         return  mgr;
  }
}

  備註:(推薦使用)相較於方法4,該方法雙重判定,如果多線程同時執行到第一次判斷語句位置,其中一個線程獲得鎖,由於是第一次該對象成員為空,實例化后並返回。其後其它線程調用公共方法的時候,由於實例化了,在第一次判斷自接返回實例,不在產生鎖競爭。大大提高了效率,保證了線程的安全性,也保證了延遲加載的特性。

 6、靜態內部類

public class Mgr{
    private Mgr() {};
    //定義靜態內部類
    private static class MgrHolder{
        private final static Mgr mgr = new Mgr();
    } 
    //公共方法直接返回靜態內部類的實例對象
    public static  Mgr getMgr() {
        return  MgrHolder.mgr;
  }
}

  備註:(可使用)該實現方法通過JVM來保證線程安全性,靜態內部類MgrHolder來New一個Mgr對象,JVM只會加載一次Mgr類(靜態內部類不會加載),當類調用getMgr方法的時候,也只會調用一次,公共方法調用靜態內部類,獲取一個對象(也是實現懶加載)。所以也是線程安全的。

7、枚舉類單例模式

public enum Mgr{
    mgr;
    public void m(){} //業務方法
}

  備註:(推薦使用)jdk1.5之後才能正常達到單例效果,參考來自《Effective Java》。注意枚舉類的枚舉變量必須寫在第一行,後面實現業務代碼。調用方式是:Mgr.mgr.Function_Name();具備枚舉類型的特點,有點是:線程同步,防止反序列化。

五、總結

  通過上面幾種單例模式的實現方式的列舉,但是在實際應用中其中的2,3,4三種方式並不適用,列出來只是讓讀者更好的理解方式5的由來,起到拋磚引玉的作用,更好的理解單例模式。總之常用的四種,懶漢,雙重校驗鎖,靜態內部類,枚舉單例。

  餓漢:類加載的時候就創建實例,所以是線程安全的,但不能延遲加載。

  雙重校驗鎖:線程安全,效率較高,延遲加載。

  靜態內部類:實現起來比較麻煩,在不同的編譯器上會出現不可預知的錯誤。

  枚舉單例:很好,不僅避免了多線程同步問題,而且能反正反序列化重新創建對象,但是不能延遲加載,用的人少。

 

  • 讀者發現有什麼有問題的地方謝謝留言指正。部分參考自:https://www.cnblogs.com/xuwendong/p/9633985.html#_label0

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念