⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flush.c

📁 虚拟地址空间基于文件的操作系统
💻 C
字号:
#include"memory.h"

int flush_process_memory(
	int give_up_flag,int free_block_flag,int wait_flag,
	int process_number,int sleep_semaphore,
	struct capability *process_capability)
{
	int i,old_bn,bn,first_block,return_value,number,max_number;
	struct physical_block *b;
	struct memory_process *p;

	i=process_unmemory_map_deal(
		process_number,0,process_capability);
	if(i<0)
		return i;
	p=memory_body->memory_process+process_number;
	i=process_unmemory_map_deal(
		process_number,p->max_block_number,process_capability);
	if(i<0)
		return i;
	
	for(i=0,number=0,max_number=0;;){
		if((first_block=p->block_ring)<0)
			return number;
		for(bn=first_block;;){
			b=bn+(memory_body->physical_block);
			if(wait_flag){
				if(((b->state)==READING_BLOCK)
				||((b->state)==WRITING_BLOCK)){
					wait_block(bn,sleep_semaphore);
					break;
				}
			}
			if(max_number<(p->block_number))
				max_number=(p->block_number);
			i++;
			if(i>max_number)
				return number;
			if(b->state==MODIFIED_BLOCK){
				return_value=write_one_block(bn,
					sleep_semaphore,give_up_flag);
				if(return_value<0)
					return return_value;
				if(b->state!=MODIFIED_BLOCK)
					number++;
				break;
			}
			old_bn=b->buf_back;
			if(b->state==NOT_MODIFIED_BLOCK){
				if(b->lock_number>0)
					clear_block_number(b);
				if(free_block_flag)
					if(b->lock_number<=0)
						free_one_block(bn);
			}
			if((bn=old_bn)==first_block)
				return number;
		}
	}
}

int flush_file_window(
	int give_up_flag,int free_block_flag,int wait_flag,
	int file_window_number,int sleep_semaphore, 
	struct capability *file_capability)
{
	int i,first_block,bn,number,return_value,max_number;
	struct physical_block *b;
	struct file_window *f;
	struct memory_process *p;
		
	i=file_unmemory_map_deal(file_window_number,file_capability);
	if(i<0) return i;
	f=memory_body->file_window+file_window_number;
	p=memory_body->memory_process+f->file.memory_process;

	for(i=0,number=0,max_number=0;;){
		if((first_block=f->block_ring)<0)
			return number;
		for(bn=first_block;;){
			b=(memory_body->physical_block)+bn;
			if(wait_flag){
				if(((b->state)==READING_BLOCK)
				||((b->state)==WRITING_BLOCK)){
					wait_block(bn,sleep_semaphore);
					break;
				}
			}
			if(max_number<(p->block_number))
				max_number=(p->block_number);
			i++;
			if(i>max_number)
				return number;
			if(b->state==MODIFIED_BLOCK){
				f->block_ring=b->file_back;
				return_value=write_one_block(bn,
					sleep_semaphore,give_up_flag);
				if(return_value<0)
					return return_value;
				if(b->state!=MODIFIED_BLOCK)
					number++;
				break;
			}
			if(b->state==NOT_MODIFIED_BLOCK){
				if(b->lock_number>0)
					clear_block_number(b);
				if(free_block_flag)
					if(b->lock_number<=0)
						free_one_block(bn);
			}
			if((bn=b->file_back)==first_block)
				return number;
			f->block_ring=bn;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -