Starlink 衛星網路國外影片開箱與速度實測,安裝容易、下載速度最快達到 180Mbps_網頁設計

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

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

Starlink 衛星網路在國外已經陸續送到符合測試資格的用戶家中,雖然台灣基本上應該是不需要,而且也不知多久才有可能進來,但相信不少人對於這產品都相當有興趣,究竟實際使用的速度表現如何?安裝容不容易?而前幾天就有人拍攝開箱與實測影片,並分享到 YouTube 上,整體看起來真的很不錯,下面整理給大家。

Starlink 國外影片開箱與速度實測

Starlink 目前還處於 Beta 測試階段,只有開放給偏鄉的普通用戶,月費為 99 美元,約台幣 2,780 元(價格不便宜)。根據統計,截至 11 月已經完成 16 次衛星發射任務,目前在軌道上的衛星數量共有 860 顆,已經超越 Starlink 先前提過覆蓋全美的 720 顆,至於全球,則需要 1,800 顆。

近日一名網友,在自己的 Northwoods Odds and Ends 頻道中,分享他收到 Starlink 的開箱與速度實測影片,長達 16 分鐘,文末我會附上完整影片,下面就簡單介紹幾個重點。

他收到 Starlink 共有兩盒,有一個特別大,另一個看起來像是配件與說明書的小盒子:

小盒打開之後果然是配件箱(底座),還有說明書:

大盒打開當然就是接收衛星訊號的主體,另外還有隨附的 Starlink 路由器(下方白銀那一台):

這個衛星接收器有內建網路線,而且非常長一條,從戶外接到室內沒問題:

而安裝位置有很多種方式,這位用戶他是裝在屋頂上,下方還另外加裝延長管,讓接收器可以更靠近天空一點,來提升訊號強度。他也提到,Starlink 隨附的連接管,基本上可跟任何管子相容:

底部就鎖在屋頂上方:

一開始會需要一點時間讓接受器找到衛星訊號:

網路線部分,他就從旁邊的小窗進到屋內:

其長度可以一直延伸到房子另一側的地下室:

接收器的網路線是連接到電源變壓器上,然後再用另一條網路線,從另一邊的孔接出:

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

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

然後連到 Starlink 路由器上,這台只有兩個網路孔,因此另一條他再接到自己的路由器:

如下圖所示,這些網路線分別接到自己的其他網路設備與智慧家庭裝置:

速度實測方面,下圖背景是他打開可查看衛星位置的網頁,他的家位於綠色圈圈內,意味著訊號不錯,測試出來下載也確實高達 126.13Mbps,上傳 23.68Mbps:

他還測試多次,都有超過 100Mbps,甚至還看到 180Mbps 的下載速度:

不過有時候連到另一顆衛星,速度就有可能會下降:

下方完整影片。從這結果來看,Starlink 真的很讓人期待阿!無論是速度還是安裝易度都很不錯,對於那些住在偏遠地區的人,終於有機會享受到高速上網體驗,希望能趕快向全球推出(原本影片被砍了,換另一個開箱影片):

還可以玩聯網遊戲:

馬斯克全球衛星通信夢不是隨便說說, SpaceX「星鏈(Starlink)」試營運中!

您也許會喜歡:

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

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

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

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

「 Boston Dynamics」機器人公開跳舞影片 靈活動作接近真人_貨運

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

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

致力發展具有腿部人形機器人的波士頓動力(Boston Dynamics),為了迎接新的一年而集結公司旗下Atlas、Spot 和 Handle等各種類型的機器人與機器狗,推出一支「Do You Love Me?」的影片,其中Atlas人形機器人的擬真動作,也吸引許多人的討論。

「 Boston Dynamics」機器人公開跳舞影片 靈活動作接近真人

 

提到跟人類無異的機器人,很多人大概都會聯想到電影題材,像是經典的《魔鬼終結者》系列、《機械公敵》等,不過隨著波士頓動力最新的機器人影片公開,似乎又朝著電影實現更進一步。

 

在波士頓動力先前一支「More Parkour Atlas」的影片中,已能看到Atlas人形機器人開始能加自然的做出人類動作,像是原地跳起來旋轉、後空翻等。

▲圖片來源

 

 

而在「Do You Love Me?」的影片中,可以看到先從Atlas人形機器人獨舞,接著變成兩位Atlas人形機器人,接著再加入Spot 機器狗和 Handle 輪滑機器人,還有Atlas人形機器人與Spot 機器狗搭配等。

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

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

 

除了Atlas人形機器人的姿態越來越自然,而且腳步跟手部的動作能越做越細微外,最讓人驚呀的是配合音樂,你會很自然的覺得這真的是機器人跟著音樂跳舞,說不定有的人跳得還沒他們好。

 

這支影片在12月29日公開後,30日觀看次數已達到了308萬而且持續增加中,也許我們不需等到鋼彈先出現,擬真的人型機器人大概就會先運用在生活中了。

 

圖片來源自「Do You Love Me?」影片

您也許會喜歡:

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

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

※回頭車貨運收費標準

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

DXOMARK 公佈 2020 年智慧型手機最佳相機、最佳自拍、最佳錄音、最佳音效播放榜單_網頁設計公司

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

近年智慧型手機的相機性能的提升,已經能成為民眾日常記錄生活拍照、錄影的隨身相機,而相機的表現也是多數消費者在選購新手機重要的選擇因素之一。 DXOMARK 每年都會評測大量智慧型手機的相機表現並給予評分,也成為消費者、手機品牌作為參考依據。在 2020 年的最後一天, DXOMARK 依據拍攝目的彙整了今年表現最佳的智慧型手機相機。

DXOMARK 公佈 2020 年智慧型手機最佳相機、最佳自拍、最佳錄音、最佳音效播放榜單

許多旗艦級手機在發表後,消費者除了關注硬體規格和售價,也同時會期待專業相機評測網站 DXOMARK 的評測會給予什麼樣的評價,也有不少旗艦機種會將 DXOMARK 的相機評測成績作為宣傳自家手機的一大賣點。在 2020 年, 華為 Mate 40 Pro+ 再次刷新了智慧型手機的總分 139 分稱冠,然而針對不同的拍攝、使用需求, Mate 40 Pro+ 其實也不是唯一選擇。

2020 年智慧型手機最佳主相機

最佳拍照:華為 Mate 40 Pro+

華為 Mate 40 Pro+ 在拍照部分各項表現都相當出色,也毫無疑問取得了「最佳拍照」的肯定。 DXOMARK 拍照分類更取得 144 分的佳績,尤其是夜間拍攝表現出色,也是迄今為止夜拍的最佳成績。此外,動態範圍在極弱光線環境下也優於其他手機,拍攝夜景的細節和噪點也取得良好平衡。
(其他推薦:Apple iPhone 12 Pro)然而,對於中國以外的消費者要入手 華為 Mate 40 Pro+ 不太容易,因此 DXOMARK 也同樣推薦 iPhone 12 Pro 系列。雖然在部分測試項目不如 Mate 40 Pro+ ,不過 iPhone 12 Pro 系列在自動對焦、預覽方面相當出色,搭載 LiDAR 光學雷達掃瞄儀可在所有光線環境下準確地對焦。

最佳錄影:華為 Mate 40 Pro

錄影方面, 華為 Mate 40 Pro 在 DXOMARK 錄影測試取得 116 分的佳績,在任何條件下都可錄製豐富的細節、極少的噪點,色彩演色性和擁有可靠的白平衡。自動對焦準確、可靠的錄影防手震,作為室內外的動態錄影使用都相當理想。
(其他推薦: Apple iPhone 12 Pro Max)iPhoen 12 Pro Max 在錄影拍攝方面取得 113 分的成績名列該分類第二名,雖然各屬性的得分都略低於 Mate 40 Pro 不過差距微乎其微, iPhone 12 Pro Max 同樣能在任何情況下錄製高品質的影片。加上支持杜比視界(Dolby Vision)的拍攝,其動態範圍也令人印象深刻。

最佳夜拍:華為 Mate 40 Pro+

華為 Mate 40 Pro+ 除了一般拍照表現出色,上述也有提到它的夜拍表現是他的強項之一。
(其他推薦:華為 P40 Pro、小米 10 至尊紀念版)夜間拍照方面,華為 P40 Pro 和小米 10 至尊紀念版都取得 72 分的夜景拍攝成績名列第二,在極若光線和夜間拍攝時都可提供出色的畫質。

最佳散景:華為 Mate 40 Pro / 三星 Galaxy S20 Ultra

散景模式方面,華為 Mate 40 Pro 和三星 Galaxy S20 Ultra 均獲得 75 分。 Mate 40 Pro 的人像模式可生成非常自然的散景模擬效果、膚色和曝光都表現不錯,而 S20 Ultra 的散景照片也可呈現精準的曝光度、鮮豔色彩、寬廣動態範圍和戲界。

最佳望遠鏡頭:小米 10 至尊紀念版(小米 10 Ultra)

針對有遠景拍攝需求的用戶,小米 10 至尊紀念版在望遠鏡頭取得 133 分成為重視望遠變焦拍攝者的首選。
(其他推薦:華為 Mate 40 Pro+、 OPPO Finde X2 Pro 和 vivo X50 Pro+)

最佳超廣角鏡頭:小米 10 至尊紀念版(小米 10 Ultra)

小米 10 至尊紀念版在廣角方面取得 53 分,除了提供等效焦距 12.5mm 最寬闊的視野,在畸變和其他圖像的偽像都控制得宜。
(其他推薦:華為 Mate 40 Pro+)

2020 年最佳自拍手機

近年,許多消費者在選購手機相當重視相機自拍的表現,無論是自拍照片或影片進行生活記錄,而 DXOMARK 也選出了幾款 2020 年最佳自拍手機。

最適合用來自拍照片手機:華為 Mate 40 Pro

華為 Mate 40 Pro 在前相機不僅名列自拍評測取得第一名,也在拍照方面獲得 110 分拔得頭籌。在低光環境下也能呈現良好的臉部曝光和寬廣的動態範圍、色彩討喜、低光環境也具有良好的白平衡。
其他推薦:華為 P40 Pro 、 nova 6 、華碩 ZenFone 7 Pro 、三星 Galaxy S20 Ultra、 Galaxy Note 20 Ultra)

最適合用來自拍錄影的手機:華為 Mate 40 pro / 華為 ZenFone 7 Pro

在自拍錄影類別華為 Mate 40 Pro 再次奪冠,而華碩 ZenFone 7 Pro 也並列了第一位,兩款手機在自拍錄影測試都取得出色的 96 分。 Mate 40 Pro 在 4K@30fps 的測試條件下表現最優秀,而翻轉三鏡頭的 ZenFone 7 Pro 一樣在 4K@30fps 影像表現出色,甚至能拍攝 8K 錄影。
(其他推薦:華為 P40 Pro 、三星 Galaxy S20 Ultra 和 Galaxy Note20 Ultra)

2020 年最佳音效播放和錄音手機

DXOMARK 在一年多前加入了音效評測分類,針對智慧型手機的揚聲器播放和錄製收音進行評測。以下也針對音效和收音這兩部分選出了 2020 年的最佳手機。
(*小提醒:以下 DXOMARK 的推薦名單僅針對手機「音效/錄音」的評測結果進行推薦,不涉及其螢幕和錄影的畫面表現。)

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

