主頁 > 軟體設計 > 一文看懂Linux內核!Linux內核架構和作業原理詳解

一文看懂Linux內核!Linux內核架構和作業原理詳解

2021-01-30 10:32:42 軟體設計

linux內核相關視頻決議:

5個方面分析linux內核架構,讓你對內核不再陌生
90分鐘了解Linux記憶體架構,numa的優勢,slab的實作,vmalloc的原理
手把手帶你實作一個Linux內核檔案系統

簡介

作用是將應用層序的請求傳遞給硬體,并充當底層驅動程式,對系統中的各種設備和組件進行尋址,目前支持模塊的動態裝卸(裁剪),Linux內核就是基于這個策略實作的,Linux行程1.采用層次結構,每個行程都依賴于一個父行程,內核啟動init程式作為第一個行程,該行程負責進一步的系統初始化操作,init行程是行程樹的根,所有的行程都直接或者間接起源于該行程,virt/ ---- 提供虛擬機技術的支持,

Linux內核預備作業

理解Linux內核最好預備的知識點:

懂C語言
懂一點作業系統的知識
熟悉少量相關演算法
懂計算機體系結構

Linux內核的特點:

結合了unix作業系統的一些基礎概念

在這里插入圖片描述

Linux內核的任務:

1.從技術層面講,內核是硬體與軟體之間的一個中間層,作用是將應用層序的請求傳遞給硬體,并充當底層驅動程式,對系統中的各種設備和組件進行尋址,

2.從應用程式的層面講,應用程式與硬體沒有聯系,只與內核有聯系,內核是應用程式知道的層次中的最底層,在實際作業中內核抽象了相關細節,

3.內核是一個資源管理程式,負責將可用的共享資源(CPU時間、磁盤空間、網路連接等)分配得到各個系統行程,

4.內核就像一個庫,提供了一組面向系統的命令,系統呼叫對于應用程式來說,就像呼叫普通函式一樣,

內核實作策略:

1.微內核,最基本的功能由中央內核(微內核)實作,所有其他的功能都委托給一些獨立行程,這些行程通過明確定義的通信介面與中心內核通信,

2.宏內核,內核的所有代碼,包括子系統(如記憶體管理、檔案管理、設備驅動程式)都打包到一個檔案中,內核中的每一個函式都可以訪問到內核中所有其他部分,目前支持模塊的動態裝卸(裁剪),Linux內核就是基于這個策略實作的,

哪些地方用到了內核機制?

1.行程(在cpu的虛擬記憶體中分配地址空間,各個行程的地址空間完全獨立;同時執行的行程數最多不超過cpu數目)之間進行通 信,需要使用特定的內核機制,

2.行程間切換(同時執行的行程數最多不超過cpu數目),也需要用到內核機制,

行程切換也需要像FreeRTOS任務切換一樣保存狀態,并將行程置于閑置狀態/恢復狀態,

3.行程的調度,確認哪個行程運行多長的時間,

Linux行程

1.采用層次結構,每個行程都依賴于一個父行程,內核啟動init程式作為第一個行程,該行程負責進一步的系統初始化操作,init行程是行程樹的根,所有的行程都直接或者間接起源于該行程,

2.通過pstree命令查詢,實際上得系統第一個行程是systemd,而不是init(這也是疑問點)

3.系統中每一個行程都有一個唯一識別符號(ID),用戶(或其他行程)可以使用ID來訪問行程,

Linux內核源代碼的目錄結構

Linux內核源代碼包括三個主要部分:

內核核心代碼,包括第3章所描述的各個子系統和子模塊,以及其它的支撐子系統,例如電源管理、Linux初始化等

其它非核心代碼,例如庫檔案(因為Linux內核是一個自包含的內核,即內核不依賴其它的任何軟體,自己就可以編譯通過)、韌體集合、KVM(虛擬機技術)等

編譯腳本、組態檔、幫助檔案、著作權說明等輔助性檔案

使用ls命令看到的內核源代碼的頂層目錄結構,具體描述如下,

include/ ---- 內核頭檔案,需要提供給外部模塊(例如用戶空間代碼)使用,

kernel/ ---- Linux內核的核心代碼,包含了3.2小節所描述的行程調度子系統,以及和行程調度相關的模塊,

mm/ ---- 記憶體管理子系統(3.3小節),

fs/ ---- VFS子系統(3.4小節),

net/ ---- 不包括網路設備驅動的網路子系統(3.5小節),

ipc/ ---- IPC(行程間通信)子系統,

