北京邮电大学操作系统实验 (2)

北京邮电大学操作系统实验 (2)
北京邮电大学操作系统实验 (2)

操作系统

班级:2011211302

学号:2011211168

姓名:康雅微

目录

实验5.1 进程通信观察实验

实验6.3 I/O系统编程实验

实验7.1 文件管理系统管理实验代码分析

实验5.1 观察实验

1、实验目的与内容

在Linux下,用ipcs()命令观察进程通信情况,了解Linux基本通信机制。

2、实验原理

Linux IPC继承了Unix System V及DSD等,共有6种机制:信号(signal)、管道(pipe 和命名管道(named piped)、消息队列(message queues)、共享内存(shared memory segments)、信号量(semaphore)、套接字(socket)。

本实验中用到的几种进程间通信方式:

(1)共享内存段(shared memory segments)方式

–将2个进程的虚拟地址映射到同一内存物理地址,实现内存共享

–对共享内存的访问同步需由用户进程自身或其它IPC机制实现(如信号量)

–用户空间内实现,访问速度最快。

–Linux利用shmid_ds结构描述所有的共享内存对象。

(2)信号量(semaphore)方式

–实现进程间的同步与互斥

–P/V操作,Signal/wait操作

–Linux利用semid_ds结构表示IPC信号量

(3)消息队列(message queues)方式

–消息组成的链表,进程可从中读写消息。

–Linux维护消息队列向量表msgque,向量表中的每个元素都有一个指向msqid_ds结构的指针,每个msqid_ds结构完整描述一个消息队列

LINUX系统提供的IPC函数有:

●msgget(关键字,方式):创建或打开一个消息队列

●msgsnd(消息队列标志符,消息体指针,消息体大小,消息类型):向队列传递消息●msgrcv(消息队列标志符,消息体指针,消息体大小,消息类型):从队列中取消息●msgctl(消息队列标志符,获取/设置/删除,maqid_ds缓冲区指针):获取或设置某

个队列信息,或删除某消息队列

Linux系统中,内核,I/O任务,服务器进程和用户进程之间采用消息队列方式,许多微内核OS中,内核和各组件间的基本通信也采用消息队列方式.

3、实验结果

实验6.3 编程实验

1、实验目的

编写一个daemon进程,该进程定时执行ps命令,然后将该命令的输出写至文件F1尾部。通过此实验,掌握Linux I/O系统相关内容。

2、实验原理

在这个程序中,首先fork一个子程序,然后,关闭父进程,这样,新生成的子进程被交给init进程接管,并在后台执行。

新生成的子进程里,使用system系统调用,将ps的输出重定向,输入到f1.txt 里面。

3、实验步骤

编写daemon.c

代码如下:

#include

#include

int main(intargc,char* argv[])

{

inti,p;

p = fork();

if(p > 0){

exit(0);

}

else if(p == 0){

for(i = 0; i< 100; i++){

sleep(100);

system("ps> f1.txt");

}

}

else{

perror("Create new process!");

}

return 1;

}

}

编译程序

# gcc -o daemon daemon.c

执行程序

# ./daemon

5、实验结果及分析

程序sleep(100)后会在当前目录生成一个文件f1.txt,内容如下:PID TTY TIME CMD

1258pts/0 00:00:00 bash

2729 pts/0 00:00:00 daemon

2801 pts/0 00:00:00 sh

2802 pts/0 00:00:00 ps

再sleep(100),此文件会更新。重复执行100次。

实验7.1 代码分析

1、实验目的

了解与文件管理有关的Linux内核模块的代码结构。

2、实验内容

阅读Linux/Minix中有关文件模块的调用主线,并写出分析报告,包括

●文件建立模块,即系统调用create()

●文件删除模块,即系统调用rm()

●读/写模块,即read/write

3、分析报告示例

A. 创建文件模块分析

5780 /*creat system call */

5781 Creat()

5782 {

5783 resister *ip;

5784 extern uchar;

5785

5786 ip = namei(&uchar,1);

5787 if(ip == NULL){

5788 if(u.u_error)

5789 return;

5790 ip = maknode(u.u_arg[1]&07777&(~ISVTX));

5791 if (ip == NULL)

5792 return;

5793 open1(ip,FWRITE,2);

5794 }else

5795 open1(ip,FWRITE,1);

5796 }

第5 7 8 6:“namei”( 7 5 1 8 )将一路径名变换成一个“inode”指针。“uchar”是一个过程的名字,它从用户程序数据区一个字符一个字符地取得文件路径名。

5 7 8 7:一个空“inode”指针表示出了一个错,或者并没有具有给定路径名的文件存在。

5 7 8 8:对于出错的各种条件,请见U P M的C R E AT ( I I )。

5 7 9 0:“maknode”( 7 4 5 5 )调用“ialloc”创建一内存“inode”,然后对其赋初值,并使其进入适当的目录。注意,显式地清除了“粘住”位( I S V T X )。

B. 删除文件rm模块分析

3510 unlink()

3511 {

3512 resister *ip,*pp;

3513 externuchar;

3514

3515 pp = namei(&uchar,2);

3516 if (pp ==NULL)

3517 return;

3518 prele(pp);

3519 ip = iset(pp ->dev,u.u_dent.u_ino);

3520 if (ip == NULL)

3521 panic (*unlink –iset *);

3522 if ((ip ->i_mode%IFMT) == IFDIR && !suser())

3523 goto out;

3524 u.u_offset[1] = - DIRSIZ+2;

3525 u.ubase = &u.u_dent;

3526 u.ucount = DIRSIZE +2;

3527 u.u_dent.u_ino = 0;

3528 writei(pp);

3529 ip ->i_nlink--;

3530 ip->i_flag =! IUPD;

3531

3532 out:

3533 iput(pp);

3534 iput(ip);

3535 }

新文件作为永久文件自动进入文件目录。关闭文件不会自动地造成文件被删除。当内存“inode”项中的“i _ nlink”字段值为0并且相应文件未被打开时,将删除该文件。在创建文件时,该字段由“m a k n o d e”赋初值为1。系统调用“link”( 5 9 4 1 )可将其值加1,系统调用“unlink”( 3 5 2 9 )则可将其值减1。创建临时“工作文件”的程序应当在其终止前执行“unlink”系统调用将这些文件删除。

注意,“unlink”系统调用本身并没有删除文件。当引用计数( i _ count )被减为0时( 7 3 5 0、7 3 6 2 ),才删除该文件。

为了减少在程序或系统崩溃时遗留下来的临时文件所带来的问题,程序员应当遵守下列约定:

(1) 在打开临时文件后立即对其执行“unlink”操作。

(2) 应在“tmp”目录下创建临时文件。在文件名中包括进程标识数就可构成一惟一文件名

C 读/写模块,即read/write 分析

/*

* linux/fs/minix/file.c

*

* Copyright (C) 1991, 1992 Linus Torvalds

*

* minix regular file handling primitives

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define NBUF 32

#define MIN(a,b) (((a)(b))?(a):(b))

#include

#include

staticint ext2_file_read (structinode *, struct file *, char *, int); staticint ext2_file_write (structinode *, struct file *, char *, int); static void ext2_release_file (structinode *, struct file *);

/*

* We have mostly NULL's here: the current defaults are ok for * the ext2 filesystem.

*/

