科研和工程中的編程概述_第1頁
科研和工程中的編程概述_第2頁
科研和工程中的編程概述_第3頁
科研和工程中的編程概述_第4頁
科研和工程中的編程概述_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、科研和工程中的編程概述第1頁,共19頁。課程任務(wù)v掌握編程目的和意義v了解代碼編寫和優(yōu)化的技巧v掌握科研工程的問題建模方法和步驟v掌握面向空間的設(shè)計(jì)方法v掌握面向時(shí)間的設(shè)計(jì)方法v實(shí)踐各種設(shè)計(jì)方法第2頁,共19頁。編程目的和意義v目的:用計(jì)算機(jī)程序完成科研和工程中的實(shí)際問題。v意義:和計(jì)算機(jī)對話,以看到需要的計(jì)算結(jié)果。v主要平臺:通用編程:windows Linux UNIX各版本 macOS其他:各種嵌入式操作系統(tǒng)第3頁,共19頁。代碼的主要目標(biāo)形式v桌面程序(科研和工程問題解決的主要方式)windowsLinux界面程序(UI)一般進(jìn)程調(diào)用界面庫控制臺程序(console) 一般進(jìn)程服務(wù)程序

2、(service)守護(hù)進(jìn)程第4頁,共19頁。代碼的主要目標(biāo)形式v腳本程序以一個(gè)特定的桌面程序?yàn)樗拗髌脚_,一般解釋執(zhí)行,主要有:(1)web應(yīng)用程序(服務(wù)器端腳本,客戶端在瀏覽器中運(yùn)行的各種腳本程序)(2)辦公軟件(word, excel之VBA,SQLServer中存儲過程等)(3)科學(xué)計(jì)算程序(matlab, mathematic, mathCAD, AutoCAD, 3DMax, Photoshop等)(4)游戲動(dòng)畫(3D游戲引擎下的如lua等腳本)第5頁,共19頁。代碼的主要目標(biāo)形式v程序代碼最終生成模塊(Module),在C#中稱為裝配件(Assembly)v進(jìn)程(Process)是操

3、作系統(tǒng)多任務(wù)并發(fā)執(zhí)行的一個(gè)基本單位,在進(jìn)程下還可以創(chuàng)建線程(Thread),作為多任務(wù)并發(fā)執(zhí)行的補(bǔ)充。Windows以線程為基本調(diào)度單位,Linux以進(jìn)程為基本調(diào)度單位。v操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程時(shí),會裝入所需模塊,并執(zhí)行其中的代碼。v后續(xù)課程操作系統(tǒng)會詳述。第6頁,共19頁。代碼的主要目標(biāo)形式v進(jìn)程中模塊的分類WindowsLinux可執(zhí)行模塊exe (自身代碼引用的地址全部已確定)可執(zhí)行模塊(同左)動(dòng)態(tài)鏈接模塊DLL(自身代碼引用地址為浮動(dòng)地址,必要時(shí)需要重定位)共享庫模塊SO.X(同左)驅(qū)動(dòng)程序模塊SYS或其他,運(yùn)行在核心態(tài)/用戶態(tài)驅(qū)動(dòng)程序模塊,運(yùn)行在核心態(tài)/用戶態(tài)第7頁,共19頁。代碼的主

4、要目標(biāo)形式v進(jìn)程擁有自己的獨(dú)立編址的內(nèi)存空間(稱為虛擬內(nèi)存空間),在32位操作系統(tǒng)下最大達(dá)4G,在64位操作系統(tǒng)下更大。進(jìn)程的虛擬內(nèi)存空間按多個(gè)固定大小的內(nèi)存頁面來組織,分為可交換頁和非可交換頁兩種,模塊的代碼和數(shù)據(jù)就是映射到這些頁面上,由操作系統(tǒng)根據(jù)需要調(diào)入物理內(nèi)存來執(zhí)行。操作系統(tǒng)直接把進(jìn)程空間的高地址部分映射到已經(jīng)裝載了驅(qū)動(dòng)模塊的那些系統(tǒng)的內(nèi)存頁面上。第8頁,共19頁。代碼的主要目標(biāo)形式v操作系統(tǒng)根據(jù)用戶的要求為一個(gè)可執(zhí)行模塊創(chuàng)建一個(gè)進(jìn)程,同時(shí)根據(jù)可執(zhí)行模塊文件內(nèi)的信息裝載它所依賴的動(dòng)態(tài)模塊(同樣動(dòng)態(tài)模塊要是依賴其它動(dòng)態(tài)模塊就遞歸地依次裝入)。當(dāng)然也可以在程序內(nèi)用API函數(shù)動(dòng)態(tài)地裝載模塊。

5、動(dòng)態(tài)模塊內(nèi)的函數(shù)地址被重新定位,使得其他各種類型的模塊能調(diào)用它們。具體動(dòng)態(tài)鏈接的過程可看參考書Linker and loader。第9頁,共19頁。代碼的主要目標(biāo)形式v模塊的組成(1)機(jī)器代碼(2)已初始化全局?jǐn)?shù)據(jù)(如全局變量)(3)未初始化全局?jǐn)?shù)據(jù)(如方法/函數(shù)內(nèi)的靜態(tài)局部變量)(4)資源(windows下DLL內(nèi),可看作特殊全局?jǐn)?shù)據(jù))(5)模塊信息(各種信息及導(dǎo)入/導(dǎo)出函數(shù)表)第10頁,共19頁。代碼的主要目標(biāo)形式v一個(gè)進(jìn)程內(nèi)含有一個(gè)可執(zhí)行模塊(指含主入口的exe模塊,也會有其他exe模塊被動(dòng)態(tài)裝載,此時(shí)都算作動(dòng)態(tài)模塊)和多個(gè)動(dòng)態(tài)模塊(不討論驅(qū)動(dòng)模塊)。v動(dòng)態(tài)鏈接庫可以做到機(jī)器代碼在不同的

