編譯k8s
A. 怎麼用通俗易懂的話來解釋Docker(容器)技術
官網的介紹是這樣的:
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications....
其實看完這句話還是不明白究竟是啥的,下面就慢慢解釋。不過長話短說的話,把他想像成一個用了一種新穎方式實現的超輕量虛擬機,在大概效果上也是正確的。當然在實現的原理和應用上還是和VM有巨大差別的,並且專業的叫法是應用容器(Application Container)。
為啥要用容器?
那麼應用容器長什麼樣子呢,一個做好的應用容器長得就好像一個裝好了一組特定應用的虛擬機一樣。比如我現在想用MySQL那我就找個裝好MySQL的容器,運行起來,那麼我就可以使用 MySQL了。
那麼我直接裝個 MySQL不就好了,何必還需要這個容器這么詭異的概念?話是這么說,可是你要真裝MySQL的話可能要再裝一堆依賴庫,根據你的操作系統平台和版本進行設置,有時候還要從源代碼編譯報出一堆莫名其妙的錯誤,可不是這么好裝。而且萬一你機器掛了,所有的東西都要重新來,可能還要把配置在重新弄一遍。但是有了容器,你就相當於有了一個可以運行起來的虛擬機,只要你能運行容器,MySQL的配置就全省了。而且一旦你想換台機器,直接把這個容器端起來,再放到另一個機器就好了。硬體,操作系統,運行環境什麼的都不需要考慮了。
在公司中的一個很大的用途就是可以保證線下的開發環境、測試環境和線上的生產環境一致。當年在 Bai 經常碰到這樣的事情,開發把東西做好了給測試去測,一般會給一坨代碼和一個介紹上線步驟的上線單。結果代碼在測試機跑不起來,開發就跑來跑去看問題,一會兒啊這個配置文件忘了提交了,一會兒啊這個上線命令寫錯了。找到了一個 bug 提上去,開發一看,啊我怎麼又忘了把這個命令寫在上線單上了。類似的事情在上線的時候還會發生,變成啊你這個軟體的版本和我機器上的不一樣……在 Amazon 的時候,由於一個開發直接擔任上述三個職位,而且有一套自動化部署的機制所以問題會少一點,但是上線的時候大家還是膽戰心驚。
若果利用容器的話,那麼開發直接在容器里開發,提測的時候把整個容器給測試,測好了把改動改在容器里再上線就好了。通過容器,整個開發、測試和生產環境可以保持高度的一致。
此外容器也和VM一樣具有著一定的隔離性,各個容器之間的數據和內存空間相互隔離,可以保證一定的安全性。
B. 虛擬化有哪些應用
近年來,雲原生 (Cloud Native)可謂是 IT 界最火的概念之一,眾多互聯網巨頭都已經開始積極擁抱雲原生。而說到雲原生,我們就不得不了解本文的主角 —— 容器(container)。容器技術可謂是撐起了雲原生生態的半壁江山。容器作為一種先進的虛擬化技術,已然成為了雲原生時代軟體開發和運維的標准基礎設施,在了解它之前,我們不妨從虛擬化技術說起。
何謂虛擬化技術
1961 年 —— IBM709 機實現了分時系統
計算機歷史上首個虛擬化技術實現於 1961 年,IBM709 計算機首次將 CPU 佔用切分為多個極短 (1/100sec) 時間片,每一個時間片都用來執行著不同的任務。通過對這些時間片的輪詢,這樣就可以將一個 CPU 虛擬化或者偽裝成為多個 CPU,並且讓每一顆虛擬 CPU 看起來都是在同時運行的。這就是虛擬機的雛形。
容器的功能其實和虛擬機類似,無論容器還是虛擬機,其實都是在計算機不同的層面進行虛擬化,即使用邏輯來表示資源,從而擺脫物理限制的約束,提高物理資源的利用率。虛擬化技術是一個抽象又內涵豐富的概念,在不同的領域或層面有著不同的含義。
這里我們首先來粗略地講講計算機的層級結構。計算機系統對於大部分軟體開發者來說可以分為以下層級結構:
應用程序層
函數庫層
操作系統層
硬體層
各層級自底向上,每一層都向上提供了介面,同時每一層也只需要知道下一層的介面即可調用底層功能來實現上層操作(不需要知道底層的具體運作機制)。
但由於早期計算機廠商生產出來的硬體遵循各自的標准和規范,使得操作系統在不同計算機硬體之間的兼容性很差;同理,不同的軟體在不同的操作系統下的兼容性也很差。於是,就有開發者人為地在層與層之間創造了抽象層:
應用層
函數庫層
API抽象層
操作系統層
硬體抽象層
硬體層
就我們探討的層面來說,所謂虛擬化就是在上下兩層之間,人為地創造出一個新的抽象層,使得上層軟體可以直接運行在新的虛擬環境上。簡單來說,虛擬化就是通過模訪下層原有的功能模塊創造介面,來「欺騙」上層,從而達到跨平台開發的目的。
綜合上述理念,我們就可以重新認識如今幾大廣為人知的虛擬化技術:
虛擬機:存在於硬體層和操作系統層間的虛擬化技術。
容器:存在於操作系統層和函數庫層之間的虛擬化技術。
JVM:存在於函數庫層和應用程序之間的虛擬化技術。
虛擬機通過「偽造」一個硬體抽象介面,將一個操作系統以及操作系統層以上的層嫁接到硬體上,實現和真實物理機幾乎一樣的功能。比如我們在一台 Windows 系統的電腦上使用 Android 虛擬機,就能夠用這台電腦打開 Android 系統上的應用。
容器通過「偽造」操作系統的介面,將函數庫層以上的功能置於操作系統上。以 Docker 為例,其就是一個基於 Linux 操作系統的 Namespace 和 Cgroup 功能實現的隔離容器,可以模擬操作系統的功能。簡單來說,如果虛擬機是把整個操作系統封裝隔離,從而實現跨平台應用的話,那麼容器則是把一個個應用單獨封裝隔離,從而實現跨平台應用。所以容器體積比虛擬機小很多,理論上佔用資源更少。
java 虛擬機同樣具有跨平台特性,所謂跨平台特性實際上也就是虛擬化的功勞。我們知道 Java 語言是調用操作系統函數庫的,JVM 就是在應用層與函數庫層之間建立一個抽象層,對下通過不同的版本適應不同的操作系統函數庫,對上提供統一的運行環境交給程序和開發者,使開發者能夠調用不同操作系統的函數庫。
在大致理解了虛擬化技術之後,接下來我們就可以來了解容器的誕生歷史。雖然容器概念是在 Docker 出現以後才開始在全球范圍內火起來的,但在 Docker 之前,就已經有無數先驅在探索這一極具前瞻性的虛擬化技術。
容器的前身 「Jail」
1979 年 —— 貝爾實驗室發明 chroot
容器主要的特性之一就是進程隔離。早在 1979 年,貝爾實驗室在 Unix V7 的開發過程中,發現當一個系統軟體編譯和安裝完成後,整個測試環境的變數就會發生改變,如果要進行下一次構建、安裝和測試,就必須重新搭建和配置測試環境。要知道在那個年代,一塊 64K 的內存條就要賣 419 美元,「快速銷毀和重建基礎設施」的成本實在是太高了。
開發者們開始思考,能否在現有的操作系統環境下,隔離出一個用來重構和測試軟體的獨立環境?於是,一個叫做 chroot(Change Root)的系統調用功能就此誕生。
chroot 可以重定向進程及其子進程的 root 目錄到文件系統上的新位置,也就是說使用它可以分離每個進程的文件訪問許可權,使得該進程無法接觸到外面的文件,因此這個被隔離出來的新環境也得到了一個非常形象的命名,叫做 Chroot Jail (監獄)。之後只要把需要的系統文件一並拷貝到 Chroot Jail 中,就能夠實現軟體重構和測試。這項進步開啟了進程隔離的大門,為 Unix 提供了一種簡單的系統隔離功能,尤其是 jail 的思路為容器技術的發展奠定了基礎。但是此時 chroot 的隔離功能僅限於文件系統,進程和網路空間並沒有得到相應的處理。
進入21世紀,此時的虛擬機(VM)技術已經相對成熟,人們可以通過虛擬機技術實現跨操作系統的開發。但由於 VM 需要對整個操作系統進行封裝隔離,佔用資源很大,在生產環境中顯得太過於笨重。於是人們開始追求一種更加輕便的虛擬化技術,眾多基於 chroot 擴展實現的進程隔離技術陸續誕生。
2000 年 —— FreeBSD 推出 FreeBSD Jail
在 chroot 誕生 21 年後,FreeBSD 4.0 版本推出了一套微型主機環境共享系統 FreeBSD Jail,將 chroot 已有的機制進行了擴展。在 FreeBSD Jail 中,程序除了有自己的文件系統以外,還有獨立的進程和網路空間,Jail 中的進程既不能訪問也不能看到 Jail 之外的文件、進程和網路資源。
2001 年 —— Linux VServer 誕生
2001年,Linux 內核新增 Linux VServer(虛擬伺服器),為 Linux 系統提供虛擬化功能。Linux VServer 採取的也是一種 jail 機制,它能夠劃分計算機系統上的文件系統、網路地址和內存,並允許一次運行多個虛擬單元。
2004 年 —— SUN 發布 Solaris Containers
該技術同樣由 chroot 進一步發展而來。2004 年 2 月,SUN 發布類 Unix 系統 Solaris 的 10 beta 版,新增操作系統虛擬化功能 Container,並在之後的 Solaris 10 正式版中完善。Solaris Containers 支持 x86 和 SPARC 系統,SUN 創造了一個 zone 功能與 Container 配合使用,前者是一個單一操作系統中完全隔離的虛擬伺服器,由系統資源控制和 zones 提供的邊界分離實現進程隔離。
2005 年 —— OpenVZ 誕生
類似於 Solaris Containers,它通過對 Linux 內核進行補丁來提供虛擬化、隔離、資源管理和狀態檢查 checkpointing。每個 OpenVZ 容器都有一套隔離的文件系統、用戶及用戶組、進程樹、網路、設備和 IPC 對象。
這個時期的進程隔離技術大多以 Jail 模式為核心,基本實現了進程相關資源的隔離操作,但由於此時的生產開發仍未有相應的使用場景,這一技術始終被局限在了小眾而有限的世界裡。
就在此時,一種名為「雲」的新技術正悄然萌發……
「雲」的誕生
2003 年至 2006 年間,Google 公司陸續發布了 3 篇產品設計論文,從計算方式到存儲方式,開創性地提出了分布式計算架構,奠定了大數據計算技術的基礎。在此基礎上,Google 顛覆性地提出「Google 101」計劃,並正式創造「雲」的概念。一時間,「雲計算」、「雲存儲」等全新詞彙轟動全球。隨後,亞馬遜、IBM 等行業巨頭也陸續宣布各自的「雲」計劃,宣告「雲」技術時代的來臨。
也是從這時期開始,進程隔離技術進入了一個更高級的階段。在 Google 提出的雲計算框架下,被隔離的進程不僅僅是一個與外界隔絕但本身卻巍然不動的 Jail,它們更需要像一個個輕便的容器,除了能夠與外界隔離之外,還要能夠被控制與調配,從而實現分布式應用場景下的跨平台、高可用、可擴展等特性。
2006 年 —— Google 推出 Process Containers,後更名為 Cgroups
Process Container 是 Google 工程師眼中「容器」技術的雛形,用來對一組進程進行限制、記賬、隔離資源(CPU、內存、磁碟 I/O、網路等)。這與前面提到的進程隔離技術的目標其實是一致的。由於技術更加成熟,Process Container 在 2006 年正式推出後,第二年就進入了 Linux 內核主幹,並正式更名為 Cgroups,標志著 Linux 陣營中「容器」的概念開始被重新審視和實現。
2008 年 —— Linux 容器工具 LXC 誕生
在 2008 年,通過將 Cgroups 的資源管理能力和 Linux Namespace(命名空間)的視圖隔離能力組合在一起,一項完整的容器技術 LXC(Linux Container)出現在了 Linux 內核中,這就是如今被廣泛應用的容器技術的實現基礎。我們知道,一個進程可以調用它所在物理機上的所有資源,這樣一來就會擠占其它進程的可用資源,為了限制這樣的情況,Linux 內核開發者提供了一種特性,進程在一個 Cgroup 中運行的情況與在一個命名空間中類似,但是 Cgroup 可以限制該進程可用的資源。盡管 LXC 提供給用戶的能力跟前面提到的各種 Jails 以及 OpenVZ 等早期 Linux 沙箱技術是非常相似的,但伴隨著各種 Linux 發行版開始迅速佔領商用伺服器市場,包括 Google 在內的眾多雲計算先鋒廠商得以充分活用這一早期容器技術,讓 LXC 在雲計算領域獲得了遠超前輩的發展空間 。
同年,Google 基於 LXC 推出首款應用託管平台 GAE (Google App Engine),首次把開發平台當做一種服務來提供。GAE 是一種分布式平台服務,Google 通過虛擬化技術為用戶提供開發環境、伺服器平台、硬體資源等服務,用戶可以在平台基礎上定製開發自己的應用程序並通過 Google 的伺服器和互聯網資源進行分發,大大降低了用戶自身的硬體要求。
值得一提的是,Google 在 GAE 中使用了一個能夠對 LXC 進行編排和調度的工具 —— Borg (Kubernetes 的前身)。Borg 是 Google 內部使用的大規模集群管理系統,可以承載十萬級的任務、數千個不同的應用、同時管理數萬台機器。Borg 通過許可權管理、資源共享、性能隔離等來達到高資源利用率。它能夠支持高可用應用,並通過調度策略減少出現故障的概率,提供了任務描述語言、實時任務監控、分析工具等。如果說一個個隔離的容器是集裝箱,那麼 Borg 可以說是最早的港口系統,而 LXC + Borg 就是最早的容器編排框架。此時,容器已經不再是一種單純的進程隔離功能,而是一種靈活、輕便的程序封裝模式。
2011 年 —— Cloud Foundry 推出 Warden
Cloud Foundry 是知名雲服務供應商 VMware 在 2009 年推出的一個雲平台,也是業內首個正式定義 PaaS (平台即服務)模式的項目,「PaaS 項目通過對應用的直接管理、編排和調度讓開發者專注於業務邏輯而非基礎設施」,以及「PaaS 項目通過容器技術來封裝和啟動應用」等理念都出自 Cloud Foundry。Warden 是 Cloud Foundry 核心部分的資源管理容器,它最開始是一個 LXC 的封裝,後來重構成了直接對 Cgroups 以及 Linux Namespace 操作的架構。
隨著「雲」服務市場的不斷開拓,各種 PaaS 項目陸續出現,容器技術也迎來了一個爆發式增長的時代,一大批圍繞容器技術進行的創業項目陸續涌現。當然,後來的故事很多人都知道了,一家叫 Docker 的創業公司橫空出世,讓 Docker 幾乎成為了「容器」的代名詞。
Docker 橫空出世
2013 年 —— Docker 誕生
Docker 最初是一個叫做 dotCloud 的 PaaS 服務公司的內部項目,後來該公司改名為 Docker。Docker 在初期與 Warden 類似,使用的也是 LXC ,之後才開始採用自己開發的 libcontainer 來替代 LXC 。與其他只做容器的項目不同的是,Docker 引入了一整套管理容器的生態系統,這包括高效、分層的容器鏡像模型、全局和本地的容器注冊庫、清晰的 REST API、命令行等等。
Docker 本身其實也是屬於 LXC 的一種封裝,提供簡單易用的容器使用介面。它最大的特性就是引入了容器鏡像。Docker 通過容器鏡像,將應用程序與運行該程序需要的環境,打包放在一個文件裡面。運行這個文件,就會生成一個虛擬容器。
更為重要的是,Docker 項目還採用了 Git 的思路 —— 在容器鏡像的製作上引入了「層」的概念。基於不同的「層」,容器可以加入不同的信息,使其可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。通過製作 Docker 鏡像,開發者可以通過 DockerHub 這樣的鏡像託管倉庫,把軟體直接進行分發。
也就是說,Docker 的誕生不僅解決了軟體開發層面的容器化問題,還一並解決了軟體分發環節的問題,為「雲」時代的軟體生命周期流程提供了一套完整的解決方案。
很快,Docker 在業內名聲大噪,被很多公司選為雲計算基礎設施建設的標准,容器化技術也成為業內最炙手可熱的前沿技術,圍繞容器的生態建設風風火火地開始了。
容器江湖之爭
一項新技術的興起同時也帶來了一片新的市場,一場關於容器的藍海之爭也在所難免。
2013 年 —— CoreOS 發布
在 Docker 爆火後,同年年末,CoreOS 應運而生。CoreOS 是一個基於 Linux 內核的輕量級操作系統,專為雲計算時代計算機集群的基礎設施建設而設計,擁有自動化、易部署、安全可靠、規模化等特性。其在當時有一個非常顯眼的標簽:專為容器設計的操作系統。
借著 Docker 的東風,CoreOS 迅速在雲計算領域躥紅,一時間,Docker + CoreOS 成為業內容器部署的黃金搭檔。同時,CoreOS 也為 Docker 的推廣與社區建設做出了巨大的貢獻。
然而,日漸壯大的 Docker 似乎有著更大的「野心」。不甘於只做「一種簡單的基礎單元」的 Docker,自行開發了一系列相關的容器組件,同時收購了一些容器化技術的公司,開始打造屬於自己的容器生態平台。顯然,這對於 CoreOS 來說形成了直接的競爭關系。
2014 年 —— CoreOS 發布開源容器引擎 Rocket
2014 年末,CoreOS 推出了自己的容器引擎 Rocket (簡稱 rkt),試圖與 Docker 分庭抗禮。rkt 和 Docker 類似,都能幫助開發者打包應用和依賴包到可移植容器中,簡化搭環境等部署工作。rkt 和 Docker 不同的地方在於,rkt 沒有 Docker 那些為企業用戶提供的「友好功能」,比如雲服務加速工具、集群系統等。反過來說,rkt 想做的,是一個更純粹的業界標准。
2014 年 —— Google 推出開源的容器編排引擎 Kubernetes
為了適應混合雲場景下大規模集群的容器部署、管理等問題,Google 在 2014 年 6 月推出了容器集群管理系統 Kubernetes (簡稱 K8S)。K8S 來源於我們前面提到的 Borg,擁有在混合雲場景的生產環境下對容器進行管理、編排的功能。Kubernetes 在容器的基礎上引入了 Pod 功能,這個功能可以讓不同容器之間互相通信,實現容器的分組調配。
得益於 Google 在大規模集群基礎設施建設的強大積累,脫胎於 Borg 的 K8S 很快成為了行業的標准應用,堪稱容器編排的必備工具。而作為容器生態圈舉足輕重的一員,Google 在 Docker 與 rkt 的容器之爭中站在了 CoreOS 一邊,並將 K8S 支持 rkt 作為一個重要里程碑。
2015 年 —— Docker 推出容器集群管理工具 Docker Swarm
作為回應,Docker 公司在 2015 年發布的 Docker 1.12 版本中也開始加入了一個容器集群管理工具 Docker swarm 。
隨後,Google 於 2015 年 4 月領投 CoreOS 1200 萬美元, 並與 CoreOS 合作發布了首個企業發行版的 Kubernetes —— Tectonic 。從此,容器江湖分為兩大陣營,Google 派系和 Docker 派系。
兩大派系的競爭愈演愈烈,逐漸延伸到行業標準的建立之爭。
2015 年 6 月 —— Docker 帶頭成立 OCI
Docker 聯合 Linux 基金會成立 OCI (Open Container Initiative)組織,旨在「制定並維護容器鏡像格式和容器運行時的正式規范(「OCI Specifications」),圍繞容器格式和運行時制定一個開放的工業化標准。
2015 年 7 月 —— Google 帶頭成立 CNCF
而戰略目標聚焦於「雲」的 Google 在同年 7 月也聯合 Linux 基金會成立 CNCF (Cloud Native Computing Foundation)雲原生計算基金會,並將 Kubernetes 作為首個編入 CNCF 管理體系的開源項目,旨在「構建雲原生計算 —— 一種圍繞著微服務、容器和應用動態調度的、以基礎設施為中心的架構,並促進其廣泛使用」。
這兩大圍繞容器相關開源項目建立的開源基金會為推動日後的雲原生發展發揮了重要的作用,二者相輔相成,制定了一系列行業事實標准,成為當下最為活躍的開源組織。
Kubernetes 生態一統江湖
雖然這些年來 Docker 一直力壓 rkt,成為當之無愧的容器一哥,但作為一個龐大的容器技術生態來說,Docker 生態還是在後來的容器編排之爭中敗給了 Google 的 Kubernetes 。
隨著越來越多的開發者使用 Docker 來部署容器,編排平台的重要性日益突出。在 Docker 流行之後,一大批開源項目和專有平台陸續出現,以解決容器編排的問題。Mesos、Docker Swarm 和 Kubernetes 等均提供了不同的抽象來管理容器。這一時期,對於軟體開發者來說,選擇容器編排平台就像是一場豪賭,因為一旦選擇的平台在以後的競爭中敗下陣來,就意味著接下來開發的東西在未來將失去市場。就像當初 Android、iOS 和 WP 的手機系統之爭一樣,只有勝利者才能獲得更大的市場前景,失敗者甚至會銷聲匿跡。容器編排平台之爭就此拉開帷幕。
2016 年 —— CRI-O 誕生
2016 年,Kubernetes 項目推出了 CRI (容器運行時介面),這個插件介面讓 kubelet(一種用來創建 pod、啟動容器的集群節點代理)能夠使用不同的、符合 OCI 的容器運行時環境,而不需要重新編譯 Kubernetes。基於 CRI ,一個名為 CRI-O 的開源項目誕生,旨在為 Kubernetes 提供一種輕量級運行時環境。
CRI-O 可以讓開發者直接從 Kubernetes 來運行容器,這意味著 Kubernetes 可以不依賴於傳統的容器引擎(比如 Docker ),也能夠管理容器化工作負載。這樣一來,在 Kubernetes 平台上,只要容器符合 OCI 標准(不一定得是 Docker),CRI-O 就可以運行它,讓容器回歸其最基本的功能 —— 能夠封裝並運行雲原生程序即可。
同時,CRI-O 的出現讓使用容器技術進行軟體管理和運維的人們發現,相對於 Docker 本身的標准容器引擎, Kubernetes 技術棧(比如編排系統、 CRI 和 CRI-O )更適合用來管理復雜的生產環境。可以說,CRI-O 將容器編排工具放在了容器技術棧的重要位置,從而降低了容器引擎的重要性。
在 K8S 順利搶佔先機的情況下,Docker 在推廣自己的容器編排平台 Docker Swarm 時反而犯下了錯誤。2016 年底,業內曝出 Docker 為了更好地適配 Swarm,將有可能改變 Docker 標準的傳言。這讓許多開發者在平台的選擇上更傾向於與市場兼容性更強的 Kubernetes 。
因此,在進入 2017 年之後,更多的廠商願意把寶壓在 K8S 上,投入到 K8S 相關生態的建設中來。容器編排之爭以 Google 陣營的勝利告一段落。與此同時,以 K8S 為核心的 CNCF 也開始迅猛發展,成為當下最火的開源項目基金會。這兩年包括阿里雲、騰訊、網路等中國科技企業也陸續加入 CNCF ,全面擁抱容器技術與雲原生。
結語
從數十年前在實驗室里對進程隔離功能的探索,再到如今遍布生產環境的雲原生基礎設施建設,可以說容器技術凝聚了幾代開發者的心血,才從一個小小的集裝箱發展到一個大型的現代化港口。可以預見的是,從現在到未來很長一段時間里,容器技術都將是軟體開發和運維的重要基礎設施。
C. 騰訊藍鯨運維平台優缺點
藍鯨智雲,簡稱藍鯨,是一套基於PaaS的技術解決方案;通過藍鯨,可以實現很多功能,這就是他的優點,缺點就是有些功能比較雞肋。
1、「運維基礎服務」的無人值守;運維基礎服務就是我們經常做的發布變更和故障處理,日常的運維操作。
2、「運維增值服務」的低成本實現;也就是說,在實行運維基礎服務之後,實現IT運營轉型;為相關關聯的崗位提供快速、低成本的支撐工具,運營系統,推動企業企業內部的工具文化;並利用雲和大數據技術為企業實現精細化的工作活動。
在騰訊內部,藍鯨支撐著300多款業務,管理著20多萬台伺服器,完成著14萬次發布變更操作,每天處理著變更和操作超過6萬次。下面我們一起看藍鯨的架構圖。最底部是管控平台,他具體服務擇比如說傳輸數據,傳輸文件。
執行腳本等;在管控平台上層,是常用的基礎平台,如配置平台、作業平台、數據平台等,他們為上層的集成平台提供原子服務,從而為下面平台提供調度自動化,在集成平台的上層,承載著很多SAAS應用,如標准運維、監控系統。
故障自愈,移動平台等。目前藍鯨2.0已經開放了這4個平台,管控平台、配置平台、作業平台、集成平台,最底層的管控平台,可以管理各種OS,如WINDOWS,LUNIX,小型機,x等上面的作業平台可以是基礎運維工作的自動化,如智能傳輸文件。
腳本、雲化管理、腳本快速執行,海量主機的並發操作,跨雲管理(無論阿里雲、騰訊雲、私有雲等都可以統一管理)等等。
D. 如何用Jenkins和Kubernetes搭建可伸縮持續集成系統
目前市場主流持續集工具
例 CruiseControLhudson jenkinsapacheContinuum 等 源持續集工具,
CruiseControl :簡稱 CC 持續集工具主要提供基於版本管理工具 ( CVS、VSS、SVN) 知變化或每定持續集並提供持續集報告、 Email 、 Jabber 等等式通知相關負責其要求需要進行構建項目已編寫全自項目編譯腳本 ( 基於 Maven 或 Ant) 由於該工具配置及部署麻煩 且版本久沒更新
hudson 由於oracle收購 前源東西 能ORACLE私化
HudsonJenkins前身基於Java發種持續集工具用於監控程序重復工作包括:
1、持續軟體版本發布/測試項目
2、監控外部調用執行工作
-
E. 初學編程應該學習哪種編程語言
如果你想學習編程,雖然選擇第一門編程語言與你想用它來做什麼,最終達到什麼目的有很大的關系,但是事實上某些編程語言的確比其他語言要好學。
選擇一門合適的編程語言作為入門的語言對於培養自己編程的興趣會有很大的幫助。
下面幾種零基礎小白入門的編程語言最佳候選名單。
1、Java
java是互聯網歷史最悠久、最堅挺和最具影響力的編程語言之一。你可以在線上線下、各種平台、操作系統和設備應用的核心部分發現Java的身影。它是一門極具特色的基於類、面向對象的編程語言,被設計為能夠在盡可能多的平台上移植和運行。
出於這個原因,它也是世界上最流行的編程語言之一, 堅持首選Java作為第一門編程語言的學習者必須注意Java迫使你以程序員的方式思維一邏輯和分析式思考, 並且真正把握計算機是如何處理信息的才行。
學習Java可轉向JavaEE分布式開發、大數據+人工智慧、軟體測試等等。
2、python
當我們討論第一門編程語言以及哪一門語言更加容易快速上手時,很容易會提到 Python。它是一種面向對象、解釋型計算機程序設計語言。
Python語法簡潔而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是PythonC/C++)很輕松地聯結在一起。
Python在設計上堅持了清晰劃一的風格, 這使得Python成為一門易讀、 易維護,並且被大量用戶所歡迎的、用途廣泛的語言。
學習Python可轉向Python全棧+人工智慧、網路安全、軟體測試、雲計算+信息安全等等。
3、C/C++
C++是C的自然演化,這兩種語言大約分別起源於19世紀70年代和80年代早期。C語言是大學裡面教的第一門編程語言,是一門使用非常廣泛,通用的編程語言,它深遠地影響了其後的幾乎每一種語言。
關於C和C++的一件重要的事情是:它們都是計算機科學與編程最基礎的語言。如果你學習它們,它們會使你獲益,即使你之後並不去使用這兩種語言,但它們會使你洞察計算機科學和計算機編程的起源和基礎。
如果你不旨在專業的編程,這對你來仍然可以學習一下。 因為學過它們的人都會說學會了C/C++後,在學習其他語言就會變得很輕松。
學習C語言可轉向智能物聯網+嵌入式開發等等。
4、JavaScript
JavaScript通常我們會把它和Java相混淆,但是兩者根本沒有一點關系。
它是一門腳本語言,是Web的基礎技術之一,但它也存在於瀏覽器之外。 隨著伺服器的強壯,雖然程序員更喜歡運行於服務嘴的腳木以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。
JavaScript比較容易學,使用瀏覽器即可運行,雖然它存在已經有一段時間了,但它正在迅速流行起來。學習JavaScript的成就感很高,因為你馬上就可以做一些Web程序了,這是大部分人學習編程的原因。
學習JavaScript可轉向Web開發、HTML5大前端等等。
在這特推薦去我們官網了解一下,看看我們的課程有沒有感興趣的!
希望能幫到你,望採納~
F. 在新建虛擬機時出現問題
JConsole
JConsole 圖形用戶界面是一種符合 Java 管理擴展(JMX)規范的監視工具。JConsole 使用 Java 虛擬機 (Java VM) 的廣泛檢測來提供有關在 Java 平台上運行的應用程序的性能和資源消耗的信息。
使用方法 本地
使用jconsole命令:監視本地運行的所有 Java 應用程序,JConsole 可以連接到這些應用程序。
使用jconsole PID命令:監視指定PID的Java應用程序。
- 獲取java PID的方法:通過任務管理器查看、通過Java提供的jps命令查看。遠程
概述:顯示有關 Java VM 和受監視值的概述信息。
內存:顯示有關內存使用的信息。
線程:顯示有關線程使用的信息。
類:顯示有關類載入的信息。
VM:顯示有關 Java VM 的信息。
MBeans:顯示有關 MBeans 的信息。
- 組成部分 概覽
伊甸園空間(堆):最初為大多數對象分配內存的池。
倖存者空間(堆):包含在伊甸園空間垃圾回收中倖存下來的物體的池。
終身代(堆):包含在倖存者空間中存在一段時間的對象的池。
永久生成(非堆):包含虛擬機本身的所有反射數據的池,如類和方法對象。使用類數據共享的 Java VM,這一代分為只讀和讀寫區域。
代碼緩存(非堆):HotSpotJava VM 還包括一個代碼緩存,其中包含用於編譯和存儲本機代碼的內存。
- 堆和非堆內存
堆內存是Java VM為所有類實例和數組分配內存的運行時數據區域。堆的大小可能是固定的或可變的。垃圾回收器是一個自動內存管理系統,用於回收對象的堆內存。
非堆內存包括所有線程之間共享的方法區域和Java VM的內部處理或優化所需的內存。它存儲每類結構,如運行時常量池、欄位和方法數據,以及方法和構造函數的代碼。方法區域在邏輯上是堆的一部分,但是,根據實現,Java VM 可能不會對它進行垃圾回收或壓縮。與堆內存一樣,方法區域可能為固定大小或可變大小。方法區域的內存不需要連續。
- 內存池和內存管理器
內存池表示Java VM管理的內存區域。Java VM至少有一個內存池,它可能會在執行期間創建或刪除內存池。內存池可以屬於堆內存或非堆內存。
內存管理器管理一個或多個內存池。垃圾回收器是一種內存管理器,負責回收不可到達的對象使用的內存。Java VM可能具有一個或多個內存管理器。它可以在執行期間添加或刪除內存管理器。內存池可以由多個內存管理器管理。
- 垃圾回收
它們創建許多壽命較短的對象,例如迭代器和局部變數。
它們創建一些壽命很長的對象,例如高級持久對象。
- 線程
查找監視器死鎖線程:檢測對象監視器鎖上是否有任何線程死鎖。此操作返回死鎖線程指示的數組。
getThreadInfo:返回線程信息。這包括線程當前被阻止的名稱、堆棧跟蹤和監視器鎖(如果有)以及持有該鎖的線程以及線程爭用統計信息。
獲取ThreadCpu時間:返回給定線程消耗的 CPU 時間
class:顯示有關類載入器行為的統計信息。
compiler:顯示有關Java HotSpot VM實時編譯器行為的統計信息。
gc:顯示有關垃圾回收堆行為的統計信息。
gccapacity:顯示有關幾代人容量及其相應空間的統計信息。
gccause:顯示有關垃圾回收統計信息(與 相同)的摘要,以及最後和當前(如果適用)垃圾回收事件的原因。-gcutil
gcnew:顯示新一代行為的統計信息。
gcnewcapacity:顯示有關新一代大小及其相應空間的統計信息。
gcold:顯示有關舊一代和元空間統計信息行為的統計信息。
gcoldcapacity:顯示有關舊一代大小的統計信息。
gcmetacapacity:顯示有關元空間大小的統計信息。
gcutil:顯示有關垃圾回收統計信息的摘要。
printcompilation:顯示 Java 熱點 VM 編譯方法統計信息。
-nr當找不到現有的RMI注冊表時,不嘗試使用jstatd進程創建一個內部的RMI注冊表。
-p port在指定的埠查找RMI注冊表。如果沒有找到,並且沒有指定-nr選項,則在該埠自行創建一個內部的RMI注冊表。
-n rminameRMI注冊表中綁定的RMI遠程對象的名稱。默認的名稱為JStatRemoteHost。如果多個jstatd伺服器在同一主機上運行,你可以通過指定該選項來讓每個伺服器導出的RMI對象具有唯一的名稱。不管如何,這樣做需要將唯一的伺服器名稱包含進監控客戶端的hostid和vmid字元串中。
-Joption將選項參數傳遞給被javac調用的java啟動程序。例如,-J-Xms48m設置啟動內存為48 MB。使用-J將選項參數傳遞給執行Java應用程序的底層虛擬機,這是一種常見慣例。
pid對應jvm的進程id
executable core產生core mp文件
[server-id@]remote server IP or hostname遠程的ip或者hostname,server-id標記服務的唯一性id
no option輸出全部的參數和系統屬性
-flag name輸出對應名稱的參數
-flag [+|-]name開啟或者關閉對應名稱的參數
-flag name=value設定對應名稱的參數
-flags輸出全部的參數
-sysprops輸出系統屬性
- 注意:jinfo雖然可以在java程序運行時動態地修改虛擬機參數,但並不是所有的參數都支持動態修改
built-in變數
it -- 當前的迭代元素
index -- 當前迭代元素的索引
array -- 被迭代的數組
built-in變數
lhs -- 左邊元素
rhs -- 右邊元素
pid:目標進程的PID,進程編號,可以採用ps -ef | grep java查看java進程的PID;
executable:產生core mp的java可執行程序;
core:將被列印信息的core mp文件;
remote-hostname-or-IP:遠程debug服務的主機名或ip;
server-id:唯一id,假如一台主機上多個遠程debug服務;
jmap -mp:[live,]format=b,file= PID:使用hprof二進制形式,輸出jvm的heap內容到文件
jmap -finalizerinfo PID:列印正等候回收的對象的信息
jmap -heap PID:列印heap的概要信息,GC使用的演算法,heap(堆)的配置及JVM堆內存的使用情況。
jmap -histo:live PID:列印每個class的實例數目,內存佔用,類全名信息。VM的內部類名字開頭會加上前綴」*」. 如果live子參數加上後,只統計活的對象數量.
jmap -permstat PID:列印classload和jvm heap長久層的信息. 包含每個classloader的名字、活潑性、地址、父classloader和載入的class數量。另外,內部String的數量和佔用內存數也會列印出來。
-F強迫.在pid沒有相應的時候使用-mp或者-histo參數。在這個模式下,live子參數無效。
-h | -help列印輔助信息
-J傳遞參數給jmap啟動的jvm.
- jstack
-F強制mp線程堆棧信息. 用於進程hung住,jstack命令沒有響應的情況
-m同時列印java和本地(native)線程棧信息,m是mixed mode的簡寫
-l列印鎖的額外信
- 作者:楚瑞濤 https://blog.csdn.net/cong____cong/article/details/106349866
使用jsconsole hostName:portNum命令:hostName是運行應用程序的系統的名稱,portNum是您在啟動Java VM時啟用 JMX 代理時指定的埠號。
使用service:jmx::命令:使用 JMX 服務 URL 進行連接。
內容分析
將 JConsole 連接到應用程序後,JConsole 由六個選項卡組成。
顯示有關 CPU 使用情況、內存使用情況、線程計數和在Java VM中載入的類的圖形監視信息。
提供執行GC的操作,可以隨時點擊按鈕進行垃圾回收
Java VM管理兩種類型的內存:堆內存和非堆內存,這兩種內存都是在 Java VM 啟動時創建的。
內存池和內存管理器是Java VM內存系統的關鍵方面。
垃圾回收 (GC) 是Java VM釋放不再引用的對象佔用的內存的方式。通常認為具有活動引用為"活動"且未引用(或無法訪問)對象的對象為"已死"。垃圾回收是釋放死對象使用的內存的過程。GC 使用的演算法和參數對性能有顯著影響。
Java hotspot VM垃圾回收器使用代數 GC。生成 GC 利用大多數程序符合以下概括的觀察。
提供有關線程使用的信息。
顯示有關類載入的信息。
提供有關Java VM的信息。
以通用方式顯示有關在平台 MBean 伺服器注冊的所有 MBeans 的信息。MBeans 選項卡允許您訪問平台 MXBean 檢測的完整集,包括在其他選項卡中不可見的儀器。此外,您還可以使用 MBeans 選項卡監視和管理應用程序的 MBeans。
列出目標系統上已檢測的 Java 虛擬機 (JVM)。
監視 Java 虛擬機 (JVM) 統計信息。
對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控。
命令格式
jstat [-option] [PID]
option參數
1.jstat –class: 顯示載入class的數量,及所佔空間等信息。
2.jstat -compiler顯示VM實時編譯的數量等信息。
3.jstat -gc: 可以顯示gc的信息,查看gc的次數,及時間。
4.jstat -gccapacity:可以顯示,VM內存中三代(young,old,perm)對象的使用和佔用大小
5.jstat -gcutil:統計gc信息
6.jstat -gcnew:年輕代對象的信息。
7.jstat -gcnewcapacity: 年輕代對象的信息及其佔用量。
8.jstat -gcold:old代對象的信息。
9.jstat -gcoldcapacity: old代對象的信息及其佔用量。
10.jstat -gcpermcapacity: perm對象的信息及其佔用量。
11.jstat -printcompilation:當前VM執行的信息。
監視 Java 虛擬機 (JVM),並使遠程監視工具能夠連接到 JVM
命令格式
jstatd -[option]
option
使用方法
1.在jdk的bin目錄下創建文件jstatd.all.policy
2.寫入下面的安全配置
grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/lib/tools.jar" {
permission java.security.AllPermission;
#此處寫絕對路徑,主要是防止路徑錯誤問題,排查問題,應該寫成相對路徑
3.啟動jstatd
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=x.x.x.x &
4.使用jvisualvm工具遠程連接,進行監控
jvisualvm
VisualVM,能夠監控線程,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的).
同時他還提供很多插件可以自己安裝,是一款不錯的監控分析工具。
故障排除工具 JInfo
可以用來查看正在運行的 java 應用程序的擴展參數,包括Java System屬性和JVM命令行參數;也可以動態的修改正在運行的 JVM 一些參數。當系統崩潰時,jinfo可以從core文件裡面知道崩潰的Java應用程序的配置信息
命令格式
參數說明
option
Javacore 概述
Javacore,也可以稱為「threadmp」或是「javamp」,它是 Java 提供的一種診斷特性,能夠提供一份可讀的當前運行的 JVM 中線程使用情況的快照。即在某個特定時刻,JVM 中有哪些線程在運行,每個線程執行到哪一個類,哪一個方法。應用程序如果出現不可恢復的錯誤或是內存泄露,就會自動觸發 Javacore 的生成。
使用方法
1.jinfo pid:輸出當前 jvm 進程的全部參數和系統屬性
2.jinfo -flag name pid:輸出對應名稱的參數使用該命令,可以查看指定的 jvm 參數的值。如:查看當前 jvm 進程是否開啟列印 GC 日誌。
3.jinfo -flag [+|-]name pid:開啟或者關閉對應名稱的參數
使用 jinfo 可以在不重啟虛擬機的情況下,可以動態的修改 jvm 的參數。尤其在線上的環境特別有用。
4.jinfo -flag name=value pid:修改指定參數的值。
5.jinfo -flags pid:輸出全部的參數
6.jinfo -sysprops pid:輸出當前 jvm 進行的全部的系統屬性
jhat
主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言。
1.使用jmap命令導出堆文件jmap -mp:live,file=a.log pid
也可以使用下面方式導出堆文件
1、使用jconsole選項通過HotSpotDiagnosticMXBean從運行時獲得堆轉儲(生成mp文件)、
2、虛擬機啟動時如果指定了-XX:+HeapDumpOnOutOfMemoryError選項, 則在拋出OutOfMemoryError時, 會自動執行堆轉儲。
3、使用hprof命令
2.使用jhat分析堆文件jhat -J-Xmx512M a1.log
3.查看分析的html頁面
http://ip:7000/jhat中的OQL(對象查詢語言)
如果需要根據某些條件來過濾或查詢堆的對象,這是可能的,可以在jhat的html頁面中執行OQL,來查詢符合條件的對象
基本語法:
select
[from [instanceof] ]
[where ]
解釋:
(1)class name是java類的完全限定名,如:java.lang.String,java.util.ArrayList, C是char數組,java.io.File是java.io.File[]
(2)類的完全限定名不足以唯一的辨識一個類,因為不同的ClassLoader載入的相同的類,它們在jvm中是不同類型的
(3)instanceof表示也查詢某一個類的子類,如果不明確instanceof,則只精確查詢class name指定的類
(4)from和where子句都是可選的
(5)java域表示:obj.field_name;java數組表示:array[index]
舉例:
(1)查詢長度大於100的字元串
select s from java.lang.String s where s.count > 100
(2)查詢長度大於256的數組
select a from [I a where a.length > 256
(3)顯示匹配某一正則表達式的字元串
select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)顯示所有文件對象的文件路徑
select file.path.value.toString() from java.io.File file
(5)顯示所有ClassLoader的類名
select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)通過引用查詢對象
select o from instanceof 0xd404d404 o
built-in對象 -- heap
(1)heap.findClass(class name) -- 找到類
select heap.findClass("java.lang.String").superclass
(2)heap.findObject(object id) -- 找到對象
select heap.findObject("0xd404d404")
(3)heap.classes -- 所有類的枚舉
select heap.classes
(4)heap.objects -- 所有對象的枚舉
select heap.objects("java.lang.String")
(5)heap.finalizables -- 等待垃圾收集的java對象的枚舉
(6)heap.livepaths -- 某一對象存活路徑
select heaplivepaths(s) from java.lang.String s
(7)heap.roots -- 堆根集的枚舉
辨識對象的函數
(1)classof(class name) -- 返回java對象的類對象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) -- 返回是否兩個對象是同一個實例
select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)
(3)objectid(object) -- 返回對象的id
select objectid(s) from java.lang.String s
(4)reachables -- 返回可從對象可到達的對象
select reachables(p) from java.util.Properties p -- 查詢從Properties對象可到達的對象
select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查詢從URL對象可到達的對象,但不包括從URL.handler可到達的對象
(5)referrers(object) -- 返回引用某一對象的對象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) -- 返回某一對象引用的對象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) -- 返回是否第一個對象引用第二個對象
select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))
(8)root(object) -- 返回是否對象是根集的成員
select root(heap.findObject("0xd4d4d4d4"))
(9)sizeof(object) -- 返回對象的大小
select sizeof(o) from [I o
(10)toHtml(object) -- 返回對象的html格式
select "+ toHtml(o) + "" from java.lang.Object o
(11)選擇多值
select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t
數組、迭代器等函數
(1)concat(enumeration1,enumeration2) -- 將數組或枚舉進行連接
select concat(referrers(p),referrers(p)) from java.util.Properties p
(2)contains(array, expression) -- 數組中元素是否滿足某表達式
select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")
返回由java.lang.Class引用的java.util.Properties對象
(3)count(array, expression) -- 滿足某一條件的元素的數量
select count(heap.classes(), "/java.io./(it.name)")
(4)filter(array, expression) -- 過濾出滿足某一條件的元素
select filter(heap.classes(), "/java.io./(it.name)")
(5)length(array) -- 返回數組長度
select length(heap.classes())
(6)map(array,expression) -- 根據表達式對數組中的元素進行轉換映射
select map(heap.classes(),"index + '-->' + toHtml(it)")
(7)max(array,expression) -- 最大值, min(array,expression)
select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")
(8)sort(array,expression) -- 排序
select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')
(9)sum(array,expression) -- 求和
select sum(heap.objects('[C'),'sizeof(it)')
(10)toArray(array) -- 返回數組
(11)unique(array) -- 唯一化數組
jmap
列印進程、核心文件或遠程調試伺服器的共享對象內存映射或堆內存詳細信息。
jmap [option]
(to connect to running process) 連接到正在運行的進程
jmap [option]
(to connect to a core file) 連接到核心文件
jmap [option] [server_id@]
(to connect to remote debug server) 連接到遠程調試服務
option
使用方法
jstack命令主要用於調試java程序運行過程中的線程堆棧信息,可以用於檢測死鎖,進程耗用cpu過高報警問題的排查。jstack命令會列印出所有的線程,包括用戶自己啟動的線程和jvm後台線程。
命令格式
jstack -[option] pid
option
公眾號「Java精選」所發表內容註明來源的,版權歸原出處所有(無法查證版權的或者未註明出處的均來自網路,系轉載,轉載的目的在於傳遞更多信息,版權屬於原作者。如有侵權,請聯系,筆者會第一時間刪除處理!
最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復「加群」,即可入群!
(微信小程序):3000+道面試題,包含Java基礎、並發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計等,在線隨時刷題!
------ 特別推薦 ------
特別推薦:專注分享最前沿的技術與資訊,為彎道超車做好准備及各種開源項目與高效率軟體的公眾號,「大咖筆記」,專注挖掘好東西,非常值得大家關注。點擊下方公眾號卡片關注。
文章有幫助的話,在看,轉發吧!
G. 運維工程師需要掌握什麼技能
運維工程師需要掌握的技能:
1、首先是主機、網路及操作系統基本知識。在出現問題時,懂得在各個網路位置抓包,來確認故障設備或線路,會使用Linux的tcpmp抓包或者ethreal、sniffer、Wireshark等抓包軟體,會在網路設備上配置鏡像,將關心的流量抓出來進行分析。
2、懂開發,能實現自動化運維。比如使用Shell、Python、Perl等腳本語言做一些自動化運行腳本、診斷故障的腳本,使用這些腳本可以提升工作效率,將重復性的簡單工作交給腳本程序處理,也可以通過這些腳本判斷故障發生的位置和原因,高效的運維將不再需要人工去逐個字元地去輸入各種命令。
3、未來雲計算與大數據勢必成為整個互聯網行業的支撐。所有雲計算運維工程師以及大數據工程師的作用就越來與明顯,同時雲計算以及大數據相關高端人才的需求量也會越來越大。
H. kubernetes 編譯時 獲取 go包 失敗怎麼辦
如果編譯時程序出現了錯誤,可能是內存出現了問題,需要換個內存解決問題。
內存是電腦的記憶部件,用於存放電腦運行中的原始數據、中間結果以及指示電腦工作的程序。
內存可以分為隨機訪問存儲器和只讀存儲器,前者允許數據的讀取與寫入,磁碟中的程序必須被調入內存後才能運行,中央處理器可直接訪問內存,與內存交換數據。電腦斷電後,隨機訪問存儲器里的信息就會丟失。後者的信息只能讀出,不能隨意寫入,即使斷電也不會丟失。
由於電路的復雜性因素,電腦中都使用二進制數,只有0和1兩個數碼,逢二進一,最容易用電路來表達,比如0代表電路不通,1代表電路通暢。人們平時用電腦時感覺不到它是在用二進制計算是因為電腦會把人們輸入的信息自動轉換成二進制,算出的二進制數再轉換成人們能看到的信息顯示到屏幕上。
在存儲器中含有大量的基本單元,每個存儲單元可以存放八個二進制位,即一個零到二百五十五之間的整數、一個字母或一個標點符號等,叫做一個位元組。存儲器的容量就是以位元組為基本單位的,每個單元都有唯一的序號,叫做地址。中央處理器憑借地址,准確地操縱著每個單元,處理數據。由於位元組這個單位太小了,人們定義了幾個更大的單位,這些單位是以2的十次冪做進位,單位有KB、MB、GB、TB等。
常見的內存包括同步動態隨機存儲器、雙倍速率同步動態隨機存儲器、介面動態隨機存儲器。
I. 計算機編程入門應該學什麼語言
首先,對於題主這個問題,我想做個比喻,
你去餐館吃飯,可是你在糾結吃什麼菜,問身邊的人,大部分人給你說,大家都喜歡吃他家的蔥爆肉,說的食材多麼好,廚師多麼拿手,可是你不吃蔥,這道菜你依舊沒辦法享受。這個例子我想表達的意思就是,都應該是選擇一個我們喜歡吃的食材,做出來的菜,才合胃口,就是吃飽了都還可以再吃兩口的那種,如果聽大家的,不和胃口,你就是吃兩口就飽了,豈不是浪費掉了。
選擇學習編程也是一個道理,都應該先去了解各個編程語言的信息,它的就業方向,它能做些什麼,找到一個你比較感興趣的方向,然後根據興趣學習就好,這樣既不會浪費時間成本,也可以讓自己學習的動力更大。
首先我們先了解一下各個語言之間的層級關系
黑馬程序員
硬體層級:就是CPU、內存、顯卡等,不屬於軟體范疇
匯編層級:可讀性差,但是現在有編譯器哈,所以市場匯編語言的工程師需求變數是很少的。高級語言需求量增大了。因為高級語言很好讀;
系統層級:Windows、Linux、Mac、OS、Andriod、IOS等等。就是電腦軟體都是跑在操作系統上的。
應用層級:是更加偏重軟體的程序的執行流程和功能的。開發起來體量非常大。
腳本層級:這裡面不涉及樓主上面說的四種語言,我就是略說一下。腳本級語言的代碼很直給的,代碼速度快。但是雖然可讀性強,但是編譯器把腳本語言翻譯成匯編語言的成本很大。
各大語言的簡單介紹和應用
1.Java(排名第一)
Java功能強大,簡單易用。具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。由於其語言特性好,框架豐富,常常被應用於企業中,你可能經常會聽到一些關於J2EE,Hibernate等的討論。而且,現如今的安卓手機的標准編程語言也是Java。
**總結**
Java主要用於企業級開發, 安卓手機, 網頁,游戲後台。
2.C和C++(永不過時,越老越吃香)
就可以用於任何開發,效率可以說是所有編程語言里最高的。排除你系統里沒有C/C++編譯器的情況。一般的系統里C一般都具備,但是可能有些是沒有C++編譯器的。
目前,C語言主要用來服務應用,開發底層模塊和嵌入式。盡管C++也可以,但是由於其復雜性,程序員更多的是選擇C語言來做。C++適合一些復雜但又要求高效率的,比如大型游戲等等。
**總結**
C主要用於服務應用,開發底層模塊和嵌入式。
C++主要用於大型游戲開發和一些規模大、性能高的程序開發。
3.JavaScript(凡是能用js編寫的程序,終將使用js編寫)
java VS JS
雷鋒VS雷峰塔
外行人可能覺得Javascript聽起來跟Java有關,實則沒有任何聯系。
毫無疑問,Javascript最廣泛的是在web前端。通俗的說,當網站傳送一些用各種「標簽」代表的格式文檔時後,Javascript負責把這些文檔「轉化」成一些客戶端動態效果。除此之外,Node.JS還用於開發伺服器端。
> nodejs是js的升級版,基於google v8引擎開發的後端語言,可以寫伺服器
**總結**
JavaScript主要做web前端以及伺服器端開發。
4.PHP(最好的語言,份額被go搶)
PHP是一種通用開源腳本語言,語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,,主要適用於Web開發領域,PHP是web後端的王者。
**總結**
PHP主要用於Web開發,後端較多,也可以用於整個web伺服器,比如論壇引擎。
前端(網頁waiter) ---請求--> 處理(伺服器Server) ---》 返回給頁面
5.Python
Python語法簡潔清晰,具有比較豐富和強大的庫,而由於它可以把用其他語言製作的模塊輕松地聯結在一起,又稱其為膠水語言。
IEEE發布2017年編程語言排行榜:Python位居首位。應用比較廣泛,像信息安全、物聯網開發、桌面應用、大數據處理都需要用python。
**總結**
Python主要用於伺服器、物聯網開發,大數據處理等。
6.go
值得一學:
開發速度,執行效率,從高到低: c> go > python
go語言所有執行需要的庫都打包在一個exe中,編譯好的exe程序,直接在第三方系統就可以運行
GUI:圖形化
GUI
難度,從難道易:c > go > pthon
> docker, k8s,區塊鏈
推薦學習思路:
找到喜歡的應用領域--->明確學習目的--->找到重點學習內容--->看視頻學習
有了一定的基礎之後:
找到項目--->按照源碼看思路--->深入理解--->抄源碼--->不看源碼自己還原
在進階之後的提升:
找到帶源碼的項目--->不要再抄源碼而是在項目基礎上實現自己的新增功能--->看書優化代碼
因為不知道題主要學習什麼編程語言,所以暫時思路就是這樣的。當明確自己要學習的內容之後,可以自己做或者找到合適自己的學習路線圖,按照自己的未來發展方向找到學習內容的重點開始學習。
J. 運維需要學什麼
運維工程師一般有系統運維、網路運維、運維開發、資料庫運維、雲運維等方向,今天主要介紹系統運維工程師所需要具備的一些技能和考證方面。
系統運維工程師必備技能
系統運維工程師不僅需要有Linux基本操作技能,還應該會伺服器硬體、以及企業里常用的雙機集群、Windows、VMware、資料庫等技能,這樣才能有擔任合格的系統運維工程師。
需要特別注意企業里物理機都是用雙機集群,一定要掌握雙機集群的技能,包括Linux雙機集群、Windows雙機集群、Oracle Rac資料庫集群、SQL Server資料庫集群等。