staticstructfile_operations ext2_file_operations = {

NULL, /* lseek - default */

ext2_file_read, /* read */

ext2_file_write, /* write */

NULL, /* readdir - bad */

NULL, /* select - default */

ext2_ioctl, /* ioctl */

generic_mmap, /* mmap */

NULL, /* no special open is needed */

ext2_release_file, /* release */

ext2_sync_file /* fsync */

};

structinode_operations ext2_file_inode_operations = {

&ext2_file_operations,/* default file operations */

NULL, /* create */

NULL, /* lookup */

NULL, /* link */

NULL, /* unlink */

NULL, /* symlink */

NULL, /* mkdir */

NULL, /* rmdir */

NULL, /* mknod */

NULL, /* rename */

NULL, /* readlink */

NULL, /* follow_link */

ext2_bmap, /* bmap */

ext2_truncate, /* truncate */

ext2_permission /* permission */

};

staticint ext2_file_read (structinode * inode, struct file * filp,

char * buf, int count)

{

int read, left, chars;

int block, blocks, offset;

intbhrequest, uptodate;

structbuffer_head ** bhb, ** bhe;

structbuffer_head * bhreq[NBUF];

structbuffer_head * buflist[NBUF];

structsuper_block * sb;

unsignedint size;

int err;

if (!inode) {

printk ("ext2_file_read: inode = NULL\n");

return -EINV AL;

}

sb = inode->i_sb;

if (!S_ISREG(inode->i_mode)) {

ext2_warning (sb, "ext2_file_read", "mode = %07o",

inode->i_mode);

return -EINV AL;

}

offset = filp->f_pos;

size = inode->i_size;

if (offset > size)

left = 0;

else

left = size - offset;

if (left > count)

left = count;

if (left > EXT2_BLOCK_SIZE_BITS(sb);

offset&= (sb->s_blocksize - 1);

size = (size + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb);

blocks = (left + offset + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb); bhb = bhe = buflist;

if (filp->f_reada) {

// 37 /* This specifies how many sectors to read ahead on the disk. */

// 39 intread_ahead[MAX_BLKDEV] = {0, };

blocks += read_ahead[MAJOR(inode->i_dev)] >>

(EXT2_BLOCK_SIZE_BITS(sb) - 9);

if (block + blocks > size)

blocks = size - block;

}

/*

* We do this in a two stage process. We first try and request

* as many blocks as we can, then we wait for the first one to

* complete, and then we try and wrap up as many as are actually * done. This routine is rather generic, in that it can be used

* in a filesystem by substituting the appropriate function in

* forgetblk

*

* This routine is optimized to make maximum use of the various * buffers and caches.

*/

do {

bhrequest = 0;

uptodate = 1;

while (blocks) {

--blocks;

*bhb = ext2_getblk (inode, block++, 0, &err);

if (*bhb&& !(*bhb)->b_uptodate) {

uptodate = 0;

bhreq[bhrequest++] = *bhb;

}

if (++bhb == &buflist[NBUF])

bhb = buflist;

/*

* If the block we have on hand is uptodate, go ahead

* and complete processing

*/

if (uptodate)

break;

if (bhb == bhe)

break;

}

/*

* Now request them all

*/

if (bhrequest)

ll_rw_block (READ, bhrequest, bhreq);

do {

/*

* Finish off all I/O that has actually completed

*/

if (*bhe) {

wait_on_buffer (*bhe);

if (!(*bhe)->b_uptodate) { /* read error? */

brelse(*bhe);

if (++bhe == &buflist[NBUF])

bhe = buflist;

left = 0;

break;

}

}

if (left s_blocksize - offset)

chars = left;

else

chars = sb->s_blocksize - offset;

filp->f_pos += chars;

left -= chars;

read += chars;

if (*bhe) {

memcpy_tofs (buf, offset + (*bhe)->b_data,

chars);

brelse (*bhe);

buf += chars;

} else {

while (chars-- > 0)

put_fs_byte (0, buf++);

}

offset = 0;

if (++bhe == &buflist[NBUF])

bhe = buflist;

} while (left > 0 &&bhe != bhb&& (!*bhe || !(*bhe)->b_lock)); } while (left > 0);

/*

* Release the read-ahead blocks

*/

while (bhe != bhb) {

brelse (*bhe);

if (++bhe == &buflist[NBUF])

bhe = buflist;

}

if (!read)

return -EIO;

filp->f_reada = 1;

if (!IS_RDONL Y(inode)) {

inode->i_atime = CURRENT_TIME;

inode->i_dirt = 1;

}

return read;

}

staticint ext2_file_write (structinode * inode, struct file * filp,

char * buf, int count)

{

off_tpos;

int written, c;

structbuffer_head * bh;

char * p;

structsuper_block * sb;

int err;

if (!inode) {

printk("ext2_file_write: inode = NULL\n");

return -EINV AL;

}

sb = inode->i_sb;

if (sb->s_flags& MS_RDONL Y)

/*

* This fs has been automatically remounted ro because of errors

*/

return -ENOSPC;

if (!S_ISREG(inode->i_mode)) {

ext2_warning (sb, "ext2_file_write", "mode = %07o\n",

inode->i_mode);

return -EINV AL;

}

/*

* ok, append may not work when many processes are writing at the same time * but so what. That way leads to madness anyway.

*/

if (filp->f_flags& O_APPEND)

pos = inode->i_size;

else

pos = filp->f_pos;

written = 0;

while (written s_blocksize, 1, &err);

if (!bh) {

if (!written)

written = err;

break;

}

c = sb->s_blocksize - (pos % sb->s_blocksize);

if (c > count-written)

c = count - written;

if (c != sb->s_blocksize&& !bh->b_uptodate) {

ll_rw_block (READ, 1, &bh);

wait_on_buffer (bh);

if (!bh->b_uptodate) {

brelse (bh);

if (!written)

written = -EIO;

break;

}

}

p = (pos % sb->s_blocksize) + bh->b_data;

pos += c;

if (pos>inode->i_size) {

inode->i_size = pos;

inode->i_dirt = 1;

}

written += c;

memcpy_fromfs (p, buf, c); //写入到缓冲块中

buf += c;

bh->b_uptodate = 1;

bh->b_dirt = 1;

brelse (bh);

}

inode->i_ctime = inode->i_mtime = CURRENT_TIME;

filp->f_pos = pos;

inode->i_dirt = 1;

return written;

}

分析:

对于整个文件的索引操作担,都使用块计算的。

整块读取时,调用底层的读取函数。只要得到了更新块就跳出去处理,否则就记录要读取的块

整块的写入时很好办的,只要整体为脏就可以了.但是对于不能整块写入的,必须写入的块原先是更新的.

源码行号注释:

86 left = size - offset; //剩余可读数

88 left = count; //left就是最终要读取的数据

92 //下面的size和blocks是对于整个文件的索引操作担,都使用块计算的

93size = (size + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb); //整个文件的块数

94blocks = (left + offset + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb); //要读取的块数

95bhb = bhe = buflist;