arch// ---- 體系結構相關的代碼,例如arm, x86等等,
arch//mach- ---- 具體的machine/board相關的代碼,
arch//include/asm ---- 體系結構相關的頭檔案,
arch//boot/dts ---- 設備樹(Device Tree)檔案,

init/ ---- Linux系統啟動初始化相關的代碼,
block/ ---- 提供塊設備的層次,
sound/ ---- 音頻相關的驅動及子系統,可以看作“音頻子系統”,
drivers/ ---- 設備驅動(在Linux kernel 3.10中,設備驅動占了49.4的代碼量),

lib/ ---- 實作需要在內核中使用的庫函式,例如CRC、FIFO、list、MD5等,
crypto/ ----- 加密、解密相關的庫函式,
security/ ---- 提供安全特性(SELinux),
virt/ ---- 提供虛擬機技術(KVM等)的支持,
usr/ ---- 用于生成initramfs的代碼,
firmware/ ---- 保存用于驅動第三方設備的韌體,

samples/ ---- 一些示例代碼,
tools/ ---- 一些常用工具,如性能剖析、自測驗等,

Kconfig, Kbuild, Makefile, scripts/ ---- 用于內核編譯的組態檔、腳本等,

COPYING ---- 著作權宣告,
MAINTAINERS ----維護者名單,
CREDITS ---- Linux主要的貢獻者名單,
REPORTING-BUGS ---- Bug上報的指南,

Documentation, README ---- 幫助、說明檔案,

【文章福利】需要C/C++ Linux服務器架構師學習資料加群812855908(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等)
在這里插入圖片描述

Linux內核體系結構簡析簡析

在這里插入圖片描述

圖1 Linux系統層次結構

最上面是用戶(或應用程式)空間,這是用戶應用程式執行的地方,用戶空間之下是內核空間,Linux 內核正是位于這里,GNU C Library (glibc)也在這里,它提供了連接內核的系統呼叫介面,還提供了在用戶空間應用程式和內核之間進行轉換的機制,這點非常重要,因為內核和用戶空間的應用程式使用的是不同的保護地址空間,每個用戶空間的行程都使用自己的虛擬地址空間,而內核則占用單獨的地址空間,

Linux 內核可以進一步劃分成 3 層,最上面是系統呼叫介面,它實作了一些基本的功能,例如 read 和 write,系統呼叫介面之下是內核代碼,可以更精確地定義為獨立于體系結構的內核代碼,這些代碼是 Linux 所支持的所有處理器體系結構所通用的,在這些代碼之下是依賴于體系結構的代碼,構成了通常稱為 BSP(Board Support Package)的部分,這些代碼用作給定體系結構的處理器和特定于平臺的代碼,

Linux 內核實作了很多重要的體系結構屬性,在或高或低的層次上,內核被劃分為多個子系統,Linux 也可以看作是一個整體,因為它會將所有這些基本服務都集成到內核中,這與微內核的體系結構不同,后者會提供一些基本的服務,例如通信、I/O、記憶體和行程管理,更具體的服務都是插入到微內核層中的,每種內核都有自己的優點,不過這里并不對此進行討論,

隨著時間的流逝,Linux 內核在記憶體和 CPU 使用方面具有較高的效率,并且非常穩定,但是對于 Linux 來說,最為有趣的是在這種大小和復雜性的前提下,依然具有良好的可移植性,Linux 編譯后可在大量處理器和具有不同體系結構約束和需求的平臺上運行,一個例子是 Linux 可以在一個具有記憶體管理單元(MMU)的處理器上運行,也可以在那些不提供 MMU 的處理器上運行,

Linux 內核的 uClinux 移植提供了對非 MMU 的支持,

圖2是Linux內核的體系結構
在這里插入圖片描述

圖2 Linux內核體系結構

Linux內核的主要組件有:系統呼叫介面、行程管理、記憶體管理、虛擬檔案系統、網路堆疊、設備驅動程式、硬體架構的相關代碼,

(1)系統呼叫介面
SCI 層提供了某些機制執行從用戶空間到內核的函式呼叫,正如前面討論的一樣,這個介面依賴于體系結構,甚至在相同的處理器家族內也是如此,SCI 實際上是一個非常有用的函式呼叫多路復用和多路分解服務,在 ./linux/kernel 中您可以找到 SCI 的實作,并在 ./linux/arch 中找到依賴于體系結構的部分,

(2)行程管理
行程管理的重點是行程的執行,在內核中,這些行程稱為執行緒,代表了單獨的處理器虛擬化(執行緒代碼、資料、堆疊和 CPU 暫存器),在用戶空間,通常使用行程 這個術語,不過 Linux 實作并沒有區分這兩個概念(行程和執行緒),內核通過 SCI 提供了一個應用程式編程介面(API)來創建一個新行程(fork、exec 或 Portable Operating System Interface [POSIX] 函式),停止行程(kill、exit),并在它們之間進行通信和同步(signal 或者 POSIX 機制),

