计算机操作系统实验四
- 格式:docx
- 大小:20.96 KB
- 文档页数:7
windows的实验报告(完整版)实验标题:Windows的实验报告一、实验目的本实验旨在深入了解Windows操作系统的基本原理和功能,并掌握Windows操作系统的安装、配置和使用方法。
二、实验内容1. Windows操作系统的安装通过制作启动盘或使用光盘安装,选择适当的版本和安装选项进行Windows操作系统的安装。
2. Windows操作系统的配置进行系统设置,包括语言和区域设定、时区设定、键盘和鼠标设置等。
3. Windows操作系统的使用掌握Windows操作系统的基本操作,包括桌面管理、文件和文件夹管理、应用程序的安装和卸载、系统设置等。
4. Windows操作系统的网络配置了解并设置Windows操作系统的网络连接,包括有线网络和无线网络的配置。
三、实验步骤1. Windows操作系统的安装按照安装引导界面的指示,选择合适的选项完成安装过程。
注意选择适配的驱动程序并进行相应设置。
2. Windows操作系统的配置在系统设置中,选择适当的语言和区域,设定正确的时区。
根据个人需求,进行键盘和鼠标相关设置。
3. Windows操作系统的使用3.1 桌面管理:了解和使用桌面的基本布局,包括桌面图标的添加、删除、移动等操作。
3.2 文件和文件夹管理:学习使用资源管理器对文件和文件夹进行管理,包括创建、复制、粘贴、删除等操作。
3.3 应用程序的安装和卸载:了解如何通过Windows商店或第三方应用程序进行安装,并学会使用控制面板进行软件的卸载。
3.4 系统设置:掌握系统设置的方法,包括背景壁纸的更换、屏幕分辨率的调整、电源管理等。
4. Windows操作系统的网络配置4.1 有线网络的配置:了解如何通过网线连接计算机和局域网以及设置IP地址、子网掩码等网络参数。
4.2 无线网络的配置:学习如何连接无线网络并进行密码设置,了解无线网络的高级配置选项。
四、实验结果经过以上实验步骤的操作,成功完成了Windows操作系统的安装、配置和使用。
操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
中南大学计算机操作系统实验报告................................................................................................................................................................................................................1、增强学生对计算机操作系统基本原理、基本理论、基本算法的理解;2、提高和培养学生的动手能力。
1、每人至少选作1 题,多做不限;2、每人单独完成,可以讨论,但每人的设计内容不得彻底相同,抄袭或者有2 人/多人设计彻底一样者,不能通过;3、设计完成后,应上交课程设计文档,文档格式应是学校课程设计的标准格式,所有学生的封面大小、格式也必须一样;4、同时上交设计的软盘(或者以班刻录光盘)。
调度算法的摹拟:摹拟各种调度算法,并进行调度性能分析。
摹拟了一个作业调度算法,其中用到了先来先服务算法(FCFS)、短作业优先算法(SJF)、最高响应比优先算法(HRN)三种算法。
如下,分别为三种算法的程序流程图。
图1 - 开始界面图 2 –输入作业的信息(名字、提交时间、运行时间) 图3 –选择算法(FCFS 、SJF、HRN)图4、5 –选择FCFS 算法后输出结果图6、7 –选择SJF 算法后输出结果图8、9 –选择HRN 算法后输出结果能体现公平性;一旦一个较长的作业进入系统后就会长期的占用系统的资源,这样如果有优先级较高的短作业需要执行的话需要等待很长期。
比前者改善了平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;对长作业非常不利,可能长期得不到执行,未能一句作业的紧迫程度来划分执行的优先级,难以准确估计作业的执行时间,从而影响调度性能。
这种算法是对FCFS 方式和SJF 方式的一种综合平衡。
windows操作系统实验报告Windows操作系统实验报告引言:在计算机科学领域,操作系统是一种控制和管理计算机硬件和软件资源的软件。
它是计算机系统中最基本的软件之一,负责协调和管理计算机的各种活动。
Windows操作系统是由微软公司开发的一种广泛使用的操作系统,它具有用户友好的界面和丰富的功能。
本实验报告将介绍Windows操作系统的基本特征、安装过程和常见问题解决方法。
一、Windows操作系统的基本特征1. 多任务处理:Windows操作系统能够同时运行多个程序,使得用户可以在同一时间内进行多个任务。
这种特征大大提高了计算机的效率和使用便捷性。
2. 图形用户界面:Windows操作系统采用了直观的图形用户界面,使得用户可以通过鼠标和键盘进行操作。
用户可以通过点击图标、拖拽文件等方式来执行各种任务,这种界面设计大大降低了用户的学习成本。
3. 文件管理系统:Windows操作系统提供了强大的文件管理系统,用户可以创建、复制、移动和删除文件和文件夹。
此外,用户还可以通过搜索功能快速找到需要的文件。
4. 网络功能:Windows操作系统支持网络连接,用户可以通过网络传输文件、共享资源和访问远程计算机。
这种功能使得用户可以方便地进行远程办公和文件共享。
二、Windows操作系统的安装过程Windows操作系统的安装过程相对简单,以下是一般的安装步骤:1. 准备安装介质:首先,需要准备Windows操作系统的安装光盘或USB安装盘。
确保安装介质是正版和可靠的。
2. BIOS设置:进入计算机的BIOS设置界面,将启动顺序设置为从光盘或USB 设备启动。
保存设置并重启计算机。
3. 安装过程:计算机重新启动后,按照屏幕上的提示选择语言、时区和键盘布局等选项。
然后,选择安装类型和磁盘分区方式。
最后,等待安装过程完成。
4. 配置系统:安装完成后,系统会要求设置用户名和密码等信息。
此外,还可以选择安装必要的驱动程序和常用软件。
篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++6.0企业版。
三、实验内容和步骤第一部分:程序1-1windows 2000 的gui 应用程序windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。
:: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ;/* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ )return(0) ; }在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。
这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。
这一指令是visual studio c++ 编译器特有的。
接下来是winmain() 方法。
其中有四个由实际的低级入口点传递来的参数。
一、单项选择题1.时钟中断是属于______。
A.硬件故障中断 B.程序中断 C. I/O中断 D.外部中断2.在一个计算机系统中,特权指令______下执行。
A.只能在核心态 B.只能在用户态C.可在核心态,也可在用户态 D.不能在核心态,也不能再用户态3. 空白文件目录法用于______。
A.主存空间的管理 B.文件存储空间的管理C.虚存空间的管理 D.外设的分配与回收4. 采用SPOOLing技术后,使得系统资源______。
A.利用率提高了 B.利用率降低了C.利用率有时提高有时降低 D.出错的机会增加了5. 文件系统的主要目的是______。
A.实现对文件的按名存取 B.实现虚拟存储C.提高外存的读写速度 D.用于存储系统文件6. 为了解决不同用户文件的“命名冲突”问题,通常在文件系统中采用______。
A.约定的方法 B.多级目录 C.路径 D.索引7. 操作系统中______采用了以空间换时间的技术。
A. SPOOLing技术 B.覆盖技术 C.通道技术 D.虚拟存储技术8. 对磁盘进行磁头调度的目的是为了缩短______时间。
A.寻道 B.旋转 C.传送 D.启动9. 加密保护和访问控制两种机制相比______。
A.加密保护机制的灵活性更好 B.访问控制机制的安全性更高C.加密保护机制必须由系统实现 D.访问控制机制必须由系统实现10.在文件系统中引入“当前目录”的主要目的是______。
A.方便用户 B.提高系统性能 C.增强系统安全性 D.支持共享文件11.在磁盘调度算法中叙述正确的是______。
A.SSTF算法性能最好B.磁盘调度算法的性能与队列中请求服务的数目无关C.对I/O队列中的服务请求进行干预处理有利于提高C-LOOK算法的性能D.C-SCAN算法适用于磁盘负载较小的系统12.位示图用于______。
A.页面置换 B.磁盘空间管理 C.文件目录查找 D.磁盘驱动调度13. 在下列有关旋转延迟的叙述中,不正确的是______。
实验报告实验课程: 计算机操作系统学生姓名:XXX学号:XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程 (3)实验二进程调度 (7)实验三死锁避免—银行家算法的实现 (16)实验四存储管理 (22)实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。
2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。
4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论 explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。
四、心得体会通过本次实验,我了解到了windows系统中进程的管理与操作,我了解了如何切出任务管理器,任务管理器应用与其他与进程相关的知识,明白了有些系统程序不能够关闭,系统中的进程与线程虽然很多,但是其中有许多关联,只要弄清楚其中的关联那么就能够运用好进程与线程,达到我们的目的。
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
图4-1 Lab4_1运行结果讨论:如输入磁盘号为C,显示的磁盘信息是整个硬盘信息,而不是C盘分区的信息。
如输入磁盘号为D,显示的磁盘信息与如输入磁盘号为C显示的磁盘信息相同。
用磁盘I/O API函数读出的磁盘信息是从硬盘的主引导区得到。
六、实验心得体会通过本次实验,我了解了磁盘的物理组织,不同磁盘不同的物理构造,如SSD和HDD,了解了其特点,以及如何通过用户态的程序直接调用磁盘I/O API函数(DeviceIoControl),使程序可以根据输入的驱动器号读取驱动器中磁盘的基本信息。
本次实验调试过程的前半段,我是使用Windows 10进行的,遇到了一些类型转化以及无输出的问题,纠结了很久没有弄出来,但是在Windows Server 2016中,没有任何问题,可以直接运行。
以后调试程序应尽量在目标机器上调试,防止出现问题。
附录程序清单清单4-11.#include <windows.h>2.#include <iostream>ing namespace std;4.#include <winioctl.h>5.#include <string.h>6.7.struct Disk //关于 Disk 结构的定义8.{9.HANDLE handle;10. DISK_GEOMETRY disk_info;11.};12.13.Disk disk;14.HANDLE Floppy;15.static _int64 sector;16.bool flag;17.Disk physicDisk(char driverLetter);18.19.void main(void)20.{21.char DriverLetter;22. cout << "请输入磁盘号:a/c" << endl;23. cin >> DriverLetter;//选择要查看的磁盘24. disk = physicDisk(DriverLetter);25.}26.27.Disk physicDisk(char driverLetter) //28.{29. flag = true;30. DISK_GEOMETRY* temp = new DISK_GEOMETRY;31.char device[9] = "\\\\.\\c:";32. device[4] = driverLetter;33. Floppy = CreateFile(device, //将要打开的驱动器名34. GENERIC_READ, //存取的权限35. FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享的权限36. NULL, //默认属性位37. OPEN_EXISTING, //创建驱动器的方式38. 0, //所创建的驱动器的属性39. NULL); //指向模板文件的句柄40.if (GetLastError() == ERROR_ALREADY_EXISTS) //如打开失败,返回错误代码41. {42. cout << "不能打开磁盘" << endl;43. cout << GetLastError() << endl;44. flag = false;45.return disk;46. }47.48.DWORD bytereturned;49.BOOL Result;50. disk.handle = Floppy;51. Result = DeviceIoControl(Floppy,52. IOCTL_DISK_GET_DRIVE_GEOMETRY,53. NULL,54. 0,55. temp,56.sizeof(*temp),57. &bytereturned,58. (LPOVERLAPPED)NULL);59.if (!Result) //如果失败,返回错误代码60. {61. cout << "打开失败" << endl;62. cout << "错误代码为:" << GetLastError() << endl;63. flag = false;64.return disk;65. }66.67. disk.disk_info = *temp;//输出整个物理磁盘的信息68. cout << driverLetter << "盘有: " << endl;69. cout << "柱面数为:" << (unsigned long)disk.disk_info.Cylinders.QuadPart << endl;70. cout << "每柱面的磁道数为:" << disk.disk_info.TracksPerCylinder << endl;71. cout << "每磁道的扇区数为:" << disk.disk_info.SectorsPerTrack << endl;72. cout << "每扇区的字节数为:" << disk.disk_info.BytesPerSector << endl;73. sector = disk.disk_info.Cylinders.QuadPart * (disk.disk_info.TracksPerCylinder) * (disk.disk_info.SectorsPerTrack);74.double DiskSize = (double)disk.disk_info.Cylinders.QuadPart * (disk.disk_info.TracksPerCylinder) * (disk.disk_info.SectorsPerTrack) * (disk.disk_info.BytesPerSector);75. cout << driverLetter << "盘所在磁盘总共有" << (long)sector << "个扇区" << endl;76. cout << "磁盘大为:" << DiskSize / (1024 * 1024) << "MB " << endl;77.delete temp;78.return disk;79.}。
实验四操作系统存储管理实验报告一、实验目的本次实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收、页面置换算法等关键概念,并能够分析和解决存储管理中可能出现的问题。
二、实验环境本次实验在装有 Windows 操作系统的计算机上进行,使用了 Visual Studio 等编程工具和相关的调试环境。
三、实验内容(一)内存分配与回收算法实现1、首次适应算法首次适应算法从内存的起始位置开始查找,找到第一个能够满足需求的空闲分区进行分配。
在实现过程中,我们通过建立一个空闲分区链表来管理内存空间,每次分配时从表头开始查找。
2、最佳适应算法最佳适应算法会选择能够满足需求且大小最小的空闲分区进行分配。
为了实现该算法,在空闲分区链表中,分区按照大小从小到大的顺序排列,这样在查找时能够快速找到最合适的分区。
3、最坏适应算法最坏适应算法则选择最大的空闲分区进行分配。
同样通过对空闲分区链表的排序和查找来实现。
(二)页面置换算法模拟1、先进先出(FIFO)页面置换算法FIFO 算法按照页面进入内存的先后顺序进行置换,即先进入内存的页面先被置换出去。
在模拟过程中,使用一个队列来记录页面的进入顺序。
2、最近最久未使用(LRU)页面置换算法LRU 算法根据页面最近被使用的时间来决定置换顺序,最近最久未使用的页面将被置换。
通过为每个页面设置一个时间戳来记录其最近使用的时间,从而实现置换策略。
3、时钟(Clock)页面置换算法Clock 算法使用一个环形链表来模拟内存中的页面,通过指针的移动和页面的访问标志来决定置换页面。
四、实验步骤(一)内存分配与回收算法的实现步骤1、初始化内存空间,创建空闲分区链表,并为每个分区设置起始地址、大小和状态等信息。
2、对于首次适应算法,从链表表头开始遍历,找到第一个大小满足需求的空闲分区,进行分配,并修改分区的状态和大小。
3、对于最佳适应算法,在遍历链表时,选择大小最接近需求的空闲分区进行分配,并对链表进行相应的调整。
实验三进程与线程
问题:
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位,具有动态性、并发性、独立性、异步性和交互性。
然而程序是静态的,并且进程与程序的组成不同,进程=程序+数据+PCB,进程的存在是暂时的,程序的存在是永久的;一个程序可以对应多个进程,一个进程可以包含多个程序。
当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,线程成为系统调度的单位,与同一个进程中的其他线程共享程序空间。
本次实验主要的目的是:
(1)理解进程的独立空间;
(2)加深对进程概念的理解,明确进程和程序的区别;
(3)进一步认识并发执行的实质;
(4)了解红帽子(Linux)系统中进程通信的基本原理。
(5)理解线程的相关概念。
要求:
1、请查阅资料,掌握进程的概念,同时掌握进程创建和构造的相关知识和线程创
建和构造的相关知识,了解C语言程序编写的相关知识;
(1)进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程的概念主要有两点:第一,进程是一个实体。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数
据区域(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
(2)进程的创建和构造:
进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。
但是进程是一个动态的实体,它是程序的一次执行过程。
进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。
新的进程通过克隆旧的程序(当前进程)而建立。
fork() 和clone()(对于线程)系统调用可用来建立新的进程。
(3)线程的创建和构造:
线程也称做轻量级进程。
就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。
但是,与独立的进程相比,进程中的线程之间的独立程度要小。
它们共享内存、文件句柄和其他每个进程应有的状态。
线程的出现也并不是为了取代进程,而是对进程的功能作了扩展。
进程可以支持多个线程,它们看似同时执行,但相互之间并不同步。
一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。
尽管这让线程之间共享信息变得更容易,但你必须小心,确保它们不会妨碍同一进程里的其他线程。
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。
所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小得多,正因如此,线程也被称为轻型进程(light-weight process)。
一个进程中可以包含多个线程。
2、理解进程的独立空间的实验内容及步骤
(1)编写一个程序,在其main()函数中定义一个变量shared,对其进行循环加/减操作,并输出每次操作后的结果;
源程序如下所示:
运行结果如图所示:
(2)使用系统调用fork()创建子进程,观察该变量的变化;
在(1)的基础上修改源码,增加多进程部分代码:
结果:
与(1)的运行结果不同,多进程情况下,子进程拷贝了父进程的内存区,因此父子进程有各自的内存空间,有各自的变量,互不影响。
父子进程从fork语句开始分开执行,且一般情况下,父子进程会争夺系统资源,谁先占用资源,谁先执行(3)修改程序把shared变量定义到main()函数之外,重复第(2)步操作,观察该变量的变化。
结果截图:
和(2)的运行结果相同;
说明父子进程有各自的内存空间,有各自的变量,独立运行。
在多进程情况下,不管是局部变量还是全局变量,父子进程都会有各自的一份拷贝,从而独立运行。
3、 理解线程的实验步骤
流程图如下所示:
(1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该线程是如何与主线程并发运行的。
输出每次操作后的结果;
代码截图:
结果截图:
多次运行程序,可以看到会有不同的结果出现;
原因:多个线程是并发执行的,相互独立运行的,多次执行结果可能不相同。
(2)在main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在main()中和新线程shared进行循环加/减操作,观察该变量的
变化;
代码截图:
结果截图:
分析:程序中两个进程都对shared变量产生影响,从而使shared的值在重复0和1。
原因:在多个线程中均可使用,说明多个线程共享了一块存储区,从而验证了这多个线程共享了同一进程块。
(3)修改程序把shared变量定义到main()函数之内,重复第(2)步操作,观察该变量的变化。
直接把全局变量shared改成局部定义,其它的保持不变直接编译出现错误;
代码:
当shared为全局变量时,程序可以正常执行,说明了shared在共享的进程块中,而不是某个线程所独占;然而此时,shared只是改为局部变量,编译时出现错误,不能继续进行操作,需要改动程序,通过传递指针变量消除错误,继续运行。
4. 编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程
显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果(多次运行,查看结果是否有变化),并分析原因;
多次执行的话,a/b/c的显示顺序不一定,取决于进程的调度时机:
P1和父进程执行先后次序随机
1)执行p1进程时,先输出‘b’;执行到语句
2)执行父进程时,当执行到语句P2 = fork ( )时,如果创建新进程成功,则又出现一个新进程,即子进程(记为p2),父进程仍然存在。
P2 = fork ( )语句执行完之后,p2和父进程执行先后次序随机。
此时执行p2时,输出‘c’;父进程会输出‘a’。
5、修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象(多次运行,查看结果是否有变化),并分析原因;
结果:
字符串内部字符的数字不会改变;
分析:由于函数printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。
但是, 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
这与打印单字符的结果相同
6、如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象;
代码:
结果:
分析:lockf ( 1, 1, 0 )锁定标准输出设备,lockf ( 1, 0, 0 )解锁标准输出设备,在lockf ( 1, 1, 0 )与lockf ( 1, 0, 0 )中间的for循环输出不会被中断,加锁与不加锁效果不相同。
7、分析总结
(1)对于fork()语句的使用还是不够熟练和清楚;
(2)注意shared 的全局性和局部性,而且在作为局部变量时,应注意
print_thread_id()函数和pthread_create()函数的使用,因为后者的第四个参数是指针型变量,故在传递shared的值时应注意指针的使用;
(3)vi操作;。