97//进行预读

98 if (filp->f_reada) {

99

100// 37 /* This specifies how many sectors to read ahead on the disk. */

101// 39 intread_ahead[MAX_BLKDEV] = {0, };

102 blocks += read_ahead[MAJOR(inode->i_dev)] >>

103 (EXT2_BLOCK_SIZE_BITS(sb) - 9); //可能都是使用512标示的,这里进行校正

104 if (block + blocks > size)

105 blocks = size - block; //校正实际能读取的块数

106}

126 bhreq[bhrequest++] = *bhb; //同时bhrequest记录了需要重新读取的块数

128 if (++bhb == &buflist[NBUF]) //回卷到头部

134 if (uptodate) //只要得到了更新块就跳出去处理,否则就记录要读取的块

136 if (bhb == bhe) //满了,要读取NBUF块

142 if (bhrequest) //调用底层的读取函数

150 if (!(*bhe)->b_uptodate) { /* read error? */

//这里当做错误处理的,left=0,跳出大循环了

154 bhe = buflist; //不是跳出去就完了,这里的bhe将来还是有用的

184 while (bhe != bhb) { //预读的块释放掉

191 filp->f_reada = 1; //标志已经预读了

226 if (filp->f_flags& O_APPEND) //是否追加,更新文件指针

237 c = sb->s_blocksize - (pos % sb->s_blocksize); //c记录本次可以读取的字符个数

240 if (c != sb->s_blocksize&& !bh->b_uptodate) { //整块的写入时很好办的,只要整体为脏就可以了.但是对于不能整块写入的,必须写入的块原先是更新的.

257memcpy_fromfs (p, buf, c); //写入到缓冲块中

北邮 通信网实验报告

北京邮电大学实验报告通信网理论基础实验报告 学院:信息与通信工程学院 班级:2013211124 学号: 姓名:

实验一 ErlangB公式计算器 一实验内容 编写Erlang B公式的图形界面计算器,实现给定任意两个变量求解第三个变量的功能: 1)给定到达的呼叫量a和中继线的数目s,求解系统的时间阻塞率B; 2)给定系统的时间阻塞率的要求B和到达的呼叫量a,求解中继线的数目s,以实现网络规划; 3)给定系统的时间阻塞率要求B以及中继线的数目s,判断该系统能支持的最大的呼叫量a。 二实验描述 1 实验思路 使用MA TLAB GUITOOL设计图形界面,通过单选按钮确定计算的变量,同时通过可编辑文本框输入其他两个已知变量的值,对于不同的变量,通过调用相应的函数进行求解并显示最终的结果。 2程序界面 3流程图 4主要的函数 符号规定如下: b(Blocking):阻塞率; a(BHT):到达呼叫量;

s(Lines):中继线数量。 1)已知到达呼叫量a及中继线数量s求阻塞率b 使用迭代算法提高程序效率 B s,a= a?B s?1,a s+a?B(s?1,a) 代码如下: function b = ErlangB_b(a,s) b =1; for i =1:s b = a * b /(i + a * b); end end 2)已知到达呼叫量a及阻塞率b求中继线数量s 考虑到s为正整数,因此采用数值逼近的方法。采用循环的方式,在每次循环中增加s的值,同时调用B s,a函数计算阻塞率并与已知阻塞率比较,当本次误差小于上次误差时,结束循环,得到s值。 代码如下: function s = ErlangB_s(a,b) s =1; Bs = ErlangB_b(a,s); err = abs(b-Bs); err_s = err; while(err_s <= err) err = err_s; s = s +1; Bs = ErlangB_b(a,s); err_s = abs(b - Bs); end s = s -1; end 3)已知阻塞率b及中继线数量s求到达呼叫量a 考虑到a为有理数,因此采用变步长逼近的方法。采用循环的方式,在每次循环中增加a的值(步长为s/2),同时调用B s,a函数计算阻塞率并与已知阻塞率比较,当本次误差小于预设阈值时,结束循环,得到a值。 代码如下: function a = ErlangB_a(b,s)

北邮网络-操作系统原理-阶段作业三

一、单项选择题(共10道小题,共100.0分) 1. 不支持记录等结构的文件类型是 A. 顺序文件 B. 索引顺序文件 C. 索引文件 D. 哈希文件 2. 在I/O系统层次模型中处于最高的一个层次,负责所有设备I/O工作中均 要用到的共同的功能的模块是 A. 系统服务接口 B. I/O子系统 C. 设备驱动程序接口 D. 设备驱动程序 3. 在采用局部转换策略进行页面置换的系统中,一个进程得到3个页架。系 统采用先进先出的转换算法,该进程的页面调度序列为:1,3,2,6,2,5,6,4,6。如果页面初次装入时不计算为缺页,请问该进程在调度中会产生几次缺页。 A. 6次 B. 5次 C. 4次 D. 3次

4. 完成从物理页架号到虚地址的映射是 A. 页表 B. 反向页表 C. 多级页表 D. 快表 5. 下列设备中,()为块设备。 A. 软盘驱动器 B. MODEM C. 声卡 D. 鼠标 6. 在下列的实存管理技术中,同一进程在连续地址存储的技术是 A. 可变分区多道管理技术 B. 多重分区管理 C. 简单分页 D. 简单分段

7. 采用简单分页系统的内存管理,页面的大小是8K字节。现有一个逻辑地 址A=3580h,该进程的页表为 [0,5/1,6/2,1/3,0...],则该逻辑地址对应的物理地址A'=() A. 0580h B. D580h C. 6580h D. 7580h 8. 对于实存管理技术,实际上它不具备的功能有: A. 主存分配 B. 地址转换和重定位 C. 存储保护和主存共享 D. 存储扩充 9. 在当前的计算机系统中,通常是按()进行编址。 A. 位 B. 字节

北邮数字电路综合实验报告

数字电路综合实验报告 简易智能密码锁 一、实验课题及任务要求 设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。 基本要求: 1、密码设置:通过键盘进行4 位数字密码设定输入,在数码管上显示所输入数字。通过密码设置确定键(BTN 键)进行锁定。 2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。输入四位核对密码后,按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led 闪烁报警。 3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。闭锁状态下不能清除密码。 4、用点阵显示开锁和闭锁状态。 提高要求: 1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。 2、密码锁的密码位数(4~6 位)可调。

3、自拟其它功能。 二、系统设计 2.1系统总体框图 2.2逻辑流程图

2.3MDS图 2.4分块说明 程序主要分为6个模块:键盘模块,数码管模块,点阵模块,报警模块,防抖模块,控制模块。以下进行详细介绍。 1.键盘模块 本模块主要完成是4×4键盘扫描,然后获取其键值,并对其进行编码,从而进行按键的识别,并将相应的按键值进行显示。 键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出高电平,在读入输出的行值时,通常高电平会被低电平拉低,当当前位置为高电平“1”时,没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。由此可确定按键位置。

北邮通电实验报告

实验3 集成乘法器幅度调制电路 信息与通信工程学院 2016211112班 苏晓玥杨宇宁 2016210349 2016210350

