计算机操作系统实验四

合集下载

操作系统实验实验报告

操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。

本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。

二、实验环境本次实验使用的操作系统为 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 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() 方法。

其中有四个由实际的低级入口点传递来的参数。

浙江大学操作系统实验A4纸

浙江大学操作系统实验A4纸

LINUX系统是多进程、多用户和交互式的计算环境。

退出系统文本界面下按<Ctrl-D>键或logout命令shutdown shutdown –h 8:00 shutdown –h +3Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。

它接收用户输入的命令并把它送入内核去执行Shell也被称为Linux的命令解释器(command interpreter)Shell命令可以被分为内部命令和外部命令。

1.内部命令是shell本身包含的一些命令,这些内部命令的代码是整个shell代码的一个组成部分;2.内部命令,shell是通过执行自己代码中相应的部分来完成的3.外部命令的代码则存放在一些二进制的可执行文件或者shell 脚本中4.外部命令,shell会到文件系统结构(file system structure)中的一些目录去搜索那些文件名与外部命令的名字相同的文件,因为shell认为这些文件中就存放了将要执行的代码。

Shell 命令搜索路径1.Shell搜索的目录的名字都保存在一个shell变量PATH(在TC shell chsh命令来改变默认登录shell-l选项显示系统可用的shellecho $SHELL /bin/bash passwd修改密码/etc/passwd记录每一个用户的shell程序root:x:0:0:root:/root:/bin/bash[用户名]:[密码]:[UID]:[GID]:[身份描述]:[主目录]:[登录shell]manman -S2 open#选择第二个section1用户命令,2系统调用,3语言函数库调用,4设备和网络界面,5文件格式,6游戏和示范,troff的环境、7表格和宏,8关于系统维护的命令info<Q>退出<Space>滚屏whoam i:显示用户名gzip [opt][filename-list]-d 解压缩文件gzip 1.txt得到1.txt.gz文件gunzip执行解压缩zcat [opt][filename-list]解压文件输出到标准输出设备tar-c 建立备份文件-z压缩/解压一个存档文件-v详细地显示文件处理过程:用功能字母x解压文件的过程或存档文件的过程-f Arch 用Arch作为存档或恢复文件的档案文件-x从磁带中解压(恢复)文件;如果没有指定,默认对整条磁带址的特殊的表;模块所声明的任何全局符号都成为内核符号表的一部分;内核符号表出于内核代码段的_ksymtab,其开始地址和结束地址由C编译器所产生的两个符号来指定:_start_ksymtab和_stop_ksymtab从文件/proc/ksyms中以文本的方式读取内存地址符号名称【所属模块】模块引用计数:计数器存放在module对象的ecount域;当开始执行模块操作时,递增计数器;在操作结束时,递减这个计数器;维护三个宏__MOD_INC_USE_COUNT模块计数+1__MOD_DEC_USE_COUNT模块计数-1__MOD_IN_USE 计数非0时返回真;计数器的值为0时,可以卸载这个模块;计数器的当前值可以在/proc/modules(lsmod)中每一项的第三个域找到模块依赖:一个模块A引用另一个模块B所到处的符号存储管理保护模式下i386提供虚拟存储器的硬件机制i386的地址转换机制:地址总线32(36)位,物理内存4(64)GB;指令系统提供的逻辑地址为48位,虚地址空间64T虚拟内存(4G),内核空间(最高的1G字节由所有进程共享,存放内核代码和数据)和用户空间(较低的3G字节存放用户程序的代码和数据),每个进程最大拥有3G字节私有虚存空间;地址转换(通过页表把虚存空间的一个地址转换为物理空间中的实际地址) 进程用户空间的管理每个程序经编译、链接后形成的二进制映像文件有一个代码段和数据段进程运行是须有独占的堆栈空间进程用户空间linux把进程的用户空间划分为一个个区间,便于管理;一个进程的用户地址空间按主要由mm_struct和vm_area_structts结构来描述;mm_struct结构对进程整个用户空间进行描述;vm_area_structs结构对用户空间中各个区间(简称虚存区)进行描述mm_struct结构首地址在task_struct成员项mm中:struct mm_struct*mminclude/linux/sched.ccount(对mm_struct结构的引用进行计数。

计算机操作系统作业4(含答案)

计算机操作系统作业4(含答案)

一、单项选择题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.}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三进程与线程问题:
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位,具有动态性、并发性、独立性、异步性和交互性。

然而程序是静态的,并且进程与程序的组成不同,进程=程序+数据+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、理解进程的独立空间的实验内容及步骤
Y
(1,对其进行循环加/减操作,并输出每次操作后的结果;
源程序如下所示:
运行结果如图所示:
(2) 使用系统调用 fork ()创建子进程,观察该变量的变化;
在(1)的基础上修改源码,增加多进程部分代码:
结果:
与(1) 的运行结果不同,多进程情况下,子进程拷贝了父进程的内存区,因此父子进程有各自的内存空间,有各自的变量,互不影响。

父子进程从fork 语句开始分开执行,且一般情况下,父子进程会争夺系统资源,谁先占用资源,谁先执行
(3) 修改程序把 shared 变量定义到 main ()函数之外,重复第(2)步操作,观察该
变量的变化。

结果截图:
和(2)的运行结果相同;
说明父子进程有各自的内存空间,有各自的变量,独立运行。

在多进程情况下,不管是局部变量还是全局变量,父子进程都会有各自的一份拷贝,从而独立运行。

3、理解线程的实验步骤
流程图如下所示:
(1)
是如何与主线程并发运行的。

输出每次操作后的结果;代码截图:
结果截图:
多次运行程序,可以看到会有不同的结果出现;
原因:多个线程是并发执行的,相互独立运行的,多次执行结果可能不相同。

(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操作;。

相关文档
最新文档