操作系统 实验四
操作系统 课程实验-实验四页式虚拟存储管理中地址转换和缺页中断
实验四页式虚拟存储管理中地址转换和缺页中断一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断。
二、实验预备知识页式存储管理中地址转换的方法;页式虚拟存储的缺页中断处理方法。
三、实验内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存64KB,每个主存块1024字节,作业最大支持到64KB,系统中每个作业分得主存块4块。
四、提示与讲解页式存储管理中地址转换过程很简单,假定主存块的大小为2n字节,主存大小为2m'字节和逻辑地址m位,则进行地址转换时,首先从逻辑地址中的高m-n位中取得页号,然后根据页号查页表,得到块号,并将块号放入物理地址的高m'-n位,最后从逻辑地址中取得低n位放入物理地址的低n位就得到了物理地址,过程如图6所示。
逻辑地址图6 页式存储管理系统地址转换示意图地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程,模拟地址转换的流程如图7所示(实验中假定主存64KB,每个主存块1024字节,即n=10,m'=16,物理地址中块号6位、块内地址10位;作业最大64KB,即m=16,逻辑地址中页号6位、页内地址10位)。
在页式虚拟存储管理方式中,作业信息作为副本放在磁盘上,作业执行时仅把作业信息的部分页面装入主存储器,作业执行时若访问的页面在主存中,则按上述方式进行地址转换,若访问的页面不在主存中,则产生一个“缺页中断”,由操作系统把当前所需的页面装入主存储器后,再次执行时才可以按上述方法进行地址转换。
页式虚拟存储管理方式中页表除页号和该页对应的主存块号外,至少还要包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和修改标志(该页是否修改过)。
操作系统实验04 Linux 多进程编程
《操作系统》实验报告实验序号:实验四实验项目名称:实验04 Linux 多进程编程学号1207022103 姓名陈华荣专业、班网络工程实验地点实1-311 指导教师李桂森实验时间2014.10.26一、实验目的及要求1.通过本实验的学习,使学生掌握Linux多进程编程的基本方法。
2.实验内容:利用Linux多进程实现题目所要求的功能。
3.以学生自主训练为主的开放模式组织教学二、实验设备(环境)及要求PC机三、实验内容与步骤1、编写一个显示“HELLO”的c语言程序,并利用GCC编译,然后运行此程序。
(提示:若没有gcc,需先安装gcc编译程序)指令:Apt-get install updateApt-get install gccCd /home/normaluesrTouch helloworld.cVim helloeorld.c在helloworld里编辑进:#include<stdio.h>Int main(){Printf(“helloworld”);Return 0;}然后用gcc进行编译运行:或者直接2、进程的创建:编制一程序,利用系统调用fork()创建两个子进程。
程序运行时,系统中有一个父进程和两个子进程活动,分别让他们显示“A”、“B”和“C”,分析程序运行结果。
3、用ctrl+alt+F2切换到第二个终端(tty2)并使用另外一个用户登录(可利用第二个实验创建的用户登录),然后使用who命令查看用户登录情况。
用ctrl+alt+F1切换到第二个终端(tty1),修改第二步的程序,在每个进程退出前都加上一个sleep(20)的函数来延缓进程的退出,然后运行此程序,立即切换到tty2,使用ps -a命令查看系统运行的进程,观察程序创建的进程都有哪些?pid是多少?4、进程的管道通信:编制一程序,使用系统调用pipe()建立一管道,两个子进程P1和P2分别向管道各写一句话,父进程则从管道中读取出来并显示在屏幕。
操作系统原理实验四
实验4 进程控制1、实验目的(1)通过对WindowsXP进行编程,来熟悉和了解系统。
(2)通过分析程序,来了解进程的创建、终止。
2、实验工具(1)一台WindowsXP操作系统的计算机。
(2)计算机装有Microsoft Visual Studio C++6.0专业版或企业版。
3、预备知识(3)·CreateProcess()调用:创建一个进程。
(4)·ExitProcess()调用:终止一个进程。
4、实验编程(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。
阅读该程序,完成实验任务。
源程序如下:# include < stdio.h ># include < windows.h >int main(VOID)﹛STARTUPINFO si;PROCESS INFORMA TION pi;ZeroMemory(&si,sizeof(si));Si.cb=sizeof(si);ZeroMemory(&pi,sizeof(pi));if(!CreateProcess(NULL,“c: \ WINDOWS\system32\ mspaint.exe”,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))﹛fprintf(stderr,”Creat Process Failed”);return—1;﹜WaitForSingleObject(pi.hProcess,INFINITE);Printf(“child Complete”);CloseHandle(pi.hProcess);CloseHandle(pi hThread);﹜在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:C:\ >CL 4-1.cpp实验任务:写出程序的运行结果。
操作系统实验四设备管理
图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.列出你的系统中当前运行的所有进程ps ax,并解释bash进程的各项信息的含义(不包括RSS和SHR)。
2.分别从至少三个虚拟终端登录ctrl+alt+f1或者+f2或者+f3,以树状形式列出你的系统中当前运行的所有进程及其PID。
找出你当前运行进程的所有祖先进程,并说明其各自的作用。
分析Linux系统中的进程的家族关系。
Ctrl+alt+f1init(1)-+-NetworkManager(663)-+-dhclient(829)| |-dnsmasq(1120)| |-{NetworkManager}(697)| `-{NetworkManager}(832)|-accounts-daemon(1291)---{accounts-daemon}(1299) |-acpid(1092)|-anacron(1091)|-aptd(2550)|-atd(1097)|-avahi-daemon(679)---avahi-daemon(688)|-bamfdaemon(2302)-+-{bamfdaemon}(2303)| `-{bamfdaemon}(2304)|-bluetoothd(631)|-colord(723)-+-{colord}(757)| `-{colord}(1043)|-console-kit-dae(1346)-+-{console-kit-dae}(1355)| |-{console-kit-dae}(1356) | |-{console-kit-dae}(1357) | |-{console-kit-dae}(1358) | |-{console-kit-dae}(1359) | |-{console-kit-dae}(1360) | |-{console-kit-dae}(1362) | |-{console-kit-dae}(1363) | |-{console-kit-dae}(1364) | |-{console-kit-dae}(1365) | |-{console-kit-dae}(1366)| |-{console-kit-dae}(1368) | |-{console-kit-dae}(1369) | |-{console-kit-dae}(1370) | |-{console-kit-dae}(1371) | |-{console-kit-dae}(1372) | |-{console-kit-dae}(1373) | |-{console-kit-dae}(1374) | |-{console-kit-dae}(1375) | |-{console-kit-dae}(1376) | |-{console-kit-dae}(1377) | |-{console-kit-dae}(1378) | |-{console-kit-dae}(1379) | |-{console-kit-dae}(1380) | |-{console-kit-dae}(1381) | |-{console-kit-dae}(1382) | |-{console-kit-dae}(1383) | |-{console-kit-dae}(1384) | |-{console-kit-dae}(1385) | |-{console-kit-dae}(1386) | |-{console-kit-dae}(1387) | |-{console-kit-dae}(1388)| |-{console-kit-dae}(1390) | |-{console-kit-dae}(1391) | |-{console-kit-dae}(1392) | |-{console-kit-dae}(1393) | |-{console-kit-dae}(1394) | |-{console-kit-dae}(1395) | |-{console-kit-dae}(1396) | |-{console-kit-dae}(1397) | |-{console-kit-dae}(1398) | |-{console-kit-dae}(1399) | |-{console-kit-dae}(1400) | |-{console-kit-dae}(1401) | |-{console-kit-dae}(1402) | |-{console-kit-dae}(1403) | |-{console-kit-dae}(1404) | |-{console-kit-dae}(1406) | |-{console-kit-dae}(1407) | |-{console-kit-dae}(1408) | |-{console-kit-dae}(1409) | |-{console-kit-dae}(1410) | |-{console-kit-dae}(1411)| |-{console-kit-dae}(1413)| |-{console-kit-dae}(1414)| |-{console-kit-dae}(1415)| |-{console-kit-dae}(1416)| |-{console-kit-dae}(1421)| |-{console-kit-dae}(1423)| |-{console-kit-dae}(2526)|`-{console-kit-dae}$k\267(1353)|-cron(1096)|-cupsd(690)|-dbus-daemon(585)|-dbus-daemon(2167)|-dbus-launch(2162)|-gconfd-2(2177)|-geoclue-master(2381)|-getty(1045)|-getty(1053)|-getty(1067)|-getty(1072)|-getty(1082)|-gnome-keyring-d(2111)-+-{gnome-keyring-d}(2112) | |-{gnome-keyring-d}(2191) | |-{gnome-keyring-d}(2193) | |-{gnome-keyring-d}(2195) | `-{gnome-keyring-d}(2398) |-gnome-terminal(2459)-+-bash(2469)| |-gnome-pty-helpe(2468)| |-{gnome-terminal}(2462) | |-{gnome-terminal}(2463) | `-{gnome-terminal}(2470) |-goa-daemon(2423)---{goa-daemon}(2426)|-gvfs-afc-volume(2267)---{gvfs-afc-volume}(2268)|-gvfs-fuse-daemo(2209)-+-{gvfs-fuse-daemo}(2212)| |-{gvfs-fuse-daemo}(2213) | `-{gvfs-fuse-daemo}(2214) |-gvfs-gdu-volume(2245)|-gvfs-gphoto2-vo(2270)|-gvfsd(2206)|-gvfsd-burn(2291)|-gvfsd-metadata(2300)|-gvfsd-trash(2277)|-hud-service(2338)-+-{hud-service}(2341)| `-{hud-service}(2342)|-ibus-x11(2166)-+-{ibus-x11}(2172)| `-{ibus-x11}(2178)|-indicator-appli(2360)---{indicator-appli}$k\267(2372)|-indicator-datet(2358)-+-{indicator-datet}(2370)| `-{indicator-datet}(2373)|-indicator-messa(2356)---{indicator-messa}$k\267(2385)|-indicator-print(2354)-+-{indicator-print}(2377)|`-{indicator-print}$k\267(2376)|-indicator-sessi(2363)-+-{indicator-sessi}(2393)|`-{indicator-sessi}$k\267(2386)|-indicator-sound(2362)-+-{indicator-sound}(2371)| `-{indicator-sound}(2397)|-irqbalance(1109)|-lightdm(1141)-+-Xorg(1174)||-lightdm(1640)-+-gnome-session(2122)-+-bluetooth-apple(2230)-+ -{bluetooth-apple}(2246)| | | | `-{bluetooth-apple}$k\267(2241)| | | |-compiz(2216)-+-sh(2331)---gtk-window-deco(2332)-+-{gtk-windo w-deco}+| | | | | `-{gtk-window-deco}+| | | | |-{compiz}(2217)| | | | |-{compiz}(2283)| | | | `-{compiz}(2284)| | | |-deja-dup-monito(2704)-+-{deja-dup-monito}(2706)| | | | `-{deja-dup-monito}(2708)| | | |-gdu-notificatio(2406)-+-{gdu-notificatio}(2407)| | | | `-{gdu-notificatio}(2408)| | | |-gnome-fallback-(2219)-+-{gnome-fallback-}(2223)| | | | `-{gnome-fallback-}(2228)| | | |-gnome-screensav(2428)-+-{gnome-screensav}(2434)| | | | `-{gnome-screensav}(2437)| | | |-gnome-settings-(2190)-+-{gnome-settings-}(2197)| | | | `-{gnome-settings-}$k\267(2196) | | | |-ibus-daemon(2151)-+-ibus-engine-sun(2179)---{ibus-engine-sun}( 2181)| | | | |-ibus-gconf(2160)---{ibus-gconf}(2169) | | | | |-python(2164)-+-{python}(2183)| | | | | `-{python}(2185)| | | | |-{ibus-daemon}(2163)| | || `-{ibus-daemon}(2170)| | | |-nautilus(2221)-+-{nautilus}(2235)| | | | `-{nautilus}(2240)| | | |-nm-applet(2225)-+-{nm-applet}(2233)| | | | `-{nm-applet}(2237)| | | |-polkit-gnome-au(2220)-+-{polkit-gnome-au}(2229)| | | | `-{polkit-gnome-au}$k\267(2226) | | | |-ssh-agent(2158)| | | |-telepathy-indic(2410)-+-{telepathy-indic}(2413)| | | | `-{telepathy-indic}$k\267(2412)| | | |-update-notifier(2530)-+-{update-notifier}(2531)| | || `-{update-notifier}(2532)| | | |-zeitgeist-datah(2429)---{zeitgeist-datah}$k\267(2433)| | | |-{gnome-session}(2174)| | | |-{gnome-session}(2175)| | | `-{gnome-session}(2182)| | `-{lightdm}(2098)| |-{lightdm}(1165)| `-{lightdm}(1175)|-login(1478)---bash(2835)---pstree(2954)|-mission-control(2418)-+-{mission-control}(2424)|`-{mission-control}$k\267(2421)|-modem-manager(627)|-notify-osd(2199)-+-{notify-osd}(2203)| `-{notify-osd}(2204)|-polkitd(705)---{polkitd}(716)|-pulseaudio(2239)-+-gconf-helper(2257)| |-{pulseaudio}(2249)| `-{pulseaudio}(2254)|-rsyslogd(667)-+-{rsyslogd}(674)| |-{rsyslogd}(685)| `-{rsyslogd}(686)|-rtkit-daemon(1763)-+-{rtkit-daemon}(1776)| `-{rtkit-daemon}(1777)|-system-service-(2541)|-tpvmlp(1058)|-ubuntu-geoip-pr(2395)|-udevd(381)-+-udevd(1556)| `-udevd(1557)|-udisks-daemon(2250)-+-udisks-daemon(2253)| `-{udisks-daemon}(2256)|-unity-panel-ser(2336)-+-{unity-panel-ser}(2340)|`-{unity-panel-ser}$k\267(2339)|-upowerd(1520)-+-{upowerd}(1531)| `-{upowerd}(1536)|-upstart-socket-(1006)|-upstart-udev-br(377)|-vmtoolsd(2054)---{vmtoolsd}(2075)|-vmtoolsd(2231)-+-{vmtoolsd}(2309)| `-{vmtoolsd}(2310)|-vmware-vmblock-(2036)-+-{vmware-vmblock-}(2039)|`-{vmware-vmblock-}$k\267(2037)|-whoopsie(1101)---{whoopsie}(1129)|-zeitgeist-daemo(2436)---{zeitgeist-daemo}(2438)`-zeitgeist-fts(2443)-+-cat(2451)`-{zeitgeist-fts}(2450)Ctrl+alt+f2init(1)-+-NetworkManager(663)-+-dhclient(829)| |-dnsmasq(1120)| |-{NetworkManager}(697)| `-{NetworkManager}(832)|-accounts-daemon(1291)---{accounts-daemon}(1299)|-acpid(1092)|-atd(1097)|-avahi-daemon(679)---avahi-daemon(688)|-bamfdaemon(2302)-+-{bamfdaemon}(2303)| `-{bamfdaemon}(2304)|-bluetoothd(631)|-colord(723)-+-{colord}(757)| `-{colord}(1043)|-console-kit-dae(1346)-+-{console-kit-dae}(1356)| |-{console-kit-dae}(1357) | |-{console-kit-dae}(1358) | |-{console-kit-dae}(1359) | |-{console-kit-dae}(1360) | |-{console-kit-dae}(1362) | |-{console-kit-dae}(1363) | |-{console-kit-dae}(1364) | |-{console-kit-dae}(1365) | |-{console-kit-dae}(1366) | |-{console-kit-dae}(1367) | |-{console-kit-dae}(1368) | |-{console-kit-dae}(1369) | |-{console-kit-dae}(1370) | |-{console-kit-dae}(1371) | |-{console-kit-dae}(1372) | |-{console-kit-dae}(1373) | |-{console-kit-dae}(1374) | |-{console-kit-dae}(1375) | |-{console-kit-dae}(1376) | |-{console-kit-dae}(1377) | |-{console-kit-dae}(1378)| |-{console-kit-dae}(1380) | |-{console-kit-dae}(1381) | |-{console-kit-dae}(1382) | |-{console-kit-dae}(1383) | |-{console-kit-dae}(1384) | |-{console-kit-dae}(1385) | |-{console-kit-dae}(1386) | |-{console-kit-dae}(1387) | |-{console-kit-dae}(1388) | |-{console-kit-dae}(1389) | |-{console-kit-dae}(1390) | |-{console-kit-dae}(1391) | |-{console-kit-dae}(1392) | |-{console-kit-dae}(1393) | |-{console-kit-dae}(1394) | |-{console-kit-dae}(1395) | |-{console-kit-dae}(1396) | |-{console-kit-dae}(1397) | |-{console-kit-dae}(1398) | |-{console-kit-dae}(1399) | |-{console-kit-dae}(1400)| |-{console-kit-dae}(1402)| |-{console-kit-dae}(1403)| |-{console-kit-dae}(1404)| |-{console-kit-dae}(1406)| |-{console-kit-dae}(1407)| |-{console-kit-dae}(1408)| |-{console-kit-dae}(1409)| |-{console-kit-dae}(1410)| |-{console-kit-dae}(1411)| |-{console-kit-dae}(1412)| |-{console-kit-dae}(1413)| |-{console-kit-dae}(1414)| |-{console-kit-dae}(1415)| |-{console-kit-dae}(1416)| |-{console-kit-dae}(1421)| |-{console-kit-dae}(1423)| |-{console-kit-dae}(2955)| |-{console-kit-dae}(3199)|`-{console-kit-dae}tv\267(1353)|-cron(1096)|-cupsd(690)|-dbus-daemon(585)|-dbus-daemon(2167)|-dbus-launch(2162)|-dconf-service(3045)-+-{dconf-service}(3046)| `-{dconf-service}(3048)|-gconfd-2(2177)|-geoclue-master(2381)|-getty(1045)|-getty(1053)|-getty(1072)|-getty(1082)|-gnome-keyring-d(2111)-+-{gnome-keyring-d}(2112) | |-{gnome-keyring-d}(2191) | |-{gnome-keyring-d}(2193) | |-{gnome-keyring-d}(2195) | `-{gnome-keyring-d}(2398) |-gnome-terminal(2459)-+-bash(2469)| |-bash(3137)| |-gnome-pty-helpe(2468)| |-{gnome-terminal}(2462) | |-{gnome-terminal}(2463)| `-{gnome-terminal}(2470)|-goa-daemon(2423)---{goa-daemon}(2426)|-gvfs-afc-volume(2267)---{gvfs-afc-volume}(2268)|-gvfs-fuse-daemo(2209)-+-{gvfs-fuse-daemo}(2212)| |-{gvfs-fuse-daemo}(2213) | `-{gvfs-fuse-daemo}(2214) |-gvfs-gdu-volume(2245)|-gvfs-gphoto2-vo(2270)|-gvfsd(2206)|-gvfsd-burn(2291)|-gvfsd-metadata(2300)|-gvfsd-trash(2277)|-hud-service(2338)-+-{hud-service}(2341)| `-{hud-service}(2342)|-ibus-x11(2166)-+-{ibus-x11}(2172)| `-{ibus-x11}(2178)|-indicator-appli(2360)---{indicator-appli}tv\267(2372) |-indicator-datet(2358)-+-{indicator-datet}(2370)| `-{indicator-datet}(2373)|-indicator-messa(2356)---{indicator-messa}tv\267(2385) |-indicator-print(2354)-+-{indicator-print}(2377)|`-{indicator-print}tv\267(2376)|-indicator-sessi(2363)-+-{indicator-sessi}(2393)|`-{indicator-sessi}tv\267(2386)|-indicator-sound(2362)-+-{indicator-sound}(2371)| `-{indicator-sound}(2397)|-irqbalance(1109)|-lightdm(1141)-+-Xorg(1174)||-lightdm(1640)-+-gnome-session(2122)-+-bluetooth-apple(2230)-+ -{bluetooth-apple}(2246)| | | | `-{bluetooth-apple}tv\267(2241)| | | |-compiz(2216)-+-sh(2331)---gtk-window-deco(2332)-+-{gtk-windo w-deco}+| | | | | `-{gtk-window-deco}+| | | | |-{compiz}(2217)| | || |-{compiz}(2283)| | | | `-{compiz}(2284)| | | |-deja-dup-monito(2704)-+-{deja-dup-monito}(2706)| | | | `-{deja-dup-monito}(2708)| | | |-gdu-notificatio(2406)-+-{gdu-notificatio}(2407)| | | | `-{gdu-notificatio}(2408)| | | |-gnome-fallback-(2219)-+-{gnome-fallback-}(2223)| | | | `-{gnome-fallback-}(2228)| | | |-gnome-screensav(2428)-+-{gnome-screensav}(2434)| | | | `-{gnome-screensav}(2437)| | | |-gnome-settings-(2190)-+-{gnome-settings-}(2197)| | || `-{gnome-settings-}tv\267(2196) | | | |-ibus-daemon(2151)-+-ibus-engine-sun(2179)---{ibus-engine-sun}( 2181)| | | | |-ibus-gconf(2160)---{ibus-gconf}(2169) | | | | |-python(2164)-+-{python}(2183)| | | | | `-{python}(2185)| | | | |-{ibus-daemon}(2163)| | | | `-{ibus-daemon}(2170)| | | |-nautilus(2221)-+-{nautilus}(2235)| | | | `-{nautilus}(2240)| | | |-nm-applet(2225)-+-{nm-applet}(2233)| | | | `-{nm-applet}(2237)| | | |-polkit-gnome-au(2220)-+-{polkit-gnome-au}(2229)| | | | `-{polkit-gnome-au}tv\267(2226) | | | |-ssh-agent(2158)| | | |-telepathy-indic(2410)-+-{telepathy-indic}(2413)| | | | `-{telepathy-indic}tv\267(2412)| | | |-update-notifier(2530)-+-{update-notifier}(2531)| | | | `-{update-notifier}(2532)| | | |-zeitgeist-datah(2429)---{zeitgeist-datah}tv\267(2433)| | | |-{gnome-session}(2174)| | | |-{gnome-session}(2175)| | | `-{gnome-session}(2182)| | `-{lightdm}(2098)| |-{lightdm}(1165)| `-{lightdm}(1175)|-login(1067)---bash(3326)---pstree(3425)|-login(1478)---bash(2835)|-mission-control(2418)-+-{mission-control}(2424)|`-{mission-control}tv\267(2421)|-modem-manager(627)|-notify-osd(2199)-+-{notify-osd}(2203)| `-{notify-osd}(2204)|-polkitd(705)---{polkitd}(716)|-pulseaudio(2239)-+-gconf-helper(2257)| |-{pulseaudio}(2249)| `-{pulseaudio}(2254)|-rsyslogd(667)-+-{rsyslogd}(674)| |-{rsyslogd}(685)| `-{rsyslogd}(686)|-rtkit-daemon(1763)-+-{rtkit-daemon}(1776)| `-{rtkit-daemon}(1777)|-system-service-(2541)|-tpvmlp(1058)|-ubuntu-geoip-pr(2395)|-udevd(381)-+-udevd(1556)| `-udevd(1557)|-udisks-daemon(2250)-+-udisks-daemon(2253)| `-{udisks-daemon}(2256)|-unity-applicati(2968)-+-{unity-applicati}(2977)| `-{unity-applicati}(2988)|-unity-files-dae(2972)-+-{unity-files-dae}(2976)| `-{unity-files-dae}(2989)|-unity-lens-vide(2974)---{unity-lens-vide}tv\267(3002)|-unity-music-dae(2970)---{unity-music-dae}tv\267(2975)|-unity-musicstor(3016)---{unity-musicstor}(3017)|-unity-panel-ser(2336)-+-{unity-panel-ser}(2340)|`-{unity-panel-ser}tv\267(2339)|-unity-scope-vid(3014)-+-{unity-scope-vid}(3025)| |-{unity-scope-vid}(3026)| `-{unity-scope-vid}(3201)|-upowerd(1520)-+-{upowerd}(1531)| `-{upowerd}(1536)|-upstart-socket-(1006)|-upstart-udev-br(377)|-vmtoolsd(2054)---{vmtoolsd}(2075)|-vmtoolsd(2231)-+-{vmtoolsd}(2309)| `-{vmtoolsd}(2310)|-vmware-vmblock-(2036)-+-{vmware-vmblock-}(2039)|`-{vmware-vmblock-}tv\267(2037)|-whoopsie(1101)---{whoopsie}(1129)|-zeitgeist-daemo(2436)---{zeitgeist-daemo}(2438)`-zeitgeist-fts(2443)-+-cat(2451)`-{zeitgeist-fts}(2450) Ctrl+alt+f33.试验有几种方法可以列出系统中的所有运行进程?PsPs aux (附上一部分截图)Top(附上一部分截图)Pstree(附上一部分截图)4.执行下列命令和操作:$sleep180(新建一个进程,使其沉睡180秒)^Z(挂起进程)$jobs(列出作业控制的内容)$sleep 240&(以后台方式启动进程)$sleep 300&$sleep 330&$sleep 630&$jobs(列出进程当前的运行状态)$fg %4(将进程4切换到前台)^C(退出当前进程)$bg %1(将进程1切换到后台运行)$kill %5(终止5进程)解释命令的作用和执行结果。
实验四 操作系统存储管理实验报告
实验四操作系统存储管理实验报告一、实验目的本次操作系统存储管理实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配、回收、地址转换等关键技术,提高对操作系统存储管理机制的认识和应用能力。
二、实验环境操作系统:Windows 10开发工具:Visual Studio 2019三、实验原理1、内存分配方式连续分配:分为单一连续分配和分区式分配(固定分区和动态分区)。
离散分配:分页存储管理、分段存储管理、段页式存储管理。
2、内存回收算法首次适应算法:从内存低地址开始查找,找到第一个满足要求的空闲分区进行分配。
最佳适应算法:选择大小最接近作业需求的空闲分区进行分配。
最坏适应算法:选择最大的空闲分区进行分配。
3、地址转换逻辑地址到物理地址的转换:在分页存储管理中,通过页表实现;在分段存储管理中,通过段表实现。
四、实验内容及步骤1、连续内存分配实验设计一个简单的内存分配程序,模拟固定分区和动态分区两种分配方式。
输入作业的大小和请求分配的分区类型,程序输出分配的结果(成功或失败)以及分配后的内存状态。
2、内存回收实验在上述连续内存分配实验的基础上,添加内存回收功能。
输入要回收的作业号,程序执行回收操作,并输出回收后的内存状态。
3、离散内存分配实验实现分页存储管理的地址转换功能。
输入逻辑地址,程序计算并输出对应的物理地址。
4、存储管理算法比较实验分别使用首次适应算法、最佳适应算法和最坏适应算法进行内存分配和回收操作。
记录不同算法在不同作业序列下的内存利用率和分配时间,比较它们的性能。
五、实验结果与分析1、连续内存分配实验结果固定分区分配方式:在固定分区大小的情况下,对于作业大小小于或等于分区大小的请求能够成功分配,否则分配失败。
内存状态显示清晰,分区的使用和空闲情况一目了然。
动态分区分配方式:能够根据作业的大小动态地分配内存,但容易产生内存碎片。
2、内存回收实验结果成功回收指定作业占用的内存空间,内存状态得到及时更新,空闲分区得到合并,提高了内存的利用率。
实验四操作系统存储管理实验报告
实验四操作系统存储管理实验报告一、实验目的本次实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收、页面置换算法等关键概念,并能够分析和解决存储管理中可能出现的问题。
二、实验环境本次实验在装有 Windows 操作系统的计算机上进行,使用了 Visual Studio 等编程工具和相关的调试环境。
三、实验内容(一)内存分配与回收算法实现1、首次适应算法首次适应算法从内存的起始位置开始查找,找到第一个能够满足需求的空闲分区进行分配。
在实现过程中,我们通过建立一个空闲分区链表来管理内存空间,每次分配时从表头开始查找。
2、最佳适应算法最佳适应算法会选择能够满足需求且大小最小的空闲分区进行分配。
为了实现该算法,在空闲分区链表中,分区按照大小从小到大的顺序排列,这样在查找时能够快速找到最合适的分区。
3、最坏适应算法最坏适应算法则选择最大的空闲分区进行分配。
同样通过对空闲分区链表的排序和查找来实现。
(二)页面置换算法模拟1、先进先出(FIFO)页面置换算法FIFO 算法按照页面进入内存的先后顺序进行置换,即先进入内存的页面先被置换出去。
在模拟过程中,使用一个队列来记录页面的进入顺序。
2、最近最久未使用(LRU)页面置换算法LRU 算法根据页面最近被使用的时间来决定置换顺序,最近最久未使用的页面将被置换。
通过为每个页面设置一个时间戳来记录其最近使用的时间,从而实现置换策略。
3、时钟(Clock)页面置换算法Clock 算法使用一个环形链表来模拟内存中的页面,通过指针的移动和页面的访问标志来决定置换页面。
四、实验步骤(一)内存分配与回收算法的实现步骤1、初始化内存空间,创建空闲分区链表,并为每个分区设置起始地址、大小和状态等信息。
2、对于首次适应算法,从链表表头开始遍历,找到第一个大小满足需求的空闲分区,进行分配,并修改分区的状态和大小。
3、对于最佳适应算法,在遍历链表时,选择大小最接近需求的空闲分区进行分配,并对链表进行相应的调整。
计算机操作系统实验四
计算机操作系统实验四计算机操作系统实验四一、实验目的本实验旨在通过实践,让学生熟悉并理解操作系统中进程调度和死锁的相关概念、算法和解决方法。
二、实验要求1.学习理解进程调度的基本概念和相关算法,包括先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)以及时间片轮转等算法。
2.掌握进程调度算法的实现原理和代码实现方法。
3.学习理解死锁的概念、产生原因以及解决方法,包括资源分配图法、银行家算法等。
4.掌握死锁相关算法的实现原理和代码实现方法。
5.进行相关实验操作,并记录实验结果和分析。
三、实验步骤1.进程调度实验1.1 实验环境配置在操作系统中配置相关环境,创建进程调度实验所需的实验环境,包括进程控制块(PCB)、进程队列、进程状态等。
1.2 先来先服务(FCFS)算法实现阐述先来先服务算法的实现原理,包括就绪队列、完成队列的管理和进程状态的切换。
1.3 短作业优先(SJF)算法实现阐述短作业优先算法的实现原理,包括作业调度表、就绪队列、完成队列的管理和进程状态的切换。
1.4 高响应比优先(HRRN)算法实现阐述高响应比优先算法的实现原理,包括计算响应比、优先级比较和进程状态的切换。
1.5 时间片轮转算法实现阐述时间片轮转算法的实现原理,包括设置时间片长度、就绪队列的管理和进程状态的切换。
1.6 实验结果分析运行各种进程调度算法,并记录实验结果,分析每种算法的优缺点和适用场景。
2.死锁实验2.1 死锁概念和产生原因阐述死锁的概念、产生原因,包括资源竞争、进程互斥、不可抢占和循环等。
2.2 资源分配图法实现阐述资源分配图法解决死锁的实现原理,包括资源分配图的构建和死锁检测算法的应用。
2.3 银行家算法实现阐述银行家算法解决死锁的实现原理,包括安全序列的判断和资源分配的策略。
2.4 实验结果分析运行资源分配图法和银行家算法,记录实验结果,分析算法的效果和应用场景。
四、实验结果及分析经过实验,我们得到了以下结果和分析:1.进程调度实验结果分析在不同的进程调度算法下,记录了各个进程在不同时刻的执行情况、等待时间和周转时间等指标。
实验4 Windows操作
实验四Windows 系统要素及使用技巧一、实验目的1.了解Windows 系统的基本运行环境;2.掌握Windows 的基本要素与操作方法;3.掌握Windows 应用程序的使用;4.了解多任务并行操作的概念。
二、实验内容:熟悉Windows 的组成、控制和使用;掌握Windows 的基本操作关系;熟悉并掌握桌面、“开始”菜单、“我的电脑”、“资源管理器”与系统资源的关系;Windows 的基本操作要素:对话框、窗口、菜单、快捷方式、图标、任务栏等Windows 操作系统桌面的系统组件:我的电脑、我的文档、网络浏览器、回收站等学会利用各种系统资源。
三、实验步骤:练习一窗口的组成1. Windows XP 操作系统的工作环境应正确启动和退出Windows XP 操作系统,特别是退出系统。
由于Windows XP 是一个多任务多线程的操作系统,有时前台运行某一程序,后台也在运行几个程序。
这时,如果因为前台程序已经完成而关掉电源,后台程序的数据和运行结果就会丢失。
并且,由于WindowsXP 运行的多任务特性,在运行时可能需要占用大量磁盘空间的临时保存信息,这些处在预设指定子目录下的临时性文件在Windows XP 正常退出时将予以删除,以免浪费资源。
但非正常退出将使Windows XP 来不及处理这些工作,从而导致硬盘空间的浪费。
在退出Windows 操作系统之前,最好关闭所有打开的应用程序窗口。
关闭应用程序有以下几种方法:①从每一个打开窗口的右上角可以看到三个按钮,最右边的按钮“”是关闭按钮,用鼠标单击。
②用鼠标单击标题栏中的“文件”,再从下拉菜单中点击“关闭”按钮,即可关闭应用程序。
如图28 所示③用鼠标双击窗口右上角的窗口控制按钮图标,可快速关闭应用程序。
如图29 所示。
④直接按键Alt+F4,结束当前的工作。
每次关机前,用鼠标单击Windows XP“开始”按钮,则屏幕弹出“开始”菜单,然后单击“关闭计算机”选项,此时,屏幕上出现标题为“关闭Windows”的对话框,如图30 所示。
操作系统实验四
一、实验名称实验四设备管理二、实验目的本实验着重于了解磁盘的物理组织,以及如何通过用户态的程序直接调用磁盘I/O API 函数(DeviceIoControl)根据输入的驱动器号读取驱动器中磁盘的基本信息,在Windows Server 2003环境进行。
三、实验内容(一)实验需求:(1)Windows Server 2003(2)Microsoft V isual Studio 2008(二)实验的内容:[1] 磁盘I/O API函数应用相关的API 介绍1.获取磁盘的基本信息的磁盘I/O API函数DeviceIoControl格式如下:BOOL DeviceIoControl( HANDLE hDevice, DWORD dwioControlCode,LPVOID lplnBuffer, DWORD nlnBufferSize,LPVOID lpOutBuffer, DWORD nOutBufferSize,LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped );.hDevice:所要进行操作的设备的句柄,它通过调用CreateFile函数来获得。
.dwIoControlCode:指定操作的控制代码。
这个值用来辨别将要执行的指定的操作,以及对哪一种设备进行操作。
对磁盘应设置为IOCTL_DISK_GET_DRIVE_GEOMETRY。
.lpInBuffer:操作所要的输入数据缓冲区指针,NULL表示不需要输入数据。
.nInBufferSize:指定lpInBuffer所指向的缓冲区的大小(以字节为单位)。
.lpOutBuffer:接收操作输出的数据缓冲区指针,NULL表示操作没有产生输出数据。
输出数据的缓冲区要足够大,对磁盘它采用固定的数据结构DISK_GEOMETRY,格式如下:structDISK_GEOMETRY {unsigned bytesPerSector; unsigned sectorsPerTrack;unsigned heads; unsigned cylinders; }.nOutBufferSize:指定lpOutBuffer所指向的缓冲区的大小(以字节为单位)。
Windows操作系统实验四实验报告
Windows操作系统C/C++ 程序实验姓名:___________________学号:___________________班级:___________________院系:_________________________________年_____月_____日实验四Windows 2000/xp线程间通信一、背景知识二、实验目的三、工具/准备工作四、实验内容1. 文件对象步骤1:登录进入Windows 2000/xp Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-1.cpp。
步骤4:单击“Build”菜单中的“Compile 4-1.cpp”命令,并单击“是”按钮确认。
系统对4-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 4-1.exe”命令,建立4-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?____________________________________________________________________ ________________________________________________________________________步骤6:在工具栏单击“Execute Program”按钮,执行4-1.exe程序。
运行结果(如果运行不成功,则可能的原因是什么?) :____________________________________________________________________ ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________阅读和分析程序4-1,请回答问题:1) 清单4-1中启动了多少个单独的读写线程?____________________________________________________________________2) 使用了哪个系统API函数来创建线程例程?____________________________________________________________________3) 文件的读和写操作分别使用了哪个API函数?____________________________________________________________________ ________________________________________________________________________每次运行进程时,都可看到清单4-3中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。
操作系统 实验4:文件管理实验报告
一、实验题目:文件管理实验--Linux下的文件管理二、实验目的和要求:实验目的:(1)加深对文件、目录、文件系统等概念的理解。
(2)掌握 Linux 文件系统的目录结构。
(3)掌握有关 Linux 文件系统操作的常用命令。
(4)了解有关文件安全性方面的知识。
实验要求:(1)正确使用文件管理命令,能熟练地对文件进行浏览、拷贝、移动和删除。
(2)能熟练地确定和更改工作目录,查看内容和文件属性,创建和删除目录。
(3)正确地理解文件的权限,并能进行相应更改。
(4)理解文件的类型及其表示形式。
(5)理解文件名的表示形式,在模式匹配中能正确使用通配符。
三、实验内容:(1)使用pwd,cd,ls等命令浏览文件系统。
(2)使用cat,cp,mv,head,tail,rm等命令查看你的文件。
(3)使用ln命令进行文件的硬连接和符号连接。
软中断通信(4)使用find,grep命令进行文件查找和模式匹配。
(5)使用chmod命令修改文件的权限。
四、实验步骤:(说明:对本实验涉及的教材中的相关内容进行归纳总结,只需简要说明即可。
)1、用root账号登录到终端,使用pwd命令查看当前目录2、用cd命令将当前目录切换到“/”目录下3、使用ls明令查看Linux的目录结构,了解各目录存放与系统相关的文件14、使用 cat、more、head、tail等命令显示 /etc/inittab文件内容5、使用grep 命令在/etc/inittab 文件中查询“initdefault”字符串26、使用find 命令查找 /目录下所有以main 开头的文件7、使用 cp 命令将/etc目录下的inittab文件拷贝到/root目录下8、使用 sort 和uniq 命令对 /root目录下的inittab文件排序后输出其结果39、统计inittab文件的字节数、行数、字数10、用mkdir命令在/root目录下创建一个test目录11、用cp命令将/etc目录及其下所有内容复制到test目录下12、使用cd和ls查看/root/test/etc 下的内容413、将test目录改名为test214、删除test2五、实验总结:通过本次实验,让我懂得了怎样创建文件以及文件管理命令的使用,对Linux的掌握和了解进一步加深。
操作系统实验报告4
操作系统实验报告4一、实验目的本次操作系统实验的目的在于深入了解和掌握操作系统中进程管理、内存管理、文件系统等核心概念和相关操作,通过实际的实验操作,增强对操作系统原理的理解和应用能力,提高解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容与步骤(一)进程管理实验1、进程创建与终止使用 C++语言编写程序,创建多个进程,并在进程中执行不同的任务。
通过进程的标识符(PID)来监控进程的创建和终止过程。
2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。
观察生产者和消费者进程在不同情况下的执行顺序和结果。
(二)内存管理实验1、内存分配与释放编写程序,使用动态内存分配函数(如`malloc` 和`free`)来分配和释放内存。
观察内存的使用情况和内存泄漏的检测。
2、内存页面置换算法实现几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法和最佳置换(OPT)算法。
通过模拟不同的页面访问序列,比较不同算法的性能。
(三)文件系统实验1、文件创建与读写使用 C++语言的文件操作函数,创建一个新文件,并向文件中写入数据。
从文件中读取数据,并进行数据的处理和显示。
2、文件目录操作实现对文件目录的创建、删除、遍历等操作。
观察文件目录结构的变化和文件的组织方式。
四、实验结果与分析(一)进程管理实验结果与分析1、进程创建与终止在实验中,成功创建了多个进程,并通过控制台输出观察到了每个进程的 PID 和执行状态。
可以看到,进程的创建和终止是按照程序的逻辑顺序进行的,操作系统能够有效地管理进程的生命周期。
2、进程同步与互斥在生产者消费者问题的实验中,通过信号量的控制,生产者和消费者进程能够正确地实现同步与互斥。
当缓冲区为空时,消费者进程等待;当缓冲区已满时,生产者进程等待。
操作系统实验四 文件系统实验
return
scanf("%s",s); strcpy(t->fileName,s); printf("\n 请输入该文件基本信息:"); scanf("%s",s); strcpy(t->file,s); t->brother=t->child=NULL; if(p->child==NULL) {
goto label; } p=p->next; } printf("文件不存在!\n"); goto label; } else if(i==8) { show(f); goto label; } else { goto label; } } void Select() { char username[20]; int i; printf("请输入用户名:\n"); scanf("%s",username); for(i=0; i<userNum; i++) { if(!strcmp(mdf[i].userName,username)) { fp= mdf[i].p; if(fp!=NULL) {
printf("该用户已创建文件:\n"); while(fp!=NULL) {
fp=fp->next; printf("%s\n",fp->fileName); } } else { printf("该用户尚未创建任何文件!\n"); } fp= mdf[i].p; Operation(fp); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define getpch(type) (type*)malloc(sizeof(type)) int userNum=0;
操作系统实验(四)实验报告--虚拟内存
操作系统实验(四)实验报告--虚拟内存操作系统实验(四)虚拟内存1、实验题目页面置换算法模拟——OPT、FIFO和LRU算法2、实验目的了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(Least Recently Used)置换算法3、实验内容1)OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
2)FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3)LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
4、程序代码#include<iostream>#include <cstdlib>#include <time.h>#include <cstdio>#define L 30///页面走向长度最大为30using namespace std;int M=4; ///内存块struct P///定义一个结构体{int num,time;}p[30];int Input(int m,P p[L])///打印页面走向状态{m=30;int i,j;j=time(NULL);///取时钟时间srand(j);///以时钟时间x为种子,初始化随机数发生器cout<<"页面走向: ";for(i=0; i<m; i++){p[i].num=rand( )%10;///产生1到10之间的随即数放到数组p中p[i].time=0;cout<<p[i].num<<" ";}cout<<endl;return m;}void print(P *page1)///打印当前的页面{P *page=new P[M];page=page1;for(int i=0; i<M; i++)cout<<page[i].num<<" ";cout<<endl;}int Search(int e,P *page1 )///寻找内存块中与e相同的块号{P *page=new P[M];page=page1;for(int i=0; i<M; i++)if(e==page[i].num)return i; ///返回i值return -1;}int Max(P *page1)///寻找最近最长未使用的页面用于OPT算法{P *page=new P[M];page=page1;int e=page[0].time,i=0;while(i<M) ///找出离现在时间最长的页面{if(e<page[i].time) e=page[i].time;i++;}for( i=0; i<M; i++)if(e==page[i].time)return i; ///找到离现在时间最长的页面返回其块号return -1;}int Count(P *page1,int i,int t,P p[L])///记录当前内存块中页面离下次使用间隔长度用于OPT算法{P *page=new P[M];page=page1;int count=0;for(int j=i; j<L; j++){if(page[t].num==p[j].num )break;///当前页面再次被访问时循环结束else count++;///否则count+1}return count;///返回count的值}int main(){int c=1;int m=0,t=0;float n=0;///缺页次数m=Input(m,p);///调用input函数,返回m值M=4;P *page=new P[M];///dowhile(c==1||c==2||c==3){int i=0;for(i=0; i<M; i++) ///初试化页面基本情况{page[i].num=0;page[i].time=m-1-i;}cout<<"1:FIFO页面置换"<<endl;cout<<"2:LRU页面置换"<<endl;cout<<"3:OPT页面置换"<<endl;cout<<"按其它键结束程序;"<<endl;cin>>c;if(c==1)///FIFO页面置换///FIFO();{n=0;cout<<" FIFO算法页面置换情况如下: "<<endl;cout<<endl;while(i<m){if(Search(p[i].num,page)>=0) ///当前页面在内存中{cout<<p[i].num<<" "; ///输出当前页p[i].numcout<<" "<<endl;i++; ///i加1}else ///当前页不在内存中{if(t==M)t=0;else{n++; ///缺页次数加1page[t].num=p[i].num; ///把当前页面放入内存中cout<<p[i].num<<" ";print(page); ///打印当前页面t++; //下一个内存块i++; ///指向下一个页面}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" ="<<n/m<<endl;}if(c==2)///LRU页面置换,最近最久未使用{n=0;cout<<" LRU算法页面置换情况如下: "<<endl;cout<<endl;while(i<m){int a;t=Search(p[i].num,page);if(t>=0)///如果已在内存块中{page[t].time=0;///把与它相同的内存块的时间置0for(a=0; a<M; a++)if(a!=t)page[a].time++;///其它的时间加1cout<<p[i].num<<" ";cout<<"不缺页"<<endl;}else ///如果不在内存块中{n++; ///缺页次数加1t=Max(page); ///返回最近最久未使用的块号赋值给tpage[t].num=p[i].num; ///进行替换page[t].time=0; ///替换后时间置为0cout<<p[i].num<<" ";print(page);for(a=0; a<M; a++)if(a!=t)page[a].time++; ///其它的时间加1}i++;}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" = "<<n/m<<endl;}if(c==3)///OPT页面置换{n=0;cout<<" OPT算法置换情况如下:"<<endl;cout<<endl;while(i<m){if(Search(p[i].num,page)>=0)///如果已在内存块中{cout<<p[i].num<<" ";cout<<" "<<endl;i++;}else///如果不在内存块中{int a=0;for(t=0; t<M; t++)if(page[t].num==0)a++;///记录空的内存块数if(a!=0) ///有空内存块{int q=M;for(t=0; t<M; t++)if(page[t].num==0&&q>t)q=t;///把空内存块中块号最小的找出来page[q].num=p[i].num;///把缺页换过来n++; ///缺页次数加一cout<<p[i].num<<" ";print(page);i++;}else{int temp=0,s;for(t=0; t<M; t++) ///寻找内存块中下次使用离现在最久的页面if(temp<Count(page,i,t,p)){temp=Count(page,i,t,p);s=t;}///把找到的块号赋给spage[s].num=p[i].num;n++;cout<<p[i].num<<" ";print(page);i++;}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n<<"/"<<m<<" = "<<n/m<<endl;}}///while(c==1||c==2||c==3);return 0;}5、心得体会通过该实验,是我对虚拟内存更加了解,对最佳置换算法、先进先出算法、最近最久算法更加了解。
操作系统实验四
操作系统实验四:文件管理模拟实验目的:本实验的目的是,是通过设计和调试一个简单的文件系统,主要是模拟文件操作命令的执行,来模拟文件的管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握他们的基本实施方法。
实验要求:1.设计一个支持n个用户的文件系统,每个用户可拥有多个文件;2.采用二级或二级以上(树型目录)的多级文件目录管理;3.对文件应设置存取控制保护方式,如“只能执行”、“允许读”、“允许写”等;4.系统的外部特性应接近于真实系统,可设置下述文件操作命令:creat 建立文件open 打开文件close 关闭文件delete 撤销文件read 读文件write 写文件copy 复制文件directory 查询目录5.通过键盘使用该文件系统,系统应显示操作命令的执行结果。
实验内容:设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。
另外,为打开文件设置了运行文件目录(AFD)。
4、总体流程:初始化文件目录;输出提示符,等待接受命令,分析键入的命令;对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
算法的流程图如下:以下程序是用pascal语言写成,在tp4下可运行,我有tp4软件。
同学们有兴趣可到我处拷贝,但最好是不要用tp4, pascal现在用的越来越少了,被C语言取代了,现再去详细去看pascal语言书已无必要,尽管现在很多算法,数据结构等仍用pascal 伪语言描述,包括我们的课本《操作系统》(西安电子出版社汤小丹等)中的伪代码也是用类pascal描述的。
由于伪代码不涉及语言细节,同学们很易看懂这样的伪代码。
同学们很易看懂下面的程序:(主要看懂算法,语言细节有不懂也不要紧)program filesystem;Uses crt;const openf :integer=0;type str=string[6];//字符串类型linku=^datau; //定义指向用户文件目录(结构体)的指针类型datau=record //用户文件目录结构体类型filename : str;pcode :integer;length :integer;addr :integer;next :linku;end;linkm=^datam; //定义指向主文件目录(结构体)的指针类型datam=record //主文件目录结构体类型username :str;link :linku;end;linka=^dataa; //定义指向活动文件目录(结构体)的指针类型 dataa=recordfilename :str;pcode :integer;rpointer :integer;wpointer :integer;addr :integer;next :linka;end;var mfd :array[1..5] of linkm;p1,q1:linkm; p2,q2:linku; afd,p3,q3 :linka;x,y1: str; i,y :integer;f: boolean; code :integer;procedure init;//初始化代码label a;beginclrscr;for i:=1 to 10 do writeln;writeln(' ':25,'WELCOME TO OUR FILE SYSTEM!');writeln; writeln;writeln(' ':27,'Please press space bar !');repeat until readkey=' ';clrscr;a: write('User number?');readln(y1);val(y1,y,code); if code<>0 then goto a;if y>5 thenbeginwriteln('User too many!( <=5 )' ) ; goto a;end;writeln('Begin users login:');for i:=1 to y dobeginwrite('User name', i, '?');readln(x);new(p2);p2^.next:=NIL; p2^.filename:=' ';// p2^.next相当于C语言p2->next,即指针操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四银行家算法
(一)教学要求
掌握处理死锁的方法,掌握银行家算法的实现
(二)知识点提示
死锁的概念,死锁产生的原因和条件,处理死锁的方法,银行家算法,安全状态和不安全状态,安全性算法
(三)教学内容
银行家算法的模拟实现
实验步骤:
(1)定义数据结构:
allocation[][]; //分配矩阵
available[]; //可用资源向量
need[][]; //需求矩阵
request[]; //资源请求向量
(2)定义函数:void bank_arithmetic(int i, int request[]) //银行家算法
void isSafe( ); //安全性算法
主函数中对可用资源向量,分配矩阵和需求矩阵进行初始化(输入数据参照课本P113的例题),输入请求资源的进程编号以及请求的资源向量,通过调用银行家算法判断是否可以把资源分配给请求资源的进程。
(3)银行家算法的执行步骤:
设Request i是进程P i的请求向量。
若Request i[j]=k,表示进程P i需要k个j类资源。
当P i 发出资源请求后,系统按下述步骤进行检查:
①若Request i≤Need i,则转②;否则,认为出错。
因为它所需要的资源数已超过它所宣布的最大值。
②若Request i≤Available,则转③;否则,表示系统中尚无足够的资源,P i必须等待。
③系统试探把要求的资源分配给进程P i,并修改下面数据结构中的数值。
Available=Available – Request i
Allocation i = Allocation i + Request i
Need i = Need i– Request i
④系统执行安全性算法,检测此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分给进程P i;否则,将试探分配作废,恢复资源状态,让P i等待。
(4)安全性算法的执行步骤:
①设置两个向量work和finish
工作向量work,它表示系统可提供给进程继续运行的各类资源数,含有m个元素,其初始值为:work[j]=available[j]。
完成向量finish,它表示系统是否有足够资源使进程推进完成,开始执行安全性算法时,
Finish[i]=false;当有足够资源分配给进程Pi,Pi推进完成时,令Finish[i]=true。
②从进程集合中找到一个进程,其满足:
Finish[i]=false
Need[i,j] ≤Work[j]
如找到则执行步骤③,找不到则执行步骤④。
③当进程Pi获得资源后,便可以向前推进,直至完成,并释放出分配给它的全部资源,故应执行:
Work[j]=Work[j]+Allocation[i,j];
Finish[i]=true;
执行步骤②。
④若所有进程的Finish都为true,则系统为安全状态;否则,系统为不安全状态。
实验程序:
#include <stdio.h>
#define M 3
#define N 5
int available[]={3,3,2};
int allocation[N][M]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int need[N][M]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
void banker_arithmetic(int i,int request[]){
int isSafe();
int j,k,l;
printf("进程P%d请求资源,资源请求向量为: \n",i);
for(j=0;j<M;j++)
printf("%d ",request[j]);
printf("\n");
j=0;
while(j < M){
if(request[j]<=need[i][j])
j++;
else
break;
}
if(j==M){
k=0;
while(k < M)
if(request[k]<=need[i][k])
k++;
else
break;
if(k==M){
for(l=0;l<M;l++){
available[l]=available[l]-request[l];
allocation[i][l]=allocation[i][l]+request[l];
need[i][l]=need[i][l]-request[l];
}
if(isSafe())
printf("分配是安全的,可以把资源分配给p%d\n",i);
else{
printf("分配是不安全的,不能把资源分配给P%d\n",i);
for(l=0;l<M;l++){
available[l]=available[l]+request[l];
allocation[i][l]=allocation[i][l]-request[l];
need[i][l]=need[i][l]+request[l];
}
}
}
}
printf("Allocation:");
for(j=0;j<N;j++){
for(k=0;k<M;k++)
printf("%d ",allocation[j][k]);
printf("\n");
}
printf("Need:");
for(j=0;j<N;j++){
for(k=0;k<M;k++)
printf("%d ",need[j][k]);
printf("\n");
}
printf("Available:\n");
for(j=0;j<M;j++)
printf("%d ",available[j]);
printf("\n");
i++;
}
int isSafe(){
int work[M];
int i,j,k,l=0,a=0;
int finish[]={0,0,0,0,0};
for(i=0;i<M;i++){
work[i]=available[i];
}
while(l<N||a < N){
i=0;
while(i<N){
if(finish[i]==0){
j=0;
while(j<M)
if(need[i][j]<=work[j])
j++;
else
break;
if(j==M){
printf("P%d ",i);
for(k=0;k<M;k++)
{
work[k]=work[k]+allocation[i][k];
}
printf("\n");
finish[i]=1;
l++;
}
}
i++;
}
a++;
}
for(i=0;i<N;i++)
if(finish[i]==0)
return 0;
return 1;
}
int main()
{
int i=1;
int request[]={1,0,2};
banker_arithmetic(i,request);
return 0;
}
实验结果:
进程p1请求资源,资源请求向量为:1 0 2
p1
p3
p4
p0
p2
分配是安全的,可以把资源分配给p1 Allocation:0 1 0
3 0 2
3 0 2
2 1 1
0 0 2
Need:7 4 3
0 2 0
6 0 0
0 1 1
4 3 1
Available:
2 3 0
Press any key to continue.
(四)思考题
1、死锁产生的原因是什么?
死锁产生的原因有竞争不可抢占型资源引起死锁竞争可消耗资源引起死锁进程推进顺序不当引发死锁
2、处理死锁的方法有哪些?
预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个。
避免死锁:在系统的资源分配过程中,用某种方法去防止系统进入不安全状态(可能会导致思索的状态),从而避免发生死锁。
检测和解除死锁:当进程申请资源时,不进行任何限制,即允许死锁发生。
但要求系统定期或不定期检测是否有死锁发生。
当检测到系统中已发生死锁时,将进程从死锁状态中解脱出来。