行程管理還包括處理活動行程之間共享 CPU 的需求,內核實作了一種新型的調度演算法,不管有多少個執行緒在競爭 CPU,這種演算法都可以在固定時間內進行操作,這種演算法就稱為 O(1) 調度程式,這個名字就表示它調度多個執行緒所使用的時間和調度一個執行緒所使用的時間是相同的,O(1) 調度程式也可以支持多處理器(稱為對稱多處理器或 SMP),您可以在 ./linux/kernel 中找到行程管理的源代碼,在 ./linux/arch 中可以找到依賴于體系結構的源代碼,

(3)記憶體管理
內核所管理的另外一個重要資源是記憶體,為了提高效率,如果由硬體管理虛擬記憶體,記憶體是按照所謂的記憶體頁 方式進行管理的(對于大部分體系結構來說都是 4KB),Linux 包括了管理可用記憶體的方式,以及物理和虛擬映射所使用的硬體機制,不過記憶體管理要管理的可不止 4KB 緩沖區,Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器,這種記憶體管理模式使用 4KB 緩沖區為基數,然后從中分配結構,并跟蹤記憶體頁使用情況,比如哪些記憶體頁是滿的,哪些頁面沒有完全使用,哪些頁面為空,這樣就允許該模式根據系統需要來動態調整記憶體使用,為了支持多個用戶使用記憶體,有時會出現可用記憶體被消耗光的情況,由于這個原因,頁面可以移出記憶體并放入磁盤中,這個程序稱為交換,因為頁面會被從記憶體交換到硬碟上,記憶體管理的源代碼可以在 ./linux/mm 中找到,

(4)虛擬檔案系統
虛擬檔案系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為檔案系統提供了一個通用的介面抽象,VFS 在 SCI 和內核所支持的檔案系統之間提供了一個交換層(請參看圖4),
在這里插入圖片描述

圖3 Linux檔案系統層次結構

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函式的一個通用 API 抽象,在 VFS 下面是檔案系統抽象,它定義了上層函式的實作方式,它們是給定檔案系統(超過 50 個)的插件,檔案系統的源代碼可以在 ./linux/fs 中找到,檔案系統層之下是緩沖區快取,它為檔案系統層提供了一個通用函式集(與具體檔案系統無關),這個快取層通過將資料保留一段時間(或者隨即預先讀取資料以便在需要是就可用)優化了對物理設備的訪問,緩沖區快取之下是設備驅動程式,它實作了特定物理設備的介面,

(5)網路堆疊
網路堆疊在設計上遵循模擬協議本身的分層體系結構,回想一下,Internet Protocol (IP) 是傳輸協議(通常稱為傳輸控制協議或 TCP)下面的核心網路層協議,TCP 上面是 socket 層,它是通過 SCI 進行呼叫的,socket 層是網路子系統的標準 API,它為各種網路協議提供了一個用戶介面,從原始幀訪問到 IP 協議資料單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標準化的方法來管理連接,并在各個終點之間移動資料,內核中網路源代碼可以在 ./linux/net 中找到,

(6)設備驅動程式
Linux 內核中有大量代碼都在設備驅動程式中,它們能夠運轉特定的硬體設備,Linux 原始碼樹提供了一個驅動程式子目錄,這個目錄又進一步劃分為各種支持設備,例如 Bluetooth、I2C、serial 等,設備驅動程式的代碼可以在 ./linux/drivers 中找到,

(7)依賴體系結構的代碼
盡管 Linux 很大程度上獨立于所運行的體系結構,但是有些元素則必須考慮體系結構才能正常操作并實作更高效率,./linux/arch 子目錄定義了內核源代碼中依賴于體系結構的部分,其中包含了各種特定于體系結構的子目錄(共同組成了 BSP),對于一個典型的桌面系統來說,使用的是 x86 目錄,每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都關注內核中的一個特定方面,例如引導、內核、記憶體管理等,這些依賴體系結構的代碼可以在 ./linux/arch 中找到,

如果 Linux 內核的可移植性和效率還不夠好,Linux 還提供了其他一些特性,它們無法劃分到上面的分類中,作為一個生產作業系統和開源軟體,Linux 是測驗新協議及其增強的良好平臺,Linux 支持大量網路協議,包括典型的 TCP/IP,以及高速網路的擴展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE),Linux 也可以支持諸如流控制傳輸協議(SCTP)之類的協議,它提供了很多比 TCP 更高級的特性(是傳輸層協議的接替者),

