搜档网
当前位置:搜档网 › 西安邮电大学Linux复习汇总

西安邮电大学Linux复习汇总

西安邮电大学Linux复习汇总
西安邮电大学Linux复习汇总

第一章概述

1、什么是POSIX标准,为什么现代造作系统的设计必须遵循POSIX标准?

答:POSIX表示可移植操作系统接口(Portable Operating System Interface)。

POSIX是在Unix标准化过程中出现的产物。

POSIX 1003.1标准定义了一个最小的Unix 操作系统接口。

任何操作系统只有符合这一标准,才有可能运行Unix程序。

2、什么是GNU?Linux与GNU有什么关系?答:GNU是GNU Is Not Unix的递归缩写,是自由软件基金会的一个项目。

GNU项目产品包括emacs编辑器、著名的

GNU C和Gcc编译器等,这些软件叫做GNU

软件。

GNU软件和派生工作均适用GNU通用公共

许可证,即GPL(General Public License)。

Linux的开发使用了众多的GUN工具。

3、Linux系统由哪些部分组成?Linux内核处于什么位置?

答:(1)符合POSIX标准的操作系统内核、Shell和外围工具。(2)C语言编译器和其他开发工具及函数库。(3)X Window窗口系统。(4)各种应用软件,包括字处理软件、图象处理软件等。

Linux内核是所有Linux 发布版本的核心。

第二章内存寻址

1、在80x86的寄存器中,哪些寄存器供一般用户使用?哪些寄存器只能被操作系统使用?

答:通用寄存器EAX,EBX,ECX,EDX,EBP(基址指针),ESP(堆栈指针),ESI(扩展源指针),EDI(扩展目的指针),还有EFLAGS(标志寄存器).

专供操作系统使用的寄存器:IDTR中断描述符寄存器,GDTR全局描述符表寄存器,LDTR局部描述符表寄存器,TaskRegisters任务寄存器,DebugRegister调试寄存器,ControlRegister控制寄存器,Model-SpecificRegisters模型专用寄存器。3、请用C语言描述段描述符表。

答:#include

#include

#define BASE_H 0xff00

#define BASE_M 0x00ff

#define BASE_L 0xffff

#define LIMIT_H 0x000f

#define LIMIT_L 0xffff

#define GRANULARITY 0x0080

#define SEGMENT_P 0x8000

#define SYSTEM_TYPE 0x1000

#define DPL 0x6000

#define TYPE_E 0x0800

#define TYPE_ED_C 0x0400

#define TYPE_RW 0x0200

#define TYPE_A 0x0100

struct {

unsigned char base_high;

unsigned char g : 1;

unsigned char other : 3;

unsigned char limit_high : 4;

unsigned char P : 1;

unsigned char dpl : 2;

unsigned char S : 1;

unsigned char E : 1;

unsigned char ED_C : 1;

unsigned char RW : 1;

unsigned char A : 1;

unsigned char base_middle;

unsigned short base_low;

unsigned short limit_low;

} gdt_t;

int main(int argc, char *argv[])

{

// int gdt[4] = {0x0fff, 0x0000, 0x9a00, 0x00c0} ; // 0x08

// int gdt[4] = {0x7fff, 0x0000, 0x9a01, 0x00c0} ; // 0x10

// int gdt[4] = {0x0002, 0x8000, 0x920b, 0x00c0} ; // display memory

// int gdt[4] = {0xffff, 0xffff, 0xffff, 0xffff} ; // test

int gdt[4] = {0x03ff, 0x0000, 0xf201, 0x00c0} ; // ldt0

unsigned int base, limit;

unsigned int granularity;

unsigned int present, dpl, system_type, segment_type;

unsigned int type_e, type_ed_c, type_rw, type_a; base = (gdt[3] & BASE_H) << 16;

base += (gdt[2] & BASE_M) << 16;

base += gdt[1] & BASE_L << 0;

limit = (gdt[0] & LIMIT_L) << 0;

limit += (gdt[3] & LIMIT_H) << 16;

granularity = (gdt[3] & GRANULARITY) >> 7; present = (gdt[2] & SEGMENT_P) >> 15;

dpl = (gdt[2] & DPL) >> 13;

system_type = (gdt[2] & SYSTEM_TYPE) >> 12; type_e = (gdt[2] & TYPE_E) >> 11;

type_ed_c = (gdt[2] & TYPE_ED_C) >> 10;

type_rw = (gdt[2] & TYPE_RW) >> 9;

type_a = (gdt[2] & TYPE_A) >> 8;

printf("base\t\t0x%x\t%d\n", base, base);

printf("limit\t\t0x%x\t%d\n", limit, limit);

printf("\n"); printf("G\t\t%d\t(0=bype, 1=4KB)\n",

granularity);

printf("\n");

printf("P\t\t%d\n", present);

printf("DPL\t\t%d\n", dpl);

printf("S\t\t%d\t(0=system, 1=code or data)\n",

system_type);

printf("TYPE_E\t\t%x\n", type_e);

printf("TYPE_ED_C\t%x\n", type_ed_c);

printf("TYPE_RW\t\t%x\n", type_rw);

printf("TYPE_A\t\t%x\n", type_a);

printf("\n");

printf("E=0, data segment\n");

printf("ED=0, data segment\n");

printf("ED=1, stack segment\n");

printf("W=0, not writable\n");

printf("W=1, writable\n");

printf("\n");

printf("E=1, code segment\n");

printf("C=0, ingore privilege\n");

printf("C=1, use privilege\n");

printf("R=0, not readable\n");

printf("R=1, readable\n");

return EXIT_SUCCESS;

}

4、Linux是如何利用段机制又巧妙的绕过段机制

的?在内核代码中如何表示各种段,查找最新源代

码并进行阅读和分析。

答:IA32规定段机制是不可禁止的,因此不可能绕

过它直接给出线性地址空间的地址。万般无奈之

下,Linux的设计人员干脆让段的基地址为0,而段

的界限为4GB,这时任意给出一个偏移量,则等式

为“0+偏移量=线性地址”,也就是说“偏移量=线性

地址”。另外由于段机制规定“偏移量< 4GB”,所

以偏移量的范围为0H~FFFFFFFFH,这恰好是线

性地址空间范围,也就是说虚拟地址直接映射到了

线性地址,我们以后所提到的虚拟地址和线性地址

指的也就是同一地址。看来,Linux在没有回避段

机制的情况下巧妙地把段机制给绕过去了。

另外,由于IA32段机制还规定,必须为代码

段和数据段创建不同的段,所以Linux必须为代码

段和数据段分别创建一个基地址为0,段界限为

4GB的段描述符。不仅如此,由于Linux内核运行

在特权级0,而用户程序运行在特权级别3,根据

IA32的段保护机制规定,特权级3的程序是无法访

问特权级为0的段的,所以Linux必须为内核和用

户程序分别创建其代码段和数据段。这就意味着

Linux必须创建4个段描述符——特权级0的代码

段和数据段,特权级3的代码段和数据段。

5、为什么在设计两级页表的线性地址结构时,给

页目录和页表各分配10位?如果不是这样,举例

说明会产生什么样的结果?

答:所谓两级页表就是对页表再进行分页。第一级

称为页目录,其中存放的是关于页表的信息。4MB

的页表再次分页(4MB/4K)可以分为1K个页,

同样对每个页的描述需要4个字节,于是可以算出

页目录最多占用4KB个字节,正好是一个页,其示

意图如2.9所示。

页目录共有1K个表项,于是,线性地址的最高10

位(即22位~ 31位)用来产生第一级的索引。两级表

结构的第二级称为页表,每个页表也刚好存放在一

个4K字节的页中,包含1K个字节的表项。第二级

页表由线性地址的中间10位(即21位~ 12位)进行

索引,最低12位表示页内偏量。

举例:如果页目录占用31~24位,页表项占用23~12

位,偏移地址占11~0位,则有2^8个页表项,一个

页面有2^12(4k)个表项,每个表项大小为4字节,

2^12的范围为4页面,而不是以一个页面为准。

6、深入理解图2.12,并结合图叙述线性地址到物

理地址的转换。

答:第一步,用32位线性地址的最高10位第31~22

位作为页目录项的索引,将它乘以4,与CR3中的

页目录的起始地址相加,获得相应目录项在内存的

地址。

第二步,从这个地址开始读取32位页目录项,取

出其高20位,再给低12位补0,形成的32位就是

页表在内存的起始地址。

第三步,用32位线性地址中的第21~12位作为页

表中页表项的索引,将它乘以4,与页表的起始地

址相加,获得相应页表项在内存的地址。

第四步,从这个地址开始读取32位页表项,取出

其高20位,再将线性地址的第11~0位放在低12

位,形成最终32位页面物理地址。

第三章进程

1、什么是进程控制块?它包含哪些基本信息?

答:对进程进行全面描述的数据结构,Linux中把

对进程的描述结构叫做task_struct:

struct task_struct {

}传统上这样的数据结构被叫做进程控制块PCB

(process control blaock)

系统为了管理进程设置的一个专门的数据结构,用

它来记录进程的外部特征,描述进程的运动变化过

程。系统利用PCB来控制和管理进程,所以PCB

是系统感知进程存在的唯一标志。进程与PCB是一

一对应的。

包含的基本信息:

(1)状态信息-描述进程动态的变化。(2)链接信息-

描述进程的父/子关系。(3)各种标识符-用简单数

字对进程进行标识。(4)进程间通信信息-描述多个

进程在同一任务上协作工作。(5)时间和定时器信息

-描述进程在生存周期内使用CPU时间的统计、计

费等信息。(6)调度信息-描述进程优先级、调度策

略等信息。(7)文件系统信息-对进程使用文件情况

进行记录。(8)虚拟内存信息-描述每个进程拥有的

地址空间。(9)处理器环境信息-描述进程的执行环

境(处理器的寄存器及堆栈等)

3、Linux的进程控制块如何存放?为什么?假设

ESP中存放的是栈顶指针,请用三句汇编语句描述

如何获得current的PCB的地址。

答:当进程一进入内核态,CPU就自动设置进程的

内核栈。这个栈位于内核的数据段上,为了节省空

间,Linux把内核栈和一个紧挨近的PCB的小数据

结构,thread_info放在一起,占用8kb的内存区。

因为这样可以节省空间,内核很容易从ESP寄存器

的值获得,当前在CPU上正在运行的thread_info

结构的地址。

movl $0xfffe000, %eax

andl %esp, %ecx

movl %ecx, p

4、PCB的组织方式有哪几种?为什么要采取这些

组织方式?

答:(1)进程链表(2)哈希表(3)就绪队列(4)

等待队列

在一个系统中,通常可以拥有数十个、数百个

乃至数千个进程,相应的就有这么多PCB。为了能

有效的对它们加以管理,应该用适当的方式将这些

PCB组织起来。

5、请编写内核模块,打印系统中各进程的名字以

及PID,同时统计系统中进程的个数。

答:static int print_pid(void)

{ struct task_struct *task,*p;

struct list_head *pos;

int count = 0;

printk("Hello World enter begin:\n");

task = &init_task;

list_for_each(pos,struct task_struct,tasks);

{ count++;

printk("%d->%s\n",p->pid,p->comm);

}

printk("the number of process is:%d\n",count);

return 0;

}

7、什么是写时复制技术,这种技术在什么情况下

最能发挥其优势?

答:父进程和子进程共享页面而不是复制页面。然

而,只要页面被共享,它们就不能被修改。无论父

进程和子进程何时试图写一个共享的页面,就产生

一个错误,这时内核就把这个页复制到一个新的页

面中并标记为可写。原来的页面仍然是写保护的:

当其它进程试图写入时,内核检查写进程是否是这

个页面的唯一属主;如果是,它把这个页面标记为

对这个进程是可写的。采用这种技术,显然只有预

测到将要修改的页才会被复制,而且必须被复制,

不然的话,就会破坏父进程的程序执行。

9、init内核线程与init进程是一回事吗?它们有什

么本质的区别?

答:(1)init()函数是内核代码的一部分,在内核

态运行,是独立的可执行代码的一部分。

(2)init进程在Linux操作系统中是一个具有

特殊意义的进程,它是由内核启动并运行的第

一个用户进程,因此它不是运行在内核态,而

是运行在用户态。它的代码不是内核本身的一

部分,而是存放在硬盘上可执行文件的映象

中,和其他用户进程没有什么两样。

10、用fork写一个简单的测试程序,从父进程和子

进程中打印信息。信息应该包括父进程和子进程的

PID。执行程序若干次,看两个信息是否以同样的

次序打印。

答:#include

int main(void)

{

pid_t pid;

pid = fork();

if(pid < 0)

{

printf("error");

return 0;

}

else if(pid == 0)

{

printf("this is chile process with pid

of %d\n",getpid());

}

else

{

printf("this is parent process with pid

of %d\n",pid);

}

return 0;

}

第四章内存管理

2、什么是内核映像?它存放在物理空间和内核空

间的什么地方?

答:内核空间由所有进程共享,其中存放的是内核

代码和数据,即“内核映象”Linu x内核映像被装入

在物理地址0x00100000开始的地方,内核映像在

内核空间的起始地址就为0xC0100000。

3、用户空间划分为哪几部分?用户程序调用

malloc()分配的内存属于那一部分?

答:分为堆栈段、BSS(未初始化的数据段)、数据段

和代码段。从数据段的顶部到堆栈段地址的下沿这

个区间是一个巨大的空洞,这就是进程在运行时调

用malloc()可以动态分配的空间,也叫动态内存或堆。

4、什么是虚存映射?有哪几种类型?

答:随着进程的运行,被引用的程序部分会由操作系统装入到物理内存,这种将映像链接到进程用户空间的方法被称为“虚存映射”,也就是把文件从磁盘映射到进程的用户空间,这样把对文件的访问转化为对虚存区的访问。有两种类型的虚存映射:(1)共享的:有几个进程共享这一映射,也就是说,如果一个进程对共享的虚存区进行写,其它进程都能感觉到,而且会修改磁盘上对应的文件。(2)私有的:进程创建的这种映射只是为了读文件,而不是写文件,因此,对虚存区的写操作不会修改磁盘上的文件,由此可以看出,私有映射的效率要比共享映射的高。除了这两种映射外,如果映射与文件无关,就叫匿名映射。

5、一个进程一般包含哪些虚存区?举例说明。

6、说明mmap()系统调用的功能?利用mmap()写一个拷贝文件的程序。

答:mmap()系统调用时通过调用do_mmap内核函数来实现建立文件到显存的映射。

int i,fd1,fd2;

char *buf1,buf2;

fd1 = open("data",0 KDOMCY);

if(fd1&&fd2&&(fstar(fd);&star buf1()=0)

{

if(lseek(fd) statbuf,st_size-1,seek_set)<0

{

perror"lseek target");

exit(-1);

}

if(MAP_FAILED == buf())

{

perror("Lmap source");

exit(-1);

}

if((map_FAFCE) == buf2)

{

perror("mmap target");

exit(-1);

}

mempy(buf2,buf1,(size - f)startbuf,st_size);

}

7、Linux是如何实现“请求调页”的?

答:1)如果被访问的页不在内存,也就是说,这个页还没有被存放在任何一个物理页面中,那么,内核分配一个新的页面并将其适当地初始化,这种技术称为“请求调页”;2)“请求调页”是一种动态内存分配技术,它将页面的分配推迟到不能再推迟为止,也就是说,一直推迟到进程要访问的页不在物理内存时为止,由此引起一个缺页异常;该技术的引入主要是因为进程开始运行时并不访问其地址空间中的全部地址。

8、试叙述伙伴算法的工作原理,并说明为什么伙伴算法可以消除外碎片?

答:假设要求分配的块其大小为128个页面。该算法先在块大小为128个页面的链表中查找,看是否有这样一个空闲块。如果有,就直接分配;如果没有,该算法会查找下一个更大的块,具体地说,就是在块大小为256个页面的链表中查找一个空闲块。如果存在这样的空闲块,内核就把这256个页面分为两等份,一份分配出去,另一份插入到块大小为128个页面的链表中。如果在块大小为256个页面的链表中也没有找到空闲页块,就继续找更大的块,即512个页面的块。如果存在这样的块,内核就从512个页面的块中分出128个页面满足请求,然后从384个页面中取出256个页面插入到块大小为256个页面的链表中。然后把剩余的128个页面插入到块大小为128个页面的链表中。如果512个页面的链表中还没有空闲块,该算法就放弃分配,并发出出错信号。

9、vmalloc()和kmalloc()有何区别?编写内核模块程序,调用这两个函数以观察二者所分配空间位于不同的区域。

答:在内核空间中调用kmalloc()分配连续物理空间,而调用vmalloc()分配非物理连续空间。我们把kmalloc()所分配内核空间中的地址称为内核逻辑地址,把vmalloc()分配的内核空间中的地址称为内核虚拟地址

vmalloc()在分配过程中须更新内核页表

#include

#include

#include

#include

#include

unsigned char * kmalloc men;

unsigned char * vmalloc men;

MODULL_LICENSE("GPL");

static int_init init_mmshow(void)

{

pagemem = _get_free_page(GFP_KERNEL);

if(!kmallocmen)

goto fail2;

printk(KERN_INFO"vmallocmen=0x%p\n",v mallocmen);

return 0;

failB

fail 1:

Kfree(kmallocmen);

fail 2:

free_page(pagemon);

fail 3:

return -1;

}

static void_exit cleanup_mmshow(void)

{

Vfree(vmallocmen);

Kfree(kmallocmen);

free_page(pagemen);

}

module_init(imit_mmshow);

module_exit(cleanup_mmshow);

10、分析守护进程kswapd的运行时机,你认为怎

样换出页面比较合理?

答:为了避免在CPU忙碌的时候,也就是在缺页异

常发生时,临时搜索可供换出的内存页面并加以换

出,Linux内核定期地检查系统内的空闲页面数是

否小于预定义的极限,一旦发现空闲页面数太少,

就预先将若干页面换出,以减轻缺页异常发生时系

统所承受的负担。当然,由于无法确切地预测页面

的使用,即使这样做了也还可能出现缺页异常发生

时内存依然没有足够的空闲页面。但是,预换出毕

竟能减少空闲页面不够用的概率。并且通过选择适

当的参数(如每隔多久换出一次,每次换出多少

页),可以使临时寻找要换出页面的情况很少发生。

为此,Linux内核设置了一个定期将页面换出的守

护进程kswapd。

第五章中断和异常

1、什么是中断向量?Linux是如何分配中断向量

的?

答:每个中断源都被分配一个8位无符号整数作为

类型码,即中断向量

Linux对256个向量的分配如下:(1)从0~31的向量

对应于异常和非屏蔽中断。(2)从32~47的向量(即

由I/O设备引起的中断)分配给屏蔽中断。(3)剩余

的从48~255的向量用来标识软中断。Linux只用了

其中的一个(即128或0x80向量)用来实现系统

调用。

3、如何对中断描述符表进行初始化?

答:Linux内核在系统的初始化阶段要初始化可编

程控制器8259A;将中断描述符表的起始地址

装入IDTR寄存器,并初始化表中的每一项;

当计算机运行在实模式时,中断描述符表被初

始化,并由BIOS使用;真正进入了Linux内

核,中断描述符表就被移到内存的另一个区

域,并为进入保护模式进行预初始化。

4、在中断描述符表中如何插入一个中断门、陷阱

门和系统门?

答:IDT表项的设置通过_set_gaet()函数实现。调用

该函数在IDT表中插入一个中断门:

set_intr_gate(unsigned int n, void *addr);调用该函数

在IDT表中插入一个陷阱门:set_trap_gate(unsigned

int n, void *addr);调用该函数在IDT表中插入一个

系统门:set_system_gate(unsigned int n, void *addr)

5、CPU为什么要进行有效性检查?如何检查?

CPU是如何跳到中断或异常处理程序的?

答:有效性检查避免用户应用程序访问特殊的陷阱

门或中断门。

当从用户态堆栈切换到内核态堆栈时,先把用户态

堆栈的值压入中断程序的内核态堆栈中,同时把

EFLAGS寄存器自动压栈,然后把被中断进程的返

回地址压入堆栈。如果异常产生了一个硬错误码,

则将它也保存在堆栈中。如果特权级没有发生变

化,则压入栈中的内容如图5.4中 。此时,CS:EIP

的值就是IDT表中第i项门描述符的段选择符和偏

移量的值,于是,CPU就跳转到了中断或异常处理

程序。

分两步进行有效性检查:首先是“段”级检查,将CPU

的当前特权级CPL(存放在CS寄存器的最低两位)

与IDT中第i项段选择符中的DPL相比较,如果

DPL(3)大于CPL(0),就产生一个“通用保护”

异常,因为中断处理程序的特权级不能低于引起中

断的进程的特权级。这种情况发生的可能性不大,

因为中断处理程序一般运行在内核态,其特权级为

0。然后是“门”级检查,把CPL与IDT中第i个门

的DPL相比较,如果CPL大于DPL,也就是当前

特权级(3)小于这个门的特权级(0),CPU就不

能“穿过”这个门,于是产生一个“通用保护”异常,

这是为了避免用户应用程序访问特殊的陷阱门或

中断门。但是请注意,这种“门”级检查是针对一般

的用户程序,而不包括外部I/O产生的中断或因

CPU内部异常而产生的异常,也就是说,如果产生

了中断或异常,就免去了“门”级检查。

6、中断处理程序和中断服务程序有何区别?Linux

如何描述一条共享的中断线?

答:中断服务程序ISR与中断处理程序是两个不同

的概念。在Linux中,15条中断线对应15个中断

处理程序。具体来说,中断处理程序相当于某个中

断向量的总处理程序,例如IRQ0x05_interrupt()是

中断号为5(向量为37)的总处理程序,如果这个

5号中断由网卡和图形卡共享,则网卡和图形卡分

别有其相应的中断服务程序。

typedef irqreturn_t(* irq_handler_t) (int, void *);

struct irqaction{

irq_handler_t handler;

unsigned long flags;

cpumask_t mask;

const char *name;

void *dev_id;

struct irqaction *next;

int irq;

...

};

8、为什么把中断分为两部分来处理?

答:中断服务例程一般都是在中断请求关闭的条件

下执行的,以避免嵌套而使中断控制复杂化。但是,

中断是一个随机事件,它随时会到来,如果关中断

的时间太长,CPU就不能及时响应其他的中断请求,

从而造成中断的丢失。因此,内核的目标就是尽可

能快的处理完中断请求,尽其所能把更多的处理向

后推迟。例如,假设一个数据块已经达到了网线,

当中断控制器接受到这个中断请求信号时,Linux

内核只是简单地标志数据到来了,然后让处理器恢

复到它以前运行的状态,其余的处理稍后再进行

(如把数据移入一个缓冲区,接受数据的进程就可

以在缓冲区找到数据)。因此,内核把中断处理分

为两部分:前半部分(top half)和后半部分(bottom

half),前半部分内核立即执行,而后半部分留着稍

后处理。

9、实时时钟和操作系统时钟有何不同?

答:大部分PC机中有两个时钟源,分别是实时时

钟(RTC)和操作系统(OS)时钟

实时时钟也叫硬件时钟,它靠电池供电,即使

系统断电,也可以维持日期和时间。

RTC是OS时钟的时间基准,操作系统通过

读取RTC来初始化OS时钟,此后二者保持

同步运行,共同维持着系统时间。所谓同步,

是指操作系统在运行过程中,每隔一个固定

时间会刷新或校正RTC中的信息

10、jiffies表示什么?什么时候对其增加?

答:jiffies是Linux内核中的一个全局变量,用它来

表示系统自启动以来的时钟节拍总数。启动时,内

核将该变量初始化为0,此后,每次时钟中断处理

程序都会增加该变量的值。

11、时钟中断的下半部分主要做什么?

答:run_lock_timers()函数去处理所有到期的定时

器,定时器作为软中断在下半部分中执行。

Scheduler_tick()函数负责减少当前运行进程的时间

片计数值并且在需要时设置need_resched标志。当

update_process_timer()函数返回后,do_timer()函数

接着会调用update_times()函数更新墙上时钟。

第六章系统调用

1、系统调用与库函数、系统命令及内核函数有什

么区别和联系?

答:应用编程接口(API)其实是一个函数定义,比

如常见的read()、malloc()、free()、abs()函数等,

这些函数说明了如何获得一个给定的服务;而系统

调用是通过软中断向内核发出一个明确的请求。从

编程者的观点看,API和系统调用之间没有什么差

别,二者关注的都是函数名、参数类型及返回代码的

含义。然而,从设计者的观点看,这是有差别的,

因为系统调用的实现是在内核完成的,而用户态的

函数是在函数库中实现的。系统命令相对应用编程

接口更高一层,每个系统命令都是一个可执行程

序,比如常用的系统命令ls、hostname等,这些命

令的实现调用了系统调用。内核函数与普通函数形

式上没有什么区别,只不过前者在内核实现,因此

要满足一些内核编程的要求。系统调用是用户进程

进入内核的接口层,它本身并非内核函数,但它是

由内核函数实现的,进入内核后,不同的系统调用

会找到各自对应的内核函数。

2、内核为什么要设置系统调用处理程序,它与服

务例程有什么区别?

答:用户空间的程序无法直接执行内核代码,内核

驻留在受保护的地址空间上,不允许用户进程内核

地址空间上读写。当用户态的进程调用一个系统调

用时,CPU切换到内核态并开始执行一个内核函

数。系统调用处理程序执行下列操作:

在内核栈保存大多数寄存器的内容;

调用所谓系统调用服务例程的相应的C函数来处理

系统调用;

通过ret_from_sys_call( )函数从系统调用返回;

不同的系统调用会找到各自对应的内核函数,这些

内核函数被称为系统调用的“服务例程”。

3、说明系统调用号的作用。

答:因为内核实现了很多不同的系统调用,因此进

程必须传递一个叫做系统调用号的参数来识别所

需的系统调用;

第七章内核中的同步

1、什么事临界区?什么是竞争状态?什么是同

步?

答:临界区(critical regions)就是访问和操作共享

数据的代码段,这段代码必须被原子地执行。竞争状

态是多个内核任务同时访问同一临界区。避免并发

和防止竞争状态称为同步(synchronization)

2、内核中造成并发执行的原因是什么?

答:(1)中断——中断几乎可以在任何时刻异步发

生,也可能随时打断正在执行的代码。(2)内核抢

占——若内核具有抢占性,内核中的任务就可能会

被另一任务抢占(3)睡眠及与用户空间的同步——

在内核执行的进程可能会睡眠,这将唤醒调度程

序,导致调度一个新的用户进程执行(4)对称多

处理——两个或多个处理器可以同时执行代码3、

给出信号量的定义,并说明down()和up()的含义。

答:信号量是在1968年由Edsger Wybe DijKstra提

出的,此后它逐渐成为一种常用的锁机制。信号量

支持两个原子操作P()和V(),这两个名字来自荷兰

语Proberen和Vershogen。前者做测试操作(字面

意思是探查),后者叫做增加操作。后来的系统把

这两种操作分别叫做down()和up(),Linux也遵从

这种叫法。down()操作通过对信号量计数减1来请

求获得一个信号量。如果结果是0或大于0,信号

量锁被获得,任务就可以进入临界区了。如果结果是负数,任务会被放入等待队列,处理器执行其它任务。down()函数如同一个动词“降低(down )”,一次down()操作就等于获取该信号量。相反,当临界区中的操作完成后,up()操作用来释放信号量,该操作也被称作是“提升(upping )”信号量,因为它会增加信号量的计数值。如果在该信号量上的等待队列不为空,处于队列中等待的任务在被唤醒的同时会获得该信号量。 4、申明一个信号量,并给出如何使用它。答:定义: struct semaphore { atomic_t count; int sleepers; wait_queue_head_t wait; } 使用: static DECLARE_MUTEX(mr_sem); /*声明并初始化互斥信号量*/ if(!down_interruptible(&mr_sem)) /* 信号被接收 , 信号量还未获取 */ /*临界区…*/ up(&mr_sem);

1、什么是软链接和硬链接?二者有何区别?

答:软链接(符号链接symbolic link )是一种特殊的文件,这种文件包含了另一个文件的任意一个路径名。这个路径名指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。硬链接(hard link)让一个文件对应一个或多个文件名,或者说把我们使用的文件名和文件系统使用的节点号链接起来,这些文件名可以在同一目录或不同目录 2、什么是虚拟文件系统?什么是虚拟文件系统界面?

答:为了支持其他各种不同的文件系统,Linux 提供了一种统一的框架,就是所谓的虚拟文件系统转换(Virtual Filesystem Switch ),简称虚拟文件系统(VFS)。

虚拟文件系统所提供的抽象界面主要由一组标准的、抽象的操作构成,例如read()、write()、lseek 等,这些函数以系统调用的形式供用户程序调用。这样,用户程序调用这些系统调用时,根本无需关心所操作的文件属于哪个文件系统,这个文件系统是怎样设计和实现的。

3、以wirte()系统调用为例,说明VFS 是如何与具体文件系统(如DOS 的FAT )相结合的?

答:Linux 的目录建立了一棵根目录为“/ ”的树。根目录包含在根文件系统中,在Linux 中,这个根文件系统通常就是 Ext2类型。其他所有的文件系统都可以被“安装”在根文件系统的子目录中。例如,用户可以通过“mount ”命令,将DOS 格式的磁盘分区(即FAT 文件系统)安装到Linux 系统中,然后,用户就可以像访问Ext2文件一样访问DOS 的文件。 4、内核如何组织索引结点?为什么要设置多个链表管理索引结点?

答:内核使用如下的数据库来自组织索引节点。 struct inode

{struct list_head i_hash; /*指向哈希链表的指针*/

struct list_head i_list; /*指向索引节点链表的指针*/

struct list_head i_dentry;/*指向目录项链表的指针*/

unsigned long i_ino; /*索引节点号*/ kdev_t i_dev; /*设备标识号 */

umode_t i_mode; /*文件的类型与访问权限 */ nlink_t i_nlink; /*与该节点建立链接的文件数 */ uid_t i_uid; /*文件拥有者标识号*/

gid_t i_gid; /*文件拥有者所在组的标识号*/ /***********用于索引节点操作的域*****************/

struct inode_operations *i_op; /*索引节点的操作*/ struct super_block *i_sb; /*指向该文件系统超级块的指针 */

atomic_t i_count;/*当前使用该节点的进程数。计数为0,表明该节点可丢弃或被重新使用 */

struct file_operations *i_fop; /*指向文件操作的指针 */

Struct vm_area_struct *i_op

unsigned int i_flags; /*文件系统的安装标志*/ union

{struct minix_inode_infor minix_i; struct Ext2_inode_info Ext2_i;

}使用多个链表加快了对索引节点对象的搜索 5、内核如何组织目录项结构?画图说明。

答:目录项(dentry )对象: 存放目录项与对应文件进行链接的信息。VFS 把每个目录看作一个由若干子目录和文件组成的常规文件。例如,在查找路径名/tmp/test 时 , 内核为根目录“/ ”创建第一个目录项对象, 为根目录下的 tmp 项创建第二级目录项对象,为 /tmp 目录下的test 项创建第三级目录项对象。

6、假定进程以读方式打开一个文件后,再执行fork ,父进程和子进程都将可以读这个文件。这两个进程的读操作和写操作有何关系? 答:这两个进程共享一个系统文件表项,于是也共享该文件的偏移。因此,这两个进程将读取文件的不同部分。如果没有其他的进程将该文件打开,写操作将添加到文件的尾部且写操作无数据丢失。

7、结合用户打开表说明什么是文件描述符? 答:文件描述符是用来描述打开的文件的。每个进程用一个files_struct 结构来记录文件描述符的使用情况,这个files_struct 结构称为用户打开文件表,它是进程的私有数据

8、从用户发出读请求到最终从磁盘读取数据包括哪些步骤?给出读操作的逻辑流。 答:从用户发出读请求到最终的从磁盘读取数据,可以概括为以下几步: (1)用户界面层——负责从用户函数经过系统调用进入内核;(2)基本文件系统层——负责调用文件读方法,从缓冲区中搜索数据页,返回给用户。(3)I/O 调度层——负责对请求排队,从而提高吞吐量。(4)I/O 传输层——利用任务队列,异步操作设备控制器,完成数据传输。 第九章 设备驱动 2时,若设备类型为块设备就指软盘驱动器,而若为字符设备则是指所谓“伪终端(Pseudo TTY )”设备。 2、什么是设备驱动程序?

答:处理和管理硬件控制器的软件

要使一项设备在系统中成为可见,成为应用程序可以访问的设备,首先要在系统中建立一个代表此设备的设备文件,这是通过系统调用mknode()实现的。除此之外,更重要的是在设备驱动层要有这种设备的驱动程序。

设备驱动程序是上层的同步操作与低层的异步操作之间的桥梁。

3、I/O 端口一般包括哪些寄存器?各自功能是什么?CPU 用什么命令对其进行读写?

答:CPU 把要发给设备的命令写入控制寄存器,并从状态寄存器中读出表示设备内部状态的值。CPU 还可以通过读取输入寄存器的内容从设备取得数据,也可以通过向输出寄存器中写入字节而把数据输出到设备。

Insb(),outsb(),insw(),outsw(),insl(),outsl()

4、驱动程序一般包含几部分?并对各部分给予简要说明。

答:根据功能,驱动程序的代码可以分为如下几个部分:

(1)驱动程序的注册和注销 (2)设备的打开与释放 (3)设备的读和写操作 (4)设备的控制操作

(5)设备的中断和查询处理

操作系统实验内存分配

西安邮电大学 (计算机学院) 课内实验报告 实验名称:内存管理 专业名称:软件工程 班级: 学生姓名: 学号(8位): 指导教师: 实验日期:

实验五:进程 1.实验目的 通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。 (1)掌握内存分配FF,BF,WF策略及实现的思路; (2)掌握内存回收过程及实现思路; (3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。 3.实验过程: 创建进程:

删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式:

wf最差匹配算法排列方式: 4.实验心得: 这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义: ①首次适应算法。在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。 ②循环首次适应算法。该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。 ③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。 ④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #include #include

2015西安交通大学操作系统考试试卷(带答案)

2015西安交通大学操作系统考试试卷(带答案)

2014—2015学年第 1 学期 (A 卷标准答案) 西安交通大学考试试卷(操作系统)(A /B □卷) 开课单位: 课程名称: 操作系统 课程编码: 106027 时间120分钟,开卷□/闭卷 ,总分100分,占总评成绩80%,2015 年1月11日 提示:本场考试不得携带使用计算器。 阅 卷 评 分 表(评阅人填写) 题号 一 二 三 四 五 六 七 八 总得分 得分 评阅人 诚信承诺: 我保证严格遵守学校考场规则,诚信应考。若有任何违纪、作弊行为,自愿接受学校按相关规定进行处理。 本人签名: 院(系): 专业班级: 姓名: 学号: 装 订

一、选择题(共20分,各选项0.5分) 1、在分时系统中,为使多个用户能够同时与系统交互,最关键的问题是( 4)A;当用户数目为100时,为保证响应时间不超过2s,此时的时间片最大应为( 2)B。 A:(1)计算机具有足够高的运行速度;(2)内存容量应足够大;(3)系统能及时地接收多个用户的输入;(4)能在一较短的时间内,使所有用户程序都得到运行;(5)能快速进行内外存对换。 B:(1)10ms;(2)20ms;(3)50ms;(4)100ms;(5)200ms。 2、设有10个进程共享一个互斥段,如果最多允许有1个进程进入互斥段,则所采用的互斥信号量初值应设置为( 3)A,而该信号量的取值范围为( 4)B;如果最多允许有3个进程同时进入互斥段,则所采用的互斥信号量初值应设置为( 2)C A,C:(1)10;(2)3;(3)1;(4)0。 B:(1)0~1;(2)-1~0;(3)1~-9;(4)0~-9。 3、在引入线程的操作系统中,资源分配和调度的基本单位是(2 ),CPU调度和分配的基本单位是(3)。 (1)程序;(2)进程;(3)线程;(4)作业。 4、设m为同类资源R的数目,n为系统中的并发进程数。当n个进程共享m个互斥资源R 时,每个进程对R的最大需求是w;则下列情况会出现死锁的是(4)。 (1)m=2,n=1,w=2;(2)m=2,n=2,w=1;(3)m=4,n=3,w=2;(4)m=4,n=2,w=3。 5、一个计算机系统的虚拟存储器最大容量是由(5)确定的,其实际容量是由(4)决定的。(1)计算机字长;(2)内存容量;(3)硬盘容量;(4)内存和硬盘容量之和;(5)计算机的地址结构。 6、下列解决死锁的方法中,属于死锁预防策略的是( 2),属于死锁避免策略的是( 1)。(1)银行家算法;(2)资源有序分配法;(3)资源分配图化简法;(4)撤销进程法。 7、为实现设备分配,应为每类设备配置一张( 1),在系统中配置一张( 3);为实现设备独立性,系统中应配置一张( 2)。 (1)设备控制表;(2)逻辑设备表;(3)系统设备表;(4)设备分配表;(5)I/O请求表8、现代操作系统中,提高内存利用率主要是通过(1或4)功能实现的,而使每道程序能在不受干扰的环境下运行,主要是通过(2 )功能实现的。 (1)对换;(2)内存保护;(3)地址映射;(4)虚拟存储器。 9、在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起(3);否则,若所需的页不在内存中,则会引起(4)。 (1)输入/输出中断;(2)时钟中断;(3)越界中断;(4)缺页中断。 10、测得某个请求调页的计算机系统部分的状态数据如下:CPU利用率为20%,用于对换空间的硬盘的利用率为97.7%,其它设备的利用率为5%。由此判定系统出现异常。此种情况下,(4)A或(1)B能提高CPU利用率。 A:(1)安装一个更快的硬盘;(2)通过扩大硬盘容量增加对换空间; (3)增加运行进程数;(4)减少运行进程数。 B:(1)加内存条,增加物理空间容量;(2)增加一个更快的CPU; (3)增加其他更快的I/O设备;(4)使用访问速度更快的内存条。 11、静态链接是在(5)A进行的,而动态链接是在(2)B或(3)C进行的,其中在(3)C进行链接可使得内存利用率最高;适用于动态链接的存储方式是(1)D。 A,B,C:(1)编译某段程序时;(2)装入某段程序时;(3)调入某段程序时;(4)紧凑时;(5)装入程序之前。 D:(1)分段存储管理;(2)分页存储管理;(3)可变分区管理;(4)固定分区管理。

2018西安邮电大学初试考试大纲—826数据结构

西安邮电大学硕士研究生招生考试大纲 科目代码:826 科目名称:《数据结构》 一、课程性质和任务 数据结构是计算机各专业的专业基础课。它是操作系统、数据库、编译原理等所有软件专业基础课和专业课的重要基础;它还是进行程序设计,尤其是进行高水平的应用程序和系统程序必不可少的基础。通过本课程的学习,使学生掌握数据组织、存储和运算的基本原理和方法,培养学生对各类数据结构和相关算法的分析和设计的能力,使学生能够编写出正确、清晰和较高质量的算法和程序。 二、课程教学内容和要求 第一章数据结构和算法 1.了解数据结构、逻辑结构、存储结构和抽象数据类型的基本概念。 2.了解数据结构的发展和地位。 3.了解各种算法描述方法和算法设计的基本要求。 4.掌握对算法的评价标准和算法效率的度量方法。 第二章线性表 1.理解线性表的概念、定义、逻辑结构和存储结构。 2.熟练掌握线性表的顺序结构及其各种基本运算。 3.熟练掌握单链表、循环链表、双向链表的存储结构及其各种基本运算。 4.理解链表的应用——稀疏多项式存储和运算。 第三章栈和队列 1.掌握栈的定义、表示、实现和应用。 2.掌握递归的概念和递归的实现过程。 3.掌握队列的定义以及顺序(循环队列)和链式存储结构的实现。 第四章串 1.了解串的基本概念及顺序和链式存储结构。 2.掌握串的各种基本运算。

3.了解串的模式匹配算法。 第五章数组和广义表 1.掌握数组的顺序存储结构。 2.理解稀疏数组的概念和压缩存储的方法。 3.理解稀疏矩阵的三元组存储结构和基本运算。 4.了解稀疏矩阵的十字链表存储结构。 5.理解广义表的基本概念,掌握广义表的存储结构。 第六章树 1.理解树的基本概念及其存储结构。 2.熟练掌握二叉树的定义、性质以及各种存储结构和遍历算法。 3.掌握线索二叉树的概念、存储结构及线索化算法。 4.掌握树和森林与二叉树间的转换,掌握树和森林的遍历算法。 5.掌握哈夫曼树的概念、存储结构和应用。 第七章图 1.理解图的基本概念,掌握图的邻接矩阵和邻接表的存储结构。 2.了解十字链表,邻接多重表等存储结构。 3.熟练掌握图的深度优先和广度优先遍历算法。 4.理解图的连通性、最小生成树的概念。 5.掌握求最小生成树算法。 6.理解有向无环图的概念,掌握拓扑排序和关键路径算法。 7.理解带权最短路径的概念,掌握求最短路径的算法。 第八章查找 1.理解查找的概念及其效率的评价方法。 2.理解静态查找表的概念,熟练掌握顺序、折半和分块查找算法。 3.理解动态查找表和二叉排序树的概念。 4.了解平衡二叉树的概念。 5.理解哈希表的含义,掌握哈希函数的构造和处理冲突的基本方法。第九章内部排序 1.掌握插入类排序的算法:直接插入排序、希尔排序。

西安邮电大学认识实习报告

西安郵電大学 认知实习报告书 院系名称:计算机学院 学生姓名:张帆帆 专业名称:计算机科学与技术 班级:1506班 实习时间:2016年6月20-216年6月22

认识实习报告 2016年6月20日我们开始了我们为期三天的认识实习,从学校一些重要的实验室到学校的网络中心室,还有西安软件园和中兴手机。 虽然说我们从来到这所学校已经快一年了,但是我们对学校的了解还是微乎其微,比如各种各样的实验室,他们有自己不同的发展方向和侧重点,还有各种各样高级的实验设备和经验丰富的指导老师,这些都是一个学校,一个学院甚至一个专业的精华所在,是无数代前人和学长学姐努力的产物,他们把它赋予价值并且发扬光大。相比于对自己学院的核心一无所知,整天待在宿舍,能见识一下自己所在地方的魅力,显得意义非凡。 第一天我们参观的是自动化学院的实验室,参观的同时有老师或者学长进行讲解,我们首先参观的是217-221实验室,他们的侧重点是测控和计控原理,其中自控原理的核心思想是闭环控制,老师讲解的时候举了一个空调的例子。一个闭环控制主要部件有控制器、执行器、被控对象和监测系统。即由监测系统检测并反馈给CPU,CPU启动执行器,执行器执行其所控制的被控对象,比如空调会制冷,形成一个闭合的执行系统。211实验室主要是单片机,也叫单板机,是一个装置的核心控制部分。然后还参观了无线传感实验室,主要承担智能传感网、物联网技术等,面向测控技术与仪器。中途老师还带我们参观了航模实验室,虽然核心地区在一个非常小的屋子里,但是里面墙壁,桌面上,地上,摆放着各种各样的飞行器组件及成品,虽然有些成品看起来非常简单,但它却能完成各种各样的飞行任务,保持双翼平衡及旋转角度控制,真的非常神奇,因为完成它们的不是什么传说中的科学家或教授,而是在校大学生,是一些为了梦想不断学习的普普通通的大学生。最后参观的是非常有意思的一个实验室,叫机器人创新实验室,他们主要是做一些有目的性的“机器人”,可以完成特定任务,当然它们的长相不一定是人的形态,是一个比较形象的称呼,主要是由一些传感器和电机以及单片机焊接电路组成,学长还展示了他们的功能,比如避障,摇尾巴,电子秤,会踢足球的机器人,还有门禁系统,我觉得这些和我们东区的嵌入式其实差不多,可是我却并不了解! 在这个过程中,老师还展示了一些学长学姐由一个思想的火花把它变成现实

操作系统实验内存分配

精心整理西安邮电大学 (计算机学院) 课内实验报告 1. (1 (2 (3 原因,写出实验报告。 2.实验要求: 1)掌握内存分配FF,BF,WF策略及实现的思路; 2)掌握内存回收过程及实现思路; 3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

3.实验过程: 创建进程: 删除其中几个进程:(默认以ff首次适应算法方式排列) Bf最佳适应算法排列方式: wf最差匹配算法排列方式: 4.实验心得: 明 实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。 5.程序源代码: #include #include #include #include

#define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小#define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 //起始位置 /*内存分配算法*/ #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 /*描述每一个空闲块的数据结构*/ struct free_block_type { }; /* /* { }; /* /* void display_menu(); int set_mem_size(); void set_algorithm(); void rearrange(int algorithm); int rearrange_WF(); int rearrange_BF(); int rearrange_FF(); int new_process(); int allocate_mem(struct allocated_block *ab);

数据结构课程设计报告含代码完整版

数据结构课程设计报告 含代码 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

西安邮电学院 数据结构课程设计报告题目:校园导航系统 院系名称:计算机学院 专业名称:计算机科学与技术 班级: 学生姓名: 学号(8位): 指导教师: 设计起止时间:2011年12月11日~2011年12月15日

一. 设计目的 1.通过本次课程设计巩固《数据结构》中所学的内容; 2.提高自己上机编程以及调试能力。 二. 设计内容 1.设计所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。 2.为来访客人提供图中任意景点相关信息的查询。 3.为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。 三.概要设计 1.功能模块图; 2.各个模块详细的功能描述。 1. 可以手动创建一个校园图。 2. 可以直接从文件读取校园各个景点的信息。 3. 可选择从任意个景点作为起点进行遍历。

4. 输入景点序号查询该景点相关信息。 5. 输入两个景点查询两个景点的最短,最佳及其所有的路径。 6. 将校园图信息保存入文件。 四.详细设计 1.功能函数的调用关系图

2.各功能函数的数据流程图 1. Adjmatrix *g即结构体对象在main()中被创建在其他子函数中进行参数传递。 2. 全局变量visited数组 中用。 3. 全局变量shorest[][],path[][] 在floyd()中被赋值来分别记录v[i]-v[j]最短路径和 v[i]-v[j]所经过景点。 3.重点设计及编码 两景点最短距离弗洛伊德算法 void floyd(adjmatrix *g) { int i,j,k; for(i=0;ivexnum;i++) for(j=0;jvexnum;j++) shortest[i][j]=0; for(i=0;ivexnum;i++) for(j=0;jvexnum;j++) { shortest[i][j]=g->arcs[i][j].adj; path[i][j]=0; } for(i=0;ivexnum;i++) for(j=0;jvexnum;j++) for(k=0;kvexnum;k++) if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) { shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k; } }

西安邮电大学软件课程设计报告

软件课程设计 报告书 院系名称:电子工程学院 学生姓名:李群 专业名称:光信息 班级:1103 学号:05113096 时间:2012年4月11日至2012年4月20日

实验题目 一、实验目的 让学生综合应用所学的计算机基础知识和所掌握的程序设计语言(C语言),自行设计并实现一个较为完整的小型管理信息系统或小型应用系统的设计与开发。其主要目的是使学生通过系统分析、系统设计、编程调试,写实验报告等环节,初步掌握软件系统设计的方法和步骤,灵活运用程序设计语言进行软件开发的能力,提高分析问题和解决问题的能力,提高程序设计水平。要求编程时采用结构体、指针、文件等复杂数据结构存储组织数据。 二、实验内容 1 通过键盘输入某位学生的学生证信息。学生证包含的信息请参看自己的学生证; 2 给定学号,显示某位学生的学生证信息; 3 学生信息的添加 4 显示全部的学生证信息; 5 给定某位学生的学号,修改该学生的学生证信息; 6 给定某位学生的学号,删除该学生的学生证信息; 7 提供一些统计各类信息的功能。统计学生数,学生男女人数; 8 能够对年龄进行升序和降序排序; 9 用文件的形式将录入的数据进行存储,并从其中读取数据。 三、需求分析 根据题目要求,学生信息要从文本文件中存取,所以本程序要提供读写文件,显示,统计,查寻,修改记录,保存文件等操作,此外,还要提供键盘式选择菜单实现功能。 四、概要设计 分析整个系统,根据上面的需求分析,可以将这个系统的设计分为如下几大模块:读取数据,输出数据,添加数据,输入数据、修改数据、查询数据、删除数据、统计数据,排序数据,保存数据。 五、详细设计及运行结果

电子生产实习报告 西安邮电大学

西安邮电大学 生产实习报告书 系部名称:电子工程学院 学生姓名: 专业名称:电子信息工程 班级: 实习时间:2013 年 2 月25日至2013 年3月8日

报告内容包括以下几方面: 一、生产实习的目的 1、通过实训熟悉原理图的绘制流程。 2、通过实训认识基本元器件的序号、封装形式。 3、通过实习制作原理图生成电路板。 4、通过实习学会自动布线,制作电路原理图元件和元件封装。 5、通过PROTELl 99 SE 完成几个简单的电路设计,建立和提高对SCH和PCB系统 的认识,并应用到自己的硬件电路设计中。 二、生产实习的内容 1、单片机板:原理图、两种封装形式(直插、表贴) 2、DSP板:符号库、封装库(表贴) 三、原理图设计步骤 (1)新建数据库文件:如mydesign2.ddb (2)建立原理图文件:File/new Schematic document sheet1.Sch (3)加载元件库:Miscellaneous Devices. lib; Protel Dos Schematic. lib; (4)绘制原理图,对于元件库中没有的元器件要自己创建。 (5)检查原理图:tools/ERC (6)添加器件封装:footprint,注意直插式和表贴式的封装形式是不同的。对于封装库中没有的封装,要注意利用向导自己建立。 (7)生成元件清单:reports/bill of material (8)产生网络表:Design/Create Netlist

四、印刷电路板设计步骤 (1)绘制原理图及生成网络表 (2)规划电路板 (3)启动印刷电路板编辑器 (4)设置参数 (5)装入网络表及元件的封装 (6)布置元件 (7)自动布线与手工调整 (8)印刷电路板文件的保存及打印输出 五、原理图符号库的设计 (1)进入元件符号库:design/make project library (2)利用绘图工具栏绘制所需元件。 (3)保存绘制元件,将元件置入电路图。 六、印刷电路板封装库的设计 (1)启动设计数据库文件,进入PCB元件编辑界面。 (2)从tools菜单中选择new component命令,进入封装创建向导。(3)根据实际的元器件确定封装形式,并按照向导的步骤创建元件封装。(4)保存添加。 各阶段电路原理图及封装结果如下: 1.单片机板: (1)原理图

西安邮电大学课程设计报告

一. 实验目的及实验环境 实验目的:目前,对于中小超市来说,需要采取一套行之有效的超市管理系统来管理超市的日常进货、销售、员工管理等信息。本次设计的超市管理系统就是想让用户以最少的手工业务处理,来完成超市中的日常工作,增加超市业务处理的效率。 一个典型的超市管理系统,除了应该完成超市中必要的销售工作,如收银台,还应该具有后台管理的功能。 实验环境:系统的体系结构:C/S结构 前台:Java (Eclipse 3.5) 后台数据库:SQL Server 2008 二. 实验内容 超市管理系统 该系统应具备前台收银操作,还有后台对各种数据的管理。 该系统应为多用户使用的,应以用户的权限来进入系统管理模块。 友好的界面及方便简单的操作。 数据存放在数据库中,系统对数据库可进行增、删、查、改的操作。三.方案设计 系统开发的总体任务是实现Java与SQL Server 2008的组合应用,实现用JDBC 方式调用SQL数据库,且有一定的透明性。 超市管理系统需要完成的功能主要有: 1、用户分类登录系统及权限管理。 2、超市收银台的销售管理方式。 3、销售商品信息的录入、查询、修改、删除。 4、供应商信息的录入,查询,修改、删除。 5、超市员工的职位基本信息的设定。 6、员工的基本信息的录入,查询,修改和删除。 7、仓库信息的录入与查看。 8、数据间的相互联系:销售商品的数量和库存量的基本联系;商品信息和供应商的相关数据联系;员工与职位间的联系等。 9、数据存放在数据库中,任何数据操作都是对数据库的数据的操作。

系统结构图(功能模块图) 各个模块的功能描述: (1)、登录界面:本系统简单的设置有三种职位,用户使用密码登录,成功后给其相应的操作界面。 (2)、仓库管理:是仓库管理员和老板可使用的操作,主要是查看仓库的入库信息和添加入库信息。 (3)、管理商品信息:只有老板可用,主要是查看现有商品的信息、修改、删除及添加新的商品信息。 (4)、管理供应商信息:只有老板可用,主要是查看现有的供应商的信息、修改、删除及添加新供应商的信息。 (5)、管理员工信息:只有老板可用,主要是查看现有的员工信息、修改、删除及增加新员工。 (6)、查看销售纪录。 四.测试数据及运行结果 1、Java与数据库SQL 2008的链接: String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=SuperMarket"; 2、用户登陆(登陆界面,老板界面,仓库管理员界面,销售员界面):

西安邮电大学linux操作系统课程设计

西安郵電大學 操作系统课程设计 报告书 院系名称:软件工程 学生姓名:蒋博 专业名称:软件工程 班级:1202班 学号:04123038 时间:2015 年4月13 日至2015 年4月24 日

1实验目的 操作系统是控制和管理计算机硬件和软件资源的虚拟机,其中的文件系统是对软件和设备进行管理的系统,文件系统是操作系统中非常重要的一个模块,它的实现占用了操作系统源码的最大编码量,其好坏也直接影响着用户对操作系统的感受程度。通过对操作系统课程设计的实践,进一步加深对文件系统的认识和理解,并在此基础上培养学生的工程应用能力。实验分别从用户态和内核态两个层次实践文件系统的部分功能。 2实验任务 2.1 ls实现 在linux下编程实现带参数的shell命令ls,ls命令必须支持如下功能。 1.基本要求 (1)支持-l 参数; (2)输出结果按字典排序; (3)列出“.”文件,支持-a参数,在没有-a时候不显示隐藏文件; (4)显示记录总数。 2.高级要求 (1)支持对给定的目录进行操作,如ls /tmp; (2)输出结果分栏排序,每栏的宽度由这一栏最长的文件名决定,显示的栏 数还受终端显示器的宽度影响,每一列尽可能的等宽; (3)正确显示文件特殊属性suid、sgid和sticky,参见联机帮助确保程序能处 理各种情况; (4)支持标准的ls支持选项-R,它的功能是递归地列出目录中所有的文件包 含子目录中的文件; (5)支持标准的ls支持选项-u,它会显示出文件的最后访问时间,如果用了 -u而不用-l,会有什么结果?; (6)当关掉一个文件的读权限,就不能打开这个文件来读。如果从一个终端 登录,打开一个文件,保持文件的打开状态,然后从另外的终端登录,去掉文件的读权限,这时有什么事情会发生?编写一个程序,先用open()打开一个文件,用read()读一些内容,调用sleep()等待20s以后,再读一些内容,从另外的终端,再等待的20s内去掉文件的读权限,这样会有什么结果?。 2.2编写内核模块显示目录或文件的信息。

西安邮电大学封面个人简历模板

……………………….…………………………………………………………………………………姓名:杜宗飞专业:计算机科学与技术 学院:数理信息学院学历:本科……………………….…………………………………………………………………………………手机:×××E – mail:×××地址:西安邮电大学

自荐信 尊敬的领导: 您好!今天我怀着对人生事业的追求,怀着激动的心情向您毛遂自荐,希望您在百忙之中给予我片刻的关注。 我是西安邮电大学计算机科学与技术专业的2014届毕业生。西安邮电大学大学四年的熏陶,让我形成了严谨求学的态度、稳重踏实的作风;同时激烈的竞争让我敢于不断挑战自己,形成了积极向上的人生态度和生活理想。 在西安邮电大学四年里,我积极参加各种学科竞赛,并获得过多次奖项。在各占学科竞赛中我养成了求真务实、努力拼搏的精神,并在实践中,加强自己的创新能力和实际操作动手能力。 在西安邮电大学就读期间,刻苦进取,兢兢业业,每个学期成绩能名列前茅。特别是在专业必修课都力求达到90分以上。在平时,自学一些关于本专业相关知识,并在实践中锻炼自己。在工作上,我担任西安邮电大学计算机01班班级班长、学习委员、协会部长等职务,从中锻炼自己的社会工作能力。 我的座右铭是“我相信执着不一定能感动上苍,但坚持一定能创出奇迹”!求学的艰辛磨砺出我坚韧的品质,不断的努力造就我扎实的知识,传统的熏陶塑造我朴实的作风,青春的朝气赋予我满怀的激情。手捧菲薄求职之书,心怀自信诚挚之念,期待贵单位给我一个机会,我会倍加珍惜。 下页是我的个人履历表,期待面谈。希望贵单位能够接纳我,让我有机会成为你们大家庭当中的一员,我将尽我最大的努力为贵单位发挥应有的水平与才能。 此致 敬礼! 自荐人:××× 2014年11月12日 唯图设计因为专业,所 以精美。为您的求职锦上添花,Word 版欢迎 下载。

西安邮电大学verilog HDL 实验报告

西安邮电大学verilog课程实验报告 院系:电子工程学院 专业班级:电子10班 学号:(17) 姓名: 222 2013年6月8 日

实验一门级建模 1.实验内容 (1)使用nand门编写双输入端的与门,或门及非门my_or,my_and和my_not门构造一个双输入端 的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真。 (2)本章中的一位全加器使用乘积项之和的形式可以表示为: Sum=a*b*c_in+a’b*c_in’+a’b’*c_in+a*b’*c_in’ C_out=a*b+b*c_in+a*c_in 其中a,b和c_in为输入,sum和c_out为输出;只使用与门、或门、非门实现一个一位全加器,写出Verilog描述,限制是每个门最多有四个输入端。编写激励模块对功能进行检查,并对全部的输入组合进行测试。 2.实验目的 (1)掌握门基本类型,并学习Verilog提供的门级原语 (2)理解门的实例引用 (3)熟悉门级建模的一般步骤 (4)熟悉编程软件 3.实验步骤 (1)先根据题目要求构建my_or,my_and,my_not;其次根据所设计的门来设计my_xor,并且编写激励对所设计的进行验证 实验代码及仿真激励代码如下 module myxor(out,x,y); output out; input x,y; wire x,y; wire y0,y1,y2,y3; my_not mynot0(y0,x,1); my_not mynot1(y1,y,1); my_and myand0(y2,y,y0); my_and myand1(y3,y1,x);

西安邮电大学本科生学分制学籍管理办法

西安邮电大学本科生学分制学籍管理办法 为提高教育教学质量,维护正常教学秩序,培养德智体全面发展的高素质人才,根据教育部《普通高等学校学生管理规定》、《高等学校学生行为准则》及陕西省教育厅普通高等学校学生管理有关规定精神,结合我校办学实际,制定本办法。 第一章总则 第一条我校全日制本科生实施学分制。 第二条学分制是用学分计算学习量的一种教学管理制度。学生可以根据专业培养方案及自己的基础和能力,在教师的指导下安排学习计划。 第三条学生选课应办理有关选课手续。免修、免听课程应由本人提出书面申请,经学院批准,教务处审核后方可进行。 第四条对学有余力的学生,经批准可以跨校、跨学院、跨专业、跨年级选课。 第五条学生成绩档案必须同时登记考核成绩和学分。有正式学籍的学生修满专业培养方案规定的应修学分,同时符合学校有关规定者,准予毕业。 第六条我校本科生标准学制为四年,学生在校修读年限最长为六年。在校时间超过四年者,需按规定标准缴纳培养费。 第二章教学实施细则 第七条全日制本科教学必须依照专业培养方案组织实施。 第八条各专业所学课程分必修课、选修课两类。 第九条课程修读 (一)必修课 学生应根据各专业培养方案的安排,修读各门必修课。 (二)选修课选课原则

学生应以培养方案安排为依据,在专业教师的指导下,确定选读课程、选修时间及顺序。凡有先修课要求的课程,一般应首先修完先修课程,取得学分后,才可选修该课程。 (三)选修课修读办法 1.各类选修课修读学分要求详见各专业培养方案。学生在毕业前必须修够所在专业要求的相应学分方可毕业。 2.学校于每学期第八周左右按照专业培养方案,组织落实下一学期各专业拟开设的选修课程,并向全校公布,以供学生选课。 3.学生预选课程前,各开课学院应组织有关教师参加选课的咨询活动,向学生介绍所开课程情况、解答学生提出的问题等。 4.凡经批准选定的课程,中途不得更改。学生应按规定参加该课程的各项教学活动,凡缺课三分之一以上者不得参加该课程的考核。 5.凡未按规定办理选修手续者,不得参加该门选修课的考核。 第十条学分按照各专业人才培养方案要求认定。 第十一条学生须修满本专业培养方案要求的毕业最低学分,其中必修课学分不得用其它学分替补。 第三章学籍管理细则 第一节入学与注册 第十二条凡本校录取的新生,必须持本校录取通知书和学校规定的有关证件,按规定的期限到校办理入学手续。因故不能按期入学者,应书面向学校请假,假期不得超过两周。未请假或者请假逾期者,除因不可抗力等正当事由以外,视为放弃入学资格。 第十三条新生入学后,学校将在三个月内,按照国家招生规定对其进行复查。复查合格者予以注册,即取得学籍。复查不

西安邮电大学嵌入式课后答案

嵌入式系统开发 习题1 1.什么是嵌入式系统?有何特点? 答:嵌入式系统的概念有很多种,在嵌入式系统领域中比较认同的嵌入式系统的概念是:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。 嵌入式系统的特点: ⑴嵌入式系统是将先进的计算机技术、半导体技术以及电子技术与各个行业的具体应用相结合的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 ⑵系统内核小。由于嵌入式系统一般是应用于小型电子装置中,系统资源相对有限,所以内核较之传统的操作系统要小得多。 ⑶专用性强。 ⑷系统精简。 ⑸系统软件(OS)要求具有高实时性。 ⑹嵌入式软件开发要走向标准化,需要使用多任务的操作系统。 ⑺嵌入式系统本身并不具备在其上进行进一步开发的能力。 2.嵌入式系统可以分为几层?每一层各完成哪些功能? 答:嵌入式系统由硬件层、中间层、软件层和功能层组成。 硬件层:以嵌入式微处理器为核心,存储器用以存储数据和执行代码,相关的设备接口和I/O接口,这些组成了一个嵌入式系统的基础,实现逻辑运算,算术运算等。 中间层:将系统上层软件和底层硬件进行分离,封装成标准的接口,在上层软件开发人员无需知道底层硬件的具体情况,完成的任务是底层硬件的初始化、数据的输入/输出操作、硬件的配置等功能。 软件层:主要由RTOS、文件系统、图形用户接口、网络系统和通用的组件模块组成,是软件开发的基础。 功能层:用来完成被控对象的控制功能。 3.嵌入式系统中硬件抽象层有什么特点? 答:硬件抽象层是介于硬件层与软件层之间的中间层,它将系统上层软件与底层硬件分离开来,具有以下两个特点: ⑴硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软件与硬件平台之间的接口,硬件抽象层需要为操作系统提供操作和控制具体硬件的方法。 ⑵操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。 4.简述嵌入式处理器的硬件组成? 答:随着集成电路集成度的不断提高,嵌入式系统板级的硬件电路模块也越来越多的集成到芯片内部,目前处理器芯片内部的电路模块组成如下: ⑴处理器内核,以CPU为核心,有的还包含MMU(存储器管理单元)、Cache(高速缓存)、ICE(在线仿真)等电路模块。

2016西安交通大学操作系统实验报告

操作系统实验报告 实验一:用户接口实验 一.实验目的 1.理解面向操作命令的接口Shell。 2.学会简单的shell编码。 3.理解操作系统调用的运行机制。 4.掌握创建系统调用的方法。 操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。用户接口实验也因此而分为两大部分。首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell编程方法。然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。 二.实验内容 1)控制台命令接口实验 该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell 和进行简单的shell编程。 查看bash版本。 编写bash脚本,统计/my目录下c语言文件的个数 2)系统调用实验 该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall()” 和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。 编程调用一个系统调用fork(),观察结果。 编程调用创建的系统调用foo(),观察结果。

自己创建一个系统调用mycall(),实现功能:显示字符串到屏幕上。 编程调用自己创建的系统调用。 三.实验步骤 系统调用实验: 1.首先将Linux-3.0.tar.bz2拷贝到/usr/src目录下 ——命令:cp linux-3.0.tar.bz2 /usr/src/ 2.打开终端,获得root权限 ——命令:sudo –s 3.进入/usr/src目录 ——命令:cd /usr/src 4.解压linux源码 ——命令:tar xvzf linux-3.0.tar.bz2 5.进入目录linux-3.0.5 ——命令:cd linux-3.0 6.添加系统调用 ——操作:gedit kernel/myservice.c 在文本编辑器中添加 #include #include asmlinkage void sys_mycall() { printk(KERN_INFO "Hello, world!\n"); return; } 7.修改kernel/Makefile添加生成myservice.c添加到Makefile的编译规则中: obj-y += myservice.o 8..修改arch/x86/include/asm/unistd_32.h,添加以下内容: #define __NR_mycall SYS_ID //SYS_ID表示新添加系统调用的调用号

西安邮电大学操作系统期末考试题及答案

2010―2011 学年度第二学期 一、单项选择题(每题1分,共20分) 1.操作系统的发展过程是( C ) A、原始操作系统,管理程序,操作系统 B、原始操作系统,操作系统,管理程序 C、管理程序,原始操作系统,操作系统 D、管理程序,操作系统,原始操作系统 2.用户程序中的输入、输出操作实际上是由( B )完成。 A、程序设计语言 B、操作系统 C、编译系统 D、标准库程序 3.进程调度的对象和任务分别是( C )。 A、作业,从就绪队列中按一定的调度策略选择一个进程占用CPU B、进程,从后备作业队列中按调度策略选择一个作业占用CPU C、进程,从就绪队列中按一定的调度策略选择一个进程占用CPU D、作业,从后备作业队列中调度策略选择一个作业占用CPU 4.支持程序浮动的地址转换机制是( A ) A、动态重定位 B、段式地址转换 C、页式地址转换 D、静态重定位 5.在可变分区存储管理中,最优适应分配算法要求对空闲区表项按( C )进行排列。 A、地址从大到小 B、地址从小到大 C、尺寸从小到大 D、尺寸从大到小 6.设计批处理多道系统时,首先要考虑的是( 系统效率和吞吐量 )。 A、灵活性和可适应性 B、系统效率和吞吐量 C、交互性和响应时间 D、实时性和可靠性 7.当进程因时间片用完而让出处理机时,该进程应转变为( B )状态。 A、等待 B、就绪 C、运行 D、完成 8.文件的保密是指防止文件被( C )。 A、篡改 B、破坏 C、窃取 D、删除 9.若系统中有五个并发进程涉及某个相同的变量A,则变量A的相关临界区是由( D )临界区构成。 A、2个 B、3个 C、4个 D、5个10.按逻辑结构划分,文件主要有两类:(A)和流式文件。 A、记录式文件 B、网状文件 C、索引文件 D、流式文件 11.UNIX中的文件系统采用(D)。 A、网状文件 B、记录式文件 C、索引文件 D、流式文件 12.文件系统的主要目的是( A )。 A、实现对文件的按名存取 B、实现虚拟存贮器 C、提高外围设备的输入输出速度 D、用于存贮系统文档 13.文件系统中用( D )管理文件。 A、堆栈结构 B、指针 C、页表 D、目录 14.为了允许不同用户的文件具有相同的文件名,通常在文件系统中采用( B )。 A、重名翻译 B、多级目录 C、约定 D、文件名 15.在多进程的并发系统中,肯定不会因竞争( C )而产生死锁。 A、打印机 B、磁带机 C、CPU D、磁盘 16.一种既有利于短小作业又兼顾到长作业的作业调度算法是( C )。 A、先来先服务 B、轮转 C、最高响应比优先 D、均衡调度 17.两个进程合作完成一个任务。在并发执行中,一个进程要等待其合作伙伴发来消息,或者建立某个条件后再向前执行,这种制约性合作关系被称为进程的( B )。 A、互斥 B、同步 C、调度 D、伙伴 18.当每类资源只有一个个体时,下列说法中不正确的是( C )。 A、有环必死锁 B、死锁必有环 C、有环不一定死锁 D、被锁者一定全在环中 19.数据文件存放在到存储介质上时,采用的逻辑组织形式是与( A )有关的。 A、文件逻辑结构 B、存储介质特性 C、主存储器管理方式 D、分配外设方式 20.在单处理器的多进程系统中,进程什么时候占用处理器和能占用多长时间,取决于( B )。 A、进程相应的程序段的长度 B、进程自身和进程调度策略 C、进程总共需要运行时间多少 D、进程完成什么功能 二、填空题(每空2分,共20分)

