《操作系统》课程设计指导书
李海霞 编
信息工程学院基础教学部
二0一五年七月
目 录
实验一 Windows中线程与线程同步 .................................................... 3 实验二 进程调度 .................................................................................... 6 实验三 银行家算法 ................................................................................ 8 实验四
请求页式存储管理中常用页面置换算法模拟 ...................... 14
实验一 Windows中线程与线程同步
一、实验目的
1、掌握Windows中线程的操作;
2、熟悉线程不同步时的现象及环境因素; 3、掌握一种同步对象的使用。 二、实验环境
PC机,Window操作系统,Vc++6.0。 三、实验理论基础及教材对应关系
1、线程和线程不同步的认识; 2、线程间的同步和通信。 四、实验内容与步骤
1、定义全局变量 int i, 初始值置为 0。
2、创建两个线程,一个对 i 执行加 1 操作,另一个对 i 执行减 1 操作。两个线程执行相同的次数。 #include
#define MaxCount 9000000 // 循环次数要很大,可多次尝试一些值 int i;
CRITICAL_SECTION cs;
DWORD __stdcall fun1( LPVOID p1) { {
} return 0;
i++;
for( int j =0 ;j < MaxCount;j++)
第 3 页 共 16 页
}
DWORD __stdcall fun2( LPVOID p1) { { }
显然,正常情况下,i 的仍然保持为 0。但是观察两个线程执行后的情况,可以发觉最后 i 的值不一定是 0, 有时是很大的正数,有时是很大的负数,这就是多个线程在操作同一个变量 i时,未同步时带来的严重问题。
3、在多个线程操作共享的变量时,才需要考虑同步问题。
给上述这两个线程加上同步代码(步骤2的函数稍微改动即可),再来观察对 i 值的影响:
#include
#define MaxCount 9000000 // 循环次数要很大,可多次尝试一些值 int i;
CRITICAL_SECTION cs;
DWORD __stdcall fun1( LPVOID p1) {
for( int j =0 ;j < MaxCount;j++){ }
::EnterCriticalSection(&cs); i++;
::LeaveCriticalSection(&cs); } return 0;
i--;
for( int j =0 ;j < MaxCount;j++)
return 0; }
第 4 页 共 16 页
DWORD __stdcall fun2( LPVOID p1) {
for( int j =0 ;j < MaxCount;j++){ }
::EnterCriticalSection(&cs); i--;
::LeaveCriticalSection(&cs);
return 0; }
加入同步代码的两个线程,无论如何执行,i 的值总是 0 ,结果是正确的。 4、主函数的写法 int main() { }
五、实验材料的提交与成绩评定
实验源程序一份,并附上心得体会和运行结果的word文档(电子版),提交至天空教室。
DWORD id1,id2; HANDLE hThread[2];
::InitializeCriticalSection(&cs);
hThread[0] = ::CreateThread(0,0,fun1,0,0,&id1); hThread[1] = ::CreateThread(0,0,fun2,0,0,&id2); ::WaitForMultipleObjects(2,hThread,1,INFINITE); printf(\::DeleteCriticalSection(&cs); getchar(); return 0;
第 5 页 共 16 页
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库13级操作系统课程设计指导书在线全文阅读。
相关推荐: