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

📄 read_block.c

📁 虚地址空间基于文件OS内核源代码和文件
💻 C
字号:
#include"memory.h"
	
int read_one_block(int file_window_number,
	int logic_address,int sleep_semaphore)
{
	int i,bn,front,back,return_value;
	int logic_block_number;
	struct physical_block *b,*b_f,*b_b;
	struct file_window *f;
	struct memory_process *p;
	struct memory_hash *h;
	
	logic_block_number=(logic_address/PAGE_SIZE);
	f=memory_body->file_window+file_window_number;
	if((bn=get_free_block(f->file.memory_process))<0)
		return bn;
	b=memory_body->physical_block+bn;
	b->state=READING_BLOCK;
	b->lock_number=0;
	b->file_window=file_window_number;
	b->logic_block_number=logic_block_number;
	
	if(f->block_ring<0)
		{f->block_ring=bn;b->file_front=bn;b->file_back=bn;}
	else{
		front=f->block_ring;
		b_f=front+memory_body->physical_block;
		back=b_f->file_back;
		b_b=back+memory_body->physical_block;
		
		b->file_front=front;b->file_back=back;
		b_f->file_back=bn;b_b->file_front=bn;
	}
	
	i=memory_body->hash_function
		(file_window_number,logic_block_number);
	i=(i%(*(memory_body->hash_number)));

	h=&(memory_body->hash[i]);
	if(h->hash_ring<0){
			h->hash_ring=bn;
			b->hash_front=bn;b->hash_back=bn;
		}
	else{
		front=h->hash_ring;
		b_f=front+memory_body->physical_block;
		back=b_f->hash_back;
		b_b=back+memory_body->physical_block;
		
		b->hash_front=front;b->hash_back=back;
		b_f->hash_back=bn;b_b->hash_front=bn;
	}
	
	p=memory_body->memory_process+f->file.memory_process;
	
	if(p->read_block_ring<0){
			p->read_block_ring=bn;
			b->buf_front=bn;b->buf_back=bn;
		}
	else{
		front=p->read_block_ring;
		b_f=front+memory_body->physical_block;
		back=b_f->buf_back;
		b_b=back+memory_body->physical_block;
		
		b->buf_front=front;b->buf_back=back;
		b_f->buf_back=bn;b_b->buf_front=bn;

	}

	b->sleep_semaphore.processor=-1;
	b->sleep_semaphore.semaphore=-1;
	b->lock_number++;p->read_block_number++;

	if(f->file.read_in_flag){
		return_value=read_write_file_system(READ_FILE,bn,b,f,
			(logic_address/PAGE_SIZE)*PAGE_SIZE,
			sleep_semaphore);
		wake_block(bn);
	}else
		return_value=0;

	b->lock_number--;p->read_block_number--;
	
	
	front=b->buf_front;back=b->buf_back;
	if(front==bn)
		p->read_block_ring=-1;
	else{
		if(p->read_block_ring==bn)
			p->read_block_ring=front;

		b_f=front+memory_body->physical_block;
		b_b=back+memory_body->physical_block;
		b_f->buf_back=back;
		b_b->buf_front=front;
	}

	if(p->block_ring<0){
			p->block_ring=bn;
			b->buf_front=bn;b->buf_back=bn;
		}
	else{
		front=p->block_ring;
		b_f=front+memory_body->physical_block;
		back=b_f->buf_back;
		b_b=back+memory_body->physical_block;
	
		b->buf_front=front;b->buf_back=back;
		b_f->buf_back=bn;b_b->buf_front=bn;
	}
	b->state=NOT_MODIFIED_BLOCK;
	if(return_value>=0)
		return bn;
	free_one_block(bn);
	return return_value;
}

⌨️ 快捷键说明

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