西安邮电大学编译原理语法分析器的制作

《编译原理》实验报告题目: 语法分析器的制作 学生姓名:江荣吉 班级: 学号: 指导教师: 成绩: 西安邮电大学计算机学院 2015 年 6 月 7 日

一:实验目的 熟悉语法分析的过程; 理解相关文法的步骤; 熟悉First集和Follow集生成 二:实验要求 对于给定的文法,试编写调试一个语法分析程序: 要求和提示: (1)可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、SLR(1)等)作为编制语法分析程序的依据。 (2)对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。 (3)能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情 况。 设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。 三:实验过程 1:文法: E->TE’ E’->+TE’|ε T->FT’ T’->*FT’|ε F->(E)|i: 2程序描述(LL(1)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。

西安邮电大学《分布式计算原理及应用》实验报告

《分布式计算原理及应用》实验报告题目: Web服务器的实现 学生姓名: 班级:软件工程1202 学号: 指导老师:张庆生 成绩: 西安邮电大学计算机学院 2015 年 4 月 10日

一、实验目的 ①掌握如何创建监听端口请求 ②了解Http的GET请求命令格式 ③了解GET请求的实现机制 二、实验内容及要求 ①连接:Web浏览器与Web服务器建立连接,打开一个socket套接字,建 立连接。 ②Web浏览器通过socket向Web服务器提交请求。HTTP的请求以GET方法。 ③Web浏览器提交请求后,通过HTTP协议传送给Web服务器,Web服务器 接收到之后,处理请求,并将处理结果通过HTTP传给Web浏览器,将请 求的内容在web浏览器上显示出来. 三、实验过程 1、创建监听服务的端口; 核心代码:当程序运行之后开始监听8080端口是是否有请求: package http; import https://www.sodocs.net/doc/ed12014699.html,.Socket; import https://www.sodocs.net/doc/ed12014699.html,.ServerSocket; import https://www.sodocs.net/doc/ed12014699.html,.InetAddress; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; import java.io.File; public class HttpServer { public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";

相关主题