Linux 還是一個動態內核,支持動態添加或洗掉軟體組件,被稱為動態可加載內核模塊,它們可以在引導時根據需要(當前特定設備需要這個模塊)或在任何時候由用戶插入,

Linux 最新的一個增強是可以用作其他作業系統的作業系統(稱為系統管理程式),最近,對內核進行了修改,稱為基于內核的虛擬機(KVM),這個修改為用戶空間啟用了一個新的介面,它可以允許其他作業系統在啟用了 KVM 的內核之上運行,除了運行 Linux 的其他實體之外, Microsoft Windows也可以進行虛擬化,惟一的限制是底層處理器必須支持新的虛擬化指令,

Linux體系結構和內核結構區別

1.當被問到Linux體系結構(就是Linux系統是怎么構成的)時,我們可以參照下圖這么回答:從大的方面講,Linux體系結構可以分為兩塊:

(1)用戶空間:用戶空間中又包含了,用戶的應用程式,C庫

(2)內核空間:內核空間包括,系統呼叫,內核,以及與平臺架構相關的代碼

在這里插入圖片描述

2.Linux體系結構要分成用戶空間和內核空間的原因:

1)現代CPU通常都實作了不同的作業模式,

以ARM為例:ARM實作了7種作業模式,不同模式下CPU可以執行的指令或者訪問的暫存器不同:

(1)用戶模式 usr

(2)系統模式 sys

(3)管理模式 svc

(4)快速中斷 fiq

(5)外部中斷 irq

(6)資料訪問終止 abt

(7)未定義指令例外

以(2)X86為例:X86實作了4個不同級別的權限,Ring0—Ring3 ;Ring0下可以執行特權指令,可以訪問IO設備;Ring3則有很多的限制

2)所以,Linux從CPU的角度出發,為了保護內核的安全,把系統分成了2部分;

3.用戶空間和內核空間是程式執行的兩種不同狀態,我們可以通過“系統呼叫”和“硬體中斷“來完成用戶空間到內核空間的轉移

4.Linux的內核結構(注意區分LInux體系結構和Linux內核結構)
在這里插入圖片描述

Linux驅動的platform機制

Linux的這種platform driver機制和傳統的device_driver機制相比,一個十分明顯的優勢在于platform機制將本身的資源注冊進內核,由內核統一管理,在驅動程式中使用這些資源時通過platform_device提供的標準介面進行申請并使用,這樣提高了驅動和資源管理的獨立性,并且擁有較好的可移植性和安全性,下面是SPI驅動層次示意圖,Linux中的SPI總線可理解為SPI控制器引出的總線:
在這里插入圖片描述

和傳統的驅動一樣,platform機制也分為三個步驟:

1、總線注冊階段:
內核啟動初始化時的main.c檔案中的kernel_init()→do_basic_setup()→driver_init()→platform_bus_init()→bus_register(&platform_bus_type),注冊了一條platform總線(虛擬總線,platform_bus),

2、添加設備階段:
設備注冊的時候Platform_device_register()→platform_device_add()→(pdev→dev.bus = &platform_bus_type)→device_add(),就這樣把設備給掛到虛擬的總線上,

3、驅動注冊階段:
Platform_driver_register()→driver_register()→bus_add_driver()→driver_attach()→bus_for_each_dev(), 對在每個掛在虛擬的platform bus的設備作__driver_attach()→driver_probe_device(),判斷drv→bus→match()是否執行成功,此時通過指標執行platform_match→strncmp(pdev→name , drv→name , BUS_ID_SIZE),如果相符就呼叫really_probe(實際就是執行相應設備的platform_driver→probe(platform_device),)開始真正的探測,如果probe成功,則系結設備到該驅動,

從上面可以看出,platform機制最后還是呼叫了bus_register() , device_add() , driver_register()這三個關鍵的函式,

下面看幾個結構體:

struct platform_device           
(/include/linux/Platform_device.h)
{        
const char    * name;        
int        id;        
struct device    dev;        
u32        num_resources;        
struct resource    * resource;
};

Platform_device結構體描述了一個platform結構的設備,在其中包含了一般設備的結構體struct device dev;設備的資源結構體struct resource * resource;還有設備的名字const char * name,(注意,這個名字一定要和后面platform_driver.driver àname相同,原因會在后面說明,)

該結構體中最重要的就是resource結構,這也是之所以引入platform機制的原因,

struct resource                            
( /include/linux/ioport.h)
{        
resource_size_t start;        
resource_size_t end;        
const char *name;        
unsigned long flags;        
struct resource *parent, *sibling, *child;
};