聽音樂和 Podcast (音效)最佳選擇:小米 10 Pro

看電影和電視劇(音效)最佳選擇:OPPO Find X2 Pro

遊戲(音效)最佳選擇:華碩 ROG Phone 3

錄製生活影片(收音)最佳選擇:榮耀 V30 Pro

自拍錄影(收音)最佳選擇:Apple iPhone 12

錄製現場音樂會最佳選擇:Apple iPhone 12 SE(2020)

語音備忘錄和錄音最佳選擇:華為 P40 Pro

圖片/消息來源:DXOMARK (1) (2) (3)

延伸閱讀:
MKBHD 公布 2020 年度智慧型手機獎 ,年度最佳手機獎落誰家?

您也許會喜歡:

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

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

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

從 React 架構開始講解 useState、useEffect 編程設計_網頁設計公司

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

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

隨着前端開發複雜度增加,原生開發模式顯得越來越笨重,前端框架也層出不窮。

MVC 和 MVVM

MVC

MVC是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面显示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。

  • Model(模型):數據。
  • View(視圖):用戶界面。
  • Controller(控制器):業務邏輯。

MVVM

MVVM是Model-View-ViewModel的簡寫。它本質上就是MVC 的改進版。MVVM 就是將其中的View 的狀態和行為抽象化,讓我們將視圖 UI 和業務邏輯分開。

採用雙向綁定(data-binding):View的變動,自動反映在 ViewModel,反之亦然。

React Component class編程

React 是一個 用於構建用戶界面的 JavaScript 庫,注重於 View 層。

React Component 並沒有嚴格的M,V區分,只是模糊的定義了幾塊內容:

  • state: 數據存放
  • render: 用戶界面
  • setState | forceUpdate: 渲染用戶界面

所以我們的代碼邏輯是這樣的:

  1. 定義state
  2. 根據state編寫render
  3. render中加入事件,修改state,且渲染用戶界面

以上1,2兩步完成后,我們就不再需要關心render,因為render依賴state,我們只需要關心如何修改state,然後需渲染時,setState | forceUpdate就可以了。

生命周期 componentDidMount 也是很重要的,它再組件完成后只執行一次, 可以用於請求數據,然後設置state。

渲染頁面(setState):state -> view。

書寫思路清晰的代碼,要清晰的知道數據的流向,我們這樣設計。

  • 初始化階段:框架自動渲染一次 -> componentDidMount -> 手動渲染
  • 用戶操作:操作 -> 修改state -> 手動渲染

總結:寫好render和state對應的規則后,只需要專心與如何修改state,然後執行渲染即可。

例子:列表請求

請求與請求參數的分離也是代碼清晰程度的重要一部分。

setState最重要的還有第二個參數,是設置成功后的回調函數。React的state可以讓我們專心開發某一塊,例如我們寫一個列表

state = {
  page: 1,
  dataList: null,
}

// 請求列表
fetchDataList = () => {
  const { page } = this.state;
  let data = '通過page參數請求得到的數據';  // 通過請求得到數據
  this.setState({ dataList: data });
}

// 翻頁
handlePageChange = (page) => {
  this.setState({ page }, this.fetchDataList);
}

寫一個請求方法,請求得到的參數完全從state中獲取,得到數據後會setState渲染頁面,所以我們只需要專心致志於設置state,在回調中發送請求。這樣,一切都看起來那麼清晰。

特殊使用

由於 state 是引用類型,所以我們可以使用 this.state.xx = xx 來修改數據,React 官方並不推薦此種修改方式,因為此方法並沒有渲染頁面,並不能直接的感受到數據的變化。

了解了 React 渲染機制后,只要清晰我們再做什麼,也可以使用此種方法修改數據,並且大量能減少代碼量。

例如:頁面上有兩個按鈕,一個按鈕記錄此按鈕點擊次數,另一個按鈕點擊后,才會显示第一個按鈕的點擊次數。

使用常規setState方式,需要兩個變量計數。

state = {
  clickCount: 0;
  viewCount: 0;
}

btn1Click = () => {
  this.setState({clickCount: this.state.clickCount +1 });
}

btn2Click = () => {
  this.setState({viewCount: this.state.clickCount });
}

render() {
  return <div>{this.state.viewCount}</div>
}

如果使用隱士賦值,只需要一個變量,並且再需要渲染的時候手動渲染。

state = {
  count: 0;
}

btn1Click: () => {
  this.state.count++;
}

btn2Click: () => {
  this.forceUpdate(); // 強制渲染 相當於 this.setState({})
}

render() {
  return <div>{this.state.viewCount}</div>
}

當然,這種方式要在對 React 渲染機制清晰后再使用。

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

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

這就體現了React的靈活性,按需渲染。

React Hooks 函數式編程

React 16.7推出了 React Hooks 函數式編程。不用傳統的類方式,寫法大有不同。

首先看渲染機制,Component方式,渲染后,只執行了render方法,類裏面的其他方法不會執行。而 React Hooks 函數式編程 每次渲染,都會把整個函數執行一遍,並提供了一個數據存放地 useState。

useState

// 聲明一個叫 "count" 的 state 變量
const [count, setCount] = useState(0);

setCount 用來設置 count 並且渲染頁面,且只有這一種渲染方式,這就意味着,我們不能像 Component 那樣靈活的按需渲染了。

useEffect

useEffect(function () {
  // do sth..
}, [])

useEffect 第一個參數是一個函數,滿足條件後會觸發。第二個參數是個數組,如果是個空數組則只執行一次第一個參數函數(相當於componentDidMount),如果裏面放變量,執行一次后,以後每次渲染后就監聽變量有沒有改變,如果改變就執行第一個函數。

與 class 方式的對比

對比 React.Component 和 React Hooks,它們都有存放數據的state,通過state渲染頁面的render,和手動渲染的方法setState或者setXXX。

不同的是,React.Component有setState成功后的回調,React Hooks沒有。

例如使用 React Hooks 執行下面代碼

setCount(2);
console.log(count);

count拿到的總是設置前的值。

useState、useEffect代碼設計

看到知乎上一句話:先做什麼再做什麼這種callback的寫法是傾向於命令式,而使用hooks編寫代碼則更傾向於聲明式.你不需要去指定你要的動作發生的時機, 而是聲明一個條件或者依賴來讓React來決定正確的執行時間點。

所以我們要轉變思路,不要去控制何時渲染頁面,因為每一次set都會渲染頁面,需要的是在useEffect里寫條件,讓React自己決定渲染。

如請求改造如下

const [page, setPage] = useEffect(1);          // 請求參數 page
const [pageSize, setPageSize] = useEffect(20); // 請求參數 pageSize
const [type, setType] = useEffect(1);          // 請求參數 type
const [dataList, setDataList] = useEffect(1);  // 請求得到的數據

useEffect(function () {
  fetchDataList();
}, [page, pageSize, type]);

const fetchDataList = function () {
  let data = '通過page pageSize type請求到的數據';
  setDataList(data);
}

組件第一次執行或者page,pageSize,type改變,就會請求數據,然後set新數據渲染頁面。

上面代碼基本上滿足了我們需要,然後在極端情況下,即使請求參數改變,也不需要發請求。對此我們需要另外設置一個變量控制是否發請求。

const [sendRequest, setSendRequest] = useEffect(0);  // 控制發請求

useEffect(function () {
  fetchDataList();
}, [sendRequest]);

const handlePageChange = (page) => {
  setPage(page);
  setSendRequest(Math.random());
}

但是這種寫法還是運用了命令式,違背了React Hooks本意,不推薦。推薦規則寫在useEffect中。

渲染優化

不管是 class 方式還是函數式編程,都需要關心一個問題:合理渲染。

class 方式在每次 setState 或者 forceUpdate 都會執行render函數渲染。

函數式編程方式 在useState中每次set新數據后,就會重新執行整個函數並渲染。

React 重要特徵是,一般情況下,父組件渲染,子組件也會渲染。所以在頂層容器中,要合理渲染,盡可能的抽成更小的組件,防止不必要的渲染。

class 方式中,state只放與rander有關的變量,無關的可以放在class外,減少setState的使用。函數式編程一樣,和return無關的變量可以放在函數外。

whosmeya.com

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

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

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

使用 git add -p 整理 patch_台北網頁設計

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

背景

當我們修改了代碼準備提交時,本地的改動可能包含了不能提交的調試語句,還可能需要拆分成多個細粒度的 pactch

本文將介紹如何使用 git add -p 來交互式選擇代碼片段,輔助整理出所需的 patch

官方介紹

先貼個幫助信息供參考

英文版本:

 -p, --patch
           Interactively choose hunks of patch between the index and the work tree and add them to
           the index. This gives the user a chance to review the difference before adding modified
           contents to the index.

           This effectively runs add --interactive, but bypasses the initial command menu and
           directly jumps to the patch subcommand. See “Interactive mode” for details.

中文版本:

-p, --patch
交互地在索引和工作樹之間選擇補丁塊並將它們添加到索引中。這讓用戶有機會在將修改后的內容添加到索引之前查看差異。