一.实验目的 1.通过实验了解振幅调制的工作原理。 2.掌握用MC1496来实现AM和DSB的方法,并研究已调波与调制信号,载波之间的关系。3.掌握用示波器测量调幅系数的方法。 二.实验准备 1.本实验时应具备的知识点 (1)幅度调制 (2)用模拟乘法器实现幅度调制 (3)MC1496四象限模拟相乘器 2.本实验时所用到的仪器 (1)③号实验板《调幅与功率放大器电路》 (2)示波器 (3)万用表 (4)直流稳压电源 (5)高频信号源 三.实验内容 1.模拟相乘调幅器的输入失调电压调节。 2.用示波器观察正常调幅波(AM)波形,并测量其调幅系数。 3.用示波器观察平衡调幅波(抑制载波的双边带波形DSB)波形。 四.实验波形记录、说明 1.DSB信号波形观察

2.DSB信号反相点观察 3.DSB信号波形与载波波形的相位比较 结论:在调制信号正半周期间,两者同相;负半周期间,两者反相。

4.AM正常波形观测 5.过调制时的AM波形观察(1)调制度为100%

(2)调制度大于100% (3)调制度为30% A=260.0mv B=140.0mv

五.实验结论 我们通过实验了解振幅调制的工作原理是:调幅调制就是用低频调制信号去控制高频振荡(载波)的幅度,使其成为带有低频信息的调幅波。目前由于集成电路的发展,集成模拟相乘器得到广泛的应用,为此本实验采用价格较低廉的MC1496集成模拟相乘器来实现调幅之功能。 DSB信号波形与载波波形的相位关系是:在调制信号正半周期间,两者同相;负半周期间,两者反相。 通过实验了解到了调制度的计算方法 六.课程心得体会 通过本次实验,我们了解了振幅调制的工作原理并掌握了实现AM和DSB的方法,学会计算调制度,具体见实验结论。我们对集成乘法器幅度调制电路有了更好的了解,对他有了更深入的认识,提高了对通信电子电路的兴趣。 和模电实验的单独进行,通电实验增强了团队配合的能力,两个人的有效分工提高了实验的效率,减少了一个人的独自苦恼。

北邮通信原理实验 基于SYSTEMVIEW通信原理实验报告

北京邮电大学实验报告 题目:基于SYSTEMVIEW通信原理实验报告 班级:2013211124 专业:信息工程 姓名:曹爽 成绩:

目录 实验一:抽样定理 (3) 一、实验目的 (3) 二、实验要求 (3) 三、实验原理 (3) 四、实验步骤和结果 (3) 五、实验总结和讨论 (9) 实验二:验证奈奎斯特第一准则 (10) 一、实验目的 (10) 二、实验要求 (10) 三、实验原理 (10) 四、实验步骤和结果 (10) 五、实验总结和讨论 (19) 实验三:16QAM的调制与解调 (20) 一、实验目的 (20) 二、实验要求 (20) 三、实验原理 (20) 四、实验步骤和结果 (21) 五、实验总结和讨论 (33) 心得体会和实验建议 (34)

实验一:抽样定理 一、 实验目的 1. 掌握抽样定理。 2. 通过时域频域波形分析系统性能。 二、 实验要求 改变抽样速率观察信号波形的变化。 三、 实验原理 一个频率限制在0f 的时间连续信号()m t ,如果以0 12S T f 的间隔进行等间隔均匀抽样,则()m t 将被所得到的抽样值完全还原确定。 四、 实验步骤和结果 1. 按照图1.4.1所示连接电路,其中三个信号源设置频率值分别为10Hz 、15Hz 、20Hz ,如图1.4.2所示。 图1.4.1 连接框图

图1.4.2 信号源设置,其余两个频率值设置分别为15和20 2.由于三个信号源最高频率为20Hz,根据奈奎斯特抽样定理,最低抽样频率应 为40Hz,才能恢复出原信号,所以设置抽样脉冲为40Hz,如图1.4.3。 图1.4.3 抽样脉冲设置 3.之后设置低通滤波器,设置数字低通滤波器为巴特沃斯滤波器(其他类型的 低通滤波器也可以,影响不大),截止频率设置为信号源最高频率值20Hz,如图1.4.4。

北邮微波实验报告整理版

北京邮电大学信息与通信工程学院 微波实验报告 班级:20112111xx 姓名:xxx 学号:20112103xx 指导老师:徐林娟 2014年6月

目录 实验二分支线匹配器 (1) 实验目的 (1) 实验原理 (1) 实验内容 (1) 实验步骤 (1) 单支节 (2) 双支节 (7) 实验三四分之一波长阻抗变换器 (12) 实验目的 (12) 实验原理 (12) 实验内容 (13) 实验步骤 (13) 纯电阻负载 (14) 复数负载 (19) 实验四功分器 (23) 实验目的 (23) 实验原理 (23) 实验内容 (24) 实验步骤 (24) 公分比为1.5 (25) 公分比为1(等功分器) (29) 心得体会 (32)

201121111x 班-xx 号-xx ——电磁场与微波技术实验报告 实验二 分支线匹配器 实验目的 1.熟悉支节匹配器的匹配原理 2.了解微带线的工作原理和实际应用 3.掌握Smith 图解法设计微带线匹配网络 实验原理 支节匹配器是在主传输线上并联适当的电纳(或者串联适当的电抗),用附加的反射来抵消主传输线上原来的反射波,以达到匹配的目的。 单支节匹配器,调谐时主要有两个可调参量:距离d 和由并联开路或短路短截线提供的电纳。匹配的基本思想是选择d ,使其在距离负载d 处向主线看去的导纳Y 是Y0+jB 形式。然后,此短截线的电纳选择为-jB ,根据该电纳值确定分支短截线的长度,这样就达到匹配条件。 双支节匹配器,通过增加一个支节,改进了单支节匹配器需要调节支节位置的不足,只需调节两个分支线长度,就能够达到匹配(但是双支节匹配不是对任意负载阻抗都能匹配的,即存在一个不能得到匹配的禁区)。 微带线是有介质εr (εr >1)和空气混合填充,基片上方是空气,导体带条和接地板之间是介质εr ,可以近似等效为均匀介质填充的传输线,等效介质电常数为 εe ,介于1和εr 之间,依赖于基片厚度H 和导体宽度W 。而微带线的特性阻抗与其等效介质电常数为εe 、基片厚度H 和导体宽度W 有关。 实验内容 已知:输入阻抗Z 75in ,负载阻抗Z (6435)l j ,特性阻抗0Z 75 ,介质基片 2.55r ,1H mm 。 假定负载在2GHz 时实现匹配,利用图解法设计微带线单支节和双支节匹配网络,假设双支节网络分支线与负载的距离114d ,两分支线之间的距离为21 8 d 。画出几种可能的电路图并且比较输入端反射系数幅度从1.8GHz 至2.2GHz 的变化。 实验步骤 1.根据已知计算出各参量,确定项目频率。 2.将归一化阻抗和负载阻抗所在位置分别标在Smith 圆上。 3.设计单枝节匹配网络,在图上确定分支线与负载的距离以及分支线的长度,根据给定的介质基片、特性阻抗和频率用TXLINE 计算微带线物理长度和宽度。此处应该注意电长度和实际长度的联系。 4.画出原理图,在用微带线画出基本的原理图时,注意还要把衬底添加到图中,将各部分的参数填入。注意微带 分支线处的不均匀性所引起的影响,选择适当的模型。 5.负载阻抗选择电阻和电感串联的形式,连接各端口,完成原理图,并且将项目的频率改为1.8—2.2GHz 。 6.添加矩形图,添加测量,点击分析,测量输入端的反射系数幅值。 7.同理设计双枝节匹配网络,重复上面的步骤。

