操作系統(tǒng)安全課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  操作系統(tǒng)安全</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  學(xué)生姓名 </p><p>  指導(dǎo)教師 <

2、/p><p>  學(xué) 院 信息科學(xué)與工程學(xué)院 </p><p>  專(zhuān)業(yè)班級(jí) </p><p>  完成時(shí)間 2015年12月19日 </p><p><b>  目 錄

3、</b></p><p><b>  第一章 概述2</b></p><p>  第二章 需求分析3</p><p>  第三章 總體設(shè)計(jì)5</p><p>  第四章 詳細(xì)設(shè)計(jì)6</p><p><b>  一. 界面設(shè)計(jì)6</b></p>

4、<p>  二. 獲取正在運(yùn)行的進(jìn)程及其信息8</p><p><b>  三. 結(jié)束進(jìn)程9</b></p><p>  四. 獲取其他信息10</p><p>  五. 繪制圖表11</p><p>  第五章 調(diào)試分析15</p><p>  第六章 使用說(shuō)明16&l

5、t;/p><p>  第七章 測(cè)試結(jié)果17</p><p>  第八章 課程設(shè)計(jì)總結(jié)21</p><p>  第九章 參考文獻(xiàn)22</p><p>  操作系統(tǒng)安全課程設(shè)計(jì)</p><p><b>  概述</b></p><p>  操作系統(tǒng)安全是整個(gè)計(jì)算機(jī)系統(tǒng)安全的重

6、要基礎(chǔ),主要針對(duì)操作系統(tǒng)層面的安全進(jìn)行剖析,是上層運(yùn)行的重要保證。與計(jì)算機(jī)原理、編譯原理、匯編語(yǔ)言、計(jì)算機(jī)網(wǎng)絡(luò)、程序設(shè)計(jì)等專(zhuān)業(yè)課程關(guān)系十分密切。本課程設(shè)計(jì)的目的綜合應(yīng)用學(xué)生所學(xué)知識(shí),建立安全系統(tǒng)的概念,理解和鞏固操作系統(tǒng)基本理論、原理和方法,掌握安全操作系統(tǒng)開(kāi)發(fā)的基本技能。</p><p>  任務(wù)管理器是在Windows系統(tǒng)中管理應(yīng)用程序和進(jìn)程的工具,通常由Windows操作系統(tǒng)自帶,也有提供增強(qiáng)功能的第三方軟

7、件。通過(guò)任務(wù)管理器用戶(hù)可以方便的查看當(dāng)前運(yùn)行的程序、進(jìn)程、用戶(hù)、網(wǎng)絡(luò)連接以及系統(tǒng)對(duì)內(nèi)存和CPU的資源占用,并可以強(qiáng)制結(jié)束某些程序和進(jìn)程,此外還可以監(jiān)控系統(tǒng)資源的使用狀況。</p><p>  Windows 任務(wù)管理器首次出現(xiàn)是在1998年美國(guó)微軟公司發(fā)行的Windows98操作系統(tǒng)中,此后微軟的各個(gè)版本的Windows操作系統(tǒng)都集成了任務(wù)管理器。任務(wù)管理器并不是Windows系統(tǒng)的專(zhuān)利,它廣泛運(yùn)用于各種操作系統(tǒng)

8、中,在蘋(píng)果公司的Mac OS 操作系統(tǒng)中有類(lèi)似的活動(dòng)監(jiān)視器(Activity Monitor),在基于Linux的ubuntu操作系統(tǒng)有相類(lèi)似功能的系統(tǒng)監(jiān)視器。 Windows任務(wù)管理器提供了有關(guān)計(jì)算機(jī)性能的信息,并顯示了計(jì)算機(jī)上所運(yùn)行的程序和進(jìn)程的詳細(xì)信息;如果連接到網(wǎng)絡(luò),那么還可以查看網(wǎng)絡(luò)狀態(tài)并迅速了解網(wǎng)絡(luò)是如何工作的。它的用戶(hù)界面提供了文件、選項(xiàng)、查看、窗口、關(guān)機(jī)、幫助等六大菜單項(xiàng),其下還有應(yīng)用程序、進(jìn)程、性能、聯(lián)網(wǎng)、用戶(hù)等五個(gè)

9、標(biāo)簽頁(yè)。</p><p>  課題設(shè)計(jì)就是模擬Windows任務(wù)管理器,開(kāi)發(fā)的一個(gè)Windows進(jìn)程管理軟件。主要設(shè)計(jì)的是一個(gè)基于窗體的C#程序,在主對(duì)話框上面放置了一個(gè)標(biāo)簽控件,并創(chuàng)建了應(yīng)用程序、進(jìn)程和性能三個(gè)頁(yè)面,標(biāo)簽控件用于選擇并顯示頁(yè)面。三個(gè)頁(yè)面分別用于顯示當(dāng)前運(yùn)行的窗口程序、進(jìn)程及進(jìn)程模塊、系統(tǒng)資源使用情況。程序還實(shí)現(xiàn)了結(jié)束任務(wù)、等對(duì)進(jìn)程管理的基本功能。在的設(shè)計(jì)過(guò)程中,通過(guò)調(diào)用Windows API函數(shù)

