西北工业大学操作系统实验报告实验四
- 格式:docx
- 大小:53.90 KB
- 文档页数: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() 方法。
其中有四个由实际的低级入口点传递来的参数。
西北⼯业⼤学操作系统实验_OS1(5)班级:10011007 学号:2010302541 姓名:陈⼀凡实验⼀Linux操作系统的安装及使⽤1. 实验⽬的学习Linux操作系统的安装,体会操作系统为了⽅便⽤户,不断改进的安装过程;熟悉Linux系统的登录和退出,并熟悉它常⽤命令的操作使⽤⽅法。
2. 实验内容1)Linux操作系统的安装(1) 收集硬件配置资料(硬盘空间⼤⼩、显卡类型、显存⼤⼩、⽹卡类型等基本信息);(2) 对于要安装Linux⽽⼜没有预留出⾃由空间,可利⽤Linux光盘⾃带的分区⼯具来拆分基本分区;也可以利⽤DOS下的调整分区程序PQMagic来拆分基本分区或逻辑分区,并将PQMagic安装在另⼀个分区中;(3) Linux对不同介质的安装⽅法(直接从光盘引导完成安装,要求CMOS和光盘都能⽀持光盘引导;从硬盘完成安装,可事先将Linux软件包拷⼊硬盘的⼀个分区,将Linux安装到硬盘的另⼀个分区;⽹络安装,通过⽹络⽂件系统NFS或FTP 并安装到硬盘。
);(4) 使⽤FDISK添加Linux主分区和交换分区(swap);(5) 格式化分区;(6) 选择安装内容;(7) 设置root⽤户的⼝令;(8) 设置⽹卡的中断向量号、I/O地址、DNS和⽹络的⼦⽹掩码等;(9) 安装LILO,实现操作系统的双引导。
2)Linux操作系统的使⽤(1) 登录、退出和关闭系统;(2) man命令的使⽤;(3) –help命令的使⽤;(4) dir(ls)命令的使⽤;(5) less(more)分页浏览⽂件命令的使⽤;(6) touch命令的使⽤;(7) whatis命令的使⽤;(8) apropos命令的使⽤;(9) locate命令的使⽤;(10) whereis命令的使⽤;(11) find命令的使⽤;(12) sort命令的使⽤;(13) tar命令的使⽤;(14) 解压缩归档⽂件命令的使⽤;(15) mc程序的使⽤;(16)cd改变⽬录;(17)pwd查看当前⽬录;(18)mkdir创建新⽬录;(19)cp⽂件拷贝;(20)cat在屏幕上显⽰⽂件内容3)C语⾔程序的编译Linux环境下C语⾔使⽤gcc编译器对程序进⾏编译。
#include<stdio.h>int main(){ BOOL rc;char lpName[]="\\\\.\\pipe\\myPipe";char InBuffer[50] = "";char OutBuffer[50] ="";DWORD BytesRead;int nRetCode = 0;int err = 0;while(1){ strcmp(InBuffer,"");strcmp(OutBuffer,"");printf("Input Data Please!\n");scanf("%s",InBuffer);rc = strcmp(InBuffer,"end");if ( rc == 0){rc = CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,sizeof(OutBuffer),&BytesRead,NMPW AIT_USE_DEFAULT_WAIT);break;}rc = WaitNamedPipe(lpName,NMPW AIT_USE_DEFAULT_WAIT);if (rc == 0){err = GetLastError();printf("Wait Pipe Fail ! err = %d\n",err);exit(1);}else printf("Wait Pipe Success!\n");rc = CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,sizeof(OutBuffer),&BytesRead,NMPW AIT_USE_DEFAULT_WAIT);if (rc == 0){err = GetLastError();printf("Pipe Call Fail! err = %d\n",err);exit(1);}else printf("Pipe Call Success!\nData from Server is %s\n",OutBuffer);rc = strcmp(OutBuffer,"end");if (rc == 0) break;}printf("Now Client to be End!\n");return nRetCode;}#include<stdio.h>int main(){ int nRetCode = 0;int err;BOOL rc;HANDLE hPipeHandle1;char lpName[]="\\\\.\\pipe\\myPipe";char InBuffer[50] = "";char OutBuffer[50] ="";DWORD BytesRead,BytesWrite;hPipeHandle1 = CreateNamedPipe((LPCTSTR)lpName,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_W AIT,1,20,30,NMPW AIT_USE_DEFAULT_WAIT,(LPSECURITY_ATTRIBUTES)NULL);if ((hPipeHandle1 == INV ALID_HANDLE_V ALUE) || (hPipeHandle1 == NULL)){ err = GetLastError();printf("Server Pipe Create Fail! err = %d\n",err);exit(1); }else printf("Server Pipe Create Success!\n");while ( 1 ){ rc = ConnectNamedPipe(hPipeHandle1,(LPOVERLAPPED)NULL);if(rc == 0){ err = GetLastError();printf("Server pipe Connect Fail err = %d\n",err);exit(2);}else printf("Server pipe Connect Success \n");strcmp(InBuffer,"");strcmp(OutBuffer,"");rc = ReadFile(hPipeHandle1,InBuffer,sizeof(InBuffer),&BytesRead,(LPOVERLAPPED)NULL);if ( rc == 0 && BytesRead == 0){ err = GetLastError();printf("Server Read Pipe Fail! err = %d\n",err);exit(3);}else{ printf("Server pipe Connect Success \nDA TA from Client is = %s\n",InBuffer);}rc = strcmp(InBuffer,"end");if ( rc == 0 ) break;printf("Please Input Data to Send\n");scanf("%s",OutBuffer);rc = WriteFile(hPipeHandle1,OutBuffer,sizeof(OutBuffer),&BytesWrite, (LPOVERLAPPED)NULL);if (rc == 0) printf("Server Write Pipe Fail!\n");else printf("Server Write Pipe Success!\n");DisconnectNamedPipe(hPipeHandle1);rc = strcmp(OutBuffer,"end");if ( rc == 0 ) break;}printf ("Now Server be END!\n");CloseHandle(hPipeHandle1);return nRetCode;}。
实验四银行家算法(一)教学要求掌握处理死锁的方法,掌握银行家算法的实现(二)知识点提示死锁的概念,死锁产生的原因和条件,处理死锁的方法,银行家算法,安全状态和不安全状态,安全性算法(三)教学内容银行家算法的模拟实现实验步骤:(1)定义数据结构:allocation[][]; //分配矩阵available[]; //可用资源向量need[][]; //需求矩阵request[]; //资源请求向量(2)定义函数:void bank_arithmetic(int i, int request[]) //银行家算法void isSafe( ); //安全性算法主函数中对可用资源向量,分配矩阵和需求矩阵进行初始化(输入数据参照课本P113的例题),输入请求资源的进程编号以及请求的资源向量,通过调用银行家算法判断是否可以把资源分配给请求资源的进程。
(3)银行家算法的执行步骤:设Request i是进程P i的请求向量。
若Request i[j]=k,表示进程P i需要k个j类资源。
当P i 发出资源请求后,系统按下述步骤进行检查:①若Request i≤Need i,则转②;否则,认为出错。
因为它所需要的资源数已超过它所宣布的最大值。
②若Request i≤Available,则转③;否则,表示系统中尚无足够的资源,P i必须等待。
③系统试探把要求的资源分配给进程P i,并修改下面数据结构中的数值。
Available=Available – Request iAllocation i = Allocation i + Request iNeed i = Need i– Request i④系统执行安全性算法,检测此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分给进程P i;否则,将试探分配作废,恢复资源状态,让P i等待。
(4)安全性算法的执行步骤:①设置两个向量work和finish工作向量work,它表示系统可提供给进程继续运行的各类资源数,含有m个元素,其初始值为:work[j]=available[j]。
操作系统实验四实验过程及结果1、实验内容1、通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:A:50%的指令是顺序执行的B:25%的指令是均匀分布在前地址部分C:25%的指令是均匀分布在后地址部分2、将指令序列变换为页地址流设:页面大小为1K;用户内存容量4页到32页;用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0 条-第9 条指令为第0页(对应虚存地址为[0,9])第10条-第19条指令为第1页(对应虚存地址为[10,19])………………………………第310条-第319条指令为第31页(对应虚存地址为[310,319])3、计算并输出下述算法在不同内存容量下的命中率。
1)最佳淘汰算法(OPT)2)先进先出的算法(FIFO)3)最近最久未使用算法(LRU)命中率=(1-页面失效次数)/页地址流长度实验流程图核心代码/*先进先出算法total_pf:用户进程的内存页面数*/int FIFO(int total_pf){int i,j;pfc_type *p; /*中间变量*/initialize(total_pf); /*初始化相关页面控制用数据结构*/busypf_head=busypf_tail=NULL; /*忙页面队列头,队列尾链接*/for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INV ALID) /*页面失效*/{diseffect+=1; /*失效次数*/if(freepf_head==NULL)/*无空闲页面*/{p=busypf_head->next;pl[busypf_head->pn].pfn=INV ALID;freepf_head=busypf_head;/*释放忙页面队列的第一个页面*/freepf_head->next=NULL;/*表明还是缺页*/busypf_head=p;}p=freepf_head->next;/*按照FIFO方式调新页面入内存页面*/ freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head;else{busypf_tail->next=freepf_head; /*free页面减少一个*/busypf_tail=freepf_head;}freepf_head=p;}}printf("FIFO:%6.4f\n",1-(float)diseffect/ 320);return 0;OPT(最佳置换算法)设计原理:需要进行页面置换,把内存中以后一段时间都不使用或是使用时间离现在最远的页面换出。
华北电力大学实验报告||实验名称操作系统实验课程名称操作系统综合实验||专业班级:学生姓名:学号:成绩:指导教师:实验日期:华北电力大学实验报告工具包集合。
EOS SDK文件夹主要包括INC头文件、LIB文件夹导入库文件和BIN文件夹动态链接库,可执行程序,二进制文件。
EOS SDK包含的头文件有:eos.h负责导出API函数声明;eosdef.h负责导出函数类型的定义;error.h 负责导出错误码。
四.实验过程1.新建Windows控制台应用程序生成项目:执行项目:调试项目:2.使用断点终端执行:查看EOS SDK(Software Development Kit)文件夹:修改EOS应用程序项目名称:五.实验心得这次是验证性试验,具体步骤和操作方法都是与实验教程参考书上一致,实验很顺利,实验过程没有遇到困难。
通过这次实验,我掌握了OS Lab启动和退出操作;练习使用OS Lab编写一个Windows控制台应用程序,熟悉OS Lab 的基本使用方法新建项目、生成项目、调试项目等。
第页共页华北电力大学实验报告第页共页华北电力大学实验报告第页共页2. 当loop线程在控制台1中执行,并且在控制台2中执行suspend命令时,为什么控制台1中的loop线程处于就绪状态而不是运行状态?3. 在本实验3.2节中只调试了图5-3中显示的最主要的四种转换过程,对于线程由新建进入就绪状态,或者由任意状态进入结束状态的转换过程还没有调试,请读者找到这两个转换过程执行的源代码,自己练习调试。
4. 总结一下在图5-3中显示的转换过程,哪些需要使用线程控制块中的上下文(将线程控制块中的上下文恢复到处理器中,或者将处理器的状态复制到线程控制块的上下文中),哪些不需要使用,并说明原因。
5. 在本实验3.2节中总结的所有转换过程都是分步骤进行的,为了确保完整性,显然这些转换过程是不应该被打断的,也就是说这些转换过程都是原语操作(参见本书第2.6节)。
计算机操作系统实验报告一、实验目的本次计算机操作系统实验旨在深入了解计算机操作系统的工作原理和核心功能,通过实际操作和观察,增强对操作系统的认知和理解,提高解决实际问题的能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019硬件配置:Intel Core i5 处理器,8GB 内存,512GB 固态硬盘三、实验内容与步骤(一)进程管理实验1、创建进程使用 C++语言编写程序,通过调用系统函数创建新的进程。
在程序中,设置不同的参数和条件,观察进程的创建过程和资源分配情况。
2、进程调度编写模拟进程调度的程序,实现不同的调度算法,如先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
通过改变进程的到达时间、执行时间和优先级等参数,观察不同调度算法对系统性能的影响。
3、进程同步与互斥使用信号量和互斥锁等机制实现进程之间的同步与互斥。
编写多进程程序,模拟生产者消费者问题、读者写者问题等经典的同步互斥场景,观察程序的运行结果,分析同步互斥机制的有效性和性能。
(二)内存管理实验1、内存分配实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
通过模拟内存请求和释放的过程,观察不同算法下内存的使用情况和碎片产生的情况。
2、虚拟内存配置系统的虚拟内存设置,观察虚拟内存的工作原理。
编写程序访问超过物理内存大小的数据,观察系统如何利用虚拟内存进行数据交换和页面置换。
3、内存保护设置内存访问权限,编写程序尝试越界访问内存,观察系统的保护机制如何防止非法访问和错误操作。
(三)文件系统实验1、文件操作使用系统提供的文件操作接口,进行文件的创建、读写、删除等操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件权限管理设置文件的访问权限,包括读取、写入、执行等权限。
通过不同用户身份访问文件,观察权限管理的效果和安全性。
3、磁盘调度实现不同的磁盘调度算法,如先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描算法(SCAN)等。
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
计算机操作系统实验四实验四:文件系统<一>[背景知识]1. 选择文件系统文件系统决定了操作系统能够对磁盘进行的处理。
Windows xp支持的文件系统主要有:1) 文件分配表(File Allocation Table,FAT) 文件系统(FAT16)2) 保护模式FAT文件系统(FAT32)3) Windows NT文件系统(NTFS)FAT文件系统是早期文件系统之一,也是MS-DOS使用的原始文件系统。
它将文件信息储存在位于卷标开头处的文件分配表中,并保存两份文件分配表,以防其中的一个遭到破坏,见图7-1所示。
FAT文件系统最大的优点是MS-DOS、Windows 9x甚至OS/2都能访问FAT卷标;而其最大的弱点是随着FAT卷标尺寸的增长,最小的簇尺寸也随之增长。
对于大于512MB的硬盘而言,最小的簇尺寸为16KB;对于大于2GB 的硬盘,最小的簇尺寸为64KB。
这就导致磁盘空间的极大浪费,因为一个文件必须占用整数个簇。
因此,1KB的文件在2GB的硬盘上将占用64KB的磁盘空间。
FAT文件系统不支持尺寸大于4GB的卷标。
图7-1 FAT 文件系统的结构FAT32文件系统通过提供长文件名的支持来扩展FAT 文件系统,并与FAT16兼容。
FAT (16和32) 文件系统是支持可移动媒体 (例如软盘) 上的惟一的文件系统。
Windows NT 文件系统 (NTFS) 包括了FAT 文件系统的所有功能,同时又提供了对高级文件系统特征 (例如安全模式、压缩和加密) 的支持。
它是为在大磁盘上有效地完成文件操作而设计的。
与FAT 和保护模式FAT 文件系统不同,它的最小簇尺寸不超过4KB 。
但是,NTFS 卷标只能为Windows NT 、2000和XP 操作系统所访问。
Windows xp 提供的新特征 (NTFS 5.0) 使文件系统更安全、更可靠,比以往的Windows 版本更好地支持分布式计算。
Windows操作系统C/C++ 程序实验姓名:___________________学号:___________________班级:___________________院系:_________________________________年_____月_____日实验四Windows 2000/xp线程间通信一、背景知识二、实验目的三、工具/准备工作四、实验内容1. 文件对象步骤1:登录进入Windows 2000/xp Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-1.cpp。
步骤4:单击“Build”菜单中的“Compile 4-1.cpp”命令,并单击“是”按钮确认。
系统对4-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 4-1.exe”命令,建立4-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?____________________________________________________________________ ________________________________________________________________________步骤6:在工具栏单击“Execute Program”按钮,执行4-1.exe程序。
运行结果(如果运行不成功,则可能的原因是什么?) :____________________________________________________________________ ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________阅读和分析程序4-1,请回答问题:1) 清单4-1中启动了多少个单独的读写线程?____________________________________________________________________2) 使用了哪个系统API函数来创建线程例程?____________________________________________________________________3) 文件的读和写操作分别使用了哪个API函数?____________________________________________________________________ ________________________________________________________________________每次运行进程时,都可看到清单4-3中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。
实验四 进程与线程
一、 实验目的
(1)理解进程的独立空间;
(2)理解线程的相关概念。
二、 实验内容与要求
1、查阅资料,掌握进程创建和构造的相关知识和线程创建和构造的相关知识,了解C语言程序编
写的相关知识;
2、理解进程的独立空间的实验内容及步骤
(1)编写一个程序,在其 main()函数中定义一个变量 shared,对其进行循环加/减操作,并
输出每次操作后的结果;
(2)使用系统调用 fork()创建子进程,观察该变量的变化;
(3)修改程序把 shared变量定义到 main()函数之外,重复第(2)步操作,观察该变量的变
化。
3、理解线程的实验步骤
(1)编写一个程序,在其 main()函数中创建一个(或多个)线程,观察该线程是如何与主线
程并发运行的。输出每次操作后的结果;
(2)在 main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在 main()
中和新线程shared进行循环加/减操作,观察该变量的变化;
(3)修改程序把shared变量定义到 main()函数之内,重复第(2)步操作,观察该变量的变
化。
4、对整个实验过程进行分析总结,给出详细步骤;
(1) 观察上述进程执行结果,并分析原因;
(2) 提交源程序清单,并附加流程图与注释。
三、 实验过程
1、进程的与线程的创建和构造
(1).进程的创建和构造
进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一
个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,
进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。
新的进程通过克隆旧的程序(当前进程)而建立。fork()?和?clone()(对于线程)系统调用可
用来建立新的进程。
(2)线程的创建和构造
线程也称做轻量级进程。就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有
它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与独立的进程相比,进程中的线程之间
的独立程度要小。它们共享内存、文件句柄和其他每个进程应有的状态。
线程的出现也并不是为了取代进程,而是对进程的功能作了扩展。进程可以支持多个线程,它们
看似同时执行,但相互之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着
它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更
容易,但你必须小心,确保它们不会妨碍同一进程里的其他线程。
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同
的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理
器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之
间切换时,负担要比进程小得多,正因如此,线程也被称为轻型进程(light-weight process)。一
个进程中可以包含多个线程。
2、理解进程的独立空间
流程图如下所示:
Y
N
Y
N
Y
(1)编写一个程序,在其 main()函数中定义一个变量 shared,对其进行循环加/减操作,
并输出每次操作后的结果
源程序如下所示:
#include <>
int main()
{
int shared=1;
shared++;
printf("%d\n", shared);
shared--;
printf("%d\n", shared);
shared++;
printf("%d\n", shared);
shared--;
printf("%d\n", shared);
return 0;
}
shared = 1
pid = fork()
ERROR
输出shared操作
输出shared操作
pid < 0
pid > 0
pid ==0
运行结果如图所示:
(2)使用系统调用 fork()创建子进程,观察该变量的变化
添加进程创建语句后,程序运行结果如下,子进程和父进程都执行了操作,且彼此之间对于同一
个变量shared的自加操作互不影响。
代码如下图所示:
运行结果如下图所示:
(3)修改程序把 shared变量定义到 main()函数之外,重复第(2)步操作,观察该变量的变
化。
当把shared放到主函数之外时,运行结果和内部时相比,并未发生变化。
3、理解线程
流程图如下所示:
开始
结束
开始 设置全局变量
输出Shared的值
Shared++
Sleep 1 S
创建主进程
创建线程
开始
创建主进程
开始 设置全局变量
创建线程
(1)编写一个程序,在其 main()函数中创建一个(或多个)线程,观察该线程是如何与主
线程并发运行的。输出每次操作后的结果
源代码部分如下所示:
运行结果如下图所示:
原文链接:
(2)Linux开发模式与FreeBSD开发模式的比较。
(2)在 main()函数外定义一个变量shared(全局变量),在main()中创建一个线程,在 main()
中和新线程shared进行循环加/减操作,观察该变量的变化
源代码如下所示:
运行结果如下图所示:
(3)修改程序把shared变量定义到 main()函数之内,重复第(2)步操作,观察该变量的变
化
部分代码截图如下:
在这种情况下,直接编译,会发生错误,截图如下:
四、 实验分析与总结
Sleep 1 S
Shared++
输出Shared的值
结束
1. 对于fork()语句的使用还是不够熟练和清楚,在使用的过程中过于心急,对 程序本真的
内在含义理解不清楚,还要在课后认真的学习和弥补不足。
2. 实验过程中,交流很重要,不过还是要加强自己的学习能力,提高对程序的 理解能力和
使用技巧。
3. 开始时不知道该如何构造线程,在查看了资料之后,开始稍微有些明白了,在后面慢慢的实践
过程中,逐步对线程的创建和使用等有了更加深入的了解。
4. 在理解线程的相关概念的实验中,应注意shared 的全局性和局部性,而且在作为局 部变量
时,应注意print_thread_id()函数和pthread_create()函数的使用,因为后者的第四个参数是
指针型变量,故在传递shared的值时应注意指针的使用。