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

📄 fanyi .txt

📁 这是一个关于操作系统进程调度的实验
💻 TXT
字号:
3.1 实验一  并发进程间的冲突
    这个实验由两部分组成。第一部分,用C++写一个程序,实现对一个具有优先级排序的双向链表进行创建,添加结点,移动结点。然后用这段程序去熟悉NACHOS,熟悉一个工作线程的的代码。在随后的实验中,你要用到这个线程。但是现在,你仅仅用它提供的体验并发进程的乐趣即可。

class DLLElement {
public:
	DLLElement( void *itemPtr, int sortKey ); // initialize a list element,构造函数
	DLLElement *next;						// next element on list,and NULL if this is the last
	DLLElement *prev;                     // previous element on list,and NULL if this is the first
	int key;                              // priority, for a sorted list
	void *item;                           // pointer to item on the list
};
class DLList {
public:
	DLList();                    // initialize the list
	~DLList();                   // de-allocate the list
	void Prepend(void *item);    // add to head of list (set key = min_key-1)
	void Append(void *item);     // add to tail of list (set key = max_key+1)
	void *Remove(int *keyPtr);    // remove from head of list
                              // set *keyPtr to key of the removed item
                              // return item (or NULL if list is empty)
	bool IsEmpty(); // return true if list does't have elements

	void SortedInsert(void *item, int sortKey);// routines to put/get items on/off list in order (sorted by key)
	void *SortedRemove(int sortKey); // remove the first item with key==sortKey
                                 // return NULL if no such item exists
private:
	DLLElement *first; // head of the list, NULL if empty
	DLLElement *last; // last element of the list, NULL if empty
};

3.1.1 具有优先级的排序双向链表
这个双向链表根据一个整数key对items进行排序(插入操作不会带入关键字变量,它分配关键字的值是一致的)。你的代码将包含于三个文件中:dllist.h, dllist.cc, dllist-driver.cc. 前两个文件应该提供上面两个类的定义和完备。第三个文件包括两个函数:第一个用任意整数关键字形成N个items(or to aid debugging,你能控制输入顺序,就可以形成一个认真选择的关键字顺序)然后,把它们插入到一个双向链表;第二个函数从链表开始移动N个items,然后将这几个items打印出来到控制台上。两个函数都应把整数N和指向列表的指针当作参数。

为了证实你确实正确地写好类和驱动函数,建立一个单独的文件包括你程序的主函数。在这个主函数中,首先分配一个列表,然后调用上面的驱动函数,进行正确的传参。你所需证实的是你的移动函数能正确移动你按顺序插入的items。你也需做其他测试证实你的实现完成了一个双向链表。

即使你能在任何平台上写出,编译,运行上面的程序,我还是希望你能将它发展到Solaris SPARC平台或是Linux/x86 平台,用gcc来确定你的程序能在这个实验的下个部分和Nachos相互作用。

3.1.2 熟悉Nachos并明白它的线程系统
在实验的第二个部分,你需要明白Nachos线程系统是如何工作的(它的功能将扩展到随后的实验中)。一般,Nachos线程基元只是用在Nachos操作系统内核的内部,不直接被程序实用;事实上,这些基元和现实操作系统内核中管理过程的内部基元相似。然而,为了明白他们是如何工作的,在这个实验和实验三中,我们将用线程基元直接运行简单的并发程序,在Unix (Solaris)的应用中 。如果你发现你很迷惑,不要担心。

用make命令构建一个可执行的Nachos。运行make(不带参数)在代码目录下;这个可执行Nachos储存在thread的子目录下。一旦你处于这个线程子目录,你就可以运行一个简单的Nachos测试,通过输入nachos命令(if that doesn't work, try ./nachos ).

如果你测试threads/main.cc,你会发现你正在threadtest.cc 中执行函数ThreadTest。ThreadTest是并行程序的一个简单的例子。在这种情形下,两个独立的线程可以同时控制执行和并在一个过程中获得同样的数据。你的第一个目标就是通过这个程序理解线程基元,然后做一些试验帮你理解运行时多个线程间发生了什么。为了理解执行路径,通过追踪用于测试的简单情况即可。阅读2.2 Tracing(追踪) and Debugging Nachos Programs。

你的下个目标是,在运行时,用各种并发代码能打乱给定的未确定的线程执行顺序。通过揭露一些陷阱,当你期望他们时,他们更不可能出人意料地咬到你当你认为你的代码是正确的,在这个学期末时。这个实验要创建你自己的ThreadTest变体,由T线程开始存取一个特别具有共享的数据结构:在这个实验的第一部分你完成的异步优先排序的双向链表。通过异步,我们的意思是你的ThreadTest和列表完成不需要使用信号灯,互斥 ,中断禁用,或其他同步机制,你将了解它们在学期末。这些机制在于阻止一些问题(你在这个实验中会猜想和经历)

test program完成后,确认和举例出各种不正确或是不期望的动作。在你的记录中,你要向大家展现一些执行时的特殊交错。

modify 修改	interleavings 交错	illustrate 举例说明	analogous 类似的	enumerate 枚举
outline 描述要点	thorough 彻底的,完全的		exhaustive 无遗漏的	substantially 实质上,本质上


2 working with Nachos

make sense to 讲得通,理解	browse 浏览

2.1 Installing and Building Nachos
demo 呈现,展示		submit 递交,呈送	idiot 白痴	whereas 然而	
2.2 Tracing(跟踪) and Debugging(调试) Nachos Programs
  3种追踪的方法:1.printf or fprintf	2. 选择一些调试器:gdb等	3.把Nachos提供的calls插入到debug功能中
  
invest 花费,投资	synchronously 同步地,同时地	buffers 设置系统的磁盘缓存块数
character 字符	peek 偷看

2.3  Controlling the Order of Execution in Nachos 
concurrent 并发的	interleaving 交错	multiprocessor 多处理机	arbitrarily 任意的
uniprocessor-based 单处理机	context switches 上下文切换	exhaustively  用尽一切地
explicitly 明白地,明确地	hog 独占	simulated 模拟的	specified指定的

main.cc
bootstrap code 引导程序代码	
atoi 功能:把字符串转换成整型数

 ASSERT(argc > 1) 确定(argc > 1),否则跳出


 Flag == 5   printf("\tRemove interrupt!\n");
	 3   SortedInsert interrupt!
	 4   SortedRemove interrupt!
	 1   Begin interrupt!	
	 2   End interrupt!
	 6   SimpleThread interrupt!


		if( Flag == 1 && rand() % 2 == 0 )
		{
			printf("\tBegin interrupt!\n");
			currentThread->Yield();
		}

currentThread->Yield()调用以强制线程切换(注意相应文件中应该包含对外部变量currentThread的声明并include thread.h),

	for( i = 1; i < Thread_num; i++ )
	{
		Thread *t = new Thread("forked thread");
		t->Fork(SimpleThread, i);
	}
	SimpleThread(0);

  




















⌨️ 快捷键说明

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