操作系统课程设计

上传人:ca****in 文档编号:113136593 上传时间:2022-06-24 格式:DOCX 页数:15 大小:132.76KB
返回 下载 相关 举报
操作系统课程设计_第1页
第1页 / 共15页
操作系统课程设计_第2页
第2页 / 共15页
操作系统课程设计_第3页
第3页 / 共15页
点击查看更多>>
资源描述
目录第一章基本原理21.1 进程的引入和定义21.2 进程的特征21.3 进程的控制31.4 进程的调度41.5 进程互斥与同步4第二章 功能描述52.1 功能描述52.2 详细描述5第三章 界面操作6第四章 功能实现84.1流程图894.2代码解析9第五章 实验心得15第一章基本原理资源共享、程序并发执行是现代操作系统的重要特征,而进程则是操作系统中独立运行的动态实体,同时又是申请资源和分配资源的基本单位。这个分配资源的基本单位和动态实体被称为“进程”(Process)。1.1 进程的引入和定义1单道程序与顺序执行系统每次只允许一道程序运行,在运行期间,该程序将独占整个计算机系统资源,且系统按照程序规定的步骤顺序地执行,在该程序执行完之前,其它程序只能等待。顺序执行的特点:顺序性、封闭性和可再现性。顺序执行使系统管理简单,程序编制调试都很容易,但系统资源利用率低。2. 多道程序与并发执行系统允许多个程序交替执行,一道程序不用CPU时,另一道程序就马上使用,这种交替执行在宏观上表现为同时执行,这就是程序的并发性,其目的可大大提高处理器的利用率。并发执行的特点:异步性、竞争性、失去可再现性。3. 概念的引入在单用户、单任务操作系统中,所有计算机资源在某一时刻只能为一个任务(程序)所占有,如有多个任务,它们只能顺序执行,不存在资源共享问题。但是在多任务的操作系统中,则允许多个任务并发运行,如在Windows操作系统的PC机上,用户可以一边编程,一边欣赏音乐,这对于运行在DOS系统的PC机来讲只能望洋兴叹。这就在于计算机资源分配单位的进程与程序的不同。4进程的定义进程(process)是执行中的程序,这个程序是一个具有一定独立功能的程序。归纳为:进程是一个具有独立功能的、可并发执行的程序关于某个数据集合上的一次动态执行过程。1.2 进程的特征 动态性进程是一个运行过程,它具有生命周期,一个由产生到消亡的过程。进程具有动态的地址空间,因资源分配等而使地址空间的大小和内容都动态变化。地址空间的内容包括代码(指令执行和处理器状态的改变)、数据(变量的生成和赋值)和系统控制信息(进程控制块的生成和删除)。 独立性进程是一个可以独立运行的基本单位。各进程的地址空间相互独立,除非采用进程间的通讯,否则不能相互影响。 并发性也称异步性,指从宏观上看,多个进程能在同一时间段内同时运行,它们轮流占有CPU和各种资源。 结构化进程地址空间均为结构划分,如代码段、数据段和核心段。进程和程序是两个相关的不同概念,它们在以下几个方面存在区别和联系。进程是动态的,程序是静态的。进程会因条件的变化而发生状态的改变。程序是有序代码的集合;进程是程序的执行。进程通常不可以在计算机之间迁移;而程序通常可以复制。进程是暂时的,程序是永久的。进程是一个状态变化的过程,程序则可长久保存。进程与程序的组成不同,进程包括程序、数据和进程控制块。进程与程序是密切相关的。通过多次执行,一个程序可以对应多个进程;通过调用关系,一个进程可以包括多个程序。进程可创建另一个进程,而程序并不能形成新的程序。1.3 进程的控制操作系统对进程的控制是依据用户命令和系统状态来决定的。进程控制的功能是创建和撤消进程,完成进程状态的转换。进程控制程序属于操作系统的内核程序。1. 原语概念一条原语由若干条机器指令组成,是机器指令的延伸,能完成一个特定的功能,是一种特殊的系统调用命令。它的特点是执行时不可中断,且不允许原语并发执行,即原子性。对系统中所有进程的生命历程进行控制的原语称为进程控制原语,与进程控制有关的操作原语有:创建原语(create)、停止原语(halt)、挂起原语(sus-pend)、激活原语(activate)、阻塞原语(block)、唤醒原语(wakeup)等基本原语。2内核概念内核是系统的控制和协调的中心,在管态下运行。它的基本功能可以归结为以下三条: 中断处理。中断处理是操作系统内核的基本功能,是整个操作系统赖以活动的基础,如进程调度、设备驱动、文件操作以及程序并发等,都由中断进行驱动。 进程管理。 进程管理包括进程的创建和撤消、进程状态的转换、进程调度以及控制进程的并发执行。 资源管理的基本操作。资源管理的基本操作包括时钟管理、设备管理,以及对文件系统进行基本控制和驱动。3. 线程的概念在操作系统中引入进程的目的,是为了使多个任务并发,以提高资源利用率,那么在操作系统中再引入线程的目的,则主要是为了提高系统的执行效率,减小并发执行的时间和调度切换时间,使操作系统具有更好的并发性。进程是一个资源拥有者,因而,在进程的创建、撤消和切换中,系统必须为之付出较大的时间开销。如果将资源分配和处理器调度放在不同的活动实体中,也就是把进程所占资源与进程中的运行代码分离,那么在一个地址空间中便可运行多个指令流,这样就产生了线程。线程是进程中一个可独立调度的实体。它的优点体现在以下几个方面: 线程的创建时间比进程短; 线程的终止时间比进程短; 同进程内的线程切换时间比进程短; 由于同进程内的线程共享内存和文件资源,因此可直接进行不通过内存的通信。1.4 进程的调度在多道程序环境下,一旦为用户作业建立了进程并装入到内存,则多个进程就要共享处理器资源,这就必然会引起对处理器的竞争。进程调度的主要任务就是按照一定的策略动态地把处理器分配给就绪队列中的某个进程,以实现进程在就绪和执行状态间的转换,直到该进程完成为止。1.5 进程互斥与同步进程互斥是指由于共享资源所要求的排他性,进程间要相互竞争,以使用这些共享资源。进程互斥的解决办法有两种,一是由竞争各方平等协商;二是引入进程管理者,由管理者来协调竞争各方对互斥资源的使用。操作系统中实现进程互斥和同步的机制都称为同步机构。通常采用“锁”和“信号量”的机制。一个控制这些同步机构的程序被称为同步原语。同步一般是指两个事件的发生有着某种时序上的关系,进程同步是指系统中的几个进程为共同完成一个任务而产生的相互合作、协同运行关系。把一组并发进程因直接制约而互相发送消息,互相合作,互相等待,使得各进程按一定的速度执行的过程叫做进程间的同步。进程同步同样可以用P、V操作来实现。第二章 功能描述2.1 功能描述 该程序实现的是的进程,获取进程,更新,显示进程的信息。显示进程中的线程信息ID和优先级。2.2 详细描述当启动该程序时,便会出现图 2-1所示的窗口。ProcessInfo首先枚举目前正在运行的一组进程,并在顶部的组合框中列出每个进程的名字和ID。然后,第一个进程被选定,并在较大的编辑控件中显示关于该进程的信息。可以看到,与该进程的ID一道显示的还有它的父进程的 ID,进程的优先级类,以及该进程环境中当前正在运行的线程数目。当查看这个进程列表时,可以使用 VMMap菜单项(当查看模块信息时,该菜单项禁用)。如果选定 VMMap菜单项,可使 VMMap示例应用程序启动运行。该应用程序将在指定进程的地址空间中运行。模块信息部分显示了映射到进程的地址空间中的模块的列表(可执行文件和 DLL文件)。固定模块是指进程初始化时隐含加载的模块。如果是显式加载的 DLL模块,则显示 DLL的使用计数。第二个域显示映射模块的地址。如果模块不是在它的首选基地址上映射的,那么首选基地址显示在括号中。第三个域显示模块的大小(用字节数表示)。最后显示的是模块的全路径名。线程信息部分显示了该进程中当前运行的一组线程。每个线程 ID和优先级均被显示。除了进程信息外,可以选择 Modules!菜单项。这将使得 ProcessInfo能够枚举当前通过系统加载的模块,并将每个模块的名字放入顶部的组合框。然后 ProcessInfo可以选定第一个模块,并显示关于它的信息,如图2-2所示。第三章 界面操作界面显示 1 启动exe :显示下面界面 图2-12选择 Modules!菜单项。 ProcessInfo能够枚举当前通过系统加载的模块,并将每个模块的名字放入顶部的组合框。如下图所示:图2-2第四章 功能实现显示文本框中的内容4.1流程图 更新列表显示内容获取控制句柄获取进程加载模块信息显示进程的信息线程信息ID和优先级 遍历进程(循环)4.2代码解析部分一:显示大文本框中的内容void AddText(HWND hwnd, PCTSTR pszFormat, .) va_list argList; /是在C语言中解决变参问题的一组宏 va_start(argList, pszFormat); /*VA_START宏初始化变量刚定义的VA_LIST变量,/这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。*/ TCHAR sz20 * 1024; Edit_GetText(hwnd, sz, chDIMOF(sz);/chDIMOF是一个宏#definechDIMOF(Array)(sizeof(Array)/sizeof(Array0) _vstprintf(_tcschr(sz, 0), pszFormat, argList); /格式化字符串到指定内存位置_tcschr(sz,0)sz中有以0为ASCII的字符的位置,/pszFormat为格式,argList可变参数列表 Edit_SetText(hwnd, sz); va_end(argList);/VA_END宏结束可变参数的获取。然后就可以在函数里使用第二个参数了。/如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。部分二:更新列表显示内容VOID Dlg_PopulateProcessList(HWND hwnd) HWND hwndList = GetDlgItem(hwnd, IDC_PROCESSMODULELIST); /通过资源ID获取列表框句柄 SetWindowRedraw(hwndList, FALSE);/禁止重绘ComboBox_ResetContent(hwndList); /CB_RESETCONTENT此消息清空列表所有项 CToolhelp thProcesses(TH32CS_SNAPPROCESS); /包含了全部系统进程信息 PROCESSENTRY32 pe = sizeof(pe) ; /PROCESSENTRY32进程入口点信息 BOOL fOk = thProcesses.ProcessFirst(&pe); /将第一个进程的入口点信息存入pe for (; fOk; fOk = thProcesses.ProcessNext(&pe) /遍历所有进程 TCHAR sz1024; / Place the process name (without its path) & ID in the list /返回文件名所在位置的指针 PCTSTR pszExeFile = _tcsrchr(pe.szExeFile, TEXT(); if (pszExeFile = NULL) pszExeFile = pe.szExeFile; /只有文件名没路径的情况下上一句返回空指针 else pszExeFile+; / Skip over the slash如果是全路径的话需要去掉文件名前的斜线 wsprintf(sz, TEXT(%s (0x%08X), pszExeFile, pe.th32ProcessID); /格式化到字符串 int n = ComboBox_AddString(hwndList, sz); /为列表框添加一个选项文字返回值是从0开始的索引 ComboBox_SetItemData(hwndList, n, pe.th32ProcessID); /设置列表框该条记录的值为th32ProcessID方便程序访问value ComboBox_SetCurSel(hwndList, 0); / Select the first entry设置默认显示的值 FORWARD_WM_COMMAND(hwnd, IDC_PROCESSMODULELIST, hwndList, CBN_SELCHANGE, SendMessage); /当用户在listboxofacombobox中改变选择项时Windows将会发送WPARM/高位为CBN_SELCHANGE的WM_COMMAND消息 SetWindowRedraw(hwndList, TRUE); /设置列表为可重绘状态 InvalidateRect(hwndList, NULL, FALSE); /使客户区域无效为了发送WM_Parint重绘列表框部分三:获取句柄和资源IDVOID Dlg_PopulateModuleList(HWND hwnd) HWND hwndModuleHelp = GetDlgItem(hwnd, IDC_MODULEHELP); /根据父窗口句柄和资源ID获取控件句柄 ListBox_ResetContent(hwndModuleHelp); CToolhelp thProcesses(TH32CS_SNAPPROCESS); /禁止窗体重绘 PROCESSENTRY32 pe = sizeof(pe) ; /获取第一个进程入口点信息存入pe BOOL fOk = thProcesses.ProcessFirst(&pe); for (; fOk; fOk = thProcesses.ProcessNext(&pe) 部分四:进程加载模块信息 CToolhelp thModules(TH32CS_SNAPMODULE, pe.th32ProcessID); MODULEENTRY32 me = sizeof(me) ; /定义模块入口点信息并初始化长度 BOOL fOk = thModules.ModuleFirst(&me); /获取该进程第一个模块入口点信息并/存入me for (; fOk; fOk = thModules.ModuleNext(&me) /循环获取模块入口点信息 /在列表中查找当前模块信息是否已经被添加 int n = ListBox_FindStringExact(hwndModuleHelp, -1, me.szExePath); if (n = LB_ERR) / This module hasnt been added before /模块信息还未被添加则添加 ListBox_AddString(hwndModuleHelp, me.szExePath); HWND hwndList = GetDlgItem(hwnd, IDC_PROCESSMODULELIST); /获取进程列表框句 SetWindowRedraw(hwndList, FALSE); /设置进程列表框为不可重绘 ComboBox_ResetContent(hwndList); int nNumModules = ListBox_GetCount(hwndModuleHelp); /获取当前所有已添加的模块数量 for (int i = 0; i nNumModules; i+) TCHAR sz1024; ListBox_GetText(hwndModuleHelp, i, sz); /循环获取模块信息存储sz int nIndex = ComboBox_AddString(hwndList, _tcsrchr(sz, TEXT() + 1); /将模块名加入ComboBox ComboBox_SetItemData(hwndList, nIndex, i); /设置索引 / nIndex的值是不确定的/i的作用就是 /规范排序并且将ComboBox与 /IDC_MODULEHELP一一对应 ComboBox_SetCurSel(hwndList, 0); / Select the first entry / Simulate the user selecting this first item so that the / results pane shows something interesting FORWARD_WM_COMMAND(hwnd, IDC_PROCESSMODULELIST, hwndList, CBN_SELCHANGE, SendMessage); SetWindowRedraw(hwndList, TRUE); InvalidateRect(hwndList, NULL, FALSE);部分五:显示进程信息VOID ShowProcessInfo(HWND hwnd, DWORD dwProcessID) SetWindowText(hwnd, TEXT(); /清除显示区域的内容 CToolhelp th(TH32CS_SNAPALL, dwProcessID); /显示进程的信息 PROCESSENTRY32 pe = sizeof(pe) ; BOOL fOk = th.ProcessFirst(&pe); for (; fOk; fOk = th.ProcessNext(&pe) if (pe.th32ProcessID = dwProcessID) AddText(hwnd, TEXT(Filename: %srn), pe.szExeFile); AddText(hwnd, TEXT( PID=%08X, ParentPID=%08X, ) TEXT(PriorityClass=%d, Threads=%d, Heaps=%drn), pe.th32ProcessID, pe.th32ParentProcessID, pe.pcPriClassBase, tThreads, th.HowManyHeaps(); break; / No need to continue looping / 显示Modules / 显示地址用的字符数 const int cchAddress = sizeof(PVOID) * 2; AddText(hwnd, TEXT(rnModules Information:rn) TEXT( Usage %-*s(%-*s) %8s Modulern), cchAddress, TEXT(BaseAddr), cchAddress, TEXT(ImagAddr), TEXT(Size); MODULEENTRY32 me = sizeof(me) ; fOk = th.ModuleFirst(&me); for (; fOk; fOk = th.ModuleNext(&me) if (me.ProccntUsage = 65535) / Module was implicitly loaded and cannot be unloaded /加载方式为隐式加载不能被卸载 AddText(hwnd, TEXT( Fixed); else AddText(hwnd, TEXT( %5d), me.ProccntUsage); /首选的加载地址和现实的加载地址 /首选的放在PE结构中也就是硬盘上 PVOID pvPreferredBaseAddr = GetModulePreferredBaseAddr(pe.th32ProcessID, me.modBaseAddr); if (me.modBaseAddr = pvPreferredBaseAddr) AddText(hwnd, TEXT( %p %*s %8u %srn), me.modBaseAddr, cchAddress, TEXT(), me.modBaseSize, me.szExePath); else AddText(hwnd, TEXT( %p(%p) %8u %srn), me.modBaseAddr, pvPreferredBaseAddr, me.modBaseSize, me.szExePath); 部分六:显示进程中的线程信息ID和优先级 AddText(hwnd, TEXT(rnThread Information:rn) TEXT( TID Priorityrn); THREADENTRY32 te = sizeof(te) ; fOk = th.ThreadFirst(&te); for (; fOk; fOk = th.ThreadNext(&te) /获取线程的时候并不指定进程ID /下面是一段线程优先级的算法 if (te.th32OwnerProcessID = dwProcessID) int nPriority = te.tpBasePri + te.tpDeltaPri; if (te.tpBasePri 15) nPriority = 15; if (te.tpBasePri 15) & (nPriority 31) nPriority = 31; if (te.tpBasePri 16) & (nPriority 15) & (nPriority 16) nPriority = 16; AddText(hwnd, TEXT( %08X %2drn), te.th32ThreadID, nPriority); 部分七:循环遍历进程VOID ShowModuleInfo(HWND hwnd, PCTSTR pszModulePath) SetWindowText(hwnd, TEXT(); /清除显示区域的内容/第一个参数为TH32CS_SNAPPROCESS,第二个参数为默认值0返回全部进程 CToolhelp thProcesses(TH32CS_SNAPPROCESS); PROCESSENTRY32 pe = sizeof(pe) ; BOOL fOk = thProcesses.ProcessFirst(&pe); AddText(hwnd, TEXT(Pathname: %srnrn), pszModulePath); AddText(hwnd, TEXT(Process Information:rn); AddText(hwnd, TEXT( PID BaseAddr Processrn); for (; fOk; fOk = thProcesses.ProcessNext(&pe) /用for循环遍历进程 CToolhelp thModules(TH32CS_SNAPMODULE, pe.th32ProcessID); MODULEENTRY32 me = sizeof(me) ; BOOL fOk = thModules.ModuleFirst(&me); /遍历进程中的每个线程 for (; fOk; fOk = thModules.ModuleNext(&me) if (_tcscmp(me.szExePath, pszModulePath) = 0) AddText(hwnd, TEXT( %08X %p %srn), pe.th32ProcessID, me.modBaseAddr, pe.szExeFile); 第五章 实验心得通过这次对代码的仔细分析,我学到了很多,不仅仅的知识,而且是学习的态度,提高了我的学习兴趣,其中我掌握了窗口管理函数,图形设备函数,系统服务函数,一个Windwos程序一般由头文件、源文件、动态链接库、资源等几部分组成。 15
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!