操作系统 实验四

合集下载

操作系统 课程实验-实验四页式虚拟存储管理中地址转换和缺页中断

操作系统 课程实验-实验四页式虚拟存储管理中地址转换和缺页中断

实验四页式虚拟存储管理中地址转换和缺页中断一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断。

二、实验预备知识页式存储管理中地址转换的方法;页式虚拟存储的缺页中断处理方法。

三、实验内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。

实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

假定主存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 多进程编程

《操作系统》实验报告实验序号:实验四实验项目名称:实验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.进程调度实验结果分析在不同的进程调度算法下,记录了各个进程在不同时刻的执行情况、等待时间和周转时间等指标。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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、处理死锁的方法有哪些?
预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个。

避免死锁:在系统的资源分配过程中,用某种方法去防止系统进入不安全状态(可能会导致思索的状态),从而避免发生死锁。

检测和解除死锁:当进程申请资源时,不进行任何限制,即允许死锁发生。

但要求系统定期或不定期检测是否有死锁发生。

当检测到系统中已发生死锁时,将进程从死锁状态中解脱出来。

相关文档
最新文档