這可以有效地運行 add --interactive,但是會繞過初始命令菜單,而直接跳轉到 patch 子命令。有關詳細信息,請參見`‘交互模式’'。

demo 視頻版

以下文字版例子對應的視頻演示:

demo 文字版

我們造個例子來說明,假設我們本次完成了兩個功能,fun1 和 fun2,希望分開提交。另外在修改過程中還引入了一些調試的打印,是不需要提交的。

代碼的 diff 如下

 --git a/demo.c b/demo.c
index 0473c1a..76cfb22 100644
--- a/demo.c
+++ b/demo.c
@@ -1,16 +1,31 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
 }

+void fun2()
+{
+       printf("after hello world\n");
+}
+
 int main()
 {
+       fun1();
        printf("hello world\n");
+       printf("debug %s %d\n", __func__, __LINE__);
        printf("hello world\n");
        printf("hello world\n");
        printf("hello world\n");
+       printf("debug %s %d\n", __func__, __LINE__);
        printf("hello world\n");
+       fun2();
        demo();
+       printf("debug %s %d\n", __func__, __LINE__);
 }

此時直接 git add 會把整個文件的改動都加進來,不符合需求。

這正是 patch mode 發揮作用的地方,我們可以挑選一部分改動進行提交。

輸入 git add -p 進入 patch mode , 此時 git 會自動將改動切分成多個片段,並展示第一個片段,提示你進行選擇。

提示語句是 Stage this hunk [y,n,q,a,d,/,s,e,?]?

這些字母都是什麼意思呢? 輸入?回車,可以查看詳細的幫助信息。

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

英文版本:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

中文版本:

y - 暫存此區塊
n - 不暫存此區塊
q - 退出;不暫存包括此塊在內的剩餘的區塊
a - 暫存此塊與此文件後面所有的區塊
d - 不暫存此塊與此文件後面所有的 區塊
g - 選擇並跳轉至一個區塊
/ - 搜索與給定正則表達示匹配的區塊
j - 暫不決定,轉至下一個未決定的區塊
J - 暫不決定,轉至一個區塊
k - 暫不決定,轉至上一個未決定的區塊
K - 暫不決定,轉至上一個區塊
s - 將當前的區塊分割成多個較小的區塊
e - 手動編輯當前的區塊
? - 輸出幫助

對於我們的例子,git第一次自動給出的hunk很大,可以先執行 s 分割下。分割后第一個區塊就只包含增加的 fun1 函數了。

/* 太占篇幅,此處省略原始 hunk */
Stage this hunk [y,n,q,a,d,/,s,e,?]? s /* 詢問我們對第一個片段的處理,我們覺得太大,按 s 要求分割 */
Split into 7 hunks. /* 可以看到,s 讓 git 將原始片段進一步切分成了 7 個片段,接下來就是自動展示第一個片段 */
@@ -1,7 +1,12 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
 }

Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?  /* 詢問我們對第一個片段的處理 */

輸入 y 回車選中這個 fun1 的改動,git 就會自動展示下一個片段,繼續詢問我們。

這樣對片段使用 yn,我們就可以只挑選出涉及 fun1 的改動,當我們確認後續沒有 fun1 相關的改動時,就可以按 q 退出挑選了。

此時 git status 可以看到部分改動在暫存區中。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   demo.c

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   demo.c

使用 git diff --cached 可以具體確認要提交的內容,是否符合我們的預期,只包含 fun1 的改動,不包含 fun2 和調試語句。

$ git diff --cached
diff --git a/demo.c b/demo.c
index 0473c1a..b9fd4d4 100644
--- a/demo.c
+++ b/demo.c
@@ -1,5 +1,10 @@
 #include <stdio.h>

+void fun1()
+{
+       printf("before hello world\n");
+}
+
 void demo()
 {
        ;
@@ -7,6 +12,7 @@ void demo()

 int main()
 {
+       fun1();
        printf("hello world\n");
        printf("hello world\n");
        printf("hello world\n");

確認無誤就可以提交第一個patch, 即 fun1 的改動了。

git commit -m "fun1"

接下來繼續使用 git add -p,配合s,y,’n’就可以進一步挑選出fun2的改動了。

如果要挑選的改動比較明確,可以直接使用 /來搜索到目標hunk,省去逐個片段判斷的麻煩。例如執行 /fun2 來搜索包含 fun2 的代碼片段。

git add -p 挑選完之後,建議使用 git diff --cached 確認下,或者在提交之後 git show 確認下改動,如有錯漏,及時修正,多退少補。

大部分情況使用s y n就足夠了。但如果有些改動是混合在一起的,無法使用s來分割,那就得用 e 來手工編輯了,下回分解吧。

blog: https://www.cnblogs.com/zqb-all/p/13020293.html
公眾號:https://sourl.cn/MDcrJA

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

【譯】Welcome to C# 9.0_網頁設計公司

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

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

  C# 9.0正在形成,我想分享我們對添加到該語言下個版本的一些主要功能的看法。對於每個新版本的 C#,我們努力使常見的編碼方案更加清晰和簡單,C# 9.0 也不例外。這次的一個特別重點是支持數據形狀的簡潔和不可變表示。

  讓我們潛入吧!

1 僅可初始化的屬性

  對象初始化器是非常好用的。它們為類型實例化提供了一種非常靈活且可讀的格式來創建對象,尤其是對於一次創建特別大的嵌套對象來說。下面是一個簡單的例子:

new Person
{
    FirstName = "Scott",
    LastName = "Hunter"
}

  對象初始化也使用戶不必編寫大量構造函數,要做的就是編寫一些屬性!

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

  今天,一個很大的限制是,屬性必須是可修改的,對象初始化器是這樣工作的:首先調用對象的構造函數(默認為無參的構造函數),然後分配給屬性設置器(property setter)。

  僅可初始化屬性修改了這一點!它們引入了一個 init 訪問器,該訪問器是set訪問器的變體,只能在對象初始化期間調用:

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

  使用此聲明,除了初始化外,之後任何後續賦值給 FirstName 和 LastName 屬性都是一個錯誤。

  因為init訪問器只能在初始化期間訪問,因此他們允許修改封閉類型中的只讀字段,就像在構造函數中那樣:

public class Person
{
    private readonly string firstName;
    private readonly string lastName;
   
    public string FirstName
    {
        get => firstName;
        init => firstName = (value ?? throw new ArgumentNullException(nameof(FirstName)));
    }
    public string LastName
    {
        get => lastName;
        init => lastName = (value ?? throw new ArgumentNullException(nameof(LastName)));
    }
}

2 記錄

  如果要使單個屬性不可變,則僅可初始化屬性非常適合。如果希望整個對象不可變且像值類型一樣,則應考慮將其聲明為記錄:

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

  類聲明中的data關鍵字將其標記為記錄。這賦予它幾個類似價值類型的行為,我們將在下面深入探討這些行為。一般來說,記錄更被視為”值”(純數據), 而不是作為對象。您可以通過創建新記錄表示新狀態來表示隨時間的變化。它們不是由標識定義,而是由其內容定義。

2.1 With表達式

  使用不可變數據時,一種常見模式是從現有值創建新值以表示新狀態。例如,如果我們更改LastName,我們會將其表示為一個新對象,該對象是舊對象的副本,但LastName不同。這種技術通常被稱為非破壞性修改。記錄這種特性表示的是Person在給定時間的狀態。

  為了適應這種編程風格,記錄允許一種新的表達式——with:

var otherPerson = person with{LastName="Hanselman"};

  with表達式使用對象初始化器語法來說明新對象與舊對象的不同內容。您可以指定多個屬性。

  記錄隱式定義一個受保護的”複製構造函數”-一個構造函數,它獲取現有記錄對象,並逐個將其字段複製到新的對象:

protected Person(Person original){/* copy all the fields */}// generated

  with 表達式會導致調用複製構造函數,然後在上面應用對象初始化器以相應地更改屬性。

  如果您不喜歡生成的複製構造函數的默認行為,則可以改為定義自己的行為,該行為將由with表達式選取。

2.2 基於值的相等性

  所有對象都從Object繼承 Equals(object)。結構將其重寫為具有”基於價值的相等性”,通過遞歸地調用Equals來比較結構的每個字段。記錄也執行相同的操作。這意味着,根據其”值”,兩個記錄對象可以彼此相等,而不必是同一對象。例如:

var originalPerson = otherPerson with { LastName = "Hunter" };

  現在 ReferenceEquals(person, originalPerson) = false(這兩個不是一個對象)但是Equals(person, originalPerson) = true (他們有相同的值)。

  如果您不喜歡生成的 Equals 重寫的默認逐字段比較行為,則可以改為編寫自己的字段比較行為。你只需要小心,你了解基於值的相等在記錄中是如何工作的,特別是當涉及繼承時。

  除了重寫Equals 外,還有 GetHashCode()。

2.3 數據成員

  記錄絕大多數都是不可變的,只有隻讀初始化器可以通過with表達式進行非破壞性修改。為了針對這種常見情況進行優化,記錄在聲明時會更改string FirstName這類成員聲明的行為。與其他類和結構聲明中的隱式private字段不同,在記錄中,這被視為public的、僅可初始化的自動屬性的縮寫!因此:

public data classPerson
{
    string FirstName;
    string LastName;
}

  與

public data classPerson
{
    public string FirstName{get; init;}
    public string LastName{get; init;}
}

  是相同的。

  我們認為這有助於做出漂亮而清晰的記錄聲明。如果您真的需要私有字段,只需顯式地添加private修飾符:

private string firstName;

2.4 基於位置的記錄

  有時,對記錄採用更為位置化的方法是有用的,在這種方法中,記錄的內容通過構造函數參數的位置給出,並且可以通過解構函數來提取。

  可以在記錄中指定自己的構造函數和解構函數:

public data classPerson
{
    string FirstName;
    string LastName;
    public Person(string firstName,string lastName)
      =>(FirstName,LastName)=(firstName, lastName);
    public void Deconstruct(out string firstName,out string lastName)
      =>(firstName, lastName)=(FirstName,LastName);
}

  上面代碼可以簡寫為:

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

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

public data class Person(string FirstName,string LastName);

  這將聲明public的僅初始化的自動屬性以及構造函數和解構函數,以便您可以編寫:

var person =new Person("Scott","Hunter");// positional construction
var(f, l)= person;                        // positional deconstruction

  如果您不喜歡生成的自動屬性,則可以改為定義自己的同名屬性,生成的構造函數和解構函數將使用該屬性。

2.5 記錄的改變引發的問題

  想象一下,將記錄對象放入字典中。再次找到它取決於 Equal 和GetHashCode。如果記錄改變其狀態,它也會改變它等於什麼!我們可能再也找不到了!在哈希表實現中,它甚至可能損壞數據結構,因為定位基於的是”到達哈希表時”的哈希值!

  雖然可以通過重寫一些內部方法來改變這種默認的行為,但其工作量也是相當巨大的。

2.6 with表達式與繼承

public data class Person{string FirstName;string LastName;}
public data class Student:Person{int ID;}
Person person =new Student{FirstName="Scott",LastName="Hunter", ID =GetNewId()};
otherPerson = person with{LastName="Hanselman"};

  在最後一行上使用with表達式時,編譯器不知道person實際上包含了一個Student。而且,即使otherPerson實際上不是”Student”對象,它也不是一個正確的副本,該對象與複製的第一個對象具有相同的ID。

  記錄有一個隱藏的虛方法,它委託”克隆”整個對象。每個派生記錄類型都重寫此方法以調用該類型的複製構造函數,以及派生鏈上的複製構造函數直到基類記錄的複製構造函數。with表達式只需調用隱藏的”克隆”方法,並將對象初始化器應用於結果。

2.7 值相等與繼承

  與with表達式的實現類似,基於值的相等性也必須是”虛擬”的,即Student需要比較所有字段,即使比較時能夠得知類型是基類型Person。這是很容易通過重寫已經虛擬的Equals方法實現的。

  但是,相等還有一個挑戰:如果比較兩種不同的Person,該怎麼辦?我們不能讓其中一個決定是否相等:相等應該是對稱的,所以無論兩個對象中哪個是第一個,結果都應該是相同的。換句話說,他們必須就適用的相等達成一致!

  說明問題的示例:

Person person1 =new Person{FirstName="Scott",LastName="Hunter"};
Person person2 =new Student{FirstName="Scott",LastName="Hunter", ID =GetNewId()};

  這兩個對象彼此相等嗎?person1可能會這樣認為,因為person2有所有的Person的構造,但person2會認為與person1不同!我們需要確保他們都同意他們是不同的對象。

  C# 會自動為您處理。它的實現方式是每個記錄都有一個”EqualityContract”的虛擬受保護屬性。每個派生記錄都會重寫它,為了比較相等,兩個對象必須具有相同的EqualityContract。

3 簡化頂級程序

  之前我們這樣寫代碼:

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}

  現在您可以選擇在頂層編寫主程序:

using System;
Console.WriteLine("Hello World!");

  支持任何語句,但必須在using之後以及文件中的任何類型或命名空間聲明之前,並且只能在一個文件中執行此操作,就像目前只能有一個Main方法一樣。如果要返回狀態代碼,可以執行此操作。如果你想await,你可以這樣做。如果要訪問命令行參數,可以訪問args參數。

  局部函數是語句的一種形式,在頂級程序中也允許使用。從頂級語句部分以外的任何位置調用它們都是錯誤的。

4 改進模式匹配

  在 C# 9.0 中添加了幾種新類型的模式。例如:

public static decimal CalculateToll(object vehicle) =>
    vehicle switch
    {
       ...
        DeliveryTruck t when t.GrossWeightClass > 5000 => 10.00m + 5.00m,
        DeliveryTruck t when t.GrossWeightClass < 3000 => 10.00m - 2.00m,
        DeliveryTruck _ => 10.00m,
        _ => throw new ArgumentException("Not a known vehicle type", nameof(vehicle))
    };

4.1 簡單類型模式

  目前,類型模式需要在類型匹配時聲明一個標識符,即使該標識符是一個_,比如 DeliveryTruck  _。新語法不用了,可以簡寫為:

DeliveryTruck => 10.00m,

4.2 關係模式

  C#9.0引入了對應於關係運算符<、<=等的模式。因此,新語法可以這樣寫:

DeliveryTruck t when t.GrossWeightClass switch
{
    > 5000 => 10.00m + 5.00m,
    < 3000 => 10.00m - 2.00m,
    ...
},

4.3 邏輯模式

  最後,可以將模式與邏輯運算(and 、or、not)符組合起來,並將其拼寫為單詞,以避免與表達式中使用的運算符混淆。例如:

DeliveryTruck t when t.GrossWeightClass switch
{
    < 3000 => 10.00m - 2.00m,
    >= 3000 and <= 5000 => 10.00m,
    > 5000 => 10.00m + 5.00m,
},

  not的常見用法是將其應用於判空。例如:

not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
null => throw new ArgumentNullException(nameof(vehicle))

  還有,if (!(e is Customer)) { … }在新語法中,可以寫為if (e is not Customer) { … }

5 目標類型

  ”Target typing”是當表達式從使用位置的上下文中獲取其類型時,我們使用的術語。C# 9.0支持新的類型推斷。

5.1 new

  新語法中,如果是明確的類型,則在使用new時,可以不聲明類型了。比如:

Point p = new (3, 5);

5.2 ?? and ?:

  目前,??與?:如果分支之間不是同一類型會報錯。新語法下,如果兩個分支都可以轉換為目標類型則是允許的:

Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type

6 改進協變

  有時,派生類中的方法返還比基類中的聲明更具體的類型是很有用的。C# 9.0 允許:

abstract class Animal
{
    public abstract Food GetFood();
    ...
}
class Tiger : Animal
{
    public override Meat GetFood() => ...;
}

   此外,還要很多新的改進,讓我們拭目以待吧。

原文鏈接

    https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/?utm_source=vs_developer_news&utm_medium=referral

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

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

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

「MoreThanJava」計算機系統概述_包裝設計

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

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

  • 「MoreThanJava」 宣揚的是 「學習,不止 CODE」,本系列 Java 基礎教程是自己在結合各方面的知識之後,對 Java 基礎的一個總回顧,旨在 「幫助新朋友快速高質量的學習」
  • 當然 不論新老朋友 我相信您都可以 從中獲益。如果覺得 「不錯」 的朋友,歡迎 「關注 + 留言 + 分享」,文末有完整的獲取鏈接,您的支持是我前進的最大的動力!
  • 計算機是由 硬件軟件 組件組成的複雜系統。希望通過本篇文章能夠擴展和加深您對「計算機系統」的了解和認識。

Part 1. 硬件和軟件

想一想《復讎者聯盟》系列電影?

  • 圖片來源:https://new.qq.com/cmsn/20181208/20181208006498.html

當你開始想《復讎者聯盟》時,通常你都不會考慮任何關於 “物理” 方面的東西,例如影片是存儲在哪一種物理媒介(例如 DVD、電影膠捲)上,或者是播放影片所需的物理設備(例如 DVD 機、電影放映機)。因為一張 DVD 是有實體的物理設備,而電影本身確是一種沒有實體的數據信息。

硬件 這個詞通常就用於稱呼那些有實體的「物理設備」,如電視機、DVD 播放器和電腦等。

軟件 則是指與 硬件 一起使用的「數據信息」,如電影、音樂、小說、網頁、計算機程序等。

「數據信息」是非常有趣的東西,你此刻正在查看的網頁、瀏覽的視頻,它們的實際數據可能存儲在中國乃至世界的任何一個角落。在數據從源頭的物理設備複製到你的物理設備之前,可能已經輾轉複製了成幾百次,最終到達瀏覽器並交由系統渲染,在屏幕上還原出這些數據。

硬件組成

  • 圖片來源:https://zhuanlan.zhihu.com/p/33574137

計算機系統的主要 硬件組成 是:

  • CPU(處理器);
  • 主要存儲器(內存);
  • 輔助存儲器(硬盤);
  • 輸入設備(如鍵盤、鼠標);
  • 輸出設備(如显示器);

對於典型的台式計算機來說,CPU、主存、輔存、電源加上其他支持的硬件設備(如光驅,也就是放光盤的設備)通常都是放在金屬外殼中,上述的這些組件也都是連接到俗稱「主板」的計算機電路板上,而各種輸入輸出設備則通過暴露在金屬外殼背面的連接器連接。

當然排除部分比較硬核的「搞機玩家」,如「鞋盒低成本版」:

再比如「終極水冷」:

主板

主板是用來連接其他硬件的「橋樑」。

如果把電腦比作是航空母艦,那麼主板就是航母主體,其他控制中心、動能裝置、武器設備等都必須安裝在這個航母上才能協同使用,缺一不可。

  • 圖片及引用:https://www.zhihu.com/question/59272639(作者知乎:@黎小白)

我們來看一個典型的主板組成,這裏只介紹一些重要常用的組件。(完整的可以參看上方圖片下面的鏈接)

圖中 1 -> CPU 插槽

CPU 插槽(英語:CPU socket)是計算機里主板上固定住 CPU 並導通電氣訊號的一種插槽。不同 CPU 系列使用不同插槽。

圖中 4 -> 內存插槽

內存插槽是指主板上用來插內存條的插槽。

DDR4 內存條(第四代內存條)擁有與 DDR3、DDR2 或 DDR 內存條相同的外觀,但是 DDR4 內存條插槽的缺口與 DDR3、DDR2 或 DDR 內存插槽不同,以防止插入錯誤的內存條。

  • PS:這裏只展示了 ASUS X99-DELUXE 的內存安裝方式,不同主板的內存安裝方式可能不同,具體請按照主板說明書進行,否則系統將可能無法啟動

圖中 5 -> PCI 擴展插槽

凡是顯卡、網卡、聲卡和 SCSI 卡等符合 PCI 接口規格的設備,都可以使用這些 PCI 擴展插槽。

圖中 9&10 -> 主板電源插槽

這些電源插槽用來連接一個 ATX +12V 電源。24-pin 插槽用於主板供電,8-pin 插槽用於 CPU 供電。

電源所提供的連接插頭已經過特別設計,只能以一個特定方向插入主板上的電源插槽。找到正確的插入方向後,僅需穩穩地將之套進插槽中即可。

圖中 11 -> 后側面板連接端口

圖中 12 -> USB 連接插槽

這個插槽用來連接 USB 模塊,可在前面板或后側連接端口擴展 USB 模塊。

USB 連接插槽分為 USB 2.0 和 USB 3.0。

  • 注意: 請勿將 1394 排線連接到 USB 2.0 插槽上,同理,也不要將 USB 2.0 排線接到 1394 插槽上,這麼做可能會導致主板的損毀。

圖中 14 -> SATA 設備連接插槽

這些插槽可支持使用 Serial ATA(SATA)排線來連接 SATA 硬盤和光驅。

PS:上面是一些常見的主要組成,其結構會因不同主板而又略微的不同,例如有些主板沒有显示器接口(獨立顯卡)。

CPU(中央處理器)

CPU 常常被比喻為計算機系統的 “大腦”,這非常符合。

處理器 執行計算機系統的 所有基本計算。其他組件則是通過執行諸如 「存儲數據」「將數據移入和移出處理器」 之類的工作來促進計算。但是處理器是發生基本動作的地方。

處理器非常努力,但同時它也不那麼”聰明”,它唯一要做的就是執行老闆(正在運行的程序)的命令(指令),它從來不問那些命令到底是做什麼,只負責執行。這也就是為什麼程序和 CPU 之間存在一個稱為「操作系統」的中間人的原因。

  • (Ps: 關於 CPU 其他知識我們會在之後來詳細說。)

Hz 代表什麼?

通常我們討論 CPU 時,都會說這個 CPU 的是多少多少赫茲的,它其實 代表的就是 CPU 執行指令的速度(≈運行速度)

每個 CPU 都有一個非常簡單但非常重要的組件,它被稱為 時鐘。其唯一的目的就是 按一致的方式打開關閉 電信號,就像是您的心臟每秒跳動一次一樣,時鐘也會周期性地產生高電壓信號和低電壓信號。

1 Hz 表示每秒 1 個周期,也就是每秒產生一個高壓信號一個低壓信號,3 Ghz 也就是表示每秒 3 千萬個周期。因此,如果一條指令需要 5 個時鐘周期才能完成,則 CPU 的時鐘越快,該指令將被執行得越快。(但現在 CPU 的快慢並不能簡單考慮 Hz 大小,還得附加考慮”多核”和每個周期內能夠完成的工作量的因素)

CPU 可以有多快?

普通台式計算機可以在不到百萬分之一秒的時間內執行一條指令,即使是真空中傳播的光,在這段時間內也只能走 10 厘米左右,而超級計算機(在所有計算機中速度最快)可以在不到十億分之一秒的時間內執行一條指令!

CPU 的基本要素

  • 圖片來源:https://www.deskdecode.com/what-is-cpu-central-processing-unit-and-how-its-work/
  1. 寄存器: 寄存器是一個很小的地方,用於保存處理器的數據。寄存器用於存儲信息,例如指令,存儲地址和任何類型的數據,例如位序列或任何字符等。處理器的寄存器應足夠大以存儲所有給定的信息。64 位處理器應至少具有 64 位寄存器和 32 位處理器的 2 位寄存器。寄存器是所有存儲設備中最快的。
  2. L1和L2高速緩存存儲器: 高速緩存存儲器是一種類型的存儲器,位於處理器的芯片中,或者可以通過總線單獨連接。高速緩衝存儲器的用途是存儲程序指令,這些指令被軟件一次又一次地用於操作。當 CPU 處理數據時,首先將數據查找到高速緩存中。如果找到了數據,則它將相應地使用該數據;如果未找到,則處理器開始在較大的內存中查找,這實際上是耗時的。高速緩存的成本很高,但速度確實很快。

CPU 如何執行程序指令 | 簡單原理

典型的 CPU 可以簡單看成由 「控制單元」「邏輯單元」 組成。

在執行一條指令之前,必須將程序指令和數據從輸入設備或輔助存儲設備放入內存中,一旦必要的數據和指令存儲在內存中,中央處理單元就會對 每個指令 執行以下四個步驟:

  1. 「控制單元」從「存儲器」中獲取指令;
  2. 「控制單元」對指令進行解碼(確定含義),並指示將必要的數據從存儲器移至「邏輯單元」;
  3. 「邏輯單元」執行算術或邏輯指令;
  4. 「邏輯單元」將該運算的結果存儲在存儲器或寄存器中;

控制單元最終指示存儲器將結果釋放到輸出設備或輔助存儲設備。這一套步驟下來就被稱為 「機器周期」。單個機器周期指令可以由大量子指令組成,每個子指令必須至少佔用一個時鐘周期(上面提到的一個上下脈衝時間)。

每種類型的中央處理單元都 只能理解一組特定的指令,稱為 「指令集」。正如人們可以理解許多不同的語言一樣,每種不同類型的CPU都有其可以理解的指令集。

將指令和數據存儲在內存中是一回事,而控制單元能夠找到它們又是另一回事。它是如何做到的?

每個指令和每個數據在「存儲器」中的位置都有一個地址標識。也就是說,每個位置都有一個地址號碼,就像公寓前面的郵箱一樣。並且,與郵箱一樣,位置的地址號保持不變,但是位置的內容(指令和數據)可能會更改。

但是,與郵箱不同,內存位置只能容納固定數量的數據;地址只能容納固定數量的字節-在現代計算機中通常為兩個字節。

32 位 和 64 位?

您可能已經聽說過 N 位處理器的概念。最常見的是 32 位和 64 位處理器。這些位確定傳入和傳出處理器的 數據量大小。具體會有以下幾點不同:

一、處理數據的能力不同

32 位和 64 位表示 CPU 一次能處理的最大位數,理論上來說,64 位系統處理的數據效率比 32 位更高,相當於單車道和雙車道開車似得,雙車道單位時間可以有更多的車輛通行。但需要內存跟上,而且程序本身也是 64 位編譯才能發揮 64 位系統的優勢。

二、支持的內存不同(尋址能力不同)

簡單來說,32 位系統的最多能在是 232=4294967296=4 (GB) 左右的內存裏面找程序所需要的數據,而 64 位系統這就最大支持 128 GB 內存;

三、軟件兼容性不同

32 位系統無法運行 64 位軟件,64 位系統可以安裝多數 32 位軟件,以前因為大部分軟件都是基於 32 位架構環境下開發,所以 64 位系統的兼容性不如 32 位。但現在 64 位兼容性也很強了,基本都是可以兼容各類軟件了,而且 64 位的病毒都少了很多。

特別是大量消耗內存的軟件,如 PS,64 位和 32 位軟件在 64 位系統里區別很大,64 位真的快許多。

存儲器

內存和硬盤的差別

內存 中通常放置的是您 短期存儲 的數據,而 硬盤 中存放的則是 長期存儲 的數據。

想象一下您正在辦公,並且您擁有一個 辦公桌 和一個 文件櫃,那麼此時辦公桌的區域則代表了內存,文件櫃則代表了硬盤。

剛開始工作不久,你就把需要使用的物品放置在了您的辦公桌上,以便於使用,但由於桌子大小的限制,不能在桌上存放太多的東西。必須保留但不一定很快就可以訪問的項目存儲在文件櫃中。根據文件櫃的大小的不同,可以存儲許多東西。

內存和硬盤之間的重要區別是前者在計算機關閉時會清除。另一方面,無論關閉計算機多少次,硬盤都將保持不變(除非物理破壞)。因此,類似於辦公桌和文件櫃,您離開辦公室時在辦公桌上留下的所有文件都會被丟棄。文件櫃中的所有內容都將保留。

數據如何表示?

在主存儲器和輔助存儲器中,信息都以 位(bit) 模式存儲。這是一個單一的開/關值,僅開/關這兩種值是可能的。(也就是俗稱的「二進制」)

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

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

有很多方法可以實現這一點,下面我們來列舉一些:

  • 机械上電器的開關(如電燈開關);
  • 電線上的高低電壓;
  • 單個晶體管;
  • 磁盤表面的一小部分;
  • 磁帶表面的一小部分;
  • 卡上打了一個洞;(如上一篇文章提到的製表機)
  • More..

在主存儲器和輔助存儲器中,位的實現方式不同,但是從邏輯上講,兩種類型的存儲器都存儲表示為位模式的信息。

字節 | 存儲單位

一位能表示的信息太少了,以至於通常計算機內存被分成八位一組,每個八位組稱為一個 字節

一個字節大約足以容納一個字符。 當某些數據需要八個以上的位時,將使用幾個字節。通常,四個字節用於表示整數。

通常,我們需要用成千上百,甚至上億,幾十億的字節來表示某一些數據,這樣大數量的字節數我們又規定了一些單位,如下錶所示:(僅列出常用單位)

名稱 字節數 2 的冪
字節 1 20
千字節(kilobyte,俗稱 1 Kb) 1024 210
兆字節(megabyte,俗稱 1 Mb) 1,048,576 220
十億字節(gigabyte,俗稱 1 Gb) 1,073,741,824 230
萬億字節(terabyte,俗稱 1 Tb) 1,099,511,627,776 240

硬盤

計算機系統的硬盤將字節記錄在磁性表面上,就像錄音帶的表面一樣。 數據的記錄(寫入)和讀取使用類似於磁帶的讀寫頭完成。

  • 圖片來源:http://programmedlessons.org/Java9/chap03/ch03_11.html

上圖显示了一個可移動臂末端的一個磁盤和一個讀/寫頭。手臂沿着磁盤的半徑移動。由於磁盤正在旋轉,它將在磁盤上的圓形軌道中記錄數據。稍後,要讀取數據,必須將其移至正確的位置,然後必須等待直到旋轉磁盤將數據放置到位。與錄音帶一樣,無需更改即可讀取數據。記錄新數據時,它將替換以前在該位置記錄的任何數據。與音頻磁帶不同,讀/寫磁頭實際上並不接觸磁盤,而是略高於磁盤。(由於磁盤在計算機啟動時一直在旋轉,因此如果讀寫頭接觸到磁盤,磁盤很快就會磨損。)

通常,稱為計算機系統硬盤的組件包含許多單獨的磁盤和上述的讀/寫磁頭。磁盤的兩面都塗有磁性材料(因此,每個磁盤都有兩個讀/寫磁頭),並且所有磁盤都連接到一個主軸上。所有磁盤和磁頭均密封在無塵的金屬容器中。由於硬盤的操作涉及机械運動(比电子過程要慢得多),因此讀寫數據要比使用主存儲器慢得多。

文件(File)

硬盤(和其他輔助存儲設備)用於長期存儲大信息塊,例如程序和數據集。通常,硬盤內存被組織成 文件,一個文件是已經被賦予了名稱,並存儲在輔助存儲器的 信息集合。該信息可以是程序,也可以是數據。

文件中的信息表示方式與任何数字信息相同——它由位組成,通常分為八位字節。文件通常很大;它們的大小以千字節(Kb)或兆字節(Mb)為單位。

文件和操作系統

主存儲之外的大多數數據集合都組織成文件。跟蹤所有這些信息是操作系統的工作之一。如果計算機是網絡的一部分,那麼跟蹤所有計算機上的所有文件是一項艱巨的工作,並且涉及網絡上的所有操作系統。

應用程序(包括您可能編寫的程序)不會直接讀取,寫入,創建或刪除文件。 由於操作系統必須跟蹤所有內容,因此所有其他程序都要求操作系統執行文件操作任務。例如,假設某個程序剛剛計算出一組数字,則需要保存它們。以下可能發生的操作方式:

  1. ‍‍程序: 要求操作系統創建一個名稱為RESULTS.DAT的文件

  2. 操作系統: 獲取請求;查找磁盤的未使用部分並創建一個空文件。程序完成時會被告知。

  3. ‍‍程序: 要求操作系統將数字保存在文件中。

  4. 操作系統: 從程序的主內存中獲取数字,並將其寫入文件。程序完成時會被告知。

  5. ‍‍程序: 繼續進行任何操作。

文件類型

就硬盤而言,所有文件都是相同的。在电子級別,包含程序的文件和包含數據的文件之間沒有區別。所有文件都被命名為字節集合。當然,這些文件的用途不同。操作系統可以獲取程序文件,將其複製到主內存中,然後開始運行。操作系統也可以獲取數據文件,並在需要時將其信息提供給正在運行的程序。

然而,我們通常會看到文件名的最後一部分(擴展名)通常會显示該文件的 預期用途。例如,mydata.txt 的擴展名 .txt 意味着該文件應被用作文本(即字符)的集合,program.exe 擴展名 .exe 就標識着該文件是一個 “可執行文件”,也就是一個程序,在 Windows 中可以直接運行。

當文件以非預期用途使用時會發生什麼?例如,如果您嘗試在 “.EXE” 文件上使用文字處理器,該怎麼辦?

這當然會出現問題。因為 .exe 文件中包含的信息使用的是文字處理器無法理解的位模式表示。

就像遇到某人說您不懂的語言一樣。他們發出的聲音與您相同(大部分情況下),但是它們發出的聲音(單詞和句子)的模式不同。

軟件

  • 圖片來源:https://www.aqniu.com/learn/48019.html

計算機軟件由 程序數據 組成的。

程序 包含用於處理器(CPU)的指令。數據 可以是程序需要的任何信息:字符數據,数字數據,圖像數據,音頻數據和無數其他類型。但是,程序和數據之間的區別並不像您想象的那麼清晰。

記住這個重要的基本思想: 程序和數據都以相同的方式被保存在計算機存儲器中。也就是說在存儲器中(主存儲器和輔助存儲器),程序和數據並無任何區別。

舉個例子:這就像你寫或者畫東西在紙上一樣,對於紙來說,並無什麼特別的區分。

可以使用相同的电子的存儲方式來保存數據和程序對於計算機科學來說是一個重要的概念,這意味着計算機系統提供可以根據需求來將內存用於程序或數據。

程序類型

有兩類程序:應用程序、系統程序。

應用程序 是人們用來完成工作的程序。系統程序 用來使硬件和軟件平穩運行。

重要的系統程序是操作系統。當計算機運行時,操作系統始終存在。它協調計算機系統其他硬件和軟件組件的操作。操作系統負責啟動應用程序,運行它們並管理它們所需的資源。當應用程序正在運行時,操作系統將為其管理硬件的詳細信息。例如,當您在鍵盤上鍵入字符時,操作系統將確定它們打算用於哪個應用程序,並完成將其放置在那裡的工作。

一些 「嵌入式系統」 不使用操作系統,而是直接在處理器上運行其程序。例如:交通燈、微波爐、洗衣機等等。

用於台式計算機的現代操作系統幾乎都帶有用戶界面,該界面使用戶能夠通過使用窗口,按鈕,菜單,圖標,鼠標和鍵盤輕鬆地與應用程序(以及與操作系統本身)進行交互。例如:Unix,Linux,Android,Mac OS 和 Windows。

操作系統

操作系統是一個複雜的程序,可以使計算機系統的硬件和軟件組件保持協調和運行。就像一家小商店的所有者一樣,他通過拜訪客戶,接受送貨,在架子上儲貨,進行簿記等來保持一切井井有條。店主必須及時處理出現的任務。沒有店主,商店就無法運轉。

大多數計算機系統都可以運行多種操作系統中的任何一種。例如,大多數基於奔騰的計算機都可以運行 Linux 或 Windows 操作系統。儘管某些計算機有多個操作系統,但通常在一個計算機系統上僅安裝一個操作系統。無論如何,一次只能控制一個操作系統。計算機用戶可以在計算機打開時進行選擇,並且操作系統將一直處於控制狀態,直到計算機關閉為止。

首次啟動計算機時,硬件會自動加載操作系統並開始運行。此過程稱為 啟動。之所以說這是個奇怪的術語,是因為操作系統本身參与了其自身的運行,這一過程就像某人 “自己拉自己一把” 一樣。操作系統運行后,將用於啟動應用程序。

一個應用程序啟動時的場景

  1. 用戶要求運行應用程序。

    • 通過單擊圖標,選擇菜單或通過其他方式可以完成此操作。
  2. 操作系統確定應用程序的名稱。

  3. 操作系統在存儲應用程序及其存儲數據的硬盤上找到文件。

  4. 操作系統發現主內存的未使用部分足以容納應用程序。

  5. 操作系統在主內存的該部分中複製應用程序及其數據。

    • 硬盤上的軟件未更改;主內存保存磁盤上的內容的副本。
  6. 操作系統為應用程序申請資源。

  7. 最後,操作系統啟動應用程序運行。

總結: 在應用程序運行時,操作系統在後台管理資源,為應用程序進行輸入和輸出,並使其他所有程序保持運行。

Part 2. 網絡(Network)

  • 圖片來源:https://www.aqniu.com/learn/27008.html

一個計算機網絡由連接的兩台或更多台計算機組成,以便它們可以交換數據和程序。當計算機是網絡的成員時,它運行的程序和使用的數據可以位於網絡上其他計算機的硬盤上。

在商業和工業環境中,大多數計算機都在網絡上。在聯網計算機上運行的操作系統必須管理其分享的網絡資源(以及管理其所有其他職責)。操作系統能夠找到存儲在其他網絡計算機上的程序和數據,並將它們複製到其自己的主內存中。

網絡中的每台計算機都有一個網絡接口卡。這是一種通過電纜發送和接收數據的輸入/輸出設備。網絡上計算機的網絡接口卡通過電纜連接在一起。

局域網

局域網(LAN)是局限於相對較小區域的網絡。它通常局限於地理區域,例如寫作實驗室,學校或建築物。

每台計算機都有一個其他計算機用來訪問它的網絡地址。通常,計算機共享一台打印機。局域網中也可能有一台功能特彆強大的計算機,稱為「服務器」,其硬盤上裝有其他計算機可能需要的應用程序和數據。

廣域網

廣域網(WAN)連接較大地理區域的網絡,例如四川到北京或世界各地。專用的越洋電纜或衛星上行鏈路可用於連接這種類型的全球網絡。

廣域網使用各種特殊的硬件來管理數據流。當兩台計算機共享數據時,這些硬件使兩台計算機直接連接在一起。實際上,兩台計算機之間可能有數十個網絡設備。但對於用戶而言,使用 WAN 和 LAN 並無差別。

所有這些設備都 使用相同的方法來處理數據。沒有通用的數據處理方法,大型網絡將變得毫無希望。關於如何通過網絡表示和傳輸數據的協議稱為 「協議」。通常,大型網絡使用稱為 TCP / IP 的協議(用於傳輸控制協議/ Internet協議)。

互聯網(Internet)

互聯網包含所有連接在一起的計算機的一個龐大的全球網絡。在這個龐大的網絡上,每台計算機 必須具有 唯一的網絡地址(稱為 IP 地址),就像世界上的每部電話都具有唯一的電話號碼(包括國家/地區代碼和區號)一樣。

例如這是一個典型的 IP 地址:149.152.21.203,IP 地址實際上是 32 位二進制數。聯網設備使用這些地址在網絡上路由信息。上面的示例显示了使用十進制数字寫入這些位的標準方法(每 8 位轉換成十進制並使用 . 隔開)。

但是,即使以十進制形式書寫,該地址也無法被人類識別。萬維網的功能之一是它允許人類使用 計算機名稱而不是数字。例如:這是一個典型的計算機名稱:wmyskxz.com。這就要容易記住的多,在 Web 瀏覽器中使用它時,它將自動轉換為計算機 IP 地址的 32 個二進制数字。

全球資訊網(World Wide Web)

還記得我們上面提到的 重要思想 嗎:程序和數據都以 相同的方式 保存在計算機內存中。計算機存儲器(主存儲器和輔助存儲器)在存儲程序和數據時沒有區別。

通信設備也不區分程序和數據。就其而言,它就是所有信息,並且所有信息都以相同的方式傳輸。互聯網就像是全球包裹遞送服務。它關心的是將包裹從一個地址移到另一個地址,而不用擔心包裹中的內容。

互聯網提供硬件基礎,而信息傳輸協議服務於萬維網。

與任何數據一樣,用於 Web 的數據也通過 Internet 傳輸。使 Web 數據與眾不同的原因在於,它是針對 Web 瀏覽器(例如您可能正在使用的瀏覽器)而設計的。瀏覽器是一種程序,可以讀取網頁並以一種格式正確的方式显示它們。

網頁是一組數據,其中包含有關如何在監視器上显示信息的信息。使用稱為 超文本標記語言(HTML) 的語言來提供此信息 。如果要查看描述此頁面的 HTML,您可以直接右擊正在瀏覽的網頁然後會看到「显示源代碼」的選項。

參考資料

  1. Introduction to Computer Systems – http://programmedlessons.org/Java9/chap01/ch01_01.html
  2. How does the processor work – https://pmihaylov.com/how-does-the-processor-work/
  3. How Computers Work: The CPU and Memory – https://homepage.cs.uri.edu/faculty/wolfe/book/Readings/Reading04.htm
  4. What Is CPU (Central Processing Unit) And How It’s Work? – https://www.deskdecode.com/what-is-cpu-central-processing-unit-and-how-its-work/
  5. Computer Memory – http://programmedlessons.org/Java9/chap03/ch03_01.html
  6. 計算機原理-CPU到底有多快?內存:是我的250倍 – https://blog.csdn.net/pyf09/article/details/95256493
  7. 電腦系統32位和64位的區別 – https://www.jianshu.com/p/d0e95bed5b60
  • 本文已收錄至我的 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:https://github.com/wmyskxz/MoreThanJava
  • 個人公眾號 :wmyskxz,個人獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!

非常感謝各位人才能 看到這裏,如果覺得本篇文章寫得不錯,覺得 「我沒有三顆心臟」有點東西 的話,求點贊,求關注,求分享,求留言!

創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章見!

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

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

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

MySQL 可重複讀,差點就讓我背上了一個 P0 事故!_台中搬家

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

小黑黑的碎碎念

哎,最近有點忙,備考複習不利,明天還要搬家,好難啊!!

本想着這周鴿了,但是想想還是不行,爬起來,更新一下,周更可不能斷。偷懶一下,修改一下之前的一篇歷史文章,重新發布一下。

先贊后看,微信搜索「程序通事」,關注就完事了

P0 事故:餘額多扣!

這是一個真實的生產事件,事件起因如下:

現有一個交易系統,每次產生交易都會更新相應賬戶的餘額,出賬扣減餘額,入賬增加餘額。

為了保證資金安全,餘額發生扣減時,需要比較現有餘額與扣減金額大小,若扣減金額大於現有餘額,扣減餘額不足,扣減失敗。

賬戶表(省去其他字段)結構如下:

CREATE TABLE `account`
(
    `id`      bigint(20) NOT NULL,
    `balance` bigint(20) DEFAULT NULL,
    PRIMARY KEY (`id`)

) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_bin;

扣減餘額時,sql 語序如下所示:

ps:看到上面的語序,有沒有個小問號?為什麼相同查詢了這麼多次?

其實這些 SQL 語序並不在同個方法內,並且有些方法被抽出復用,所以導致一些相同查詢結果沒辦法往下傳遞,所以只得再次從數據庫中查詢。

為了防止併發更新餘額,在 t3 時刻,使用寫鎖鎖住該行記錄。若加鎖成功,其他線程的若也執行到 t3,將會被阻塞,直到前一個線程事務提交。

t5 時刻,進入到下一個方法,再次獲取賬戶餘額,然後在 Java 方法內比較餘額與扣減金額,若餘額充足,在 t7 時刻執行更新操作。

上面的 SQL 語序看起來沒有什麼問題吧,實際也是這樣的,賬戶系統已經在生產運行很久,沒出現什麼問題。但是這裏需要說一個前提,系統數據庫是 Oracle

但是從上面表結構,可以得知此次數據庫被切換成 MySQL,系統其他任何代碼以及配置都不修改(sql 存在小改動)。

就是這種情況下,併發執行發生餘額多扣,即實際餘額明明小於扣減金額,但是卻做了餘額更新操作,最後導致餘額變成了負數。

下面我們來重現併發這種情況,假設有兩個事務正在發執行該語序,執行順序如圖所示。

注意點:數據庫使用的是 MySQL,默認事務隔離等級,即 RR。數據庫記錄為 id=1 balance=1000,假設只有當時只有這兩個事務在執行。

各位讀者可以先思考一下,t2,t3,t4,t5,t6,t11 時刻餘額多少。

下面貼一下事務隔離等級RR 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,1000)

有沒有跟你想的結果的一樣?

接着將事務隔離等級修改成 RC,同樣再來思考一下 t2,t3,t4,t5,t6,t11 時刻餘額。

再次貼下事務隔離等級RC 下的答案。

事務1 的查詢結果為:

  • t2 (1,1000)
  • t4 (1,1000)
  • t6 (1,1000)

事務 2 的查詢結果為:

  • t3 (1,1000)
  • t5 (1,900)
  • t11 (1,900)

事務 1 的查詢結果,大家應該會沒有什麼問題,主要疑問點應該在於事務 2,為什麼換了事務隔離等級結果卻不太一樣?

下面我們先帶着疑問,了解一下 MySQL 的相關原理 ,看完你就會明白這一切。

  • MVCC
  • 一致性視圖
  • 快照讀與當前讀

MVCC

我們先來看下一個簡單的例子,

事務隔離等級為 RR , id=1 balance=1000

事務 1 將 id=1 記錄 balance 更新為 900,接着事務 2 在 t5 時刻查詢該行記錄結果,很顯然該行記錄應該為 id=1 balance=1000

如果 t5 查詢最新結果 id=1 balance=900,這就讀取到事務 1 未提交的數據,顯然不符合當前事務隔離級別

從上面例子可以看到 id=1 的記錄存在兩個版本,事務 1 版本記錄為 balance=1000 ,事務 2 版本記錄為 balance=900

上述功能,MySQL 使用 MVCC 機制實現功能。

MVCC:Multiversion concurrency control,多版本併發控制。摘錄一段淘寶數據庫月報的解釋:

多版本控制: 指的是一種提高併發的技術。最早的數據庫系統,只有讀讀之間可以併發,讀寫,寫讀,寫寫都要阻塞。引入多版本之後,只有寫寫之間相互阻塞,其他三種操作都可以并行,這樣大幅度提高了InnoDB的併發度。在內部實現中,與Postgres在數據行上實現多版本不同,InnoDB是在undolog中實現的,通過undolog可以找回數據的歷史版本。找回的數據歷史版本可以提供給用戶讀(按照隔離級別的定義,有些讀請求只能看到比較老的數據版本),也可以在回滾的時候覆蓋數據頁上的數據。在InnoDB內部中,會記錄一個全局的活躍讀寫事務數組,其主要用來判斷事務的可見性。

可以看到 MVCC 主要用來提高併發,還可以用來讀取老版本數據。

在學習 MVCC 原理之前,首先我們需要了解 MySQL 記錄結構。

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

如上圖所示,account 表一行記錄,除了真實數據之外,還會存在三個隱藏字段,用來記錄額外信息。

  • DB_TRX_ID:事務id。

  • DB_ROLL_PTR: 回滾指針,指向 undolog。

  • ROW_ID:行 id,與此次無關。

MySQL InnoDB 裏面每個事務都會有一個唯一事務 ID,它在事務開始的時候會跟 InnoDB 的事務系統申請的,並且嚴格按照順序遞增的。

每次事務更新數據時,將會生成一個新的數據版本,然後會把當前的事務 id 賦值給當前記錄的 DB_TRX_ID。並且數據更新記錄(1,1000—->1,900)將會記錄在 undo log(回滾日誌)中,然後使用當前記錄的 DB_ROLL_PTR 指向 und olog。

這樣 MySQL 就可以通過 DB_ROLL_PTR 找到 undolog 推導出之前版本記錄內容。

查找過程如下:

若需要知道 V1 版本記錄,首先根據當前版本 V3 的 DB_ROLL_PTR 找到 undolog,然後根據 undolog 內容,計算出上一個版本 V2。以此類推,最終找到 V1 這個版本記錄。

V1,V2 並不是物理記錄,沒有真實存在,僅僅具有邏輯意義。

一行數據記錄可能同時存在多個版本,但並不是所有記錄都能對當前事務可見。不然上面 t5 就可能查詢到最新的數據。所以查找數據版本時候 MySQL 必須判斷數據版本是否對當前事務可見

一致性視圖

MySQL 會在事務開始后建立一個一致性視圖(並不是立刻建立),在這個視圖中,會保存所有活躍的事務(還未提交的事務)。

假設當前事務保存活躍事務數組為如下圖。

判斷版本對於當前事務是否可見時,基於以下規則判斷:

  1. 若版本事務 id 小於當前活躍事務 id 數組最小值,比如版本 id 為 40,小於活躍數組最小值 45。這就代表當前版本的事務已提交,當前版本對於當前事務可見。

  2. 若版本事務 id 大於當前活躍事務數組的最大值,如版本事務 id 為 100, 大於數組最大事務 id 90。說明了這個版本是當前事務創建之後生成,所以這個版本對於當前事務不可見。

  3. 若版本事務 id 是當前活躍數組事務之一,比如版本事務 id 為 56。代表記錄版本所屬事務還未提交,所以該版本對於當前事務不可見。

  4. 若版本事務 id 不是當前活躍數組事務之一,但是事務 id 位於活躍數組最小值與最大值之一,比如如事務 ID 57。代表當前記錄事務已提交,所以該版本對於當前事務可見。

  5. 若版本事務 id 為當前事務 id,代表該行數據是當前事務變更的,當然得可見。

4 這個規則可能比較繞,結合上面圖片比較好理解。

以上判斷規則可能比較抽象,看不懂,沒事,我們再用大白話解釋一下:

  1. 未提交事務生成的記錄版本,不可見。

  2. 視圖生成前,已提交事務生成記錄版本可見。

  3. 視圖生成后,新事務生成記錄版本不可見。

  4. 自身事務更新永遠可見。

一致性視圖只會在 RR 與 RC 下才會生成,對於 RR 來說,一致性視圖會在第一個查詢語句的時候生成。而對於 RC 來說,每個查詢語句都會重新生成視圖。

當前讀與快照讀

MySQL 使用 MVCC 機制,可以讀取之前版本數據。這些舊版本記錄不會且也無法再去修改,就像快照一樣。所以我們將這種查詢稱為快照讀

當然並不是所有查詢都是快照讀,select …. for update/ in share mode 這類加鎖查詢只會查詢當前記錄最新版本數據。我們將這種查詢稱為當前讀。

問題分析

講完原理之後,我們回過頭分析一下上面查詢結果的原因。

這裏我們將上面答案再貼過來。

事務隔離級別為 RR,t2,t3 時刻兩個事務由於查詢語句,分別建立了一致性視圖。

t4 時刻,由於事務 1 使用 select.. for update 為 id=1 這一行上了一把鎖,然後獲取到最新結果。而 t5 時刻,由於該行已被上鎖,事務 2 必須等待事務 1 釋放鎖才能繼續執行。

t6 時刻根據一致性視圖,不能讀取到其他事務提交的版本,所以數據沒變。t8 時刻餘額扣減 100,t9 時刻提交事務。

此時最新版本記錄為 id=1 balance=900

由於事務 1 事務已提交,行鎖被釋放,t5 成功獲取到鎖。由於 t5 是當前讀,所以查詢的結果為最新版本數據(1,900)。

重點來了,當前這條記錄的最新版本數據為 (1,900),但是最新版本事務 id,卻是事務 2 創建之後未提交的事務,位於活躍事務數組中。所以最新記錄版本對於事務 2 是不可見的。

沒辦法只能根據 undolog 去讀取上一版本記錄 (1,1000) ,這個版本記錄剛好對於事務 2 可見,所以 t11 的記錄為 (1,1000)

而當我們將事務隔離等級修改成 RC,每次都會重新生成一致性視圖。所以 t11 時刻重新生成了一致性視圖,這時候事務 1 已提交,當前最新版本的記錄對於事務 2 可見,所以 t11 的結果將會變為 (1,900)

總結

MySQL 默認事務隔離等級為 RR,每一行數據(InnoDB)的都可以有多個版本,而每個版本都有獨一的事務 id。

MySQL 通過一致性視圖確保數據版本的可見性,相關規則總結如下:

  • 對於 RR 事務隔離等級,普通查詢僅能查到事務啟動前就已經提交完成的版本數據。
  • 對於 RC 事務隔離等級,普通查詢可以查到查詢語句啟動前就已經提交完成的版本數據。
  • 當前讀總是讀取最新版本的數據。

幫助文檔

1: https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
2 http://mysql.taobao.org/monthly/2017/12/01/
3 http://mysql.taobao.org/monthly/2018/11/04/
4 https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
5 極客時間- MySQL 專欄–事務到底是隔離的還是不隔離的

歡迎關注我的公眾號:程序通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn

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

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

同學叫我一起創業,我不聽,他現在月入10萬,我羡慕死了,我已悟到了成功的秘訣!_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

  先說說的親身經歷及見證吧,2017年一個晚上跟同學一起吃飯,聊起了創業的事情,因為我們的年齡都比較很大了,遲早有一天退出職場,就討論做什麼好,同學就說要不我們運營微信公眾號吧,我當時想,這個東西能養活自己嗎?他說可以掙大錢,我當時一點都不信,公眾號不是就推送兩篇文章,這東西有收入?我當時一點都沒有看好這個,並且,在2017年,感覺已經過了紅利期,而且從開始到有收入這段時間具體要多久完全沒有把握,不知道哪一天能看到盈利,所以我一點都沒看好這個,還是找份工作老老實實上班,每月穩定拿工資。就這樣,我們各自的想法不一樣,他運營他的公眾號,我上我的班。

  最初,他想通過公眾號將他的網絡產品綁定一起,然後通過網絡培訓盈利,剛剛開始,他也拉到一些學生,但是培訓需要花費大量的時間去做課件,每個學員教的學費不多,所以很難維持下去,收入遠遠沒有自己上班收入高,有點渺茫,一度想重返職場,最終還是沒有,因為他很相信公眾號能掙錢,而且能掙大錢,後來,把精力、時間放在吸粉。

  每天自己寫文章,經過一段時間,大概一個月左右,自己的庫存也用完了,想不出什麼內容來寫了,也沒有一分錢的收入,後來變成每天找文章然後自己加工處理,改標題,改內容,想盡了各種方法,互推、誘導關注、海報引流、建大量的微信群、欺騙用戶分享朋友圈、搞各種活動等等,大半年的時間就這樣過去,當然粉絲也有,但是不多,這個時候,偶爾會有人來找上門投廣告,一個月勉強有1000塊左右的收入,雖然不多,但是讓他看到希望,更加堅定了他的信心,到了此時此刻,我仍然不看好這個,因為收入太少了,1000塊還比不起我上班工資。我同學心態好,對公眾號的前景持樂觀的態度,所以,繼續堅持,每天摸索這什麼時間段推送文章閱讀量比較多,什麼樣的文章內容比較吸引讀者,還有標題黨等等的研究。

  經過一段時間的摸索和堅持,終於積累了比較多的粉絲,這時,他又註冊另外一個公眾號,然後以大號養小號,兩個號同時運營着,每天還是重複着之前的工作,到處找文章,修改內容,優化標題,準時準點發布文章,慢慢地小號的粉絲也在漲,就這樣,兩年的時間過去了,收入也有所增加,後來,又收購了幾個公眾號,此時他手上已經有6個公眾號,每天還是重複着同樣的工作,各個號的粉絲都在增長,這個時候,他的收入已經基本更之前上班的工資持平。去年,他的平均每個月收入達到了6W。到現在,他的號粉絲不斷增長,收入有時候超過10W每個月,遠遠超過打工的收入,尤其在這個疫情期間,很多人都失去了工作,而他做得風生水起。每個人對成功的定義不一樣,在我看來,他已經達到他預期的期望,算是成功。

有些人天生就具備成功的特性,我同學最起碼具備以下特性:樂觀、超常的執行力、重視細節、善於總結問題,此刻我悟到,一個人想要成功真不難,只要做好以下幾點就好。

1、定位

定位很重要,在做一件事之前首先要看準方向,才能充分發揮自己的優勢達到所想去的目的地;相反,如果方向走錯了,那麼離自己當初所想的方向便越走越遠。

那如何去定位,如何確定方向是準的呢,這個很重要,我覺得,首先要回顧這近些年來的發展時間軸,一個個列出來,結合當前的熱門行業,去判斷未來的走勢。雷軍的名言:站在風口上,豬都可以飛起來。看看我們這些年有哪些風口:團購、自媒體、大數據、o2o、直播、共享經濟、短視頻,在這些風口中,有些紅利期已經過了,有些還處於下滑狀態,有些正在處於紅利期。只要我們善於總結過去的經歷,觀察當前的發展形勢,可以大概推斷未來的趨勢,就這樣定位。

2、樂觀的精神

能堅持做完一件事,這過程中不能缺少樂觀的精神,這是一種精神支柱,只有這樣才能使你有動力繼續走下去,很多人都是開始充滿了信心,然後實際開展的過程與最初的想法相差甚遠,經常受到挫折、打擊,然後慢慢就對最初的想法懷疑,最後失去了信心,很快就打退堂鼓,這是在創業路上很關鍵的因素。

3、少抱怨,多檢查問題

有些人在創業的過程中,一旦遇到問題,就抱怨別人抱怨命運,抱怨條件不好,但是從來就沒有認真去檢查自己的問題,為什麼會出這樣的問題,究竟是什麼原因導致的。例如,我同學經常發推文,有時有些文章閱讀量很低有些很高,有時掉粉,但是他從來不會抱怨自己做不好,而是認真去分析,查找問題的原因。同一個時間段為什麼有些文章的閱讀量會少那麼多,為什麼會太令粉絲反感而取消關注。

4、超常的執行力

執行力非常重要,這是貫穿整個創業的始終,如果沒有了執行力,就談不上創業了。馬雲說過:成功的人都具備有超越常人的堅持。我同學也經常說,做事要像一頭牛一樣,不怕苦不怕累,堅持下去,這樣總會有結果,事實證明,他是對的。曾經有人說,即使是一隻小蚊子,死咬着一個地方吸血,最終也能吸到血,說明執行力在創業過程有多麼的重要。要做好執行力,我覺得要做好這幾點:把握時間、按質量、超越常人的堅持去對待一件事。

4.1、把握時間

按時: 這個很重要,例如,你計劃開發一個項目,然後定好了預計完成時間,然後量化了每個任務,如果你沒有按時去完成任務,那整個項目最後就無法預期完成,這個不管是做客戶項目還是做自己的項目都增加了時間成本。

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

時間點: 同樣,拿我同學運營公眾號來說,把握時間點非常重要,因為很多用戶習慣在某個時間段看你的公眾號,如果你毫無規律,不按時間發布,很多用戶會錯過閱讀,影響文章的閱讀量,然後用戶就會慢慢對您的公眾號反感,甚至取消關注。

4.2、按質量

同樣,做每一件事或者作品,都要以高質量完成,這樣才能保證你的作品競爭力,留住用戶。 這個十分關鍵,就拿公眾號來說,如果只是為了完成任務,隨隨便便抄襲一下劣質的文章來敷衍,那很多用戶很快就對你的文章不感興趣,長期下去,用戶就不在關注你的公眾號了,甚至取消關注。就拿抖音來說,為什麼抖音一旦刷起來就停不下來了,這是為什麼呢?因為抖音在作品審核是十分嚴格,只有高質量的做才會給流量,低質量的幾乎不給流量,這就是我們每次刷抖音都停不下來的原因。

超越常人的堅持

很多創業者失敗,原因就是沒有堅持下去,當然也有很多因為,例如,資金方面,讓他們無法堅持下去,但是我覺得這個不是主要原因。一個好的項目從來就不缺資金,缺的是堅持,很多創業者三天打魚两天曬網,越做越差,越差越不想做下去,惡性循環,最終堅持不下去而失敗,重返職場。我同學剛剛開始兩年,幾乎是沒有收入的,但是他還是一直堅持下去,在今天看來,我真得很佩服他,每天花大量時間去整理文章,想盡各種方法,兩年如一日,從不間斷,也只有這樣,堅持每天輸出優質的文章,才能黏住用戶。有時候,經常羡慕別人的收入比自己高,但是忽略了別人背後付出的辛勤和汗水,超出常人的堅持,才換來了今天的成果。

5、注意細節

常言道:細節決定成敗。 這句話不是隨隨便便說說,我是深有體會,也是見證者。就說我同學,每發一篇文章,都注意各方面的細節,例如:標題、封面圖片、發布時間點、內容質量、內容類型等等。

標題: 這是提高點擊率的重要手段,大家聽說過標題黨吧,一個好的標題,閱讀量比起沒有吸引力的標題要高出一倍,這對於拉廣告十分重要。

封面圖片: 有些人隨隨便便用一張圖片就算了,甚至每一期的文章都是用同樣一張封面圖片,這對於用戶一點吸引力都沒有,視覺上沒有衝擊力,不能第一時間抓住用戶。

發布時間點: 也是非常重要,長期摸索,知道用戶大概在晚上10點左右,點擊率最高的時間點,可能用戶在這個時間點才忙完一天的工作,洗完澡,躺在床上玩手機。如果隨便找一個時間點發布,很快就被其他公眾號文章淹沒或者用戶根本就沒有時間看。

內容質量: 寧為玉碎不為瓦全,質量上,一定要把控好,如果你今天沒有找到好文,寧願不發布,都不要發一些劣質的文章,如果長期發布劣質的文章,這會影響用戶對你的文章興趣度。

內容類型: 不要找一下枯燥無味的文章,或者很費腦力的文章,最好選擇一些能引起大多數用戶共鳴的心靈雞湯文章,或者其他熱點文章。

種種細節,決定着產品或者運營的成敗。

6、最後

說了那麼多,如果你真的體會到這些含義,我想成功真的不難,而我本人體會最深的就這幾點:樂觀的精神、超越常人的執行力、注意細節。而且我現在正在執行中,快達到我的預期目標,希望看到我的文章的朋友,能真正體會到其中的含義。

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

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

舊款都看膩了!這些新款SUV值得關注 實用還有面子!_網頁設計

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

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

4L自然吸氣發動機,模擬6速的CVT變速箱,它的實際表現和你想象的一樣,就是慵懶,還好是那種有底氣的慵懶,四驅系統多多少少也會影響到動力的表現。歐藍德是很有實力的一款產品,但是品牌認知度制約着它的發展。3江淮汽車-瑞風S3優點:性價比高缺點:CVT車型動力偏弱推薦人群:追求省心好用的人群推薦車型:2017款 1。

按照目前的平均生活水平計算,對於普通老百姓而言,用幾萬塊甚至十幾萬買人生的第一輛車,好像壓力不大,但是要說第二輛車,可能真的要等上六七八年才會買,所以,人生第一輛車一定要滿足顏值問題,至少要耐看,接下來的這幾輛車,一定能夠滿足廣大顏控的要求。

優點:設計感十足

缺點:中高配車型性價比不突出

推薦人群:朝氣蓬勃的年輕人

推薦車型:2015款 1.6L 自動兩驅pRM(15.68萬)

KX3剛剛進行了小改款,本來特立獨行的它,似乎為了迎合市場而做出了改變,原本小鬍子的進氣隔柵不見了,換成了六邊形的造型,向著家族風格靠攏,前霧燈更加小巧,與日間行車燈擺在了一起,總而言之,還是那麼任性。

內飾方面沒有什麼明顯的改變,簡單時尚就夠了,方向盤造型是最喜歡的地方,整個造型設計看起來非常有肌肉感,儀錶盤樣式雖然簡單,但是讀取清晰,對行車安全也有一點幫助。

為什麼推薦購買1.6L的頂配版本,首先1.6L與1.6T的動力差距還不能用“巨大”來形容,加上買韓系車,不買高配車型享受一下超高的配置,就意義不大了,通風/加熱座椅、外后視鏡加熱、方向盤加熱、自動空調、車內氛圍燈、倒車影像、全景天窗,汽車就應該這樣。

優點:有7座車型可供選擇

缺點:動力一般

推薦人群:有7座需求的消費人群

推薦車型:2016款 2.4L 四驅豪華版 7座(19.68萬)

國產歐藍德終於來到了大家面前,三菱的營銷策略,不是那麼容易搞懂的,國產歐藍德保留了進口版本的設計,前臉的大嘴設計和超大面積的鍍鉻裝飾,只能用“前衛”兩字形容,尾部的實際則是更顯質感,導光條式的尾燈設計十分耐看,辨識度很高。

內飾沒什麼出彩的地方,中控台除了空調操作區域就是8英寸的觸控車載系統,沒有什麼與駕駛相關的操作,好像三菱就從來不需要那些東西,值得一提的是換擋撥片,2.4L車型全部標配,算是強調一下運動性吧。

7座車型採用2+3+2的座椅布局,第二排座椅可以前後調節,調節範圍還不小,第三排座椅僅僅能夠坐得下成年人,應付短途出行需求不成問題,二三排座椅都放倒后,能夠形成一張平坦的大床,2.4L所有車型都是電動後備廂門,

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

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

在同級別還是有一定競爭力的。

2.4L自然吸氣發動機,模擬6速的CVT變速箱,它的實際表現和你想象的一樣,就是慵懶,還好是那種有底氣的慵懶,四驅系統多多少少也會影響到動力的表現。歐藍德是很有實力的一款產品,但是品牌認知度制約着它的發展。

優點:性價比高

缺點:CVT車型動力偏弱

推薦人群:追求省心好用的人群

推薦車型:2017款 1.6L 手動智能互聯型(8.58萬)

瑞風S3是國產小型SUV陣營里的領頭羊,9月份銷量高達21888輛,這背後肯定離不開“好開、實用、舒適”這三個方面,某種程度而言,它就像是上一代的軒逸和卡羅拉,你找不出它們有什麼特別突出的亮點,但就是這一份均衡打動了消費者。

瑞風S3的這次改款主要集中在設計上,在舊款的基礎上進行更加精緻的修整,前大燈和尾燈都開了眼角,霧燈造型別緻,加入了銀色護板和鍍鉻裝飾的后包圍更加顯檔次,也十分耐看。

內飾方面,整个中控台幾乎都是全新的設計,更加國際范,跟舊款相比,簡直就不是同一個層次,儀錶盤樣式也重新設計了,字體讀取更加清晰,中控台小巧的按鍵旋鈕和聳立的显示屏,是不是很像某國際大廠呢,不管怎樣,好看就夠了。

動力系統增加了1.6L的發動機,與之匹配的是6MT和CVT變速箱,如果你是一個追求舒適、易用、好開的車主,對什麼動力激情不感興趣的話,那麼CVT是個明智的選擇,至於為什麼推薦手動擋車型,因為覺得這樣才有意思。

優點:設計出眾、行駛品質高

缺點:配置略低

推薦人群:注重設計感和机械品質的人群

推薦車型:2016款 1.5T 手動耀臻版(11.49萬)

不知道大家怎麼看,反正是覺得瑞虎7真的是顏值爆表,處處都能體現出肌肉感,中網設計特別,整個前臉讓聯想到了鯊魚,尾燈的造型是最喜歡的地方,偏向於暗紅色的顏色非常顯檔次。

內飾的設計很簡潔,可以說有點過分簡潔,中控台就剩下孤伶伶的幾個旋鈕和按鍵,其它操作都是在上方的觸控屏幕里完成。方向盤造型也有點怪異,總是感覺設計師想要做成兩幅式,但是又迫於無奈做成三幅式,反正看着就覺得很扁,除此之外像是什麼做工、用料、設計方面都處於較高水平。

1.5T渦輪增壓發動機與6MT的匹配很好,換擋行程短,並且不會感到乾澀,發動機的動力輸出不會突兀,力道很足,是一輛完善度很高、很好開的的手動擋車型。

總結:

其實不只是女性消費者購車時會比較注重車輛的外觀顏值,絕大部分的男性消費者,也是很注重這方面的,誰也不想開着一輛特別“引人注目”的車出去,起亞KX3的時尚精緻,三菱歐藍德的高端大氣,瑞風S3的居家溫馨,瑞虎7的肌肉性感,肯定有一款能夠令你心動。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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