6、進(jìn)程間共享,而全局性數(shù)據(jù)則為每個(gè)進(jìn)程復(fù)制一份獨(dú)立的拷貝 (有特殊設(shè)置可以讓全局性數(shù)據(jù)在不同的進(jìn)程間共享,但一般不這樣作,而用共享內(nèi)存方法來取代),所以動(dòng)態(tài)庫是二進(jìn)制級別的代碼復(fù)用方法。vC+程序(類、函數(shù)等)則是源代碼級別的代碼復(fù)用方法。顯然源代碼若修改了整個(gè)軟件要重新編譯*。第11頁,共19頁。代碼的主要目標(biāo)形式v操作系統(tǒng)如果裝載了一個(gè)可執(zhí)行模塊的多個(gè)實(shí)例,即多個(gè)進(jìn)程都裝載了同一個(gè)exe模塊和其依賴的動(dòng)態(tài)模塊,那么該可執(zhí)行模塊的機(jī)器代碼頁同樣可以被多個(gè)進(jìn)程共享,全局性數(shù)據(jù)自然是每個(gè)進(jìn)程有一份自己的拷貝。v編寫大型工程/算法軟件需要進(jìn)行模塊的分劃和設(shè)計(jì)。第12頁,共19頁。編寫代碼的一個(gè)考慮v

7、全局變量、類的靜態(tài)成員變量、方法/函數(shù)內(nèi)的靜態(tài)局部變量(線程局部存儲變量除外)都會在模塊內(nèi)有自己唯一的一個(gè)地址。如果源代碼有這樣的變量,并在生成exe模塊或者多個(gè)dll模塊時(shí)被使用,那么進(jìn)程內(nèi)將有多份這樣的全局性變量。v如果算法設(shè)計(jì)中需要的一個(gè)全局性的變量是相對進(jìn)程來說是唯一的,就不能把含有該全局性的變量的代碼做成源代碼級別的共享的庫,而是做在一個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫內(nèi),再通過一系列函數(shù)來操作該變量。第13頁,共19頁。編寫代碼的一個(gè)考慮v由于一個(gè)進(jìn)程可以創(chuàng)建多個(gè)線程,而這些線程是可以并行訪問同一進(jìn)程空間內(nèi)的數(shù)據(jù)的,因此要注意對可能被多個(gè)線程訪問和修改的數(shù)據(jù)進(jìn)行同步保護(hù)。v前述的全局性的變量要特別

8、注意進(jìn)行多線程保護(hù),特別是方法/函數(shù)內(nèi)的靜態(tài)局部變量,它是在第一次被調(diào)用時(shí)初始化的,如果有多個(gè)線程同時(shí)調(diào)用該方法/函數(shù)而不注意保護(hù),可能造成該靜態(tài)局部變量被多次初始化。(該方法/函數(shù)是不可重入的)第14頁,共19頁。編寫代碼的一個(gè)考慮vCRT庫中隱含有全局變量。采用動(dòng)態(tài)鏈接沒有問題,但采用靜態(tài)鏈接將使每個(gè)模塊都有一份這樣的全局變量。如new,malloc等動(dòng)態(tài)內(nèi)存平分配函數(shù)會使用隱含的全局變量,在一個(gè)模塊中分配內(nèi)存,在另一個(gè)模塊中釋放這塊內(nèi)存,會因?yàn)槭褂貌煌娜肿兞繕?biāo)示內(nèi)部數(shù)據(jù)結(jié)構(gòu)而導(dǎo)致內(nèi)存錯(cuò)誤。所以編寫代碼時(shí)要在同一個(gè)模塊內(nèi)提供內(nèi)存的分配和釋放成對出現(xiàn)的函數(shù)。第15頁,共19頁。編寫代碼的

9、一個(gè)考慮v所以進(jìn)行算法設(shè)計(jì)時(shí)盡量少用全局變量,包括線程局部存儲TLS全局變量(每個(gè)線程有一份變量的拷貝),盡量使用類的成員變量來描述問題中的屬性、狀態(tài)等。即使必須要全局性的變量,也要控制在一定范圍內(nèi),考慮進(jìn)程范圍、線程范圍、模塊范圍的內(nèi)存占用情況和使用情況,要不要同步保護(hù)等。第16頁,共19頁。例子v一個(gè)大型多人RPG聯(lián)網(wǎng)對戰(zhàn)游戲中,記錄當(dāng)前的玩家總數(shù)目、每個(gè)玩家的ID是一個(gè)全局性的變量。對于服務(wù)器端的程序,該變量對于進(jìn)程是唯一的。因此適合編寫一個(gè)動(dòng)態(tài)庫模塊,含此變量,并提供引出函數(shù)來操縱該變量。該程序的可執(zhí)行模塊和其他動(dòng)態(tài)模塊可通過調(diào)用引出函數(shù)來訪問/修改此變量。v也可以設(shè)計(jì)為單件模式 (Singleton),參看設(shè)計(jì)模式。第17頁,共19頁。上機(jī)v編寫一個(gè)解決方案,含有兩個(gè)工程,一個(gè)是動(dòng)態(tài)庫模塊,含有全局性的玩家表,假設(shè)每個(gè)玩家的ID長度不超過8個(gè)字符,并提供添加、刪除、獲得總數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論