操作系统课程 实验报告(完整版)

中南大学《操作系统》实验报告

姓名:孙福星

专业班级:软件 1006班

学号:3902100610

完成日期:2011.11.22

进程调度与内存管理

一、实验目的

在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。

二、实验要求

1、可随机输入若干进程,并按优先权排序;

2、从就绪队首选进程运行:优先权-1/要求运行时间-1

要求运行时间=0时,撤销该进程

3、重新排序,进行下轮调度。

4、可随时增加进程;

5、规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备

队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。

6、每次调度后,显示各进程状态。

7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表;

表目内容:起址、长度、状态(未分/空表目)

8、结合以上实验,PCB增加为:

{PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置,

PCB指针}

9、采用最先适应算法分配主存空间;

10、进程完成后,回收主存,并与相邻空闲分区合并。

11、采用图形界面;

三、实验内容

选择一个调度算法,实现处理机调度。

1、设计一个按优先权调度算法实现处理机调度的程序;

2、设计按时间片轮转实现处理机调度的程序。

3、主存储器空间的分配和回收。在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。

四、实验原理

该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:按优先权调度和按时间片轮转调度。每个进程可能有5种状态:新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。当创建进程时,如果内存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果内存中进程数已经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。

按优先级调度:

当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。

按时间片轮转调度:

当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。

内存管理

该实验基于实验一完成,核心是内存的分配和回收,在实验一的基础上增加内存管理部分,在新建进程的时候增加一个输入内存大小的输入框,在进程进入内存时要分配内存,在进程销毁时要回收内存,如果进入内存时内存不足,则将进程插入到后备队列等待下次调度。系统维护一个内存表,每个表项代表一个空间,每个空间保存了该空间的起始地址和空间大小以及空间使用状态。初始时只有一个空间,当CPU启动时要分配内存,内存分配采用最先适应算法。回收内存时如果有相邻空闲空间,则要进行空闲空间合并。

}

}

五、源代码及截图:

1.divDTO:

public class divDTO

{

private int divBase;

private int length;

private int divFlag;

public divDTO(int divBase,int length,int divFlag)

{

this.divBase = divBase;

this.divFlag = divFlag;

this.length = length;

}

public divDTO()

{

}

public void setDivBase(int base)

{

this.divBase = base;

}

public int getDivBase()

{

return this.divBase;

}

public void setLength(int length)

{

this.length = length;

}

public int getLength()

{

return this.length;

}

public void setDivFlag(int flag)

{

this.divFlag = flag;

}

public int getDivFalg()

{

return this.divFlag;

}

}

2.PcbDTO:

public class PcbDTO

{

static final int Running = 1;

static final int Ready = 2;

static final int Waiting = 3;

private String processName;

private int runTime;

private int prority;

private int processState;

private int base;

private int limit;

private int pcbFlag;

public PcbDTO(String name, int time,int pro,int base,int limit) {

this.processName = name;

this.runTime = time;

this.prority = pro;

this.processState = 0;

this.limit = limit;

this.base = base;

}

public PcbDTO()

{this.pcbFlag = 0;}

public void setProcessName(String name)

{

this.processName = name;

}

public String getProcessName()

{

return processName;

}

public void setRunTime(int time)

{

this.runTime = time;

}

public int getRunTime()

{

return this.runTime;

}

public void setPrority(int prority) {

this.prority = prority;

}

public int getPrority()

{

return this.prority;

}

public void setProcessState(int state) {

this.processState = state;

}

public String getProcessState()

{

String s = new String();

if(this.processState == 1)

{

s = "running";

}

else if(this.processState == 2)

{

s = "ready";

}

else if(this.processState == 3)

{

s = "waiting";

}

return s;

}

public int getBase()

{

return this.base;

}

public void setBase(int base)

{

this.base = base;

}

public void setLimit(int limit)

{

this.limit = limit;

}

public int getLimit()

{

return this.limit;

}

}

3.import javax.swing.*;

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.event.*;