北京邮电大学数字电路实验报告

北京邮电大学 数字电路与逻辑设计实验 实验报告 实验名称:QuartusII原理图输入 法设计与实现 学院:北京邮电大学 班级: 姓名: 学号:

一.实验名称和实验任务要求 实验名称:QuartusII原理图输入法设计与实现 实验目的:⑴熟悉用QuartusII原理图输入法进行电路设计和仿真。 ⑵掌握QuartusII图形模块单元的生成与调用; ⑶熟悉实验板的使用。 实验任务要求:⑴掌握QuartusII的基础上,利用QuartusII用逻辑 门设计实现一个半加器,生成新的半加器图像模 块。 ⑵用实验内容(1)中生成的半加器模块以及逻辑门 实现一个全加器,仿真验证其功能,并能下载到实 验板上进行测试,要求用拨码开关设定输入信号, 发光二级管显示输出信号。 ⑶用3线—8线译码器(74L138)和逻辑门实现要求 的函数:CBA F+ C + =,仿真验证其 + B C B A A A B C 功能,,并能下载到实验板上进行测试,要求用拨 码开关设定输入信号,发光二级管显示输出信号。二.设计思路和过程 半加器的设计实现过程:⑴半加器的应有两个输入值,两个输出值。 a表示加数,b表示被加数,s表示半加和, co表示向高位的进位。

⑵由数字电路与逻辑设计理论知识可知 b a s ⊕=;b a co ?= 选择两个逻辑门:异或门和与门。a,b 为异 或门和与门的输入,S 为异或门的输出,C 为与门的输出。 (3)利用QuartusII 仿真实现其逻辑功能, 并生成新的半加器图形模块单元。 (4)下载到电路板,并检验是否正确。 全加器的设计实现过程:⑴全加器可以由两个半加器和一个或门构 成。全加器有三个输入值a,b,ci ,两个输 出值s,co :a 为被加数,b 为加数,ci 为低 位向高位的进位。 ⑵全加器的逻辑表达式为: c b a s ⊕⊕= b a ci b a co ?+?⊕=)( ⑶利用全加器的逻辑表达式和半加器的逻 辑功能,实现全加器。 用3线—8线译码器(74L138)和逻辑门设计实现函数 CBA A B C A B C A B C F +++= 设计实现过程:⑴利用QuartusII 选择译码器(74L138)的图形模块

北邮《现代通信技术》实验报告一

现代通信技术实验报告 班级: 2012211110 学号: 2012210299 姓名:未可知

在学习现代通信技术实验课上,老师提到的一个词“通信人”警醒了我,尽管当初填报志愿时选择了通信工程最终也如愿以偿,进入大三,身边的同学忙着保研、考研、出国、找工作,似乎大家都为了分数在不懈奋斗。作为一个北邮通信工程的大三学生,我也不断地问自己想要学习的是什么,找寻真正感兴趣的是什么,通信这个行业如此之大,我到底适合什么。本学期,现代通信技术这本书让我了解到各种通信技术的发展和规划,也让我对“通信人”的工作有了更深刻的认识。 一、通信知识的储备 《现代通信技术》第一页指出,人与人之间通过听觉、视觉、嗅觉、触觉等感官,感知现实世界而获取信息,并通过通信来传递信息。所谓信息,是客观事物状态和运动特征的一种普遍形式,客观世界中大量地存在、产生和传递着以这些方式表示出来的各种各样的信息。信息的目的是用来“消除不可靠的因素”,它是物质运动规律总和。因此,我们通信人的任务就是利用有线、无线等形式来将信息从信源传递到信宿,在传输过程中保证通信的有效性和可靠性。 而具体来讲,要实现信息传递,通信网是必需的通信体系,其中通信网分层的结构形式需要不同的支撑技术,包括业务网技术,向用户提供电话、电报、数据、图像等各种电信业务的网络;介入与传送网技术,实现信息由一个点传递到另一个点或一些点的功能。对此,我们通信工程专业学习课程的安排让我们一步步打下基础,建立起知识储备。 知识树如下: 如知识树所述,通信工程课程体系可以大致分为一下6类基础:

数学基础:工科数学分析,线性代数,复变函数,概率论基础,随机过程; 电路基础:电路分析,模拟电子技术,数字逻辑电路,通信电子电路; 场与波基础:电磁场与电磁波,微波技术,射频与天线; 计算机应用能力:C 语言程序设计,微机原理与接口技术,计算机网络,数据结构,面向对象程序设计,实时嵌入式系统 信号处理类课程:信号与系统,信号处理,图像处理,DSP 原理及应用; 通信类课程:通信原理,现代通信技术,信息论基础,移动通信,光纤通信等。 从大一开始学习的工科数学分析,大学物理,大学计算机基础等课程为基础类课程,旨在培养我们的语言能力,数学基础,物理基础,计算机能力,然后逐步加大难度,细化课程,方向逐渐明朗详细。同时,课程中加入了各种实验,锻炼了我们的动手能力。 二、通信知识的小小应用 实验课上老师说过,以我们所学的知识已经可以制作简单通信的手机的草图了,我对此跃跃欲试。经过思考和调研,以下是我对于简单手机设计的原理框图和思考结果。 一部手机的结构包括接收机、发射机、中央控制模块、电源和人机界面部分,如下图 手机结构设计图 电路部分包括射频和逻辑音频电路部分,射频电路包括从天线到接收机的解调输出,与发射的I/O 调制到功率放大器输出的电路。其中,射频接收电路完成接收信号的滤波、信号放大、解调等功能;射频发射电路完成语音基带信号的调制、变频、功率放大等功能。要用到的超外差接收机、混频器、鉴相器等在《通信电子电路》书本中的知识。逻辑音频包括从接收解调到接收音频输出、送话器电路到发射I/O 调制器及逻辑电路部分的中央处理单元、数字语音处理及各种存储器电路。由核心控制模块CPU 、EEPROM 、 FLASH 、SRAM 等部分组成,一个基本 天线 接收机 发射机 频率合成 电源 逻 辑 音 频 人 机 交 互

北京邮电大学2009年操作系统期末试卷

北京邮电大学2008——2009学年第一学期 《操作系统》期末考试试题(A) 1.FILL IN BLANKS (10 points) 1.1 A _trap___ is a software-generated interrupt caused either by an error or by a specific request from a user program that an operating-system services be performed. 1.2 A ______ is used in Unix systems to notify a process that a particular event has occurred. 1.3 To manage the process executing, OS records the state and other information (e.g. the priority) of the process in . 1.4 The scheduling criteria include CPU utilization, throughput, turnaround time, waiting time, and response time .

1.5 For n concurrent processes that mutual exclusively use some resources, the code segmentations, in which the processes access the resources, are called deadlock . 1.6. The ___visual memory___ scheme enables users to run programs that are larger than actual physical memory, this allows the execution of a process that is not completely in memory. 1.7. The __FIFO___ page replacement algorithm associates with each page the time when that page was brought into memory. When a page must be replaced, the oldest page is chosen. 1.8The file system resides permanently on , which is designed to hold a large amount of data permanently. 1.9The file system itself is generally composed of many different levels, including the logical file system, the file-organization module, the and the I/O control. 1.10 T he kernel’s I/O subsystem provides numero us services. Among these are I/O scheduling, , caching, spooling, device reservation, and error handling, and name translation. 2.CHOICE ( 10 points ) 2.1 _____ operating systems have well defined, fixed time constraints. Processing must be done within the defined constrains, or the system will fail. A. Multimedia B. Real-time C. Clustered D. Network 2.2 Which one of the following OS is implemented based on microkernel structure? _____

北邮arduino实验报告

电子电路综合实验设计 实验名称: 基于 Arduino 的电压有效值测量电路设计与实现 学院: 班级: 学号: 姓名: 班内序号:

实验 基于Arduino 的电压有效值测量电路设计与实现 一. 摘要 Arduino是一个基于开放原始码的软硬件平台,可用来开发独立运作、并具互动性的电子产品,也可以开发与PC 相连的周边装置,同时能在运行时与PC 上的软件进行交互。为了测量正弦波电压有效值,首先我们设计了单电源供电的半波整流电路,并进行整流滤波输出,然后选择了通过Arduino设计了读取电压有效值的程序,并实现使用此最小系统来测量和显示电压有效值。在频率和直流电压幅度限定在小范围的情况下,最小系统的示数基本和毫伏表测量的值相同。根据交流电压有效值的定义,运用集成运放和设计的Arduino最小系统的结合,实现了运用少量元器件对交流电压有效值的测量。 关键字:半波整流整流滤波 Arduino最小系统读取电压有效值 二. 实验目的 1、熟悉Arduino 最小系统的构建和使用方法; 2、掌握峰值半波整流电路的工作原理; 3、根据技术指标通过分析计算确定电路形式和元器件参数; 4、画出电路原理图(元器件标准化,电路图规范化); 5、熟悉计算机仿真方法; 6、熟悉Arduino 系统编程方法。 三. 实验任务及设计要求 设计实现 Arduino 最小系统,并基于该系统实现对正弦波电压有效值的测量和显示。 1、基本要求 (1)实现Arduino 最小系统,并能下载完成Blink 测试程序,驱动Arduino 数字13 口LED 闪烁; (2)电源部分稳定输出5V 工作电压,用于系统供电; (3)设计峰值半波整流电路,技术指标要求如下:

北邮通信原理实验报告

北京邮电大学通信原理实验报告 学院:信息与通信工程学院班级: 姓名: 姓名:

实验一:双边带抑制载波调幅(DSB-SC AM ) 一、实验目的 1、了解DSB-SC AM 信号的产生以及相干解调的原理和实现方法。 2、了解DSB-SC AM 信号波形以及振幅频谱特点,并掌握其测量方法。 3、了解在发送DSB-SC AM 信号加导频分量的条件下,收端用锁相环提取载波的原理及其实现方法。 4、掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波的调试方法。 二、实验原理 DSB 信号的时域表达式为 ()()cos DSB c s t m t t ω= 频域表达式为 1 ()[()()]2 DSB c c S M M ωωωωω=-++ 其波形和频谱如下图所示 DSB-SC AM 信号的产生及相干解调原理框图如下图所示

将均值为零的模拟基带信号m(t)与正弦载波c(t)相乘得到DSB—SC AM信号,其频谱不包含离散的载波分量。 DSB—SC AM信号的解调只能采用相干解调。为了能在接收端获取载波,一种方法是在发送端加导频,如上图所示。收端可用锁相环来提取导频信号作为恢复载波。此锁相环必须是窄带锁相,仅用来跟踪导频信号。 在锁相环锁定时,VCO输出信号sin2πf c t+φ与输入的导频信号cos2πf c t 的频率相同,但二者的相位差为φ+90°,其中很小。锁相环中乘法器的两个 输入信号分别为发来的信号s(t)(已调信号加导频)与锁相环中VCO的输出信号,二者相乘得到 A C m t cos2πf c t+A p cos2πf c t?sin2πf c t+φ =A c 2 m t sinφ+sin4πf c t+φ+ A p 2 sinφ+sin4πf c t+φ 在锁相环中的LPF带宽窄,能通过A p 2 sinφ分量,滤除m(t)的频率分量及四倍频载频分量,因为很小,所以约等于。LPF的输出以负反馈的方式控制VCO,使其保持在锁相状态。锁定后的VCO输出信号sin2πf c t+φ经90度移相后,以cos2πf c t+φ作为相干解调的恢复载波,它与输入的导频信号cos2πf c t 同频,几乎同相。 相干解调是将发来的信号s(t)与恢复载波相乘,再经过低通滤波后输出模拟基带信号 A C m t cos2πf c t+A p cos2πf c t?cos2πf c t+φ =A c 2 m t cosφ+cos4πf c t+φ+ A p 2 cosφ+cos4πf c t+φ 经过低通滤波可以滤除四倍载频分量,而A p 2 cosφ是直流分量,可以通过隔直

北京邮电大学电路实验报告-(小彩灯)

北京邮电大学电路实验报告-(小彩灯)

电子电路综合实验报告课题名称:基于运算放大器的彩灯显示电路的设计与实现 姓名:班级:学号: 一、摘要: 运用运算放大器设计一个彩灯显示电路,通过迟滞电压比较器和反向积分器构成方波—三角波发生器,三角波送入比较器与一系列直流电平比较,比较器输出端会分别输出高电平和低电平,从而顺序点亮或熄灭接在比较器输出端的发光管。 关键字: 模拟电路,高低电平,运算放大器,振荡,比较 二、设计任务要求: 利用运算放大器LM324设计一个彩灯显示电路,让排成一排的5个红色发光二极管(R1~R5)重复地依次点亮再依次熄灭(全灭→R1→R1R2→R1R2R3→R1R2R3R4→R1R2R3R4R5→R1R2R3R4→R1R2R3→R1R2→R1→全灭),同时让排成一排的6个绿色发光二极管(G1~G6)单光

三角波振荡电路可以采用如图2-28所示电路,这是一种常见的由集成运算放大器构成的方波和三角波发生器电路,图2-28中运放A1接成迟滞电压比较器,A2接成反相输入式积分器,积分器的输入电压取自迟滞电压比较器的输出,迟滞电压比较器的输入信号来自积分器的输出。假设迟滞电压比较器输出U o1初始值为高电平,该高电平经过积分器在U o2端得到线性下降的输出信号,此线性下降的信号又反馈至迟滞电压比较器的输入端,当其下降至比较器的下门限电压U th-时,比较器的输出发生跳变,由高电平跳变为低电平,该低电平经过积分器在U o2端得到线性上升的输出信号,此线性上升的信号又反馈至迟

滞电压比较器的输入端,当其上升至比较器的上门限电压U th+时,比较器的输出发生跳变,由低电平跳变为高电平,此后,不断重复上述过程,从而在迟滞电压比较器的输出端U o1得到方波信号,在反向积分器的输出端U o2得到三角波信号。假设稳压管反向击穿时的稳定电压为U Z,正向导通电压为U D,由理论分析可知,该电路方波和三角波的输出幅度分别为: 式(5)中R P2为电位器R P动头2端对地电阻,R P1为电位器1端对地的电阻。 由上述各式可知,该电路输出方波的幅度由稳压管的稳压值和正向导通电压决定,三角波的输 出幅度决定于稳压管的稳压值和正向导通电压以及反馈比R1/R f,而振荡频率与稳压管的稳压值和正向导通电压无关,因此,通过调换具有不同稳压值和正向 导通电压的稳压管可以成比例地改变方波和三角波的幅度而不改变振荡频率。 电位器的滑动比R P2/R P1和积分器的积分时间常数R2C的改变只影响振荡频率而 不影响振荡幅度,而反馈比R1/R f的改变会使振荡频率和振荡幅度同时发生变化。因此,一般用改变积分时间常数的方法进行频段的转换,用调节电位器滑动头 的位置来进行频段内的频率调节。

北邮高级操作系统期末试卷

2017,2015,2013北邮高级操作系统 试题 学号: 姓名: 成绩: 、分布式操作系统中的透明性主要是什么?其中那些透明性容易实现?哪些难实现????分? 难点: 、创建一个分布式数据库系统可提供有效的存取手段来操纵这些结点上的子数据库。 、不确定性,控制比较复杂,尤其是在资源管理上要附加许多协调操作—资源属于局部工作站,性能、可靠性对网络的依赖性强,安全保密——基础不好。用户掌握有许软件接口,相应的应用软件较少,需要大力开发。 、分布式互斥中集中式算法、分布式算法、令牌算法。分析一下其中那个算法比较实用,为什么????分? 集中式算法:集中式算法借鉴了集中式互斥算法的思想,在分布式系统

中,选出一个进程为协调者 ?通过科学的分析制定一套规则? 。协调者对所有的请求进行排队并根据一定的规则授予许可。协调者接受请求以后,检查临界区内的资源是否被其他进程占用。如果是,则它将当前请求进程插入到对应临界资源的请求队列中 否则,回复一个同意消息给请求进程,通知它可以访问该临界资源。该算法通俗易懂,既能够杜绝死锁、饥饿等现象发生,又能保证资源的互斥访问顺利进行。 但是它也有缺点,由于是集中式管理,所以一旦管理进程出现故障,则整个系统将处于瘫痪状态。因此,管理进程的性能完全决定了算法的效率,应用范围小,难以普及。 分布式算法:分布式算法中运用到广播请求通信,当进程想请求共享资源时,需要首先建立三个变量 准备进入临界区,实时时间和处理器号,并利用广播通信发送给正在运行的所有进程。该算法的核心思想如下 当进程想进入临界区时 要建立一个包括进入的临界区名字、处理器号和当前时间的消息 并把消息发送给所有其它进程。当进程接收到另一个进程的请求消息时 将分下面三种情况来区别对待 ?若接收者不在临界区中 也不想进入临界区 就向发送者发送 ?消息; ?若接收者已经在临界区内就不必回答 而是负责对请求消息排队; ?若接收者要进入临界区 但还没进入 它就会把接收的消息和它发送的消息的时间戳进行对比 取小的那个。如果接收的消息时间戳小 就发 ?消息 如果发送的消息时间戳小 那么接收者负责排列请求队列而不发送任何消息。当进程接收到允许消息时 它就进入临界区。从临界区退出时 向队列中的所有进程发送 ?消息 并将自己从队列中删除。该算法可以保证访问临界区的互斥性以及无死锁进程、无饥饿进程。但是这种算法有个严重的缺点是算法太复杂并且不健壮 任何一个进程崩溃都会影响到算法的正确性。二是令牌丢失 令牌算法:令牌算法中引入了令牌,所有的进程组成一个环模型,环中每个进程需要知道它的下一个位置的节点的名称。令牌在环上顺序传递,当

北邮-电子电路综合设计实验(函数信号发生器)报告

电子电路综合设计实验报告 实验1 函数信号发生器的设计与实现 姓名:------ 学号:---------- 班内序号:--

一. 实验名称: 函数信号发生器的设计与调试 二.实验摘要: 采用运放组成的积分电路产生方波-三角波,可得到比较理想的方波和三角波。根据所需振荡频率的高低和对方波前后沿陡度的要求以及对所需方波、三角波的幅度可以确定合适的运放以及稳压管的型号、所需电阻的大小和电容的值。三角波-正弦波的转换是利用差分放大器来完成的,选取合适的滑动变阻器来调节三角波的幅度以及电路的对称性。同时利用隔直电容、滤波电容来改善输出正弦波的波形。 关键词: 方波三角波正弦波频率可调 三、设计任务要求 1.基本要求: (1)输出频率能在1-10KHz范围内连续可调,无明显失真; (2)方波输出电压Uopp=12V,上升、下降沿小于10us,占空比可调范围30%-70%; (3)三角波Uopp=8V; (4)正弦波Uopp错误!未找到引用源。1V. (5)设计该电路的电源电路(不要求实际搭建) 2.提高要求: (1)正弦波、三角波和方波输出波形的峰峰值Uopp均可在1V-10V内连续可调。 (2)三种输出波形的输出端口的输出阻抗小于100Ω。 (3)三种波形从同一端口输出,并能够显示当前输出信号的种类、大小和频率 (4)用CPLD设计DDS信号源 (5)其他函数信号发生器的设计方案 四、设计思路以及总体结构框图 本课题中函数发生器结构组成如下所示:由比较器和积分器组成方波—三角波产生电

路,比较器输出的方波经积分器得到三角波,三角波到正弦波的变换电路主要由差分放大器来完成。差分放大器具有工作点稳定,输入阻抗高,抗干扰能力较强等优点。特别是作为直流放大器时,可以有效地抑制零点漂移,因此可将频率很低的三角波变换成正弦波。波形变换的原理是利用差分放大器传输特性曲线的非线性。 图4-1 函数信号发生器的总体框图 五.分块电路和总体电路的设计 (1)方波——三角波产生电路 图5-1 方波-三角波产生电路

北邮程序设计实验报告

程序设计实践 设 计 报 告 课题名称:邮件客户端学生姓名: 班级: 2 班内序号:16 学号: 2 日期:2014.6.4

1.课题概述 1.1课题目标和主要内容 本课题主要通过MFC的方式,利用SOCKET以及SMTP相关知识,来实现邮件(可携带附件)的定向发送,借此来复习和巩固C++编程的基本思想;学习SOCKET以及SMTP的相关知识,了解复杂网络应用程序的设计方法,并独立完成一个网络应用。 1.2系统的主要功能 1.邮件的发送(不携带附件) 2.邮件的发送(携带附件) 3.邮件接收 2. 系统设计 2.1 系统总体框架 程序的功能由MyEmailClientDlg.cpp,SMTP.cpp,MailMessage.cpp,Base64.cpp, MIMECode.cpp,MIMEContentAgent.cpp,MIMEMessage.cpp,AppOctetStream.cpp, MyEmailClient.cpp,StdAfx.cpp,TextPlain.cpp来实现。其中MIMECode.cpp, MIMEContentAgent.cpp,MIMEMessage.cpp, AppOctetStream.cpp, TextPlain.cpp来对MIME 协议进行封装,Base64.cpp来对Base64编码进行封装,SMTP.cpp是对SMTP协议进行封装,MailMessage.cpp是利用MIME协议对邮件内容的一个处理,最终通过MyEmailClientDlg.cpp 来实现邮件的发送的功能。 2.2 系统详细设计 [1] 模块划分图及描述 协议模块:包括网络应用程序中的各种协议,包括STMP协议,MIME协议等。 处理模块:主要实现对数据的进行编码以及解码。 实现模块:主要内容为邮件发送的具体步骤,相关按钮操作。 [2] 类关系图及描述 协议类:CSMTP, CTEXTPlai, CMIMECode,C MIMEContentAgent,C MIMEMessage, CAppOctetStream, CTextPlain.主要为协议中信息处理的中作用 编码类:Base64, MailMessage.主要为对邮件信息的处理

北邮高级操作系统期末试卷

20仃,2015,2013北邮高级操作系统 试题 学号:姓名:成绩: 1、分布式操作系统中的透明性主要是什么?其中那些透明性容 易实现?哪些难实现?(20分) 难点: 1、创建一个分布式数据库系统可提供有效的存取手段来操纵这些结点上的子数据库。 2、不确定性,控制比较复杂,尤其是在资源管理上要附加许多协调操作一资源 属于局部工作站,性能、可靠性对网络的依赖性强,安全保密一一基础不好。用户掌握有许软件接口,相应的应用软件较少,需要大力开发。 2、分布式互斥中集中式算法、分布式算法、令牌算法。分析一下其 中那个算法比较实用,为什么?(20分) 集中式算法:集中式算法借鉴了集中式互斥算法的思想,在分布式系统中,选出一个进程为协调者(通过科学的分析制定一套规则)。协调者对所有的请求进行排队并根据一定的规则授予许可。协调者接受请求以后,检查临界区内的资源是否被其他进程占用。如果是,则它将当前请求进程插入到对应临界资源的请求队列中;否则,回复一个同意消息给请求进程,通知它可以访问该临界资源。该算法通俗易懂,既能够杜绝死锁、饥饿等现象发生,又能保证资源的互斥访问顺利进行。 但是它也有缺点,由于是集中式管理,所以一旦管理进程出现故障,则整个系统将处于 瘫痪状态。因此,管理进程的性能完全决定了算法的效率,应用范围小,难以普及。

分布式算法:分布式算法中运用到广播请求通信,当进程想请求共享资源时,需要首先建立三个变量:准备进入临界区,实时时间和处理器号,并利用广播通信发送给正在运行的所有进程。该算法的核心思想如下:当进程想进入临界区时,要建立一个包括进入的临界区名字、处理器号和当前时间的消息,并把消息发送给所有其它进程。当进程接收到另一个进程的请求消息时,将分下面三种情况来区别对待:1)若接收者不在临界区中,也不想进入临界区,就向发送者发送0K消息;2)若接收者已经在临界区内就不必回答,而是负责对请求消息排队;3)若接收者要进入临界区,但还没进入,它就会把接收的消息和它发送的消息的时间戳进行对比,取小的那个。如果接收的消息时间戳小,就发0K消息,如果发送的消息时间戳小,那么接收者负责排列请求队列而不发送任何消息。当进程接收到允许消息时,它就进入临界区。从临界区退出时,向队列中的所有进程发送0K消息,并将自己从队列中删除。该算法可以保证访问临界区 的互斥性以及无死锁进程、无饥饿进程。但是这种算法有个严重的缺点是算法太 二是令牌丢失 复杂并且不健壮,任何一个进程崩溃都会影响到算法的正确性。 令牌算法:令牌算法中引入了令牌,所有的进程组成一个环模型,环中每个进程需要知道它的下一个位置的节点的名称。令牌在环上顺序传递,当某个进程拥有令牌时就表明可以访问临界区。当请求进程没有令牌时,算法需要N发送任何消息。如果得到令牌的进程不打算进入临界区,它只是简单地将令牌传送给它后面的进程。当每个进程都需要进入临界区时,令牌在环上的传递速度最慢;相反,当没有进程想要进入临界区时,令牌在环上的传递速度最快。 (该算法的正确性是显而易见的,但是也存在一些问题,比如说,当令牌丢失时,需要重新生成。可是如何检测令牌丢失又是一个困难的问题。还有,如果环中的一个进程崩溃,那么环 的连贯性就遭到破坏,算法也就会出现麻烦。) 综上所述,基于令牌的算法在排除了令牌丢失和进程故障等问题之后,在今后的分布式系统中,能有更好的应用。

2016年北邮数电实验报告

数字电路与逻辑设计 实验报告 学院:电子工程学院 班级: 姓名: 学号: 班内序号:

目录 (一)实验名称及实验任务要求 (1) (二)模块端口说明及连接图 (2) 1.1实验三(3)模块端口说明 (2) 1.2实验三(3)连接图 (2) 2.1实验四模块端口说明 (2) 2.2实验四连接图 (2) (三)原理图或VHDL代码 (3) 1.实验一(2)原理图 (3) 2.实验三(3)VHDL代码 (4) 3.实验四VHDL代码 (7) (四)仿真波形 (10) 1.实验一(2)仿真波形 (10) 2.实验三(3)仿真波形 (11) 3.实验四仿真波形 (11) (五)仿真波形分析 (11) 1.实验一(2)仿真波形分析 (11) 2.实验三(3)仿真波形分析 (11) 3.实验四仿真波形分析 (11) (六)故障及问题分析 (12) (七)总结和结论 (13)

(一)实验名称及实验任务要求 实验一 名称:QuartusII原理图输入法设计与实现 实验任务要求:EDA基础实验1(1)、(2)、(3)必做,选做VHDL 实现加法器。 实验二 名称:用VHDL设计与实现组合逻辑电路 实验任务要求:四人表决器、8421码转格雷码、数码管译码器(下载测试)。 实验三 名称:用VHDL设计与实现时序逻辑电路 实验任务要求:分频器、8421十进制计数器、将分频器/8421十进制计数器/数码管译码器3个电路进行连接并下载。 实验四 名称:用VHDL设计与实现相关电路 实验任务要求:数码管动态扫描控制器、点阵扫描控制器。

(二)模块端口说明及连接图 1.1实验三(3)模块端口说明 cp:时钟信号输入; rst:8421十进制计数器异步置位; c[6...0]:七段二极管数码管显示; cat[7...0]:数码管显示。 1.2实验三(3)连接图 2.1实验四模块端口说明 cp:时钟信号输入; rst:8421计数器异步复位; lgt[6...0]:七段二极管数码管显示; cat[7...0]:数码管显示。 2.2实验四连接图

相关文档
最新文档