设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死

声明:

找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存.

只要虚拟内存设置为系统默认大小就不会出生僵死的现象了.

当时因为服务器内存48G,系统默认虚拟内存大小也是48G,

觉得太占硬盘空间,一时手贱,改小了虚拟内存,才会造成服务器长时间运行僵死的现象.

#include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

#ifndef FILE_CACHE_FLAGS_DEFINED

#define FILE_CACHE_MAX_HARD_ENABLE      0x00000001
#define FILE_CACHE_MAX_HARD_DISABLE     0x00000002
#define FILE_CACHE_MIN_HARD_ENABLE      0x00000004
#define FILE_CACHE_MIN_HARD_DISABLE     0x00000008

#endif

LPTSTR lpSrvName = TEXT("SystemFileCacheLimit");
SERVICE_STATUS ServiceStatus = {0};
SERVICE_STATUS_HANDLE hStatus;

BOOL WINAPI EnablePrivileges()
{
	HANDLE hToken; 
	TOKEN_PRIVILEGES tkp; 

	if (!::OpenProcessToken(::GetCurrentProcess(), 
		TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
		return( FALSE ); 

	::LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME, 
		&tkp.Privileges[0].Luid); 

	tkp.PrivilegeCount = 1; 
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

	::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
		(PTOKEN_PRIVILEGES)NULL, 0); 

	if (::GetLastError() != ERROR_SUCCESS) 
		return FALSE; 

	return TRUE;
}

VOID WINAPI ServiceHandler(DWORD fdwControl)
{
	switch(fdwControl)
	{
	case SERVICE_CONTROL_PAUSE:
		ServiceStatus.dwCurrentState = SERVICE_PAUSED;
		break;
	case SERVICE_CONTROL_CONTINUE:
		ServiceStatus.dwCurrentState = SERVICE_RUNNING;
		break;
	case SERVICE_CONTROL_STOP:
	case SERVICE_CONTROL_SHUTDOWN:
		ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
		ServiceStatus.dwWin32ExitCode = 0;
		ServiceStatus.dwCheckPoint    = 0;
		ServiceStatus.dwWaitHint      = 0;
		SetServiceStatus(hStatus,&ServiceStatus);
		return ;
	case SERVICE_CONTROL_INTERROGATE:
		break;
	default:
		break;
	}
	SetServiceStatus(hStatus,&ServiceStatus);
	return ;
}



VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
	DWORD   status = 0;
	DWORD   specificError = 0xfffffff;
	ServiceStatus.dwServiceType        = SERVICE_WIN32;
	ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
	ServiceStatus.dwControlsAccepted   =  SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
	ServiceStatus.dwWin32ExitCode      = 0;
	ServiceStatus.dwServiceSpecificExitCode = 0;
	ServiceStatus.dwCheckPoint         = 0;
	ServiceStatus.dwWaitHint           = 0;

	hStatus = RegisterServiceCtrlHandler(lpSrvName,(LPHANDLER_FUNCTION)ServiceHandler);
	if (hStatus==0)
	{
		return;
	}

	status = GetLastError();
	if (status!=NO_ERROR)
	{
		ServiceStatus.dwCurrentState       = SERVICE_STOPPED;
		ServiceStatus.dwCheckPoint         = 0;
		ServiceStatus.dwWaitHint           = 0;
		ServiceStatus.dwWin32ExitCode      = status;
		ServiceStatus.dwServiceSpecificExitCode = specificError;
		SetServiceStatus(hStatus, &ServiceStatus);
		
		return;
	}

	ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
	ServiceStatus.dwCheckPoint         = 0;
	ServiceStatus.dwWaitHint           = 0;  
	SetServiceStatus(hStatus, &ServiceStatus);	
	
	ULONG MiniCache, MaxCache;
	TCHAR szIni[MAX_PATH] = {0};

	::GetModuleFileName(NULL, szIni, _countof(szIni));
	::PathRenameExtension(szIni, TEXT(".ini"));
	
	if (dwArgc >=4)
	{
		::WritePrivateProfileString(TEXT("参数设置"), TEXT("最大缓存"), lpszArgv[3], szIni);
		::WritePrivateProfileString(TEXT("参数设置"), TEXT("最小缓存"), lpszArgv[2], szIni);
		MiniCache = _ttol(lpszArgv[2]) * 1024 * 1024;
		MaxCache = _ttol(lpszArgv[3]) * 1024 * 1024;
	}
	else
	{
		if (PathFileExists(szIni))
		{
			MiniCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最小缓存"), -1, szIni);
			MaxCache = ::GetPrivateProfileInt(TEXT("参数设置"), TEXT("最大缓存"), -1, szIni);
			MiniCache = MiniCache * 1024 * 1024;
			MaxCache = MaxCache * 1024 * 1024;
		}	
	}

	EnablePrivileges();
	::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE);

	return;
}


int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nShowCmd)
{
	SIZE_T MiniCache, MaxCache;
	DWORD dwFlags;
	TCHAR szMsg[512] = {0};
	LPWSTR* szArgList;
	int nArgs;
	
	if (!::FindWindow(TEXT("Progman"), NULL))
	{
		SERVICE_TABLE_ENTRY ServiceTable[2];
		ServiceTable[0].lpServiceName = lpSrvName;
		ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
		ServiceTable[1].lpServiceName = NULL;
		ServiceTable[1].lpServiceProc = NULL;

		StartServiceCtrlDispatcher(ServiceTable);
		return 1;
	}

	szArgList = ::CommandLineToArgvW(::GetCommandLineW(), &nArgs);
	switch(nArgs)
	{
	case 1:
		::GetSystemFileCacheSize(&MiniCache, &MaxCache, &dwFlags);
		_stprintf_s(szMsg, _countof(szMsg), TEXT("使用方法:\n\nSetSystemFileCache.exe 最小缓存限制 最大缓存限制\n比如:SetSystemFileCache.exe 128 1024\n即设置最小缓存为128MB, 最大缓存1024MB\n\n刷新系统文件缓存: SetSystemFileCache.exe -flush\n\n关闭系统文件缓存限制(系统默认):\nSetSystemFileCache.exe -disable\n\n以服务方式运行:\nSetSystemFileCache.exe 128 1024 -Service\n即设置最小缓存为128MB,最大缓存为1024MB并以服务方式运行.\n\n当前系统文件缓存限制:\n最小文件缓存:%uMB\n最大文件缓存:%uMB\n最小文件缓存开关状态: %s\n最大文件缓存开关状态: %s\n"), 
			MiniCache/1024/1024, MaxCache/1024/1024, 
			dwFlags&FILE_CACHE_MIN_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"), 
			dwFlags&FILE_CACHE_MAX_HARD_ENABLE ? TEXT("开启") : TEXT("关闭"));
		::MessageBox(::GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
		break;
	case 2:
		EnablePrivileges();
		if (_tcsicmp(szArgList[1], TEXT("-flush")) == 0)
		{
			if (::SetSystemFileCacheSize(-1, -1, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
			{
				::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存成功!"), TEXT("提示"), MB_ICONASTERISK);
			}else
			{
				::MessageBox(GetDesktopWindow(), TEXT("刷新系统文件缓存失败!"), TEXT("提示"), MB_ICONASTERISK);
			}
		}
		else if(_tcsicmp(szArgList[1], TEXT("-disable")) == 0)
		{
			if (::SetSystemFileCacheSize(0, 0, FILE_CACHE_MAX_HARD_DISABLE|FILE_CACHE_MIN_HARD_DISABLE))
			{
				::MessageBox(GetDesktopWindow(), TEXT("已成功关闭系统文件缓存大小限制!"), TEXT("提示"), MB_ICONASTERISK);
			}else
			{
				::MessageBox(GetDesktopWindow(), TEXT("关闭系统文件缓存大小限制失败!"), TEXT("提示"), MB_ICONASTERISK);
			}
		}
		break;
	case 3:
		MiniCache = _ttol(szArgList[1])*1024*1024;
		MaxCache = _ttol(szArgList[2])*1024*1024;
		EnablePrivileges();
		
		if (::SetSystemFileCacheSize(MiniCache, MaxCache, FILE_CACHE_MAX_HARD_ENABLE|FILE_CACHE_MIN_HARD_ENABLE))
		{
			_stprintf_s(szMsg, _countof(szMsg), TEXT("设置系统文件缓存大小上限成功!\n\n当前设置: 最小缓存%dMB, 最大缓存%dMB"), MiniCache/1024/1024, MaxCache/1024/1024);
			::MessageBox(GetDesktopWindow(), szMsg, TEXT("提示"), MB_ICONASTERISK);
		}
		else
		{
			::MessageBox(GetDesktopWindow(), TEXT("设置系统文件缓存大小上限失败!"), TEXT("提示"), MB_ICONASTERISK);
		}
		
		break;
	case 4:
		if (_tcsicmp(szArgList[3], TEXT("-Service")) == 0)
		{
			TCHAR szPath[MAX_PATH] = {0};
			SERVICE_DESCRIPTION SrvDesc;
			SrvDesc.lpDescription = TEXT("Windows2008限制系统文件缓存工具\r\nBy zwfgdlc\r\n有任何疑问请联系:zwfgdlc@qq.com");
			
			SC_HANDLE hScm = ::OpenSCManager(NULL, NULL, GENERIC_READ | GENERIC_WRITE);
			::GetModuleFileName(NULL, szPath, _countof(szPath));
			
			if (hScm)
			{
				SC_HANDLE hService = ::CreateService(hScm, lpSrvName, TEXT("SetSystemFileCache"), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL);
				if (hService == NULL && ::GetLastError() == ERROR_SERVICE_EXISTS)
				{
					if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("创建服务失败!\n服务已经存在,是否删除服务?"), TEXT("警告"), MB_ICONWARNING|MB_YESNO))
					{
						hService = ::OpenService(hScm, lpSrvName, DELETE);
						if (hService!=NULL && ::DeleteService(hService))
						{
							::MessageBox(GetDesktopWindow(), TEXT("服务已删除!"), TEXT("提示"), MB_ICONASTERISK);
						}
						::CloseServiceHandle(hService);
					}
					::CloseServiceHandle(hScm);
				}
				else
				{
					::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &SrvDesc);
					if (IDYES == ::MessageBox(GetDesktopWindow(), TEXT("服务创建成功,是否立即启动服务?"), TEXT("提示"), MB_ICONASTERISK|MB_YESNO))
					{
						::StartService(hService, nArgs, (LPCTSTR*)szArgList);
					}
					::CloseServiceHandle(hService);
					::CloseServiceHandle(hScm);
				}
				
			}
		}
		
		break;
	default:
		::MessageBox(GetDesktopWindow(), TEXT("参数不正确!"), TEXT("提示"), MB_ICONWARNING);
		break;
	}

	LocalFree(szArgList);
	return 1;
}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
服务器安全管理制度 1. 执行服务器管理制度目的 为安全有效地管理机房及服务器,促进网络系统安全的应用.高效运行,特制定本规章 制度,请遵照执行。 2. 服务器管理 2.1 服务器监控 2.1.1 服务器日志监控 每天检查服务器系统日志,安全日志进行检查对错误、异常、警告等日志进行分析判断 并将判断结果进行有效解决处理并记录到《服务器监控记录表》,若服务器故障请按服务 器故障处理流程及时处理并记录到《服务器维护及故障处理记录表》。 2.1.2 服务器面板信息监控 每天检查负责机房内所有服务器、存储、UPS及其他机房设备面板信息,对异常的指示信 息及时作分析判断并将判断结果进行有效解决处理并记录到《服务器监控记录表》,若 服务器故障请按服务器故障处理流程及时处理并记录到《服务器维护及故障处理记录表》 。 2.1.3 服务器操作系统信息监控 每天检查所有服务器系统信息,包括磁盘空间使用率、系统资源使用率、杀毒软件、服 务器进程、必须启动的服务、用户访问记录、服务器时间。若有异常进行分析判断并将 判断结果进行有效解决处理并记录到《服务器监控记录表》,若服务器故障请按服务器故 障处理流程及时处理并记录到《服务器维护及故障处理记录表》。 2.1.4 服务器数据库信息监控 每天检查服务器所有数据库运行状态。包括数据库定时代理运行、数据库备份计划、数 据库日志及归档、数据库表空间使用率。若有异常进行分析判断并将判断结果进行有效 解决处理并记录到《服务器监控记录表》,若服务器故障请按服务器故障处理流程及时处 理并记录到《服务器维护及故障处理记录表》。 若监控数据库时发现数据库文件或日志增长过快等情况及时与负责系统的程序员检查 是否为程序异常导致。 2.1.5 服务器数据备份监控 每天检查服务器数据备份情况,定期维护备份空间,若有异常及时处理。 2.2 服务器日常维护及故障处理 2.2.1 服务器定期维护 根据《服务器管理方案表》定期对服务器进行维护,维护内容如下: 2.2.1.1 在停止所有用户会话的情况下进行重启服务器释放资源使用。 2.2.1.2 检查数据库使用状态、裸设备,清理僵死进程、临时表空间等。 2.2.1.3 清理过期的数据库归档日志释放数据库归档日志空间,并收缩数据库。 2.2.1.4 根据数据库每天监控得到的数据适当调整表空间大小、临时表空间大小、内 存使用调整、归档日志库大小等。 2.2.1.5 清除数据库中无效的索引、存储过程、定时代理等。 2.2.1.6 每月备份一次服务器及数据库系统文件、并清理一次系统及安全日志(先 备份再清除)。 2.2.1.7 每月对服务器进行一次硬件检测维护,主要包括安全隐患、性能等方面、如 机器温度、使用率等。 2.2.1.8 每周每台服务器杀毒软件至少升级一次、全盘杀毒一次。 2.2.1.9 服务器必须启动服务必须设置为自动启动,人为重启服务器后必须检查各项系 统运行必须服务是否启动正常。 2.2.2 服务器故障处理 2.2.2.1 服务器常用耗材备货,服务器管理员对服务器常用的耗材包括硬盘、电池、 内存等进行备货,若备货被使用请及时请购。 2.2.2.2 服务器故障处理流程及方案 3. 服务器请购 3.1 所有的服务器请购必须在本年度预算范围内进行。 3.2 系统负责人根据项目计划提前1个月填写《服务器需求配置表》发送给信息管理部总监、 网络管理处主任进行评估,评估确认后由网络管理处根据需求选定服务器配置 型号,提交请购单据并及时跟进审批及货期确保设备按计划到位。 4. 服务器安装 4.1 服务器安装前系统负责人确认《服务器需求配置表》并和服务器管理员共同制定安装方 案、各类软件、整理安装文档,并准备好所有的安装软件及插件经过网络管理处 主任同意后方可安装,安装过程中若遇到与初始制定的安装方案存在入的状况则 及时更新服务器安装文档。 4.2 服务器安装完毕经过测试成功后由服务器管理员整理所有的服务器安装档案,包括安 装配置文档软件、环境插件、操作系统版本、IP地址、计算机名、服务器账户密码 、数据库账户密码、系统初始资源信息、数据库初始资源信息,服务器档案整理完 毕后和该服务器操作系统镜像统一存放在服务器档案库和《服务器管理表》,并另存 一份至光盘以防止文件被病毒破坏。 4.3 根据系统需要与系统项目负责人一起制定服务器数据备份方案并更新《服务器备份方案 表》。开始备份服务器数据。 4.4 服务器系统必须升级安装所有安全补丁,弥补系统漏洞。 4.5 若有其他人员协助安装配置,需经过网络管理处主任批准,由管理员监督下安装。 5. 服务器备份 5.1根据系统需要与系统项目负责人一起制定每台服务器数据备份方案、并将方案更新 《服务器备份方案表》,后续严格按照《服务器备份方案表》进行备份,
三、实验内容与要求 1、熟悉windows的编程接口,使用系统调用编程实现将参数1对应文件1.txt和参数2对应文件2.txt的内容合并到参数3对应文件zong.txt中(上传文件名为学号后5位ex0701.c)。 2、使用windows提供的命令将文件1.txt和文件2.txt的内容合并到文件total.txt中 (请将实现的操作命令写入下题批处理文件的第一行)。 3、主管助理小张经常接收公司员工发来的文件,开始为了节省时间,小张将下载的文件都保存在文件夹xiazai中(文件名如图1所示,下载后直接解压即可),这样不便于后期的统计和分类管理,现在领导要求必须为所有员工(90人)每人单独建立一个文件夹(以员工工号命名10201、10202......10290),然后将他们提交的文件分别剪切到各自对应的文件夹中(如图2所示)。于是小张开始为7名员工建立文件夹,再一个一个的去做……同学们想想有没有一种方法能快速完成所要求的操作呢? 请熟悉windows的命令接口,使用windows提供的常用命令copy、md、del等编写一个批处理文件(上传文件名为学号后5位ex0703.bat),实现所要求的功能: 1、启动linux系统或通过windows telnet到linux。 2、用huas用户名和密码123456登入系统中。 3、打开一终端窗口(在linux桌面上单击右键,选择从终端打开)。然后在其中输入以下命令实验。 4、熟悉常用操作命令. 5、编辑如下源代码(实验教材P86 1.进程的创建)并保存 二、实验目的 (1)加深对进程概念的理解,明确进程和程序的区别。 (2)分析进程竞争资源现象,学习解决进程互斥的方法。 (3了解Linux系统中进程通信的基本原理。 三、实验内容与要求 (1)任务一:编写一段程序,使其实现进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发信号,子进程捕捉到信号后分别输下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输如下的信息后终止 Parent Process is Killed! (2)任务二:在上面的程序中增加语句signal (SIGNAL, SIG-IGN)和signal (SIGQUIT, SIG-IGN),观察执行结果,并分析原因。 (3)任务三:进程的管道通信 编制一段程序,实现进程的管道通信。 使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道中写一句话: Child 1 is sending a message! Child 2 is sending a message! 而父进程则从管道中读来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。 二、实验目的 自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。 三、实验内容与要求 1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 4)设计可视性较好的界面,应能反映进程状态的变化引起的对应PCB内容、组织结构的变化。 二、实验目的 存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 三、实验内容与要求 通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。 计算并输下属算法在不同内存容量下的命中率。  先进先的算法(FIFO); 最近最少使用算法(LRU) 二、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 三、实验内容与要求 设计有n个进程共享m个系统资源的系统,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。 系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析。 四、算法描述(含数据结构定义)或流程图 (一) 数据结构 1. 可利用资源向量Available ,它是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源的数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Available(j)=k,标是系统中现有Rj类资源k个。 2. 最大需求矩阵Max,这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。 3. 分配矩阵Allocation,这是一个n×m的矩阵,它定义了系统中的每类资源当前一分配到每一个进程的资源数。如果Allocation(i,j)=k,表示进程i当前已经分到Rj类资源的数目为k。Allocation i表示进程i的分配向量,有矩阵Allocation的第i行构成。 4. 需求矩阵Need,这是一个n×m的矩阵,用以表示每个进程还需要的各类资源的数目。如果Need(i,j)=k,表示进程i还需要Rj类资源k个,才能完成其任务。Need i表示进程i的需求向量,由矩阵Need的第i行构成。 上述三个矩阵间存在关系:Need(i,j)=Max(i,j)-Allocation(i,j)。 (二) 银行家算法 Request i 是进程Pi 的请求向量。Request i (j)=k表示进程Pi请求分配Rj类资源k个。当Pi发资源请求后,系统按下述步骤进行检查: 1. 如果Request i ≤Need,则转向步骤2;否则,认为错,因为它所请求的资源数已超过它当前的最大需求量。 2. 如果Request i ≤Available,则转向步骤3;否则,表示系统中尚无足够的资源满足Pi的申请,Pi必须等待。 3. 系统试探性地把资源分配给进程Pi,并修改下面数据结构中的数值: 二、实验目的 磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验来理解和掌握磁盘调度的职能。 三、实验内容与要求 分别模拟如下磁盘调度算法,对磁盘进行移臂操作:  先来先服务算法  最短寻道优先算法 1. 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。 2. 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提输入输请求而处于等待状态时,可用磁盘调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。 3. 由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。 4. 为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,参考程序流程图。 5. “接受请求”进程建立一张“进程请求I/O”表,指等待访问磁盘的进程要求访问的磁道,表的格式如下: 进程名 要求访问的磁道号 6. 磁盘调度的功能是查“请求I/O”表,当有等待访问的进程时,按磁盘调度算法从中选择一个等待访问的进程,按其指定的要求访问磁道。流程图中的“初始化”工作包括:初始化“请求I/O”表,设置当前移臂方向;当前磁道号。并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值