10、而獲得任務(wù)、進(jìn)程、線程模塊,以及系統(tǒng)資源使用情況等信息。最后在Windows10系統(tǒng)上進(jìn)行測(cè)試,實(shí)現(xiàn)了進(jìn)程管理的基本功能。</p><p><b>  需求分析</b></p><p>  設(shè)計(jì)一個(gè)Windows或Linux下的進(jìn)程管理與監(jiān)控程序,要求該程序完成以下功能:</p><p>  可獲取當(dāng)前正在運(yùn)行的所有進(jìn)程,包括進(jìn)程PID、進(jìn)程名

11、稱(chēng)、CPU使用情況、當(dāng)前用戶(hù)名、內(nèi)存占用量等;</p><p>  能進(jìn)一步獲取各進(jìn)程的所有線程情況;</p><p>  能通過(guò)命令終止某個(gè)進(jìn)程的執(zhí)行,終止時(shí)能將其子孫進(jìn)程全部終止;</p><p><b>  要求界面友好。</b></p><p>  關(guān)于Windows任務(wù)管理器:</p><p

12、>  任務(wù)管理器的用戶(hù)界面提供了文件、選項(xiàng)、查看、窗口、關(guān)機(jī)、幫助等六大菜單項(xiàng),例如“關(guān)機(jī)”菜單下可以完成待機(jī)、休眠、關(guān)閉、重新啟動(dòng)、注銷(xiāo)、切換等操作,其下還有應(yīng)用程序、進(jìn)程、性能、聯(lián)網(wǎng)、用戶(hù)等五個(gè)標(biāo)簽頁(yè),窗口底部則是狀態(tài)欄,從這里可以查看到當(dāng)前系統(tǒng)的進(jìn)程數(shù)、CPU使用比率、更改的內(nèi)存<容量等數(shù)據(jù),默認(rèn)設(shè)置下系統(tǒng)每隔兩秒鐘對(duì)數(shù)據(jù)進(jìn)行1次自動(dòng)更新,當(dāng)然你也可以點(diǎn)擊“查看→更新速度”菜單重新設(shè)置。</p><

13、p><b>  1. 應(yīng)用程序</b></p><p>  這里顯示了所有當(dāng)前正在運(yùn)行的應(yīng)用程序,不過(guò)它只會(huì)顯示當(dāng)前已打開(kāi)窗口的應(yīng)用程序,而QQ、MSN Messenger等最小化至系統(tǒng)托盤(pán)區(qū)的應(yīng)用程序則并不會(huì)顯示出來(lái)。</p><p>  你可以在這里點(diǎn)擊“結(jié)束任務(wù)”按鈕直接關(guān)閉某個(gè)應(yīng)用程序,如果需要同時(shí)結(jié)束多個(gè)任務(wù),可以按住Ctrl鍵復(fù)選;點(diǎn)擊“新任務(wù)”按鈕

14、,可以直接打開(kāi)相應(yīng)的程序、文件夾、文檔或Internet資源,如果不知道程序的名稱(chēng),可以點(diǎn)擊“瀏覽”按鈕進(jìn)行搜索,其實(shí)這個(gè)“新任務(wù)”的功能看起來(lái)有些類(lèi)似于開(kāi)始菜單中的運(yùn)行命令?! ?lt;/p><p><b>  2. 進(jìn)程</b></p><p>  這里顯示了所有當(dāng)前正在運(yùn)行的進(jìn)程,包括應(yīng)用程序、后臺(tái)服務(wù)等,那些隱藏在系統(tǒng)底層深處運(yùn)行的病毒程序或木馬程序都可以在這里找

15、到,當(dāng)然前提是你要知道它的名稱(chēng)。找到需要結(jié)束的進(jìn)程名,然后執(zhí)行右鍵菜單中的“結(jié)束進(jìn)程”命令,就可以強(qiáng)行終止,不過(guò)這種方式將丟失未保存的數(shù)據(jù),而且如果結(jié)束的是系統(tǒng)服務(wù),則系統(tǒng)的某些功能可能無(wú)法正常使用。</p><p>  Windows的任務(wù)管理器只能顯示系統(tǒng)中當(dāng)前進(jìn)行的進(jìn)程,而Process Explorer可以樹(shù)狀方式顯示出各個(gè)進(jìn)程之間的關(guān)系,即某一進(jìn)程啟動(dòng)了哪些其他的進(jìn)程,還可以顯示某個(gè)進(jìn)程所調(diào)用的文件或文

16、件夾,如果某個(gè)進(jìn)程是Windows服務(wù),則可以查看該進(jìn)程所注冊(cè)的所有服務(wù),需要的朋友可以從www.sysinternals.com下載。</p><p><b>  3. 性能</b></p><p>  從任務(wù)管理器中我們可以看到計(jì)算機(jī)性能的動(dòng)態(tài)概念,例如CPU和各種內(nèi)存的使用情況。</p><p>  CPU使用情況:表明處理器工作時(shí)間百分

17、比的圖表,該計(jì)數(shù)器是處理器活動(dòng)的主要指示器,查看該圖表可以知道當(dāng)前使用的處理時(shí)間是多少。</p><p>  CPU使用記錄:顯示處理器的使用程序隨時(shí)間的變化情況的圖表,圖表中顯示的采樣情況取決于“查看”菜單中所選擇的“更新速度”設(shè)置值,“高”表示每秒2次,“正?!北硎久?jī)擅?次,“低”表示每四秒1次,“暫?!北硎静蛔詣?dòng)更新。</p><p>  PF使用情況:正被系統(tǒng)使用的頁(yè)面文件的量。

18、</p><p>  頁(yè)面文件使用記錄:顯示頁(yè)面文件的量隨時(shí)間的變化情況的圖表,圖表中顯示的采樣情況取決于“查看”菜單中所選擇的“更新速度”設(shè)置值。</p><p>  總數(shù):顯示計(jì)算機(jī)上正在運(yùn)行的句柄、線程、進(jìn)程的總數(shù)。</p><p>  執(zhí)行內(nèi)存:分配給程序和操作系統(tǒng)的內(nèi)存,由于虛擬內(nèi)存的存在,“峰值”可以超過(guò)最大物理內(nèi)存,“總數(shù)”值則與“頁(yè)面文件使用記錄”圖

19、表中顯示的值相同。</p><p>  物理內(nèi)存:計(jì)算機(jī)上安裝的總物理內(nèi)存,也稱(chēng)RAM,“可用”表示可供使用的內(nèi)存容量,“系統(tǒng)緩存”顯示當(dāng)前用于映射打開(kāi)文件的頁(yè)面的物理內(nèi)存。</p><p>  內(nèi)核內(nèi)存:操作系統(tǒng)內(nèi)核和設(shè)備驅(qū)動(dòng)程序所使用的內(nèi)存,“頁(yè)面”是可以復(fù)制到頁(yè)面文件中的內(nèi)存,由此可以釋放物理內(nèi)存;“非分頁(yè)”是保留在物理內(nèi)存中的內(nèi)存,不會(huì)被復(fù)制到頁(yè)面文件中。</p>&

20、lt;p><b>  4. 聯(lián)網(wǎng) </b></p><p>  這里顯示了本地計(jì)算機(jī)所連接的網(wǎng)絡(luò)通信量的指示,使用多個(gè)網(wǎng)絡(luò)連接時(shí),我們可以在這里比較每個(gè)連接的通信量,當(dāng)然只有安裝網(wǎng)卡后才會(huì)顯示該選項(xiàng)。</p><p><b>  5. 用戶(hù)</b></p><p>  這里顯示了當(dāng)前已登錄和連接到本機(jī)的用戶(hù)數(shù)、標(biāo)識(shí)(

21、標(biāo)識(shí)該計(jì)算機(jī)上的會(huì)話的數(shù)字ID)、活動(dòng)狀態(tài)(正在運(yùn)行、已斷開(kāi))、客戶(hù)端名,可以點(diǎn)擊“注銷(xiāo)”按鈕重新登錄,或者通過(guò)“斷開(kāi)”按鈕連接與本機(jī)的連接,如果是局域網(wǎng)用戶(hù),還可以向其他用戶(hù)發(fā)送消息。</p><p><b>  總體設(shè)計(jì)</b></p><p>  我決定用java語(yǔ)言完成本次課程設(shè)計(jì)的題目。</p><p>  設(shè)計(jì)思路:java可以通過(guò)

22、一些命令拿到所需要的信息,比如系統(tǒng)版本名稱(chēng)、內(nèi)存使用情況、CPU使用情況、進(jìn)程狀況、線程狀況等等,拿到這些信息以后就可以制作一個(gè)簡(jiǎn)易的任務(wù)管理器了。相對(duì)來(lái)說(shuō),java語(yǔ)言寫(xiě)界面是比較簡(jiǎn)單的,因此任務(wù)管理器的界面可以完全仿照Windows自帶任務(wù)管理器的界面來(lái)完成。</p><p>  下圖為主要的設(shè)計(jì)方案,java中可以通過(guò)如下兩個(gè)包來(lái)獲取所需的信息,所以這些信息采用get、 set方法獲取后直接打印的方法展示。

23、進(jìn)程的信息則需要獲取權(quán)限,我采用用system函數(shù)調(diào)dos命令的方法來(lái)實(shí)現(xiàn)。進(jìn)程的新建、關(guān)閉也同樣用dos命令完成。Windows任務(wù)管理器由性能、進(jìn)程、應(yīng)用程序三大部分組成。其實(shí)這三大部分是有機(jī)的聯(lián)系在一起的,尤其是性能和進(jìn)程,性能中除了CPU使用率以外,其余的數(shù)據(jù)都是由進(jìn)程模塊順便取得的。 Windows的任務(wù)管理器通過(guò)NtQuerySystemInformation的調(diào)用來(lái)獲取各類(lèi)信息,如CPU使用率,內(nèi)存使用率,句柄總數(shù),線程

24、總數(shù),進(jìn)程總數(shù)等等。在任務(wù)管理器中的幾乎所有信息都是來(lái)自該函數(shù)。我的理解中,這兩個(gè)包里的函數(shù)和方法都會(huì)用到這個(gè)函數(shù)。</p><p>  java.lang.management.ManagementFactory</p><p>  com.sun.management.OperatingSystemMXBean</p><p>  在這個(gè)任務(wù)管理器中,除了應(yīng)該可

25、以顯示上面提到的信息之外,還要有新建和結(jié)束進(jìn)程、畫(huà)出內(nèi)存和CPU使用情況圖的功能。</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p><b>  界面設(shè)計(jì)</b></p><p>  預(yù)計(jì)設(shè)計(jì)為類(lèi)似Windows自帶的任務(wù)管理器的界面,需要用到j(luò)ava自有包java.awt.*,javax.swing.*。這兩

26、個(gè)包中包含了許多制作窗口所需的方法。這里需要用到許多控件來(lái)實(shí)現(xiàn),如JTabbedPane控件,用于加入選項(xiàng)卡。還需要放置表格用來(lái)顯示進(jìn)程的各項(xiàng)信息。</p><p>  JTabbedPane jtp;</p><p>  JPanel process_tab;</p><p>  JPanel service_tab;</p><p>  

27、JPanel function_tab;</p><p><b>  //顯示進(jìn)程的表格</b></p><p>  JTable pTable = new JTable();</p><p><b>  //顯示服務(wù)的表格</b></p><p>  JTable sTable = new JTa

28、ble();</p><p><b>  //中間面板</b></p><p>  JPanel mainpanel;</p><p>  final Vector pb = new Vector(5);</p><p>  final Vector sb = new Vector(5);</p><

29、p><b>  //進(jìn)程信息面板</b></p><p>  JLabel process_num;</p><p>  各個(gè)面板的各項(xiàng)配置也在界面設(shè)計(jì)中完成,如選項(xiàng)卡出現(xiàn)的位置、名稱(chēng)以及顏色等。</p><p><b>  //選項(xiàng)卡布局</b></p><p>  public void

30、setTab() throws Exception{</p><p>  jtp = new JTabbedPane(JTabbedPane.TOP);</p><p>  process_tab = new JPanel();</p><p>  process_tab.setLayout(null);</p><p>  ProcessT

31、ab();</p><p>  service_tab = new JPanel();</p><p>  //service_tab.setLayout(null);</p><p>  ServiceTab();</p><p>  function_tab = new JPanel();</p><p>  fu

32、nction_tab.setLayout(null);</p><p>  FunctionTab();</p><p>  process_tab.setBackground(Color.WHITE);</p><p>  service_tab.setBackground(Color.WHITE);</p><p>  function_

33、tab.setBackground(Color.WHITE);</p><p>  jtp.add("進(jìn)程 ",process_tab);</p><p>  jtp.add("待定",service_tab);</p><p>  jtp.add("性能 ",function_tab);</p&

34、gt;<p>  mainpanel = new JPanel();</p><p>  mainpanel.setBounds(0, 0, 545, 580);</p><p>  mainpanel.add(jtp);</p><p>  this.getContentPane().add(mainpanel);</p><p

35、>  southPanel();</p><p><b>  }</b></p><p>  接著只要取到各項(xiàng)選項(xiàng)卡所需的信息,將其加入各個(gè)選項(xiàng)卡內(nèi)即可,進(jìn)程選項(xiàng)卡還需添加表格中各個(gè)選項(xiàng),這里用一個(gè)字符串?dāng)?shù)組來(lái)完成。</p><p>  String cname[] = { "映像名稱(chēng)", "用戶(hù)名"

36、;, "優(yōu)先權(quán)", "PID", "線程數(shù)" };</p><p>  for (int i = 0; i < 5; i++) pb.add(cname[i]);</p><p>  獲取正在運(yùn)行的進(jìn)程及其信息</p><p>  獲得進(jìn)程及其信息采用通過(guò)命令行獲取的方式,在此之前必須先建立一個(gè)類(lèi)

37、(命名為ProcessImformation)來(lái)放置取到的信息,所需信息有:進(jìn)程名稱(chēng)、用戶(hù)名、優(yōu)先權(quán)、進(jìn)程PID、線程數(shù),建立一個(gè)函數(shù),再增加該函數(shù)變量的get方法。</p><p>  ProcessImformation(String caption, String csname, String priority,</p><p>  String processId, String

38、threadCount) {</p><p>  this.caption = caption;</p><p>  this.csname = csname;</p><p>  this.priority = priority;</p><p>  this.processId = processId;</p><p&

39、gt;  this.threadCount = threadCount;</p><p><b>  取進(jìn)程信息的命令:</b></p><p>  String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption,CSNa

40、me,Priority,ProcessId,ThreadCount";</p><p><b>  // 取進(jìn)程信息</b></p><p>  readProcess(Runtime.getRuntime().exec(procCmd));</p><p>  String handCmd = System.getenv("

41、;windir")+ "\\system32\\wbem\\wmic.exe process get Name,HandleCount";</p><p><b>  // 取句柄信息</b></p><p>  readHandle(Runtime.getRuntime().exec(handCmd));</p><

42、p>  hand.getOutputStream().close();</p><p>  InputStreamReader ir = new InputStreamReader(hand.getInputStream());</p><p>  LineNumberReader input = new LineNumberReader(ir);</p><p&

43、gt;  String line = input.readLine();</p><p>  int cn = line.indexOf("Name");</p><p>  int ch = line.indexOf("HandleCount");</p><p>  while ((line = input.read

44、Line()) != null) {</p><p>  if (line.length() < cn) continue;</p><p>  int handle = Integer.parseInt(line.substring(ch, cn-1).trim());</p><p>  i += handle;</p><p&g

45、t;<b>  }</b></p><p>  proc.getOutputStream().close();</p><p>  InputStreamReader ir = new InputStreamReader(proc.getInputStream());</p><p>  LineNumberReader input = new

46、 LineNumberReader(ir);</p><p>  String line = input.readLine();</p><p>  int capidx = line.indexOf("Caption");</p><p>  int cmdidx = line.indexOf("CSName");</

47、p><p>  int prioidx = line.indexOf("Priority");</p><p>  int pid = line.indexOf("ProcessId");</p><p>  int tc = line.indexOf("ThreadCount");</p>&l

48、t;p>  while ((line = input.readLine()) != null) {</p><p>  if (line.length() < tc) continue;</p><p>  // 字段出現(xiàn)順序:Caption,CommandLine,Priority,ProcessId,ThreadCount</p><p>  S

49、tring caption = line.substring(capidx, cmdidx - 1).trim();</p><p>  String caname = line.substring(cmdidx, prioidx - 1).trim();</p><p>  String priority = line.substring(prioidx, pid - 1).trim()

50、;</p><p>  String processId = line.substring(pid, tc - 1).trim();</p><p>  String ThreadCount = line.substring(tc, line.length() - 1).trim();</p><p>  proce[i] = new ProcessImformat

51、ion(caption, caname, priority,processId, ThreadCount);</p><p>  //int th = Integer.parseInt(ThreadCount);</p><p>  i = i + 1;</p><p>  //t += th;</p><p><b>  }<

52、;/b></p><p><b>  結(jié)束進(jìn)程</b></p><p>  結(jié)束進(jìn)程同樣通過(guò)命令行實(shí)現(xiàn),在進(jìn)程表格中選中某進(jìn)程后點(diǎn)擊結(jié)束進(jìn)程按鈕,彈出對(duì)話框顯示“確定要結(jié)束進(jìn)程(加入進(jìn)程名稱(chēng))嗎?”,點(diǎn)擊“是”后可以結(jié)束進(jìn)程。</p><p><b>  // 結(jié)束進(jìn)程按鈕</b></p><p&

53、gt;  JButton kill = new JButton("結(jié)束進(jìn)程(E)");</p><p>  kill.setBounds(400, 425, 98, 23);</p><p>  kill.addActionListener(this);</p><p>  process_tab.add(kill);</p>&l

54、t;p>  用戶(hù)點(diǎn)擊按鈕之后轉(zhuǎn)到如下函數(shù):</p><p>  public void actionPerformed(ActionEvent args) {</p><p>  if(args.getActionCommand().equals("結(jié)束進(jìn)程(E)")){</p><p>  if (pTable.getSelectedRo

55、w() != -1) {</p><p>  if (pTable.getValueAt(pTable.getSelectedRow(), 0) != null) {</p><p>  // Toolkit.getDefaultToolkit().beep();</p><p>  String pname = pTable.getValueAt(pTable.g

56、etSelectedRow(), 0).toString();</p><p>  pname = pname.replace("\"", "");</p><p>  pname = pname.trim();</p><p>  int n = JOptionPane.showConfirmDialog(this

57、, "確定要結(jié)束進(jìn)程" + pname + "嗎?", "確認(rèn)對(duì)話框", JOptionPane.YES_NO_OPTION);</p><p>  if (n == JOptionPane.YES_OPTION) {</p><p><b>  try {</b></p><p> 

58、 String kill = "wmic process where name=\"" + pname + "\" call terminate";</p><p>  Runtime.getRuntime().exec(kill);</p><p>  } catch (Exception ex) {</p>&l

59、t;p><b>  }</b></p><p>  JOptionPane.showMessageDialog(this, pname + "已結(jié)束!", "消息",</p><p>  JOptionPane.WARNING_MESSAGE);</p><p><b>  }</b

60、></p><p><b>  }</b></p><p><b>  } else</b></p><p>  JOptionPane.showMessageDialog(this, "沒(méi)有選中項(xiàng)!", "消息",</p><p>  JOptionP

61、ane.WARNING_MESSAGE);</p><p><b>  }</b></p><p><b>  獲取其他信息</b></p><p>  獲得其他信息的方式與獲得進(jìn)程及其信息的方式相同,在此之前必須先建立一個(gè)類(lèi)(命名為OSInformation)來(lái)放置取到的信息,所需信息有:操作系統(tǒng)名稱(chēng)及版本、總物理內(nèi)存、

62、已使用物理內(nèi)存、剩余物理內(nèi)存、CPU使用情況,建立一個(gè)函數(shù),再增加該函數(shù)變量的get、set方法。由于方法與獲得進(jìn)程及其信息的方法相同,不再贅述。</p><p>  int kb = 1024;</p><p>  OperatingSystemMXBean osmxb =</p><p>  (OperatingSystemMXBean) ManagementF

63、actory.getOperatingSystemMXBean();</p><p><b>  // 操作系統(tǒng)</b></p><p>  String osName = System.getProperty("os.name");</p><p>  String osVersion = System.getProper

64、ty("os.version");</p><p><b>  // 總的物理內(nèi)存</b></p><p>  long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / (kb * kb);</p><p>  // 剩余的物理內(nèi)存</p><

65、p>  long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / (kb * kb);</p><p>  // 已使用的物理內(nèi)存</p><p>  Long usedMemory = </p><p>  (osmxb.getTotalPhysicalMemorySize() -os

66、mxb.getFreePhysicalMemorySize()) / (kb * kb);</p><p>  if (osName.toLowerCase().startsWith("windows")) {</p><p>  this.getProcessForWindows();</p><p><b>  }</b>

67、;</p><p><b>  // 構(gòu)造返回對(duì)象</b></p><p>  OSInformation infoBean = new OSInformation();</p><p>  infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);</p><p&

68、gt;  infoBean.setOsName(osName +" "+osVersion);</p><p>  infoBean.setTotalMemorySize(totalMemorySize);</p><p>  infoBean.setUsedMemory(usedMemory);</p><p>  return infoBea

69、n;</p><p><b>  繪制圖表</b></p><p>  繪制CPU和內(nèi)存使用情況。首先需要建立一個(gè)坐標(biāo)類(lèi),由于要繪制兩個(gè)圖,所以需要x1、x2、y1、y2四個(gè)坐標(biāo)變量。繪制圖表需要用到時(shí)鐘函數(shù),令其可以自動(dòng)刷新,自動(dòng)取到所需的信息并且繪圖。每取到新的結(jié)果,舊的結(jié)果(上一個(gè)結(jié)果)則向左移動(dòng)一格。</p><p>  public

70、void updateChart(){</p><p>  //物理內(nèi)存使用記錄中的表格</p><p>  for(int i = 0;i<10;i++){</p><p>  XY xy = new XY();</p><p>  xy.x1 = 0;</p><p>  xy.y1 = (i+1)*13;&

71、lt;/p><p>  xy.x2 = 500;</p><p>  xy.y2 = (i+1)*13;</p><p>  if(!checkEqual(xy,X_memory_record)) X_memory_record.add(xy);</p><p><b>  }</b></p><p&g

72、t;  Y_memory_record.clear();</p><p>  for(int i = 0;i<70;i++){</p><p>  XY xy = new XY();</p><p>  xy.x1 = (i+1)*13-move;</p><p>  xy.y1 = 0;</p><p>  x

73、y.x2 = (i+1)*13-move;</p><p>  xy.y2 = 200;</p><p>  if(!checkEqual(xy,Y_memory_record)) Y_memory_record.add(xy);</p><p><b>  }</b></p><p>  //物理內(nèi)存使用記錄中的數(shù)據(jù)

74、</p><p>  List<XY> temp_memory_record = new ArrayList<XY>();</p><p>  for(int i = 0;i<D_memory_record.size();i++){</p><p>  XY xy = D_memory_record.get(i);</p>

75、<p>  xy.x1 = xy.x1-2;</p><p>  xy.x2 = xy.x2-2;</p><p>  if(!checkEqual(xy,temp_memory_record)) temp_memory_record.add(xy);</p><p><b>  }</b></p><p>

76、;  D_memory_record = temp_memory_record;</p><p>  //物理內(nèi)存使用百分量</p><p>  float used_memory = </p><p>  ((float)monitorInfo.getUsedMemory()/(float)monitorInfo.getTotalMemorySize())*100

77、;</p><p>  float point_memory = 130-(used_memory/100*130);</p><p>  XY xy_memory_record = new XY();</p><p>  xy_memory_record.x1 = 480;</p><p>  xy_memory_record.y1 = (

78、int)point_memory;</p><p>  xy_memory_record.x2 = 480+2;</p><p>  xy_memory_record.y2 = (int)point_memory;</p><p>  if(!checkEqual(xy_memory_record,D_memory_record)){</p><

79、p>  D_memory_record.add(xy_memory_record);</p><p><b>  }</b></p><p>  //CPU使用記錄中的表格</p><p>  for(int i = 0;i<10;i++){</p><p>  XY xy = new XY();</p

80、><p>  xy.x1 = 0;</p><p>  xy.y1 = (i+1)*13;</p><p>  xy.x2 = 500;</p><p>  xy.y2 = (i+1)*13;</p><p>  if(!checkEqual(xy,X_cpu_record)) X_cpu_record.add(xy);

81、</p><p><b>  }</b></p><p>  Y_cpu_record.clear();</p><p>  for(int i = 0;i<70;i++){</p><p>  XY xy = new XY();</p><p>  xy.x1 = (i+1)*13-mov

82、e;</p><p>  xy.y1 = 0;</p><p>  xy.x2 = (i+1)*13-move;</p><p>  xy.y2 = 200;</p><p>  if(!checkEqual(xy,Y_cpu_record)) Y_cpu_record.add(xy);</p><p><b&

83、gt;  }</b></p><p>  //CPU使用記錄中的數(shù)據(jù)</p><p>  List<XY> temp_cpu_record = new ArrayList<XY>();</p><p>  for(int i = 0;i<D_cpu_record.size();i++){</p><p&g

84、t;  XY xy = D_cpu_record.get(i);</p><p>  xy.x1 = xy.x1-2;</p><p>  xy.x2 = xy.x2-2;</p><p>  if(!checkEqual(xy,temp_cpu_record)) temp_cpu_record.add(xy);</p><p><b

85、>  }</b></p><p>  D_cpu_record = temp_cpu_record;</p><p>  //CPU使用百分量</p><p>  float used_cpu = (float)(os.getSystemCpuLoad()*100);</p><p>  float point_cpu =

86、130-(used_cpu/100*130);</p><p>  XY xy_cpu_record = new XY();</p><p>  xy_cpu_record.x1 = 480;</p><p>  xy_cpu_record.y1 = (int)point_cpu;</p><p>  xy_cpu_record.x2 = 4

87、80;</p><p>  xy_cpu_record.y2 = (int)point_cpu;</p><p>  if(!checkEqual(xy_cpu_record,D_cpu_record)) D_cpu_record.add(xy_cpu_record);</p><p>  //CPU兩次數(shù)據(jù)之間的連接線</p><p> 

88、 XY xy_cpu_record_connect = new XY();</p><p>  xy_cpu_record_connect.x1 = temp_cpu_x;</p><p>  xy_cpu_record_connect.y1 = temp_cpu_y;</p><p>  xy_cpu_record_connect.x2 = 480;</p&

89、gt;<p>  xy_cpu_record_connect.y2 = (int)point_cpu;</p><p>  if(!checkEqual(xy_cpu_record_connect,D_cpu_record)){</p><p>  D_cpu_record.add(xy_cpu_record_connect);</p><p><

90、;b>  }</b></p><p>  temp_cpu_x = 480;</p><p>  temp_cpu_y = (int)point_cpu;</p><p><b>  }</b></p><p>  //檢查隊(duì)列中是否有重復(fù)數(shù)據(jù)</p><p>  public

91、boolean checkEqual(XY check_xy,List<XY> list){</p><p><b>  XY xy;</b></p><p>  for(int i = 0;i<list.size();i++){</p><p>  xy = list.get(i);</p><p>

92、  if((xy.x1 == check_xy.x1)&&(xy.y1 == check_xy.y1)&&(xy.x2 == check_xy.x2)&&(xy.y2 == check_xy.y2)) return true;</p><p><b>  }</b></p><p>  return false;<

93、;/p><p><b>  }</b></p><p>  //輸出隊(duì)列中的數(shù)據(jù)</p><p>  public void showData(List<XY> list){</p><p><b>  XY xy;</b></p><p>  for(int i =

94、 0;i<list.size();i++){</p><p>  xy = list.get(i);</p><p>  System.out.println("第"+i+"個(gè): "+xy.x1+" "+xy.y1+" "+xy.x2+" "+xy.y2);</p>&l

95、t;p><b>  }</b></p><p><b>  }</b></p><p>  public void autoFlush() throws Exception {</p><p>  Timer timeCount = new Timer(1000, new ActionListener() {<

96、/p><p>  public void actionPerformed(ActionEvent evt) {</p><p><b>  try {</b></p><p>  //刷新得到系統(tǒng)信息的工具</p><p>  monitorInfo = service.getMonitorInfoBean();</p

97、><p>  m.getHandleCount();</p><p>  //圖標(biāo)每次左移的像素點(diǎn)</p><p>  move = move+2;</p><p>  updateProcess();</p><p>  southPanel();</p><p>  updateChart();

98、</p><p>  FunctionTab();</p><p>  p_memory_record.repaint();</p><p>  p_cpu_record.repaint();</p><p>  p_cpu_used.repaint();</p><p>  } catch (Exception up

99、date) {</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  });</b></p><p>  timeCount.start();</p><p><b>  }</b&g

100、t;</p><p><b>  調(diào)試分析</b></p><p>  如何在進(jìn)程的表格中選中一個(gè)進(jìn)程結(jié)束是我設(shè)計(jì)時(shí)遇到的問(wèn)題之一。</p><p>  一開(kāi)始結(jié)束進(jìn)程總是不很順利,后來(lái)我加入了如下函數(shù):記錄上次選中的行,從選中的行中得到進(jìn)程的名稱(chēng),將名稱(chēng)傳給結(jié)束進(jìn)程的按鈕,再通過(guò)結(jié)束進(jìn)程的函數(shù)actionPerformed結(jié)束進(jìn)程。后續(xù)調(diào)試分

101、析表明,這個(gè)函數(shù)可實(shí)現(xiàn)選中進(jìn)程后結(jié)束進(jìn)程的功能。</p><p>  public void updateProcess() throws Exception {</p><p>  int flag = 0;</p><p>  String name = "";</p><p>  int rowIndex = 0;&

102、lt;/p><p>  // 記錄上次選中的行</p><p>  if (pTable.getSelectedRow() != -1) {</p><p><b>  flag = 1;</b></p><p>  name = pTable.getValueAt(pTable.getSelectedRow(), 0).t

103、oString();</p><p><b>  } else {</b></p><p><b>  flag = 0;</b></p><p><b>  }</b></p><p>  m.getProcessForWindows();</p><p&

104、gt;  String c[][] = new String[m.processCount][5];</p><p>  int j = 0;</p><p>  Vector srcdata = new Vector();</p><p>  while (j < m.processCount) {</p><p>  c[j][0]

105、 = m.proce[j].getCaption();</p><p>  c[j][1] = m.proce[j].getCSName();</p><p>  c[j][2] = m.proce[j].getPriority();</p><p>  c[j][3] = m.proce[j].getProcessId();</p><p>

106、;  c[j][4] = m.proce[j].getThreadCount();</p><p>  if (c[j][0].equals(name)) rowIndex = j;</p><p>  Vector rowdata = new Vector(5);</p><p>  for (int i = 0; i < 5; i++) row

107、data.add(c[j][i]);</p><p>  // 將數(shù)據(jù)加入到容器,也就是加入到JTable 中</p><p>  srcdata.add(rowdata);</p><p><b>  j++;</b></p><p><b>  }</b></p><p>

108、;  DefaultTableModel model0 = new DefaultTableModel(srcdata, pb);</p><p>  pTable.setModel(model0);</p><p>  if (flag == 1) pTable.setRowSelectionInterval(rowIndex, rowIndex);</p><

109、p>  this.pTable.repaint();</p><p>  this.pTable.updateUI();</p><p><b>  }</b></p><p><b>  使用說(shuō)明</b></p><p>  使用說(shuō)明參照第七章 測(cè)試結(jié)果中的圖1。</p>&l

110、t;p>  如圖1所示,任務(wù)管理器中有三個(gè)選項(xiàng)卡,進(jìn)程、待定、性能。進(jìn)程選項(xiàng)卡中,可顯示現(xiàn)在正在運(yùn)行中的進(jìn)程,并且打印進(jìn)程的信息,包括進(jìn)程的名稱(chēng)(映像名稱(chēng))、進(jìn)程的使用者(用戶(hù)名)、進(jìn)程的優(yōu)先權(quán)(優(yōu)先權(quán))、進(jìn)程的PID(PID)、進(jìn)程的線程數(shù)(線程數(shù))。</p><p>  點(diǎn)擊表格中的某個(gè)進(jìn)程,可以通過(guò)右下方的“結(jié)束進(jìn)程”按鈕結(jié)束進(jìn)程。點(diǎn)擊結(jié)束進(jìn)程后會(huì)彈出對(duì)話框,提示是否要結(jié)束進(jìn)程,選擇“是”之后會(huì)結(jié)束該

111、進(jìn)程,同時(shí)彈出對(duì)話框提示該進(jìn)程已經(jīng)被結(jié)束。</p><p>  性能選項(xiàng)卡顯示的是CPU使用情況和內(nèi)存使用情況圖,如圖5所示。</p><p>  任務(wù)管理器的最下方實(shí)時(shí)顯示進(jìn)程數(shù)、CPU使用率和物理內(nèi)存使用情況。</p><p><b>  測(cè)試結(jié)果</b></p><p>  圖1 - 任務(wù)管理器界面</p&g

112、t;<p>  圖2 - 選中一個(gè)正在運(yùn)行中的進(jìn)程</p><p>  圖3 - 點(diǎn)擊結(jié)束進(jìn)程</p><p>  圖4 - 結(jié)束進(jìn)程后</p><p>  圖5 - CPU使用情況和內(nèi)存使用情況圖</p><p>  對(duì)比Windows自帶任務(wù)管理器可知,實(shí)驗(yàn)結(jié)果正確,并且可完成結(jié)束進(jìn)程的功能。</p><

113、p><b>  課程設(shè)計(jì)總結(jié)</b></p><p>  通過(guò)這次課程設(shè)計(jì),我發(fā)現(xiàn)了自身的不足,比如沒(méi)有很好的書(shū)寫(xiě)習(xí)慣,考慮問(wèn)題不周到,對(duì)于java語(yǔ)言的理解不夠深入等。</p><p>  原來(lái)我并不是很擅長(zhǎng)java的界面編寫(xiě),但是經(jīng)過(guò)此次的課程設(shè)計(jì),我已經(jīng)能夠熟練使用java中界面編寫(xiě)的一些控件,這是我的一大收獲。</p><p> 

114、 研究任務(wù)管理器的功能并熟練的使用任務(wù)管理器可以方便的處理計(jì)算機(jī)日常使用中所遇到一些問(wèn)題,對(duì)于更好的使用計(jì)算機(jī)操作系統(tǒng)從事辦公、學(xué)習(xí)和娛樂(lè)也有現(xiàn)實(shí)的意義。課題研究設(shè)計(jì)的進(jìn)程管理器能夠顯示任務(wù)信息,顯示進(jìn)程、線程模塊等信息,能夠結(jié)束任務(wù)、終止進(jìn)程,并能以圖表的形式顯示CPU、內(nèi)存使用率,操作簡(jiǎn)單,能基本滿(mǎn)足用戶(hù)對(duì)Windows進(jìn)程管理的需求。但有些進(jìn)程管理的高級(jí)功能還未在設(shè)計(jì)之中,如對(duì)進(jìn)程模塊(DLL文件)的卸載與加載、對(duì)異常進(jìn)程的警告等

115、,今后還需進(jìn)一步學(xué)習(xí)和了解Windows核心編程,熟悉動(dòng)態(tài)鏈接庫(kù)DLL的操作等知識(shí)。</p><p>  在編程的過(guò)程中我體驗(yàn)到了一分耕耘一分收獲的喜悅;多次調(diào)試后程序成功運(yùn)行了,那時(shí)候的歡樂(lè)是我以前無(wú)法想象的。并且,我養(yǎng)成了寫(xiě)程序時(shí)添加注釋的好習(xí)慣,這樣在改錯(cuò)、函數(shù)功能一一對(duì)應(yīng)方面就方便多了。果然,學(xué)習(xí)任何一門(mén)課程,只要學(xué)得用心,都可以從中體會(huì)到學(xué)習(xí)的快樂(lè)。今后我的進(jìn)步,想必都是從這一點(diǎn)點(diǎn)敲入編譯器的代碼中獲得

116、的。</p><p><b>  參考文獻(xiàn)</b></p><p> ?。?)張堯?qū)W等. 計(jì)算機(jī)操作系統(tǒng)教程(第4版). 清華大學(xué)出版社,2013</p><p> ?。?)賈春福,鄭鵬. 操作系統(tǒng)安全. 武漢大學(xué)出版社,2006</p><p> ?。?)羅宇等. 操作系統(tǒng)課程設(shè)計(jì). 機(jī)械工業(yè)出版社,2005</

溫馨提示

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

評(píng)論

0/150

提交評(píng)論