public class MainFrame {

private JList readyList;

private JList waitingList;

private JList jobList;

private JButton susButton;

private JButton relaxButton;

private JButton startButton;

private JButton newButton;

private JLabel nameLabel;

private JLabel prorityLabel;

private JLabel timeLabel;

private JLabel jobLabel;

private JLabel readyLabel;

private JLabel waitingLabel;

private JLabel runningLabel;

private JLabel spaceLabel;

private JLabel divLabel;

private JLabel allocLabel;

private JTable readyTable;

private JTable runningTable;

private JTable divTable;

private JTable allocTable;

private JTextField nameText;

private JTextField timeText;

private JTextField spaceText;

private JComboBox prorityCom;

private JPanel newPanel;

private JPanel waitingPanel;

private JPanel readyPanel;

Vector jobVectorName;

Vector jobDtoVector;

Vector waitingVectorName;

Vector waitingDtoVector;

PcbDTO[] readyDtoArray;

PcbDTO[] newDtoArray;

divDTO[] divDtoArray;

PcbDTO[] newSort;

Object[][] readydata;

Object[][] runningdata;

Object[][] divdata;

Object[][] allocdata;

int first;

int end;

int point;

PcbDTO a;

public MainFrame() {

a = new PcbDTO();

first = 0;

end = 0;

point = 0;

JFrame jf = new JFrame("进程调度-ws");

Container c = jf.getContentPane();

c.setLayout(null);

// c.setBackground(Color.pink);

newPanel = new JPanel();

newPanel.setLayout(null);

waitingPanel = new JPanel(); waitingPanel.setLayout(null);

// waitingPanel.setBackground(Color.pink); readyPanel = new JPanel();

readyPanel.setLayout(null);

susButton = new JButton("挂起"); relaxButton = new JButton("释放"); startButton = new JButton("开始"); newButton = new JButton("新建进程");

nameLabel = new JLabel("进程名"); prorityLabel = new JLabel("优先级"); timeLabel = new JLabel("运行时间"); jobLabel = new JLabel("后备队列"); readyLabel = new JLabel("就绪队列"); waitingLabel = new JLabel("等待队列"); runningLabel = new JLabel("运行进程"); spaceLabel = new JLabel("需要空间"); divLabel = new JLabel("未分分区表"); allocLabel = new JLabel("内存分配表");

nameText = new JTextField();

timeText = new JTextField();

spaceText = new JTextField();

prorityCom = new JComboBox(); prorityCom.setToolTipText("优先级");

readyDtoArray = new PcbDTO[6];

newSort = new PcbDTO[6];

for (int i = 0; i < 6; i++) {

newSort[i] = new PcbDTO();

}

newDtoArray = new PcbDTO[100]; jobDtoVector = new Vector(); jobVectorName = new Vector(); waitingDtoVector = new Vector(); waitingVectorName = new Vector(); divDtoArray = new divDTO[20];

for (int i = 0; i < 20; i++) {

divDtoArray[i] = new divDTO();

divDtoArray[i].setDivFlag(0);

}

divDtoArray[0].setDivFlag(1);

divDtoArray[0].setDivBase(20);

divDtoArray[0].setLength(180);

readydata = new Object[6][4];

runningdata = new Object[2][3];

divdata = new Object[20][3];

allocdata = new Object[20][3];

String[] col1 = { "进程", "时间", "优先级", "状态" }; String[] col2 = { "进程", "时间", "优先级" };

String[] col3 = { "起址", "长度", "状态" };

String[] col4 = { "起址", "长度", "占用进程" }; readyTable = new JTable(readydata, col1);

// readyTable.setEnabled(false);

runningTable = new JTable(runningdata, col2); runningTable.setRowHeight(22);

runningTable.setEnabled(false);

allocTable = new JTable(allocdata, col4); allocTable.setEnabled(false);

divTable = new JTable(divdata, col3);

divTable.setEnabled(false);

divTable.setValueAt(String.valueOf(20), 0, 0); divTable.setValueAt(String.valueOf(180), 0, 1); divTable.setValueAt(String.valueOf(1), 0, 2); JScrollPane runningSP = new JScrollPane(); JScrollPane readySP2 = new JScrollPane(); JScrollPane divSP = new JScrollPane();

JScrollPane allocSP = new JScrollPane();

runningSP.getViewport().add(runningTable);

readySP2.getViewport().add(readyTable);

divSP.getViewport().add(divTable);

allocSP.getViewport().add(allocTable);

// int []prorityArray = new int[10];

for (int i = 0; i < 10; i++) {

prorityCom.addItem(i);// prorityArray[i] = i;

}

jobList = new JList();

waitingList = new JList();

JScrollPane readySP = new JScrollPane(readyList); JScrollPane jobSP = new JScrollPane(jobList); JScrollPane waitingSP = new JScrollPane(waitingList);

newPanel.setSize(450, 100); newPanel.setLocation(0, 0);

nameLabel.setSize(80, 20); nameLabel.setLocation(10, 5); nameText.setSize(100, 25); nameText.setLocation(10, 30); prorityLabel.setSize(80, 20); prorityLabel.setLocation(120, 5); prorityCom.setSize(100, 25); prorityCom.setLocation(120, 30); timeLabel.setSize(80, 20); timeLabel.setLocation(230, 5); timeText.setSize(100, 25); timeText.setLocation(230, 30); spaceLabel.setSize(80, 20); spaceLabel.setLocation(340, 5); spaceText.setSize(100, 25); spaceText.setLocation(340, 30); newButton.setSize(100, 20); newButton.setLocation(320, 70);

waitingPanel.setSize(190, 410); waitingPanel.setLocation(0, 100);

jobLabel.setSize(100, 20); jobLabel.setLocation(10, 2); jobSP.setSize(180, 105);

jobSP.setLocation(10, 25); waitingLabel.setSize(100, 20); waitingLabel.setLocation(10, 129); waitingSP.setSize(180, 105); waitingSP.setLocation(10, 150); divLabel.setSize(100, 20); divLabel.setLocation(10, 253); divSP.setSize(180, 113);

divSP.setLocation(10, 273); relaxButton.setSize(80, 20); relaxButton.setLocation(110, 388);

readyPanel.setSize(260, 410); readyPanel.setLocation(190, 100);

readyLabel.setSize(100, 22);

readyLabel.setLocation(10, 2); allocLabel.setSize(100, 20); allocLabel.setLocation(10, 232); startButton.setSize(80, 20); startButton.setLocation(177, 388); susButton.setSize(80, 20); susButton.setLocation(95, 388); readySP2.setSize(250, 117); readySP2.setLocation(10, 25); runningLabel.setLocation(10, 142); runningLabel.setSize(100, 20); runningSP.setSize(250, 65); runningSP.setLocation(10, 167); allocSP.setSize(250, 130); allocSP.setLocation(10, 255);

c.add(newPanel);

newPanel.add(nameLabel); newPanel.add(nameText); newPanel.add(prorityLabel); newPanel.add(prorityCom); newPanel.add(timeText); newPanel.add(timeLabel); newPanel.add(newButton); newPanel.add(spaceLabel); newPanel.add(spaceText);

c.add(waitingPanel); waitingPanel.add(jobLabel); waitingPanel.add(jobSP); waitingPanel.add(waitingLabel); waitingPanel.add(waitingSP); waitingPanel.add(divLabel); waitingPanel.add(divSP); waitingPanel.add(relaxButton);

c.add(readyPanel);

readyPanel.add(readyLabel); readyPanel.add(allocLabel); readyPanel.add(runningLabel); readyPanel.add(startButton); readyPanel.add(susButton); readyPanel.add(allocSP); readyPanel.add(runningSP);

readyPanel.add(readySP2);

jf.setSize(470, 550);

jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

jf.setLocationRelativeTo(null);

jf.setVisible(true);

startButton.addActionListener(new MyActionListener());

newButton.addActionListener(new MyActionListener());

susButton.addActionListener(new MyActionListener());

relaxButton.addActionListener(new MyActionListener());

}

public void sus() {

try {

Thread.sleep(1000);

} catch (Exception ex) {

}

}

class MyActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

int count = 0;

PcbDTO test = new PcbDTO();

JButton jb = (JButton) e.getSource();

int max = -1;

if (jb == startButton) {

// while(true)

// {

int runAllocFlag = -1;

if ((String) runningTable.getValueAt(0, 0) == null

|| (String) runningTable.getValueAt(0, 0) == "") { try {

Thread.sleep(0);

} catch (Exception ex) {

}

// System.out.println("到3");

for (int j = first; j != end;) {

if (!readyDtoArray[j].getProcessState().equals(

"waiting")) {

max = j;

break;

}

j = (j + 1) % 6;

}

for (int j = first; j % 6 != end;) {

if (!readyDtoArray[j].getProcessState().equals(

"waiting")) {

if (readyDtoArray[j].getPrority() > readyDtoArray[max]

.getPrority()) {

max = j;

}

}

j = (j + 1) % 6;

}

if (max >= 0) {

a = readyDtoArray[max];

readyDtoArray[max] = readyDtoArray[first];

readyDtoArray[first] = a;

readyTable.setValueAt(

readyDtoArray[max].getProcessName(), max, 0);

readyTable.setValueAt(readyDtoArray[max].getRunTime(),

max, 1);

readyTable.setValueAt(readyDtoArray[max].getPrority(),

max, 2);

readyTable.setValueAt(

readyDtoArray[max].getProcessState(), max, 3);

readyTable.setValueAt("", first, 0);

readyTable.setValueAt("", first, 1);

readyTable.setValueAt("", first, 2);

readyTable.setValueAt("", first, 3);

runningTable.setValueAt(a.getProcessName(), 0, 0);

runningTable.setValueAt(a.getRunTime(), 0, 1);

runningTable.setValueAt(a.getPrority(), 0, 2);

readyDtoArray[first].setRunTime(readyDtoArray[first]

.getRunTime() - 1);

if (0 != readyDtoArray[first].getPrority()) {

readyDtoArray[first]

.setPrority(readyDtoArray[first]

.getPrority() - 1);

}

first = (first + 1) % 6;

} else {

System.out.println("cpu等待中……");

}

} else {

/*

* try { Thread.sleep(2000); } catch(InterruptedException

* e1) { System.out.println(e1); }

*/

// System.out.println("到1");

runningTable.setValueAt("", 0, 0);

runningTable.setValueAt("", 0, 1);

runningTable.setValueAt("", 0, 2);

// 如果运行时间为0则撤销进程,否则将进程重新添加到就绪队列中

if (a.getRunTime() <= 0) {

// 收回内存空间

for (int i = 0; i < point; i++) {

if (newSort[i].getBase() >= a.getBase()) {

newSort[i] = newSort[i + 1];

}

}

point--;

// 设置内存分配表的内容

for (int i = 0; i < point; i++) {

allocTable.setValueAt(

String.valueOf(newSort[i].getBase()), i, 0);

allocTable

.setValueAt(String.valueOf(newSort[i]

.getLimit()), i, 1);

allocTable.setValueAt(newSort[i].getProcessName(),

i, 2);

}

allocTable.setValueAt("", point, 0);

allocTable.setValueAt("", point, 1);

allocTable.setValueAt("", point, 2);

// 把收回的内存加入到记录未分分区的数组

int memoryEnd = 0;

int location = 0;

int up = -1;//

int down = -1;

for (int i = 0; i < 20; i++) {

if (divDtoArray[i].getDivFalg() == 1) {

memoryEnd = divDtoArray[i].getDivBase()

+ divDtoArray[i].getLength();

if (memoryEnd == a.getBase()) {

up = i;

}

if (divDtoArray[i].getDivBase() == (a.getBase() + a

.getLimit())) {

down = i;

}

}

}

if (up >= 0 && down >= 0) {

divDtoArray[up]

.setLength((divDtoArray[up].getLength()

+ a.getLimit() + divDtoArray[down]

.getLength()));

divDtoArray[down].setDivFlag(0);

for (int i = (down + 1); i < 20; i++) {

if (divDtoArray[i].getDivFalg() == 1) {

divDtoArray[i - 1]

.setDivBase(divDtoArray[i]

.getDivBase());

divDtoArray[i - 1].setDivFlag(1);

divDtoArray[i - 1].setLength(divDtoArray[i]

.getLength());

divDtoArray[i].setDivFlag(0);

} else {

divTable.setValueAt("", i - 1, 0);

divTable.setValueAt("", i - 1, 1);

divTable.setValueAt("", i - 1, 2);

break;

}

}

} else if (up >= 0 && down < 0) {

divDtoArray[up].setLength((divDtoArray[up]

.getLength() + a.getLimit()));

} else if (up < 0 && down >= 0) {

divDtoArray[down].setLength((divDtoArray[down]

.getLength() + a.getLimit()));

divDtoArray[down].setDivBase(a.getBase());

} else if (up < 0 && down < 0) {

for (int i = 0; i < 20; i++) {

if (divDtoArray[i].getDivBase() > a.getBase()

|| divDtoArray[i].getDivFalg() == 0) {

location = i;

break;

}

}

for (int i = 20; i > location; i--) {

if (divDtoArray[i - 1].getDivFalg() == 1) {

divDtoArray[i]

.setDivBase(divDtoArray[i - 1]

.getDivBase());

divDtoArray[i].setDivFlag(1);

divDtoArray[i].setLength(divDtoArray[i - 1]

.getLength());

}

}

divDtoArray[location].setDivBase(a.getBase());

divDtoArray[location].setDivFlag(1);

divDtoArray[location].setLength(a.getLimit());

}

// 设置未分分区表的内容

for (int i = 0; i < 20; i++) {

if (divDtoArray[i].getDivFalg() == 1) {

divTable.setValueAt(String

.valueOf(divDtoArray[i].getDivBase()),

i, 0);

divTable.setValueAt(String

.valueOf(divDtoArray[i].getLength()),

i, 1);

divTable.setValueAt(String

.valueOf(divDtoArray[i].getDivFalg()),

i, 2);

}

}

if (!jobDtoVector.isEmpty()) {

int runLength = 0;

PcbDTO jobToReady = (PcbDTO) jobDtoVector

.elementAt(0);

for (int i = 0; i < 20; i++) {

if (divDtoArray[i].getDivFalg() == 1) {

if (divDtoArray[i].getLength() >= jobToReady

.getLimit()) {

runAllocFlag = i;

break;

}

}

}

if (runAllocFlag >= 0) {

jobDtoVector.removeElementAt(0);

jobVectorName.remove(jobVectorName

.indexOf(jobToReady.getProcessName()));

jobList.setListData(jobVectorName);

jobToReady.setProcessState(PcbDTO.Ready);

jobToReady.setBase(divDtoArray[runAllocFlag]

.getDivBase());

runLength = divDtoArray[runAllocFlag]

.getLength() - jobToReady.getLimit();

if (runLength == 0) {

int i = runAllocFlag;

divDtoArray[i].setDivFlag(0);

for (; i < 19; i++) {

if (divDtoArray[i + 1].getDivFalg() == 1) {

divDtoArray[i] = divDtoArray[i + 1];

divDtoArray[i + 1].setDivFlag(0);

}

divTable.setValueAt(String

.valueOf(divDtoArray[i]

.getDivBase()), i, 0);

divTable.setValueAt(String

.valueOf(divDtoArray[i]

.getLength()), i, 1);

divTable.setValueAt(String

.valueOf(divDtoArray[i]

.getDivFalg()), i, 2);

}

divTable.setValueAt(String

.valueOf(divDtoArray[i]

.getDivFalg()), i, 2);

} else if (runLength > 0) {

int c2 = divDtoArray[runAllocFlag]

.getDivBase()

+ jobToReady.getLimit();

divDtoArray[runAllocFlag].setDivBase(c2);

divDtoArray[runAllocFlag]

.setLength(runLength);

divTable.setValueAt(String.valueOf(c2),

runAllocFlag, 0);

divTable.setValueAt(

String.valueOf(runLength),

runAllocFlag, 1);

divTable.setValueAt(String

.valueOf(divDtoArray[runAllocFlag]

.getDivFalg()),

runAllocFlag, 2);

}

readyDtoArray[end] = jobToReady;

readyTable.setValueAt(

jobToReady.getProcessName(), end, 0);

readyTable.setValueAt(jobToReady.getRunTime(),

end, 1);

readyTable.setValueAt(jobToReady.getPrority(),

end, 2);

readyTable.setValueAt(

jobToReady.getProcessState(), end, 3);

end = (end + 1) % 6;

int runi = 0;// 用于记录当前新生成的PcbDTO对象应该插入到newSort中的位置

for (; runi < point; runi++) {

if (jobToReady.getBase() < newSort[runi]

.getBase()) {

break;

}

}

// 如果不是插入到数组末尾,则把比它大的都向后挪一位并设置JTable中的显示

for (int i = point; i > runi; i--) {

newSort[i] = newSort[i - 1];

allocTable.setValueAt(String

.valueOf(newSort[i].getBase()), i,

0);

allocTable.setValueAt(String

.valueOf(newSort[i].getLimit()), i,

1);

allocTable.setValueAt(

newSort[i].getProcessName(), i, 2);

}

// 插入新生成的对象

newSort[runi] = jobToReady;

allocTable.setValueAt(

String.valueOf(jobToReady.getBase()),

runi, 0);

allocTable.setValueAt(

String.valueOf(jobToReady.getLimit()),

runi, 1);

allocTable.setValueAt(

jobToReady.getProcessName(), runi, 2);

point++;

}

}

} else {

readyDtoArray[end] = a;

readyTable.setValueAt(a.getProcessName(), end, 0);

readyTable.setValueAt(a.getRunTime(), end, 1);

readyTable.setValueAt(a.getPrority(), end, 2);

readyTable.setValueAt(a.getProcessState(), end, 3);

end = (end + 1) % 6;

}

操作系统实验报告

篇一:操作系统实验报告完全版 《计算机操作系统》 实验报告 班级:姓名:学号: 实验一进程控制与描述 一、实验目的 通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。 二、实验环境 硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++ 6.0企业版。 三、实验内容和步骤 第一部分: 程序1-1windows 2000 的gui 应用程序 windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。 :: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ; /* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ ) return(0) ; } 在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。 接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。这一指令是visual studio c++ 编译器特有的。 接下来是winmain() 方法。其中有四个由实际的低级入口点传递来的参数。hinstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用getmodulehandle() api 函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是exe文件映像的基地址,通常为0x00400000。下一个参数hprevinstance 是为向后兼容而设的,现在系统将其设为null。应用程序的命令行 (不包括程序的名称) 是lpcmdline参数。另外,系统利用ncmdshow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。 最后,程序调用messagebox() api函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。 先分析程序功能,再写出运行结果: 操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (handle) 的号码,就可与进程对象交互。这一号码只对当前进程有效。 在系统中运行的任何进程都可调用getcurrentprocess() api函数,此函数可返回标识进程本身的句柄。然后就可在windows需要该进程的有关情况时,利用这一句柄来提供。 程序1-2:获得和使用进程的句柄 # include <windows.h> # include <iostream> void main() { handle hprocessthis = :: getcurrentprocess() ; dword dwpriority = :: getpriorityclass(hprocessthis) ;std :: cout << “current

计算机操作系统实验课实验报告

实验报告 实验课程: 计算机操作系统 学生姓名:XXX 学号:XXXX 专业班级:软件 2014年12月25日 目录

实验一熟悉Windows XP中的进程和线程错误!未定义书签。 实验二进程调度错误!未定义书签。 实验三死锁避免—银行家算法的实现错误!未定义书签。 实验四存储管理错误!未定义书签。 实验一熟悉Windows XP中的进程和线程

实验名称 熟悉Windows XP中的进程和线程 实验目的 1、熟悉Windows中任务管理器的使用。 2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。 实验结果分析 1、启动操作系统自带的任务管理器: 方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“”。 调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表: 表一:统计进程的各项主要信息 序号进程名称进程ID线程数量占用内存优先级占CPU时间虚拟内存173********k标准0:00:009200k 2722834124k高0:00:043372k 35144308588k标准0:00:1543652k

446681120700k标准0:00:0123572k 5590831716k标准0:00:002128k 658161730340k标准0:00:1121720k 从任务管理器中分别找到下列程序:、、、,试着结束它们,观察到的反应是任务管理器无法结束进程, 原因是该系统是系统进程。 在任务管理器中找到进程“”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失 了、得到的结论是管理桌面图标的文件(说出进程的作用)。 5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“”的各项信息,并填写下表: 进程:中的各个线程 序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关1000016B8000001048100:00:064998336 2000016B8000003EC15150:00:008 3000016B8000009048100:00:0011 4000016B800000A0C8100:00:0013 5000016B800001280880:00:07817138 6000016B8000013D88100:00:002326

操作系统课程设计实验报告

操作系统 课程设计报告 学院: 班级: 学生姓名: 学号: 指导老师: 提交日期: 一、实验目的

本设计的目的是实现操作系统和相关系统软件的设计,其中涉及进程编程、I/O操作、存储管理、文件系统等操作系统概念。 二、实验要求 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux 文件系统。具体见附表 三、实验环境 Windows 、VC 三、实验思想 1、整体思路 实验可分为三个大模块:文件组织结构、目录结构、磁盘空间管理。编写时,先定义重要的数据结构,整理好各个模块的思路,列出程序清单。接着编写一些对系统进行基本操作的函数,然后利用这些函数实现各种功能。 2、盘块大概分布(分了128块,每块64字节) 盘块0 1 2 3 4 5 6 (127) 用途FAT表FAT表根目录目录数据数据数据...... 数据 盘块与盘块之间的链接,是利用FAT表项,(使用数组结构),并用它记录了所有盘块的使用信息。 优点:可以利用FAT信息,迅速查找、打开各个目录,进行创建、修改文件。 3、目录组成 为了简单,构思目录时,每个目录只有8字节,每盘存放最多8个目录。其中,目录名、文件名最多只能为3字节,如果是文件的话,类型名也最多为2字节。区分目录名和文件名的方法是:设计一个属性项(1个字节),为8时表示纯目录,为4时表示文件目录。具体分布如下图: 用途目录名或文件名文件类型属性文件起始盘 文件长度 块 大小3(字节) 2 1 1 1 优点:属性可以区分纯目录、文件目录;文件起始盘块可以记录文件的存放位置;文件长度,,在读文件时控制指针,是否到了文件末尾。 缺点:为了简单,对文件名、目录名、类型名都作了限制。最大分别为:3,3,2字节。

操作系统实验报告

操作系统原理课内实验报告

实验一:用户接口实验 一.实验目的 1.理解面向操作命令的接口Shell。 2.学会简单的shell编码。 3.理解操作系统调用的运行机制。 4.掌握创建系统调用的方法。 二.实验内容 1.控制台命令接口实验 理解面向操作命令的接口shell和进行简单的shell编程。 2.系统调用实验 理解操作系统调用的运行机制 三.实验步骤 添加系统调用 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表示新添加系统调用的调用号 并修改文件中的NR_syscalls,将其值增加1 9..修改arxh/x86/include/asm/syscalls.h添加以下内容: asmlinkage void sys_mycall(); 10.修改arch/x86/kernel/syscall_table_32.S,添加以下内容: .long sys_mycall 11.配置内核(仅仅修改local versions即可)——命令:make menuconfig 12.编译内核——命令:make –j4 bzImage(开4个线程编译) 13.编译内核模块——命令:make –j4 modules 14.安装内核模块——命令:make modules_install 15.安装内核——命令:make install 16.重启系统,在系统选择页面选择进入自己编译的linux-3.0内核 17.在桌面建立测试的C程序test.c程序内容如下: #include int main(int argc, char *argv[]) { syscall(SYS_ID); // SYS_ID表示新添加系统调用的调用号 return 0; } 18.编译程序——gcc test.c –o a.out 19.运行程序——./a.out 20.查看内核日志(printk的输出信息在内核日志中):dmesg

操作系统实验报告

操作系统实验报告 学号: 姓名: 指导老师: 完成日期:

目录 实验一1实验二2实验三7实验四10实验五15实验六18实验七22

实验一 UNIX/LINUX入门 一、实验目的 了解 UNIX/LINUX 运行环境,熟悉UNIX/LINUX 的常用基本命令,熟悉和掌握UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。 二、实验内容 熟悉 UNIX/LINUX 的常用基本命令如ls、who、pwd、ps 等。 练习 UNIX/LINUX的文本行编辑器vi 的使用方法 熟悉 UNIX/LINUX 下c 语言编译器cc/gcc 的使用方法。用vi 编写一个简单的显示“Hello,World!”c 语言程序,用gcc 编译并观察编译后的结果,然后运行它。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验程序 #include <> #include <> int main() { printf ("Hello World!\n"); return 0; } 五、实验感想 通过第一次室验,我了解 UNIX/LINUX 运行环境,熟悉了UNIX/LINUX 的常用基本命令,熟悉和掌握了UNIX/LINUX 下c 语言程序的编写、编译、调试和运行方法。

实验二进程管理 一、实验目的 加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。 二、实验内容 (1)进程创建 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。 (2)进程控制 修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。 (3)进程的管道通信 编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1 和P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。 三、实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。 四、实验设计 1、功能设计 (1)进程创建 使用fork()创建两个子进程,父进程等待两个子进程执行完再运行。 (2)进程控制 使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话再运行。 (3)进程的管道通信 先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。 2、数据结构 子进程和管道。 3、程序框图

操作系统课程 实验报告(完整版)

中南大学《操作系统》实验报告 姓名:孙福星 专业班级:软件 1006班 学号: 完成日期:

进程调度与内存管理 一、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。 二、实验要求 1、可随机输入若干进程,并按优先权排序; 2、从就绪队首选进程运行:优先权-1/要求运行时间-1 要求运行时间=0时,撤销该进程 3、重新排序,进行下轮调度。 4、可随时增加进程; 5、规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备 队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。 6、每次调度后,显示各进程状态。 7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表; 表目内容:起址、长度、状态(未分/空表目) 8、结合以上实验,PCB增加为: {PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置, PCB指针} 9、采用最先适应算法分配主存空间; 10、进程完成后,回收主存,并与相邻空闲分区合并。 11、采用图形界面;

三、实验内容 选择一个调度算法,实现处理机调度。 1、设计一个按优先权调度算法实现处理机调度的程序; 2、设计按时间片轮转实现处理机调度的程序。 3、主存储器空间的分配和回收。在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。 四、实验原理 该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:按优先权调度和按时间片轮转调度。每个进程可能有5种状态:新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。当创建进程时,如果内存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果内存中进程数已经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。 按优先级调度: 当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。 按时间片轮转调度: 当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。

操作系统实验报告

操作系统实验报告. 操作系统实验报告 一、实验目的 本实验旨在加深对操作系统基本概念、原理和算法的理解,通过实践操作来更深入地理解操作系统的核心思想、设计理念和实现技术。 二、实验内容 本次实验主要涉及以下几个方面: 1、进程管理:包括进程的创建、切换、销毁,以及进程间的通信等操作。 2、内存管理:包括内存的分页、分段、段页式管理等内存管理算法。 3、文件系统:了解文件系统的基本概念和操作,如文件的创建、读写、删除等。 4、设备驱动:了解设备驱动的基本原理和编写方法。 三、实验环境 实验平台:Linux操作系统开发工具:GCC、GDB、Makefile等 四、实验步骤及结果

1、进程管理实验实验步骤: (1) 使用fork()系统调用创建子进程。 (2) 使用exec()系列函数在子进程中运行/bin/ls命令。 (3) 使用wait()系统调用来等待子进程结束。 (4) 使用kill()系统调用来结束子进程。实验结果:成功创建子进程,并在子进程中运行/bin/ls 命令,等待子进程结束并结束子进程。 2、内存管理实验实验步骤: (1) 使用malloc()函数和free()函数进行内存的分配和释放。 (2) 使用sbrk()函数调整堆的大小。 (3) 使用mmap()函数进行内存映射。实验结果:成功使用malloc()函数和free()函数进行内存的分配和释放,使用sbrk()函数调整堆的大小,使用mmap()函数进行内存映射。 3、文件系统实验实验步骤: (1) 使用open()函数打开文件。 (2) 使用read()函数和write()函数对文件进行读写操作。 (3) 使用close()函数关闭文件。实验结果:成功使用open()函数打开文件,使用read()函数和write()函数对文件进行读写操作,使用close()函数关闭文件。 4、设备驱动实验实验步骤: (1) 编写设备驱动程序。 (2) 使用make命令编译设备驱动程序。 (3) 使用insmod命令加载设备驱动程序。 (4) 使用rmmod命令卸载设备驱动程序。实验结果:成功编写设备驱动程序,编译、加载和卸载设备驱动程序。 五、实验总结及思考

操作系统实验报告

操作系统实验报告 操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。 一、实验内容 本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。具体内容包括: 1. 进程的创建和管理 2. 线程的创建和管理 3. 进程同步的实现 在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。 二、实验过程

1. 进程的创建和管理 在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。我们采用了Linux系统下的fork()函数,用于创建子进程。在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。 2. 线程的创建和管理 在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。同样地,我们采用了Linux系统下的fork()函数来创建线程。在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。 3. 进程同步的实现

在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。 三、实验收获 通过这次操作系统实验,我们收获了很多宝贵的经验和知识: 1. 更深入地了解了操作系统的工作原理和相关知识。 2. 掌握了操作系统的进程、线程和进程同步等相关技能。 3. 加强了代码实现和调试的能力。

操作系统实验报告

技术资料 常州大学 操作系统课程实验报告 姓名 xxx 专业班级计算机科学与技术 学号 xxxxxx 指导老师 xxx 成绩 实验时间2012年4月23日——2012年5月7日

实验一 Windows XP 系统管理 一实验目的 1) 了解和学习Windows系统管理工具及其使用; 2) 熟悉Windows系统工具的内容和应用; 3)熟悉Windows操作系统的应用环境。 二实验环境 需要准备一台运行Windows XP操作系统的计算机。 三背景知识 Windows XP的“管理工具”中集成了许多系统管理工具,利用这些工具,管理员可以方便地实现各种系统维护和管理功能。这些工具都集中在“控制面板”的“管理工具”选项下,用户和管理员可以很容易地对它们操作和使用。在默认情况下,只有一些常用工具——如服务、计算机管理、事件查看器、数据源 (ODBC) 、性能和组件服务等——随Windows XP 系统的安装而安装。 四实验内容与步骤 为了帮助用户管理和监视系统,Windows XP提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。 步骤1:登录进入Windows XP。 步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。 在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么: 1) 本地安全策略:查看和修改本地安全策略,如用户权限和审核策略 2) Internet信息服务:管理 IIS,Internet 和 Intranet 站点的 WEB服务器 3) 服务:启动和停止服务 4)计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程的计算机 5)事件查看器:显示来自于 Windows 和其他程序的监视与排错消息 6)数据源ODBC:添加、删除、以及配置 ODBC 数据源和驱动程序 7)性能:显示系统性能图表以及配置数据日志和警报 8)组件服务:配置和管理 COM+ 应用程序 1. 计算机管理 使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows XP管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。 步骤3:在“管理工具”窗口中,双击“计算机管理”图标。 “计算机管理”使用的窗口与“Windows资源管理器”相似。在用于导航和工具选择的控制台目录树中有“系统工具”、“存储”及“服务和应用程序”等节点,窗口右侧“名称”窗格中显示了工具的名称、类型或可用的子工具等。它们是: 1) 系统工具,填入表1-3中。

电大操作系统实验报告

电大操作系统实验报告 电大操作系统实验报告 一、引言 操作系统是计算机系统中的核心软件,它负责管理计算机的硬件和软件资源,为用户提供良好的使用环境。为了更好地理解和掌握操作系统的工作原理,我参加了电大的操作系统实验课程。在这门课程中,我学习了操作系统的基本概念、功能以及常见的操作系统类型。同时,还进行了一系列实验,通过实践来加深对操作系统的理解。本文将对我在实验中所学到的内容进行总结和分析。 二、实验内容 1. 实验一:操作系统的启动过程 在这个实验中,我学习了操作系统的启动过程。操作系统的启动过程包括硬件自检、引导加载程序的执行以及操作系统的初始化。通过实验,我深入了解了计算机开机后,操作系统是如何加载和启动的。 2. 实验二:进程管理 进程是操作系统中最基本的概念之一,它代表了一个正在运行的程序。在这个实验中,我学习了进程的创建、调度和终止等操作。通过实验,我了解了操作系统是如何管理多个进程的运行,并掌握了一些常用的进程管理命令。 3. 实验三:内存管理 内存管理是操作系统的重要功能之一,它负责为进程分配和回收内存空间。在这个实验中,我学习了内存的分段和分页管理方式,并了解了虚拟内存的概念和作用。通过实验,我掌握了一些常用的内存管理命令,并学会了如何检测和解决内存泄漏等问题。

4. 实验四:文件系统 文件系统是操作系统中用于管理和组织文件的一种机制。在这个实验中,我学 习了文件的创建、读写和删除等操作,并了解了文件系统的组织结构和存储方式。通过实验,我掌握了一些常用的文件管理命令,并学会了如何进行文件权 限的管理和保护。 三、实验收获 通过参加这门操作系统实验课程,我收获了很多。 首先,我对操作系统的工作原理有了更深入的理解。通过实验,我亲自操作计 算机,观察和分析操作系统的运行过程。这使我能够更直观地感受到操作系统 是如何管理和调度资源的。 其次,我掌握了一些常用的操作系统命令。在实验中,我不仅学会了如何使用 这些命令,还了解了它们的原理和用途。这为我日后的工作和学习提供了很大 的便利。 最后,我培养了一些实践和解决问题的能力。在实验中,我遇到了各种各样的 问题,如进程死锁、内存泄漏等。通过分析和调试,我学会了如何解决这些问题,并提高了自己的技术能力。 四、实验反思 在参加实验的过程中,我也遇到了一些困难和挑战。 首先,实验设备的限制给我带来了一些不便。由于实验室的计算机资源有限, 我无法在实验中同时进行多个操作。这导致我在实验中的进度受到了一定的限制。 其次,实验中的一些概念和原理对我来说比较抽象和难以理解。在这种情况下,

操作系统课程实验报告

操作系统课程实验报告 操作系统课程实验报告 一、引言 操作系统是计算机系统中最基础的软件之一,扮演着管理计算机硬件和软件资源的重要角色。为了更好地理解操作系统的工作原理和实践操作系统的相关技术,我们在本学期的操作系统课程中进行了一系列的实验。 二、实验一:进程管理 在本实验中,我们学习了进程管理的基本概念和实现方法。通过编写代码,我们实现了一个简单的进程管理系统。在这个系统中,我们可以创建、销毁和调度进程,并且实现了进程间的通信和同步机制。通过这个实验,我们深入了解了进程的创建、调度和通信机制,以及进程的状态转换和资源管理。 三、实验二:内存管理 内存管理是操作系统中非常重要的一部分。在这个实验中,我们学习了内存管理的基本原理和实现方法。通过编写代码,我们实现了一个简单的内存管理系统。在这个系统中,我们可以分配和释放内存块,并且实现了虚拟内存和页面置换算法。通过这个实验,我们深入了解了内存的分配和释放机制,以及虚拟内存的概念和实现。 四、实验三:文件系统 文件系统是计算机系统中用于管理和组织文件的一种机制。在这个实验中,我们学习了文件系统的基本概念和实现方法。通过编写代码,我们实现了一个简单的文件系统。在这个系统中,我们可以创建、读取和写入文件,并且实现了文件的目录结构和权限控制。通过这个实验,我们深入了解了文件的组织和管

理机制,以及文件的访问和保护机制。 五、实验四:设备管理 设备管理是操作系统中负责管理计算机硬件设备的一部分。在这个实验中,我们学习了设备管理的基本原理和实现方法。通过编写代码,我们实现了一个简单的设备管理系统。在这个系统中,我们可以管理设备的分配和释放,并且实现了设备的互斥和同步机制。通过这个实验,我们深入了解了设备的管理和调度机制,以及设备的并发和互斥机制。 六、实验总结 通过这一系列的实验,我们对操作系统的工作原理和实践操作系统的相关技术有了更深入的了解。我们学习了进程管理、内存管理、文件系统和设备管理的基本概念和实现方法,并且通过编写代码实现了简单的操作系统功能。在实验过程中,我们遇到了许多问题,但通过不断的学习和实践,我们逐渐解决了这些问题,并且对操作系统的理解更加深入和全面。 在未来的学习和工作中,我们将继续深入研究操作系统的相关技术,不断提升自己的能力和水平。操作系统是计算机科学中非常重要的一门课程,它不仅是计算机系统的核心,也是我们理解计算机工作原理和开发高效软件的基石。通过实验的学习,我们对操作系统有了更深入的认识,也为我们今后的学习和研究打下了坚实的基础。 七、结语 操作系统课程的实验让我们更好地理解了操作系统的工作原理和实践操作系统的相关技术。通过实践,我们不仅加深了对操作系统的理解,还提升了自己的编程能力和问题解决能力。在未来的学习和工作中,我们将继续深入研究操作

(完整word版)操作系统实验报告.实验一 WINDOWS进程初识

操作系统教程 实验指导书

实验一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:运行结果 (如果运行不成功,则可能的原因是什么?) 因为此程序是个死循环,所以运行时间为无穷大。_______________________________________________________________________________ _______________________________________________________________________________ _______________________________________________________________________________ _______________________________________________________________________________ __________________________________________________________________________

操作系统实验报告2

操作系统实验报告2 篇一:操作系统实验二实验报告 操作系统实验报告 ——实验二:线程和管道通信实验 一、实验目的 通过 Linu 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进(线)程间的通信和协作的效果 ,练习利用无名管 道进行进(线)程间通信的编程和调试技术。 二、实验说明 1) 与线程创建、执行有关的系统调用说明 线程是在共享内存中并发执行的多道执行路径,它们共享一个进程的资源,如 进程程序段、文件描述符和信号等,但有各自的执行路径和堆栈。线程的创建无需 像进程那样重新申请系统资源,线程在上下文切换时也无需像进程那样更换内存映像。多线程的并发执行即避免了多进程并发的上下文切换的开销又可以提高并发处理的效率。 pthread 库中最基本的调用。 1.pthreadcreate 系统调用语法: #include Int pthreadcreate(pthreadt thread,pthreadattrt attr, void (startroutine)(void ) Void arg); pthreadcreate 函数创建一个新的线程。pthreadcreate 在 thread 中保存 新线程的标识符。Attr 决定了线程应用那种线程属性。使用默认可给定参数 NULL; (startroutine) 是一个指向新线程中要执行的函数的指针 arg 是新线程函数携带的参数。 Pthreadcreate 执行成功会返回0并在 thread 中保存线程标识符。执 行失败则返回一个非0的出错代码 2.pthreadeit 系统调用语法:

2023年最新的操作系统文件管理实验报告三篇

2023年最新的操作系统文件管理实验报告三篇 操作系统文件管理实验报告一篇 一、实训主要内容 Word排版,表格制作与编辑。Powerpoint的制作,初步认识计算机办公应用OFFICE。 二、实训过程 第一天:初步熟悉计算机的性能和认识Word;第二天:练习Word题; 第三天:认识Powerpoint并对昨天的Word练习予以测试;Excel实训作业 第四天:将Word表格与Powerpoint的制作熟悉巩固;第五天:老师再次对我们Word与Powerpoint测验以及教我们一些有用的技能与方法,初步认识计算机办公应用。。。OFFICE。 三、实训心得体会 很快的,一个假期又过来了,面对本学期最后一次的校园生活实训,想着刚刚过去的最后一个周,紧张沉默之后更多的是感慨,印在脑海里的每一个足迹都是那么的深,真的说不出是什么感觉,伴着时间,就像是在和自己的影子赛跑,不可能从真实的两面去看清它,只是经意不经意的感受着有种东西在过去,也许更适合的只有那句话:时不待我,怎可驻足一周,短短的一周,我学到了很多不知道的东西,实在是感受颇深。

当今企业竞争范围的伴随社会市场经济的发展以及信息化程度的不断提高而日益扩大,这样就要求企业在各个方面加强管理,要求企业有更高的信息化集成来实现对企业的整体资源进行集成管理。现代企业都意识到,企业之间的竞争是综合实力的竞争,要求企业有更强的资金实力,具备强有力的管理能力和更快的市场响应速度。因此,引入计算机系统的意义是非常重大的。 在社会主义市场经济高速发展的今天,如果计算机的各项管理运做仍然停滞在以纸、笔为主要工具的阶段,就会因为信息量的快速增长而无法迅速、准确的运用计算机完成各项工作,这样,必将成为企业各方面发展的一个瓶颈。 而在当代这个以信息时代为主题的社会里,计算机技术高速发展,将信息技术应用于对现代企业的管理日益普及。计算机技术不但可以提高信息的处理速度和提高信息处理的准确性,更重要的是,可以进一步的解放劳动力,将他们分配到更需要人力资源的岗位上去,从而加快社会工作的现代化、综合化的发展步伐。引入计算机信息系统,不但为企业管理部门节省了不必要的开支,更重要的是提高了它对我们个人的工作效率。 本周通过对计算机的初步学习,我更知道原来我们利用计算机可以提高工作效率等各方面。所以我真诚的感谢老师对我们的帮助,再次说一声:谢谢。我以后将更加努力。 四、实训效果 1.通过本次实训,你有哪些收获 我收获颇丰,学到了很多知识,特别是提高了综合分析应用的能力。

操作系统实验报告(全)

操作系统实验报告书 院系名称:电子工程学院电子指导教师: 班级: 学号: 学生姓名:

实验题目一:进程 一、实验目的 通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点, 掌握在POSIX 规范中fork和kill系统调用的功能和使用。 二、实验内容 (1)补充POSIX 下进程控制的残缺版实验程序 (2)回答下列问题: 1. 你最初认为运行结果会怎么样? 2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。 3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么? 4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么? 5. 使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退 出方式哪种更好一些? 三、实验步骤 1.根据题意进入DOC环境中编写程序。 2.编译,链接,运行程序,进行调试。 3.分析实验结果及回答问题。 四、调试情况,回答问题及体会 1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。 2、在设计过程中的感受。 调试情况: 回答上述实验内容中的问题 1.预期结果: 会持续输出0-9号进程,直到输入数字键+回车,则会杀死该进程,接下来的输出将不会有该进程号,当输入q+回车,则退出程序。 2.实际结果: 与预期差不多,因输入进程总数20大于设定的最大进程数,因此按进程数10来处理。随机输出0-9号进程,sleep(SLEEP_INTERV AL),循环输出,直到输入数字键,则会杀死该数字对应的进程,直到输入q退出循环,然后杀死本组所有进程。

操作系统课内实验报告

. . 西安交通大学实验报告 操作系统实验报告 2130505133 计算机36班

操作系统实验 实验一:用户接口实验 实验目的 1)理解面向操作命令的接口Shell。 2)学会简单的shell编码。 3)理解操作系统调用的运行机制。 4)掌握创建系统调用的方法。 操作系统给用户提供了命令接口和程序接口(系统调用)两种操作方式。用户接口实验也因此而分为两大部分。首先要熟悉Linux的基本操作命令,并在此基础上学会简单的shell 编程方法。然后通过想Linux内核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。在本次实验中,最具有吸引力的地方是:通过内核编译,将一组源代码变成操作系统的内核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。 实验内容 1)控制台命令接口实验 该实验是通过“几种操作系统的控制台命令”、“终端处理程序”、“命令解释程序”和“Linux操作系统的bash”来让实验者理解面向操作命令的接口shell和进行简单的shell编程。 ➢查看bash版本。 在shell 提示符下输入: $echo $BASH_VERSION 我们的版本是4.3.42(1)-release (2)建立bash 脚本,输出Hello word

在编辑器中输入以下内容 #!/bin/bash echo Hello World! 执行脚本使用指令: $./script ➢编写bash脚本,统计/my目录下c语言文件的个数 通过bash 脚本,可以有多种方式实现这个功能,而使用函数是其中个一个选择。在使用函数之前,必须先定义函数。进入自己的工作目录,编写名为count 的文件脚本程序: #! /bin/bash function count { echo –n " Number of matches for $1: " #接收程序的第一个参数 ls $1|wc –l #对子程序的第一个参数所在的目录进行操作 } 将count 文件复制到当前目录下,然后在当前目录下建立文件夹,在my 目录下建立几个c 文件,以便用来进行测试 2)系统调用实验 该实验是通过实验者对“Linux操作系统的系统调用机制”的进一步了解来理解操作系统调用的运行机制;同时通过“自己创建一个系统调用mycall()”和“编程调用自己创建的系统调用”进一步掌握创建和调用系统调用的方法。 ➢编程调用一个系统调用fork(),观察结果。 在应用程序中调用系统调用fork()非常简单,下面的程序可以很清楚的显示出有fork()系统调用生成了子进程,而产生的分叉作用: # include

操作系统实验报告范文模板

操作系统实验报告范文模板 这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。 操作系统上机 实验报告 班级:学号:姓名:实验地点:实验时间: 这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。 实验一进程的建立 【实验目的】 创建进程及子进程在父子进程间实现进程通信【实验软硬件环境】Linu某、Window98、Window2000【实验内容】 创建进程并显示标识等进程控制块的属性信息;显示父子进程的通信信息和相应的应答信息。(进程间通信机制任选) 【实验程序及分析】 编程思路:首先本程序在Linu某用C语言完成的,父子进程的创建用fork函数来实现,然后是父子进程间的通信,这里用pipe实现。可以定义chan1[2],chan1[2],chan某[0]表示读,chan某[1]表示写。他们配合使用。【实验截图】

【实验心得体会】 通过这次上机练习,我熟悉了用c++实现进程的创建,销毁,父子进程间的通讯等一系列课程中需要学习的内容。本来进程的概念在一开始我始终无法清晰地理解,但是通过自己用mfc的方法去实现它后,我开始慢慢地理解操作系统的进程的运作机制。 虽然,我只是实现了一个父子进程的创建和通讯,但是,管中窥豹,我想自己开始明白一个操作系统正是由很多这种进程实现功能的。其中,系统整体的进程调度,管理等等还有很多东西等着我们去进一步学习、理解。 实验二进程间的同步 【实验目的】 这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。 理解进程同步和互斥模型及其应用【实验软硬件环境】 Linu某、Window98、Window2000【实验内容】 利用通信API实现进程之间的同步:建立司机和售票员进程;并实现他们间的同步运行。 【实验程序及分析】 程序总体思路:由于本次试验时用PV操作实现的互斥与同步模型,所以先实现P、V操作的函数,然后在主程序中利用PV操作函数实现司机和售票员的同步。司机和售票员分别为父进程和子进程,假设司机停车开

相关文档
最新文档