一、实验目的
1,了解并掌握Qt集成开发环境下使用Qt Designer开发图形界面程序的流程和相关操作;
2,了解并掌握Qt的信号槽和信号传递机制,并通过具体应用加深理解;
3,了解并掌握使Qt应用程序支持中文或国际化的方法,并在本次实验中使用;
4,了解并掌握QPainter的translate、shear等库函数的使用方法和Widget类的使用方法,并通过本次实验加深理解;
5,掌握在Qt Designer界面上为菜单项添加工具栏按钮、创建相应槽函数的方法;
6,了解并掌握使用双缓冲机制绘图的方法。
二、实验环境
操作系统:Windows 7
应用软件:Qt Creator
开发平台:qt-sdk-win-opensource-2009.04
三、程序流程图:
四、核心源代码
mainwindow.cpp的内容(实现菜单项的功能和绘图功能的调用) #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "donewdialog.h"
#include
#include
#include
#include "aboutdialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(tr("Qt绘图板"));
setFixedSize(700,500); //主窗口大小设为700*500
area = new PaintArea;
scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark); //scrollArea对象的背景色设为Dark scrollArea->setWidget(area); //将画布添加到scrollArea中
scrollArea->widget()->setMinimumSize(800,600); //scrollArea初始化大小设为
800*600
ui->dockWidget->hide();
setCentralWidget(scrollArea); //将scrollArea加入到主窗口的中心区
isSaved = false;
curFile = tr("未命名.png");
creatColorComboBox(ui->penColorComboBox); //画笔颜色组合框
creatColorComboBox(ui->brushColorComboBox); //填充颜色组合框
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void MainWindow::doOpen()
{
if (maybeSave())
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("打开文件"), QDir::currentPath());
if (!fileName.isEmpty())
{
area->openImage(fileName);
scrollArea->widget()->resize(area->getImageSize());
//获得图片的大小,然后更改scrollArea的大小
isSaved = true;
curFile = fileName;
}
}
}
void MainWindow::doNew()
if(maybeSave())
{
DoNewDialog dlg;
if(dlg.exec() == QDialog::Accepted)
{
int width = dlg.getWidth();
int height = dlg.getHeight();
area->setImageSize(width,height);
scrollArea->widget()->resize(width,height);
area->setImageColor(dlg.getBackColor());
isSaved = false;
}
}
}
bool MainWindow::maybeSave()
{
if(area->isModified())
{
QMessageBox::StandardButton box;
box = QMessageBox::warning(this,tr("保存文件"),tr("图片已经改变,是否保存?"), QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel);
if(box == QMessageBox::Yes)
{
return doFileSave();
}
else if(box == QMessageBox::Cancel)
{
return false;
}
}
return true;
}
bool MainWindow::doFileSave()
{
if(isSaved)
{
return saveFile(curFile);
}
else return doFileSaveAs();
}
bool MainWindow::saveFile(QString fileName)
{
if(area->saveImage(fileName,"png"))
isSaved = true;
return true;
}
else return false;
}
bool MainWindow::doFileSaveAs()
{
QString fileName = QFileDialog::getSaveFileName(this,tr("另存为"),curFile); if(fileName.isEmpty())
{
return false;
}
else return saveFile(fileName);
}
void MainWindow::on_action_N_triggered() //新建菜单
{
doNew();
}
void MainWindow::on_action_O_triggered() //打开菜单
{
doOpen();
}
void MainWindow::on_action_S_triggered() //保存菜单
{
doFileSave();
}
void MainWindow::on_action_A_triggered() //另存为菜单
{
doFileSaveAs();
}
void MainWindow::on_action_X_triggered() //退出菜单
{
if(maybeSave())
qApp->quit();
}
void MainWindow::closeEvent(QCloseEvent *event) //关闭事件
{
if(maybeSave())
qApp->quit();
else event->ignore();
}
void MainWindow::on_action_P_triggered() //打印菜单
{
area->doPrint();
}
void MainWindow::on_action_4_triggered() //放大菜单
{
area->zoomIn();
scrollArea->widget()->resize(area->getImageSize());
//获得图片的大小,然后更改scrollArea的大小
}
void MainWindow::on_action_5_triggered() //缩小菜单
{
area->zoomOut();
}
void MainWindow::on_action_6_triggered() //还原菜单
{
area->zoom_1();
}
void MainWindow::on_action_7_triggered() //旋转菜单
{
area->doRotate();
}
void MainWindow::on_action_8_triggered() //拉伸菜单
{
area->doShear();
}
void MainWindow::on_action_10_triggered() //清空菜单
{
area->doClear();
}
void MainWindow::on_action_11_triggered() //绘图工具栏菜单
{
ui->dockWidget->show();
}
void MainWindow::creatColorComboBox(QComboBox *comboBox)
{
QPixmap pix(16,16);
QPainter painter(&pix);
painter.fillRect(0,0,16,16,Qt::black); //先绘制一个16*16的小图片,然后给其涂色comboBox->addItem(QIcon(pix),tr("黑色"),Qt::black); //再用该图片作为组合框条目的图标
painter.fillRect(0,0,16,16,Qt::white);
comboBox->addItem(QIcon(pix),tr("白色"),Qt::white);
painter.fillRect(0,0,16,16,Qt::red);
comboBox->addItem(QIcon(pix),tr("红色"),Qt::red);
painter.fillRect(0,0,16,16,Qt::green);
comboBox->addItem(QIcon(pix),tr("绿色"),Qt::green);
painter.fillRect(0,0,16,16,Qt::blue);
comboBox->addItem(QIcon(pix),tr("蓝色"),Qt::blue);
painter.fillRect(0,0,16,16,Qt::yellow);
comboBox->addItem(QIcon(pix),tr("黄色"),Qt::yellow);
comboBox->addItem(tr("无颜色"),Qt::transparent); //即透明
}
void MainWindow::on_shapeComboBox_currentIndexChanged(QString shape) //选择图形组合框
{
if(shape == tr("无"))
area->setShape(PaintArea::None); //利用PaintArea类中的枚举变量
else if(shape == tr("矩形"))
area->setShape(PaintArea::Rectangle);
else if(shape == tr("直线"))
area->setShape(PaintArea::Line);
else if(shape == tr("椭圆"))
area->setShape(PaintArea::Ellipse);
}
void MainWindow::on_penStyleComboBox_currentIndexChanged(QString style) //画笔风格组合框
{
if(style == tr("实线"))
{
area->setPenStyle(Qt::SolidLine);
}
else if(style == tr("虚线"))
{
area->setPenStyle(Qt::DotLine);
}
}
void MainWindow::on_penWidthSpinBox_valueChanged(int width) //画笔线宽组合框{
area->setPenWidth(width);
}
void MainWindow::on_penColorComboBox_currentIndexChanged(int index) //画笔颜色组合框
{
QColor color =
ui->penColorComboBox->itemData(index,Qt::UserRole).value
area->setPenColor(color);
}
void MainWindow::on_brushColorComboBox_currentIndexChanged(int index) //填充颜色组合框
{
QColor color =
ui->brushColorComboBox->itemData(index,Qt::UserRole).value
}
void MainWindow::on_action_12_triggered() //关于对话框的实现
{
AboutDialog abdlg;
abdlg.show();
if(abdlg.exec()!=QDialog::Accepted)
abdlg.show();
}
void MainWindow::on_action_2_triggered() //选择直线
{
area->setShape(PaintArea::Line); //利用PaintArea类中的枚举变量
}
void MainWindow::on_action_3_triggered() //选择无
{
area->setShape(PaintArea::None);
}
void MainWindow::on_action_9_triggered() //选择矩形
{
area->setShape(PaintArea::Rectangle);
}
void MainWindow::on_action_13_triggered() //选择椭圆
{
area->setShape(PaintArea::Ellipse);
}
void MainWindow::on_action_14_triggered() //选择实线
{
area->setPenStyle(Qt::SolidLine);
}
void MainWindow::on_action_15_triggered() //选择虚线
{
area->setPenStyle(Qt::DotLine);
}
paintarea.cpp的内容(实现双缓冲绘图并提供绘图接口的调用)
#include "paintarea.h"
#include
#include
#include
PaintArea::PaintArea()
{
image = QImage(400,300,QImage::Format_RGB32); //画布的初始化大小设为400*300,使用32位颜色
backColor = qRgb(255,255,255); //画布初始化背景色使用白色
image.fill(backColor);
modified = false;
scale = 1;
angle = 0;
shear = 0;
penColor = Qt::black;
brushColor = Qt::black;
penWidth = 1;
penStyle = Qt::SolidLine;
curShape = None;
isDrawing = false;
}
void PaintArea::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.scale(scale,scale);
if(isDrawing) //如果正在绘制特殊图形,则显示临时绘图区上的内容
{
painter.drawImage(0,0,tempImage);
}
else
{
if(angle)
{
QImage copyImage = image; //新建临时的copyImage,利用它进行旋转操作
QPainter pp(©Image);
QPointF center(copyImage.width()/2.0,copyImage.height()/2.0);
pp.translate(center);
pp.rotate(angle);
pp.translate(-center);
pp.drawImage(0,0,image);
image = copyImage; //只会复制图片上的内容,不会复制坐标系统
angle = 0; //完成旋转后将角度值重新设为0
}
if(shear)
{
QImage copyImage = image;
QPainter pp(©Image);
pp.shear(shear,shear);
pp.drawImage(0,0,image);
image = copyImage;
shear = 0;
}
painter.drawImage(0,0,image);
}
}
void PaintArea::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) //当鼠标左键按下
{
lastPoint = event->pos(); //获得鼠标指针的当前坐标作为起始坐标
isDrawing = true;
}
}
void PaintArea::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton) //如果鼠标左键按着的同时移动鼠标
{
endPoint = event->pos(); //获得鼠标指针的当前坐标作为终止坐标
if(curShape == None) //如果不进行特殊图形绘制,则直接在image上绘制
{
isDrawing = false;
paint(image);
}
else //如果绘制特殊图形,则在临时绘图区tempImage上绘制
{
tempImage = image; //每次绘制tempImage前用上一次image中的图片对其进行填充paint(tempImage);
}
}
}
void PaintArea::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) //如果鼠标左键释放
{
endPoint = event->pos();
isDrawing = false;
paint(image);
}
}
void PaintArea::paint(QImage &theImage)
{
QPainter pp(&theImage); //在theImage上绘图
QPen pen = QPen();
pen.setColor(penColor);
pen.setStyle(penStyle);
pen.setWidth(penWidth);
QBrush brush = QBrush(brushColor);
pp.setPen(pen);
pp.setBrush(brush);
int x,y,w,h;
x = lastPoint.x()/scale;
y = lastPoint.y()/scale;
w = endPoint.x()/scale - x;
h = endPoint.y()/scale - y;
switch(curShape)
{
case None:
{
pp.drawLine(lastPoint/scale,endPoint/scale); //由起始坐标和终止坐标绘制直线lastPoint = endPoint; //让终止坐标变为起始坐标
break;
}
case Line:
{
pp.drawLine(lastPoint/scale,endPoint/scale);
break;
}
case Rectangle:
{
pp.drawRect(x,y,w,h);
break;
}
case Ellipse:
{
pp.drawEllipse(x,y,w,h);
break;
}
}
update(); //进行更新界面显示,可引起窗口重绘事件,重绘窗口
modified = true;
}
void PaintArea::setImageSize(int width, int height)
{
QImage newImage(width,height,QImage::Format_RGB32);
image = newImage;
update();
}
void PaintArea::setImageColor(QColor color)
{
backColor = color.rgb(); //因为image的背景色要用QRgb类型的颜色,所以这里进行了一下转换
image.fill(backColor);
update();
}
bool PaintArea::saveImage(const QString &fileName, const char *fileFormat) {
QImage visibleImage = image;
if (visibleImage.save(fileName, fileFormat)) //实现了文件存储
{
modified = false;
return true;
}
else
{
return false;
}
}
bool PaintArea::openImage(const QString &fileName)
{
QImage loadedImage;
if (!loadedImage.load(fileName))
return false;
QSize newSize = loadedImage.size();
setImageSize(newSize.width(),newSize.height());
image = loadedImage;
modified = false;
update();
return true;
}
QSize PaintArea::getImageSize()
{
return image.size()*scale;
}
void PaintArea::doPrint()
{
QPrinter printer(QPrinter::HighResolution);
QPrintDialog *printDialog = new QPrintDialog(&printer, this);
if (printDialog->exec() == QDialog::Accepted)
{
QPainter painter(&printer);
QRect rect = painter.viewport();
QSize size = image.size();
size.scale(rect.size(), Qt::KeepAspectRatio);
painter.setViewport(rect.x(), rect.y(), size.width(), size.height()); painter.setWindow(image.rect());
painter.drawImage(0, 0, image);
}
}
void PaintArea::zoomIn()
{
scale*=1.2;
update();
}
void PaintArea::zoomOut()
{
scale/=1.2;
update();
}
void PaintArea::zoom_1()
{
scale = 1;
update();
}
void PaintArea::doRotate()
{
angle +=90;
update();
}
void PaintArea::doShear()
{
shear = 0.2;
update();
}
void PaintArea::doClear()
{
image.fill(backColor); //用现在的画布背景色进行填充
update();
}
void PaintArea::setPenStyle(Qt::PenStyle style)
{
penStyle = style;
}
void PaintArea::setPenWidth(int width)
{
penWidth = width;
}
void PaintArea::setPenColor(QColor color)
{
penColor = color;
}
void PaintArea::setBrushColor(QColor color)
{
brushColor = color;
}
void PaintArea::setShape(ShapeType shape)
{
curShape = shape;
}
五、实验步骤
第一部分:设计界面
一.设计菜单
1.在QtCreator中新建Qt4 Gui Application工程,我这里使用的工程名为paint,使用默认的QMainWindow作为主窗口。
2.为了让程序中可以使用中文,我们先在main.cpp中加入头文件#include
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
3.打开mainwindow.ui,先设计菜单。依次是文件菜单,编辑菜单,工具菜单和帮助菜单。其内容分别如下:
4.向工程中添加资源文件,向其中添加要使用的菜单图标。
添加完后记着保存一下资源文件,不然的话,在资源管理器中可能看不到添加的图标。
5.打开动作编辑器Action Editor,编辑已添加的菜单动作,为菜单动作添加快捷键、快捷图标和状态栏提示,具体操作很简单,这里不作赘述,最终设置完成后结果如下图:
6.我们把其中的一些图标放到工具栏上,如下图所示:
我们这里的绘图工具栏使用的是一种叫做Dock的窗口,它与其它窗口的不同就是它可以在其父窗口中浮动,也可以停靠在父窗口的边界,就像一个工具栏一样。
1.我们在左边的部件栏中找到Dock Widget,将其拖入到设计区。
添加后它默认在左边框上停靠着,设置其windowTitle属性为“画图工具”,并在其上面添加如下图所示的标签、spinbox和combobox:
其中,“画笔线宽”下的部件为Spin Box,其属性中的objectName为penWidthSpinBox,属性栏最下面的minimum属性改为1,即最小值为1。其余部件均为组合框ComboBox,objectName依次为:选择图形:shapeComboBox 画笔类型:penStyleComboBox画笔颜色:
penColorComboBox 填充颜色:brushColorComboBox
2.为combobox“选择图形”和“画笔类型”添加条目,结果如下图:
三.添加画布
因为画布是真正实现绘图功能的,所以我们新建一个类来实现所有跟绘图有关的功能。这里先进行操作,对于一些内容到后面我们会详细解释的。
1.往工程中添加新的C++类,类名为PaintArea,以QWidget作为基类,如下所示:
2.在paintArea.h中声明对象和函数。
#ifndef PAINTAREA_H
#define PAINTAREA_H
#include
#include
#include
class PaintArea : public QWidget
{
public:
PaintArea();
void setImageSize(int width,int height);
void setImageColor(QColor color);
bool isModified() const { return modified; } //判断画布内容是否被更改过bool saveImage(const QString &fileName, const char *fileFormat); //保存图片bool openImage(const QString &fileName); //打开图片
QSize getImageSize();
void doPrint();
void zoomIn(); //放大
void zoomOut(); //缩小
void zoom_1(); //还原
void doRotate(); //旋转
void doShear(); //拉伸
void doClear(); //清空
void setPenStyle(Qt::PenStyle style); //设置画笔风格
void setPenWidth(int width); //设置画笔宽度
void setPenColor(QColor color); //设置画笔颜色
void setBrushColor(QColor color); //设置填充颜色
enum ShapeType //枚举变量,几个图形的选择
{
None, //没有图形
Line, //直线
Rectangle, //矩形
Ellipse //椭圆
};
void setShape(ShapeType shape); //设置要绘制的图形
protected:
void paintEvent(QPaintEvent *); //重绘事件
void mousePressEvent(QMouseEvent *); //鼠标按下事件
void mouseMoveEvent(QMouseEvent *); //鼠标移动事件
void mouseReleaseEvent(QMouseEvent *); //鼠标释放事件
void paint(QImage& theImage); //进行绘制
private:
QImage image; //QImage类对象,用于在其上绘图
QRgb backColor; //QRgb颜色对象,存储image的背景色
QPoint lastPoint,endPoint; //定义两个坐标对象存放鼠标指针的前后两个坐标
bool modified; //标志画布是否被更改过
qreal scale; //缩放量
int angle; //角度
qreal shear; //拉伸量
QColor penColor; //画笔颜色
QColor brushColor; //填充颜色
int penWidth; //画笔宽度
Qt::PenStyle penStyle; //画笔风格
ShapeType curShape; //当前图形
QImage tempImage; //临时绘图区
bool isDrawing; //是否在绘制特殊图形
};
#endif // PAINTAREA_H
3.在paintarea.cpp中的构造函数里初始化对象并实现相应绘图使用的函数功能。(源代码参见关键代码)
第二部分:实现基本功能
我们用Qt Creator打开上次的工程,即打开工程文件夹中的paint.pro文件。
一.添加设置画布的对话框
首先,因为新建画布时,我们想要可以设置画布的大小和背景颜色,所以在开始讲解之前,我们先添加一个对话框,用来让用户进行相关设置。
1.我们添加新的Qt Designer Form Class,选择带有按钮的对话框作为模板,如下图所示。然后类名使用DoNewDialog。
重庆大学 学生实验报告 实验课程名称操作系统原理 开课实验室DS1501 学院软件学院年级2013专业班软件工程2 班学生姓名胡其友学号20131802 开课时间2015至2016学年第一学期 总成绩 教师签名洪明坚 软件学院制
《操作系统原理》实验报告 开课实验室:年月日学院软件学院年级、专业、班2013级软件工 程2班 姓名胡其友成绩 课程名称操作系统原理 实验项目 名称 指导教师洪明坚 教师 评语教师签名:洪明坚年月日 1.实验目的: ?进入实验环境 –双击expenv/setvars.bat ?检出(checkout)EPOS的源代码 –svn checkout https://www.doczj.com/doc/d74481889.html,/svn/epos ?编译及运行 –cd epos/app –make run ?清除所有的临时文件 –make clean ?调试 –make debug ?在“Bochs Enhanced Debugger”中,输入“quit”退出调试 –调试指令,请看附录A 2.实验内容: ?编写系统调用“time_t time(time_t *loc)” –功能描述 ?返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc 非NULL,则返回值也被填到loc所指向的内存位置 –数据类型time_t其实就是long ?typedef long time_t; 3.实验步骤: ?Kernel space –K1、在machdep.c中,编写系统调用的实现函数“time_t sys_time()”,计算用户秒数。需要用到 ?变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1午夜的秒数 ?变量g_timer_ticks
实报告 课程名称:电路与模拟电子技术实验指导老师:成绩: 实验名称:基本运算电路设计实验类型:同组学生姓名: 一、实验目的和要求: 实验目的: 1、掌握集成运算放大器组成的比例、加法和积分等基本运算电路的设计。 2、了解集成运算放大器在实际应用中应考虑的一些问题。 实验要求: 1、实现两个信号的反向加法运算 2、用减法器实现两信号的减法运算 3、用积分电路将方波转化为三角波 4、实现同相比例运算(选做) 5、实现积分运算(选做) 二、实验设备: 双运算放大器LM358 三、实验须知: 1.在理想条件下,集成运放参数有哪些特征? 答:开环电压增益很高,开环电压很高,共模抑制比很高,输入电阻很大,输入电流接近于零,输出电阻接近于零。2.通用型集成运放的输入级电路,为啥均以差分放大电路为基础? 答:(1)能对差模输入信号放大 (2)对共模输入信号抑制 (3)在电路对称的条件下,差分放大具有很强的抑制零点漂移及抑制噪声与干扰的能力。 3.何谓集成运放的电压传输特性线?根据电压传输特性曲线,可以得到哪些信 息? 答:运算放大器的电压传输特性是指输出电压和输入电压之比。4.何谓集成运放的输出失调电压?怎么解决输出失调? 答:失调电压是直流(缓变)电压,会叠 加到交流电压上,使得交流电的零线偏移 (正负电压不对称),但是由于交流电可 以通过“隔直流”电容(又叫耦合电容) 输出,因此任何漂移的直流缓变分量都不 能通过,所以可以使输出的交流信号不受 失调电压的任何影响。 专业: 姓名: 日期: 地点:紫金港东
5.在本实验中,根据输入电路的不同,主要有哪三种输入方式?在实际运用中这三种输入方式都接成何种反馈形式,以实现各种模拟运算? 答:反相加法运算电路,反相减法运算电路,积分运算电路。都为负反馈形式。 四、实验步骤: 1.实现两个信号的反相加法运算 实验电路: R′= Rl//R2//RF 电阻R'的作用:作为平衡电阻,以消除平均偏置电流及其漂移造成的运算误差 输入信号v s1v s1输出电压v o ,1kHz 0 2.减法器(差分放大电路) 实验电路: R1=R2、R F=R3 输入信号v s1v s1输出电压v o ,1kHz 0 共模抑制比850 3.用积分电路转换方波为三角波 实验电路: 电路中电阻R2的接入是为了抑制由I IO、V IO所造成的积分漂移,从而稳定运放的输出零点。 在t<<τ2(τ2=R2C)的条件下,若v S为常数,则v O与t 将近似成线性关系。 因此,当v S为方波信号并满足T p<<τ2时(T p为方波半个周期时间),则v O将转变
计算机操作系统综合设计 实验一 实验名称:进程创建模拟实现 实验类型:验证型 实验环境: win7 vc++6.0 指导老师: 专业班级: 姓名: 学号: 联系电话: 实验地点:东六E507 实验日期:2017 年 10 月 10 日 实验报告日期:2017 年 10 月 10 日 实验成绩:
一、实验目的 1)理解进程创建相关理论; 2)掌握进程创建方法; 3)掌握进程相关数据结构。 二、实验内容 windows 7 Visual C++ 6.0 三、实验步骤 1、实验内容 1)输入给定代码; 2)进行功能测试并得出正确结果。 2、实验步骤 1)输入代码 A、打开 Visual C++ 6.0 ; B、新建 c++ 文件,创建basic.h 头文件,并且创建 main.cpp 2)进行功能测试并得出正确结果 A 、编译、运行main.cpp B、输入测试数据 创建10个进程;创建进程树中4层以上的数型结构 结构如图所示:。
createpc 创建进程命令。 参数: 1 pid(进程id)、 2 ppid(父进程id)、3 prio(优先级)。 示例:createpc(2,1,2) 。创建一个进程,其进程号为2,父进程号为1,优先级为2 3)输入创建进程代码及运行截图 4)显示创建的进程
3、画出createpc函数程序流程图 分析createpc函数的代码,画出如下流程图:
四、实验总结 1、实验思考 (1)进程创建的核心内容是什么? 答: 1)申请空白PCB 2)为新进程分配资源 3)初始化进程控制块 4)将新进程插入到就绪队列 (2)该设计和实际的操作系统进程创建相比,缺少了哪些步骤? 答:只是模拟的创建,并没有分配资源 2、个人总结 通过这次课程设计,加深了对操作系统的认识,了解了操作系统中进程创建的过程,对进程创建有了深入的了解,并能够用高 级语言进行模拟演示。一分耕耘,一分收获,这次的课程设计让 我受益匪浅。虽然自己所做的很少也不够完善,但毕竟也是努 力的结果。另外,使我体会最深的是:任何一门知识的掌握, 仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能 达到功效。
计算机网络模拟器实验报告 实验说明:共5个实验,其中前3个必做,后2个选做。 一、实验目的 1、掌握模拟器软件的使用方法; 2、掌握配置PC、交换机、路由器的方法; 3、掌握为交换机设置VLAN,为端口设置TRUNK的方法。 二、实验环境(请注意关闭杀毒软件) WinXP/WIN7、HW-RouteSim 2.2(软件请到BB课程 资源下载,下载后直接解压缩运行;下载前请关闭 杀毒软件) 三、实验步骤及结果 实验一:计算机和交换机基本设置 添加一个交换机,两个计算机,连接A电脑到交换机3号端口,B电脑到6号端口,双击交换机,进入终端配置:
[S3026]super password 111 ;设置特权密码为111 [S3026]quit
《操作系统》实验报告 实验序号: 4 实验项目名称:进程控制
Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜ 修改后: #include
实验任务:写出程序的运行结果。 4.正在运行的进程 (2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。 #include
北京交通大学电路基础实验报告
实验目的: (1)学习MultiSim2001建立电路、直流电路的分析方法。 (2)掌握伏安特性的测量。 (3)通过实验,加深对叠加定理和戴维南定理的理解。 实验内容: 1)测量二极管的伏安特性 (1)建立如右图所示的仿真Array电路。 (2)启动Simulate菜单中的 Analyses下的DC Sweep 设置相应的参数后,单击Simulate按钮,得到二极管的伏 安特性曲线。 2)验证叠加定理Array(1)建立如右图 所示的仿真电路。 (2)启动仿真开 关后,用电压表分 别测出V1、V2单 独作用和共同作 用时个支路的电压值,验证叠加定理。 3)验证戴维南定理 (1)建立如下图所示的仿真电路。(其中a对应2的位置,
b 对应0的位置) (2)用电压表测量R3断开时a 、b 端口的开路电压。 (3)将电阻R3短路,用电流表测量a 、b 端口短路电压。 (4)计算出等效电阻。重新建立一仿真电路,调出一个直流电压源,设置其电压为测量出的开路电压值,调一个电阻值为计算出的等效电阻,与R3电阻串联成一个等效电路。再用电压表和电流表测量R3两端的电压和流过电流,验证戴维南定理。 实验过程: 1) 测量二极管的伏安特性。 如右图,建立仿真电路图后,启动Simulate 菜单中的Analyses 下的DC Sweep 命令,设置相应的参数后,单击Simulate 按钮,得到二极管的伏安特性曲线如下:
2)验证叠加定理。 V1单独作用: 令V2=0.启动仿真开关如下图: U11=8.727V U21=3.273V U31=3.273V V2单独作用: 令V1=0,启动仿真开关如下图:
通信网络基础实验 报告 学号:。。。 姓名:。。。 专业:通信工程 指导老师:孙恩昌 完成时间:2015-12-27
目录 一.实验目的 (3) 二.实验内容 (3) 三.实验原理 (3) 四.实现停等式ARQ实验过程及结果: (5) 五.实现返回n-ARQ实验过程及结果: (7) 六.实现选择重发式ARQ过程及结果: (8) 七.心得体会 (10)
一.实验目的 1.理解数据链路层ARQ协议的基本原理 2.用算法实现四种不同形式的ARQ重传协议:停等式ARQ、返回n-ARQ、选择重发式ARQ和ARPANET ARQ。 3.提高分析和解决问题的能力和提高程序语言的实现能力 二.实验内容: 1.根据停等式ARQ协议基本理论,编写协议算法,进行仿真; 2.根据返回N-ARQ协议基本理论,编写协议算法,进行仿真; 3.根据选择重传ARQ协议基本理论,编写协议算法,进行仿真; 4.根据并行等待ARQ协议基本理论,编写协议算法,进行仿真 三.实验原理 1.停等式ARQ:在开始下一帧传送出去之前,必须确保当前帧已被正确接受。假定A到B的传输链路是正向链路,则B到A的链路称为反向链路。在该链路上A要发送数据帧给B,具体的传送过程如下: 发送端发出一个包后,等待ACK,收到ACK,再发下一个包,没有收
到ACK、超时,重发 重发时,如果ACK 不编号,因重复帧而回复的ACK,可能被错认为对其它帧的确认。 2. 返回n-ARQ:发送方和接收方状态示意图 返回n-ARQ方案的特点如下: (1)发送方连续发送信息帧,而不必等待确认帧的返回; (2)在重发表中保存所发送的每个帧的备份; (3)重发表按先进先出(FIFO)队列规则操作; (4)接收方对每一个正确收到的信息帧返回一个确认帧,每一个确认帧包含一个惟一的序号,随相应的确认帧返回; (5)接收方保存一个接收次序表,包含最后正确收到的信息帧的序号。当发送方收到相应信息帧的确认后,从重发表中删除该信息帧的备份;
操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软124班 指导老师:郭玉华 2014年12月10日
实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序: E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 有可能是因为DOS下路径的问题 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 因为程序是个死循环程序 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环: 屏蔽j循环: _______________________________________________________________________________调整循环变量i的循环次数:
实验题目: 日光灯电路改善功率因数实验 一、实验目的 1、了解日光灯电路的工作原理及提高功率因数的方法; 2、通过测量日光灯电路所消耗的功率,学会电工电子电力拖动实验装置; 3、学会日光灯的接线方法。 二、实验原理 用P 、S 、I 、V 分别表示电路的有功功率、视在功率、总电流和电源电压。按定义电路的功率因数IU P S P = = ?cos 。由此可见,在电源电压且电路的有功功率一定时,电路的功率因数越高,它占用电源(或供电设备)的容量S 就越少。 日光灯电路中,镇流器是一个感性元件(相当于电感与电阻的串联),因此它是一个感性电路,且功率因数很低,约0.5—0.6。 提高日光灯电路(其它感性电路也是一样)功率因数的方法是在电路的输入端并联一定容量的电容器。如图7-1所示: 图7-1 图7-2 图7-1 并联电容提高功率因数电路 图7-2 并联电容后的相量图 图7-1中L 为镇流器的电感,R 为日光灯和镇流器的等效电阻,C 为并联的电容器, 设并联电容后电路总电流I ,电容支路电流C I ,灯管支路电流RL I (等于未并电容前电路中的总电流),则三者关系可用相量图如图7-2所示。由图7-2知,并联电容C 前总电流 为RL I ,RL I 与总电压U 的相位差为L ?,功率因数为L ?cos ;并联电容C 后的总电流为I ,I 与总电压U 的相位差为?,功率因数为?cos ;显然?cos >L ?cos ,功率被提高了。并联电容C 前后的有功功率??cos cos IU U I P L RL ==,即有功功率不变。并联电容C 后的 总电流I 减小,视在功率IU S =则减小了,从而减轻了电源的负担,提高了电源的利用率。 三、实验设备 电工电子电力拖动实验装置一台,型号:TH-DT 、导线若干 四、实验内容 1、功率因数测试 按照图7-3的电路 实验电路如图7-3所示,将三表测得的数据记录于表7-1中。 图7-3 日光灯实验电路 W 为功率表,C 用可调电容箱。 五、实验数据与分析 表7-1 感性电路并联电容后的原始数据 C (μF ) P(瓦) V (伏) I (安) Cos ф 0 44.7 220 0.410 0.42
基尔霍夫定律和叠加定理的验证 组长:曹波组员:袁怡潘依林王群梁泽宇郑勋 一、实验目的 通过本次实验验证基尔霍夫电流定律和电压定律加深对“节点电流代数和”及“回路电压代数和”的概念的理解;通过实验验证叠加定理,加深对线性电路中可加性的认识。 二、实验原理 ①基尔霍夫节点电流定律[KCL]:在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于0。 ②基尔霍夫回路电压定律[KVL]:在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于0。 ③叠加定理:在线性电阻电路中,某处电压或电流都是电路中各个独立电源单独作用时,在该处分别产生的电压或电流的叠加。 三、实验准备 ①仪器准备 1.0~30V可调直流稳压电源 2.±15V直流稳压电源 3.200mA可调恒流源 4.电阻 5.交直流电压电流表 6.实验电路板 7.导线
②实验电路图设计简图 四、实验步骤及内容 1、启动仪器总电源,连通整个电路,分别用导线给电路中加上直流电压U1=15v,U2=10v。 2、先大致计算好电路中的电流和电压,同时调好各电表量程。 3、依次用直流电压表测出电阻电压U AB、U BE、U ED,并记录好电压表读数。 4、再换用电流表分别测出支路电流I1、I2、I3,并记录好电流读数。 5、然后断开电压U2,用直流电压表测出电阻电压U、BE,用电流表分别测出支路电流I、1并记录好电压表读数。 6、然后断开电压U1,接通电压U2,用直流电压表测出电阻电压U、、BE,用电流表分别测出支路电流I、、1并记录好电压表读数。 7、实验完毕,将各器材整理并收拾好,放回原处。 实验过程辑录 图1 测出U AB= 图2 测出电压U BE=
西安邮电大学 (计算机学院) 课实验报告 实验名称:进程管理 专业名称:计算机科学与技术 班级: 学生: 学号(8位): 指导教师: 实验日期:*****年**月**日
一. 实验目的及实验环境 目的:(1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)分析进程竞争资源现象,学习解决进程互斥的方法。 (4)了解Linux系统中进程通信的基本原理。 环境:Linux操作系统环境: 二. 实验容 (1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。 (2)阅读Linux的fork.c源文件,分析进程的创建过程。 三.方案设计 (1)进程的创建 编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。 如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (3)①编写一段程序,使其现实进程的软中断通信。 要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Processll is Killed by Parent! Child Processl2 is Killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止 Parent Process is Killed! 程序流程图如下:
操作系统教程实验报告 专业班级 学号 姓名 指导教师
实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:
学生学号0121210680225 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称操作系统 开课学院计算机科学与技术学院 指导老师姓名刘军 学生姓名李安福 学生专业班级软件sy1201 2014 — 2015 学年第一学期
《操作系统》实验教学大纲 课程编号: 课程名称:操作系统/Operating System 实验总学时数:12学时 适应专业:计算机科学与技术、软件工程 承担实验室:计算机科学与技术学院实验中心 一、实验教学的目的和任务 通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。 二、实验项目及学时分配 序号实验项目名称实验学时实验类型开出要求 01 Linux键盘命令和vi 2 设计必开 02 Linux下C编程 2 设计必开 03 SHELL编程和后台批处理 2 设计必开 04 Linux系统调用(time) 2 设计必开 05 Linux进程控制(fork) 4 设计必开 三、每项实验的内容和要求: 1、Linux键盘命令和vi 要求:掌握Linux系统键盘命令的使用方法。 内容:见教材p4, p9, p40, p49-53, p89, p100 2、Linux下的C编程 要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。 内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。 3、SHELL编程和后台批处理 要求:掌握Linux系统的SHELL编程方法和后台批处理方法。 内容:(1) 将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。 (2) 将上面SHELLL程序后台运行。观察原C程序运行时输入输出情况。 (3) 修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键 盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容, 然后输出到屏幕。 4、Linux系统调用使用方法。
重庆交通大学 学生实验报告 实验课程名称机械工程控制基础 开课实验室交通装备与制造工程实训中心 学院机电与汽车工程学院年级 2012专业班机械电子工程(2)学生姓名学号 开课时间 2014 至 2015 学年第二学期
验证性设计性综合性
ans = (1/2)^n (2) ) 1.0)(8.0()(2 --=z z z z F syms z >> f=((z^2)/((z-0.8)*(z-0.1))) f = z^2/((z - 4/5)*(z - 1/10)) >> iztrans(f) ans = (8*(4/5)^n)/7 - (1/10)^n/7 实验项目 系统分析 实验时间 实验地点 90304 实验性质 验证性 设计性 综合性 教师评价: 评价教师签名: 第三章:计算机控制系统的分析 1 试求如题图 3.1所示的采样控制系统在单位阶跃信号作用下的输出响应)(*t y 。设 ) 10(*20 )(+= s s s G ,采样周期T=0.1s 。
解: gs=tf([20],[1 10 0]); gz=c2d(gs,0.1,'imp'); gzb1=gz/(gz+1); gzb2=feedback(gz,1); y=step(gzb1); step(gzb1,gzb2); 结果: 2 试求如题图3.1所示的采样控制系统在单位速度信号作用下的稳态误差。 设) 11.0(1 )(+= s s s G ,采样周期T=0.1s. 解: gs=tf([1],[0.1 1 0]); T=0.1; gz=c2d(gs,T,'imp'); gzb=feedback(gz,1); rz = tf([0.1 0],[1 -2 1],T); rz1 = zpk([0],[1 1],T,T); yz=rz*gzb; impulse(yz); t=[0:0.1:10]'; ramp=t; lsim(gzb,ramp,t) [y,t1] = lsim(gzb,ramp,t); ER = ramp - y
操作系统实验一实验报告 基本信息 1.1 实验题目 进程控制实验 1.2完成人 王召德 1.3报告日期 2015-4-8 实验内容简要描述 2.1实验目标 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和 体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过 程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux 系统中 进程创建与控制有关的系统调用的编程和调试技术。 2.2实验要求 参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps 命令总在ls 命令之前执行。 2.3实验的软硬件环境
Ubuntu14.04 intelPC 报告的主要内容 3.1实验的思路 按照上面的实例,先生成一个子进程让其等待,然后生成第二个子进程,父进程等待其执行ps命令后唤醒第一个子进程执行ls即可。 3.2实验模型的描述 无 3.3主要数据结构的分析说明 无 3.4主要算法代码的分析说明 无 3.5项目管理文件的说明 无 实验过程和结果 4.1实验投入的实际学时数 1学时 4.2调试排错过程的记录 曾尝试让第二个子进程激活第一个子进程,结果发现当运行ps后,后面的代码将不再执行,所以不可行。 4.3多种方式测试结果的记录
实验结果: 父进程启动 (12239) ls子进程启动 (12240) ps子进程启动 (12241) PID TTY TIME CMD 12239 pts/27 00:00:00 born 12240 pts/27 00:00:00 born 12241 pts/27 00:00:00 ps ps子进程结束 (12241) 唤醒ls子进程 (12240) 键盘中断信号产生... ls子进程被唤醒 (12240) . born born.c~ hello.c pctl pctl.c~ pctl.o .. born.c helelo.h~ hello.c~ pctl.c pctl.h ls子进程结束 (12240) 父进程结束 (12239) 4.4实验结果的分析综合 无 实验的总结 父进程可以通过fork()函数生成子进程,子进程会从fork()函数开始执行原来的代码,当
实验一 1. 实验目的 学习使用workbench软件,学习组建简单直流电路并使用仿真测量仪表测量电压、电流。 2.解决方案 1)基尔霍夫电流、电压定理的验证。 解决方案:自己设计一个电路,要求至少包括两个回路和两个节点,测量节点的电流代数和与回路电压代数和,验证基尔霍夫电流和电压定理并与理论计算值相比较。 2)电阻串并联分压和分流关系验证。 解决方案:自己设计一个电路,要求包括三个以上的电阻,有串联电阻和并联电阻,测量电阻上的电压和电流,验证电阻串并联分压和分流关系,并与理论计算值相比较。 3.实验电路及测试数据 4.理论计算 根据KVL和KCL及电阻VCR列方程如下: Is=I1+I2, U1+U2=U3, U1=I1*R1,
U2=I1*R2, U3=I2*R3 解得,U1=10V,U2=20V,U3=30V,I1=5A,I2=5A 5. 实验数据与理论计算比较 由上可以看出,实验数据与理论计算没有偏差,基尔霍夫定理正确; R1与R2串联,两者电流相同,电压和为两者的总电压,即分压不分流; R1R2与R3并联,电压相同,电流符合分流规律。 6. 实验心得 第一次用软件,好多东西都找不着,再看了指导书和同学们的讨论后,终于完成了本次实验。在实验过程中,出现的一些操作上的一些小问题都给予解决了。 实验二 1.实验目的 通过实验加深对叠加定理的理解;学习使用受控源;进一步学习使用仿真测量仪表测量电压、电流等变量。 2.解决方案 自己设计一个电路,要求包括至少两个以上的独立源(一个电压源和一个电流源)和一个受控源,分别测量每个独立源单独作用时的响应,并测量所有独立源一起作用时的响应,验证叠加定理。并与理论计算值比较。 3. 实验电路及测试数据 电压源单独作用:
操作系统 实验报告 班号:1303107 学号:1130310726 姓名:蔡鹏
1.请简述head.s 的工作原理。 head.s实在32位保护模式下运行的。我认为这段程序主要包括两个部分:1.初始化设置。2.任务执行与切换。 初始设置主要包括了:1.设置GDT表2.设置系统定时芯片3. 设置IDT表(0x08时钟中断和0x80系统调用中断)4.切换到任务0执行 任务切换和执行包括了:1.任务0和任务1 , 2.时钟中断, 3.系统中断 两个任务的在LDT中代码段和数据段描述符的内容都设置为:基地址0x0000;段限长值为0x03ff,实际段长度为4MB。因此在线性地址空间中这个?内核?的代码和数据段与任务的代码和数据段都从线性地址0开始并且由于没有采用分页机制,所以他们都直接对应物理地址0开始处。 为了每隔10毫秒切换运行的任务,head.s程序中把定时器芯片8253的通道0设置成每隔10毫秒就向中断控制芯片8259A发送一个时钟中断请求信号。PC机的ROM BIOS开机时已经在8259A中把时钟中断请求信号设置成中断向量8,因此我们需要在中断8的处理过程中执行任务切换操作。任务切换的实现是查看current变量中的当前运行的任务号,如果为0,就利用任务1的TSS选择符作为操作数执行远跳转指令,从而切换到任务1中,否则反之。
每个任务在执行时,会首先把一个字符的ASCII码放入寄存器AL中,然后调用系统中断调用int 0x80,而该系统调用处理过程则会调用一个简单的字符写屏子程序,把寄存器AL中的字符显示在屏幕上,同时把字符显示的屏幕的下一个位置记录下来,作为下一次显示字符用。在显示过一个字符后,任务代码会使用循环语句延迟一段时间,然后又跳转到任务代码开始处继续循环执行,直到运行了10毫秒而发生了定时中断,从而代码会切换到另一个任务执行。对于任务A,寄存器AL中始终存放字符‘A’,而任务B运行时AL中始终存放字符‘B’。因此程序运行时我们将看到一连串的‘A’和一连串的‘B’间隔的连续不断的显示在屏幕上。若出现了一个‘C’,是由于PC机偶然产生了一个不是时钟中断和系统调用中断的其他中断。因为我们已经在程序中给所有其他中断安装了一个默认中断处理程序。当出现一个其他中断时,系统就会运行这个中断处理程序,于是就会在屏幕上显示一个‘C’,然后退出中断。 4.请记录head.s 的内存分布状况,写明每个数据段,代码段,栈段 的起始与终止的内存地址。
实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图
2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5));
华北科技学院计算机系综合性实验 实验报告 课程名称操作系统A 实验学期 2010 至 2011 学年第 5 学期学生所在系部计算机系 年级 09 专业班级信管B091 学生姓名郑印学号 200907034117 任课教师杜杏青 实验成绩 计算机系制
实验报告须知 1、学生上交实验报告时,必须为打印稿(A4纸)。页面空间不够,可以顺延。 2、学生应该填写的内容包括:封面相关栏目、实验地点、时间、目的、设备环境、 内容、结果及分析等。 3、教师应该填写的内容包括:实验成绩、教师评价等。 4、教师根据本课程的《综合性实验指导单》中实验内容的要求,评定学生的综合 性实验成绩;要求在该课程期末考试前将实验报告交给任课教师。综合性实验中,所涉及的程序,文档等在交实验报告前,拷贝给任课教师。任课教师统一刻录成光盘,与该课程的期末考试成绩一同上交到系里存档。 5、未尽事宜,请参考该课程的实验大纲和教学大纲。
《操作系统A》课程综合性实验报告 开课实验室:年月日 实验题目进程调度算法程序设计 一、实验目的 通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 二、设备与环境 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。 三、实验内容 用C语言实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 四、实验结果及分析 1.实验设计说明 本实验为进程调度中的短作业优选(非抢占式)算法的实现。定义结构struct jincheng,其中 d表示其进程名,数组啊a[2]表示其到达时间和所需求的服务时间。b[5],c[5],e[5]分别表示进程的完成时间,周转时间,平均周转时间。t表示时间刻表。 开始时,选输出各进程,进程A到达,执行晚后,其服务时间置0,根据时间刻t,判断是否所有进程都到达,若没有,则判断哪些进程到达,从中找出最短的服务时间(不包括已调度的进程),执行,若全部到达,则从全部进程中找到最短服务时间的进程(不包括已调度的进程),执行。 最后输出各进程的完成时间,周转时间,平均周转时间。及他们的平均时间。 2.实验代码 /***********spf(非抢占)************/ #include