其中 flags位表示該資源的型別,start和end分別表示該資源的起始地址和結束地址(/include/linux/Platform_device.h):

struct platform_driver              
{        
int (*probe)(struct platform_device *);        
int (*remove)(struct platform_device *);        
void (*shutdown)(struct platform_device *);        
int (*suspend)(struct platform_device *, pm_message_t state);        
int (*suspend_late)(struct platform_device *, pm_message_t state);        
int (*resume_early)(struct platform_device *);        
int (*resume)(struct platform_device *);        
struct device_driver driver;
};

Platform_driver結構體描述了一個platform結構的驅動,其中除了一些函式指標外,還有一個一般驅動的device_driver結構,
名字要一致的原因:

上面說的驅動在注冊的時候會呼叫函式bus_for_each_dev(), 對在每個掛在虛擬的platform bus的設備作__driver_attach()→driver_probe_device(),在此函式中會對dev和drv做初步的匹配,呼叫的是drv->bus->match所指向的函式,platform_driver_register函式中drv->driver.bus = &platform_bus_type,所以drv->bus->match就為platform_bus_type→match,為platform_match函式,該函式如下:

static int platform_match(struct device * dev, struct device_driver * drv)   
{       
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
}

是比較dev和drv的name,相同則會進入really_probe()函式,從而進入自己寫的probe函式做進一步的匹配,所以dev→name和driver→drv→name在初始化時一定要填一樣的,

不同型別的驅動,其match函式是不一樣的,這個platform的驅動,比較的是dev和drv的名字,還記得usb類驅動里的match嗎?它比較的是Product ID和Vendor ID,

個人總結Platform機制的好處:

1、提供platform_bus_type型別的總線,把那些不是總線型的soc設備都添加到這條虛擬總線上,使得,總線——設備——驅動的模式可以得到普及,

2、提供platform_device和platform_driver型別的資料結構,將傳統的device和driver資料結構嵌入其中,并且加入resource成員,以便于和Open Firmware這種動態傳遞設備資源的新型bootloader和kernel 接軌,

Linux內核體系結構

因為Linux內核是單片的,所以它比其他型別的內核占用空間最大,復雜度也最高,這是一個設計特性,在Linux早期引起了相當多的爭論,并且仍然帶有一些與單內核固有的相同的設計缺陷,

在這里插入圖片描述

為了解決這些缺陷,Linux內核開發人員所做的一件事就是使內核模塊可以在運行時加載和卸載,這意味著您可以動態地添加或洗掉內核的特性,這不僅可以向內核添加硬體功能,還可以包括運行服務器行程的模塊,比如低級別虛擬化,但也可以替換整個內核,而不需要在某些情況下重啟計算機,
想象一下,如果您可以升級到Windows服務包,而不需要重新啟動……

內核模塊

如果Windows已經安裝了所有可用的驅動程式,而您只需要打開所需的驅動程式怎么辦?這本質上就是內核模塊為Linux所做的,內核模塊,也稱為可加載內核模塊(LKM),對于保持內核在不消耗所有可用記憶體的情況下與所有硬體一起作業是必不可少的,
在這里插入圖片描述

模塊通常向基本內核添加設備、檔案系統和系統呼叫等功能,lkm的檔案擴展名是.ko,通常存盤在/lib/modules目錄中,由于模塊的特性,您可以通過在啟動時使用menuconfig命令將模塊設定為load或not load,或者通過編輯/boot/config檔案,或者使用modprobe命令動態地加載和卸載模塊,輕松定制內核,

第三方和封閉原始碼模塊在一些發行版中是可用的,比如Ubuntu,默認情況下可能無法安裝,因為這些模塊的源代碼是不可用的,該軟體的開發人員(即nVidia、ATI等)不提供源代碼,而是構建自己的模塊并編譯所需的.ko檔案以便分發,雖然這些模塊像beer一樣是免費的,但它們不像speech那樣是免費的,因此不包括在一些發行版中,因為維護人員認為它通過提供非免費軟體“污染”了內核,

內核并不神奇,但對于任何正常運行的計算機來說,它都是必不可少的,Linux內核不同于OS X和Windows,因為它包含內核級別的驅動程式,并使許多東西“開箱即用”,希望您能對軟體和硬體如何協同作業以及啟動計算機所需的檔案有更多的了解,
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/254433.html

標籤:其他

上一篇:陽關林場的前世今生:結合鎖眼衛星(Keyhole[KH])發掘“陽關林場”55年來的變化

下一篇:CF1478C. Nezzar and Symmetric Array(偽)題解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more