查看程序的进程和线程实验报告.docx
- 文档编号:26600386
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:12
- 大小:19.49KB
查看程序的进程和线程实验报告.docx
《查看程序的进程和线程实验报告.docx》由会员分享,可在线阅读,更多相关《查看程序的进程和线程实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
查看程序的进程和线程实验报告
查看程序的进程和线程实验报告
篇一:
程序实验2:
11-多线程编程---实验报告
程序实验二:
11-多线程编程实验
专业班级实验日期5.21姓名学号实验一(p284:
11-thread.c)
1、软件功能描述
创建3个线程,让3个线程重用同一个执行函数,每个线程都有5次循环,可以看成5个小任务,每次循环之间会有随即等待时间(1-10s)意义在于模拟每个任务到达的时间是随机的没有任何的特定规律。
2、程序流程设计
3.部分程序代码注释(关键函数或代码)
#include
#include
#include
#defineT_NUMBER3
#defineP_NUMBER5
#defineTIME10.0
void*thrd_func(void*arg)
{
(本文来自:
wwW.xIAocAofaNwE小草范文网:
查看程序的进程和线程实验报告) intthrd_num=(int)arg;
intdelay_time=0;
intcount=0;
printf("Thread%disstaraing\n",thrd_num);
for(count=0;count {
delay_time=(int)(rand()*TIME/(RAND_MAX))+1;
sleep(delay_time);
printf("\tTH%d:
job%ddelay=%d\n",thrd_num,count,delay_time);
}
printf("%dfinished\n",thrd_num);
pthread_exit(NULL);
}
intmain()
{
pthread_tthread[T_NUMBER];
intno=0,res;
void*thrd_ret;
srand(time(NULL));
for(no=0;no {
res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);
if(res!
=0)
{
printf("Creayth%dfaild\n",no);
exit(res);
}
}
printf("success\nwaiting\n");
for(no=0;no {
res=pthread_join(thread[no],&thrd_ret);
if(!
res)
{
printf("t%djoined\n",no);
}
else
{
printf("T%djoinedfaild\n",no);
}
}
return0;
}
4.编译、运行方法及结果(抓屏)
5.结果分析
由运行结果可以看出,创建线程、释放资源按照顺序,而每个线程的运行和结束是独立与并行的。
实验二(p287:
11-thread_mutex.c)
1、软件功能描述
在试验1的基础上通过互斥锁,使原本独立,无序的多个线程能够按顺序进行
2、程序流程设计
3.部分程序代码注释(关键函数或代码)
#include
#include
#include
#defineTHREAD_NUMBER3/*线程数*/
#defineREPEAT_NUMBER3/*每个线程的小任务数*/
#defineDELAY_TIME_LEVELS10.0/*小任务间的最大时间间隔*/
pthread_mutex_tmutex;
void*thrd_func(void*arg)//线程函数例程
{
intthrd_num=(int)arg;
intdelay_time=0,count=0;
intres;
//互斥锁上锁
res=pthread_mutex_lock(&mutex);
if(res)
{
篇二:
操作系统实验报告_进程和线程
计算机科学与软件学院
操作系统上机实验报告
学生姓名:
学号:
班级:
班实验日期:
XX.4.17
实验名称:
进程和线程
实验目的:
理解unix/Linux下进程和线程的创建、并发执行过程。
实验内容:
1.进程的创建
2.多线程应用
实验步骤及分析:
(此部分为关键内容:
要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案)
一、进程的创建
下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。
1、实验指导
fork()
创建一个新进程。
系统调用格式:
pid=fork()
参数定义:
intfork()
fork()返回值意义如下:
0:
在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。
>0:
在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。
-1:
创建失败。
如果fork()调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork()被调用了一次,但返回了两次。
此时OS在内存中建立一个新进程,所建的新进程是调用fork()父进程(parentprocess)的副本,称为子进程(childprocess)。
子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。
父进程与子进程并发执行。
2、参考程序代码
/*process.c*/
#include
#include
main(intargc,char*argv[])
{
intpid;
/*forkanotherprocess*/
pid=fork();
if(pid fprintf(stderr,"ForkFailed");
exit(-1);
}
elseif(pid==0){/*childprocess*/
execlp("/bin/ls","ls",NULL);
}
else{/*parentprocess*/
/*parentwillwaitforthechildtocomplete*/
wait(NULL);
printf("ChildComplete");
exit(0);
}
}
3、编译和运行
$gccprocess.c–oprocesss
4、运行
$./process程序运行截图
5、思考
(1)系统是怎样创建进程的?
(2)扩展程序,在父进程中输出1到5,在子进程中输出6-10,要求父子进程并发
输出;记录实验结果,并给出简单分析。
6.实验中遇到的问题和解决方法
二、多线程应用
编写unix/Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
下面是一个最简单的多线程程序example1.c。
1.实验指导
下面的示例中,要使用到两个函数,pthread_create和pthread_join,并声明了一个pthread_t型的变量。
函数pthread_create用来创建一个线程,它的原型为:
externintpthread_create__P((pthread_t*__thread,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。
这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。
第二个参数我们也设为空指针,这样将生成默认属性的线程。
当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。
前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。
创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
函数pthread_join用来等待一个线程的结束。
函数原型为:
externintpthread_join__P((pthread_t__th,void**__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等
待的线程结束为止,当函数返回时,被等待线程的资源被收回。
一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。
它的函数原型为:
externvoidpthread_exit__P((void*__retval))__attribute__((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。
2、参考程序代码
/*thread.c*/
#include
#include
voidthread(void)
{
inti;
for(i=0;i printf("Thisisapthread.\n");
}
intmain(intargc,char*argv[])
{
pthread_tid;
inti,ret;
ret=pthread_create(&id,NULL,(void*)thread,NULL);
if(ret!
=0){
printf("Createpthreaderror!
\n");
exit
(1);
}
for(i=0;i printf("Thisisthemainprocess.\n");
pthread_join(id,NULL);
return(0);
}
3、编译和运行
编译此程序:
gccexample1.c-lpthread-oexample1
-lpthread:
使用线程库
运行example1,得到如下结果:
Thisisthemainprocess.
Thisisapthread.
Thisisthemainprocess.
Thisisthemainprocess.
Thisisapthread.
Thisisapthread.
再次运行,可能得到如下结果:
Thisisapthread.
Thisisthemainprocess.
Thisisapthread.
Thisisthemainprocess.
Thisisapthread.
Thisisthemainprocess.
程序运行截图
4、思考
(1)程序运行后,进程thread中有几个线程存在?
(2)为什么前后两次运行结果不一样?
答
(1)
(2)
5.实验中遇到的问题和解决方法
运行结果并没有出现预期效果
篇三:
操作系统实验报告
操作系统教程
实验报告
班级:
软104
学号:
109074267
姓名:
王二康
实验一WINDOWS进程初识
1、实验目的
(1)学会使用VC编写基本的Win32ConsolApplication(控制
(2)台应用程序)。
(3)掌握WINDOWSAPI的使用方法。
(4)编写测试程序,理解用户态运行和核心态运行。
2、实验内容和步骤
(1)编写基本的Win32ConsolApplication
步骤1:
登录进入Windows,启动VC++6.0。
步骤2:
在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32ConsolApplication”,然后在“Projectname”处输入工程名,在“Location”处输入工程目录。
创建一个新的控制台应用程序工程。
步骤3:
在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++SourceFile”,然后在“File”处输入C/C++源程序的文件名。
步骤4:
将清单1-1所示的程序清单复制到新创建的C/C++源程序中。
编译成可执行文件。
步骤5:
在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:
E:
\课程\os课\os实验\程序\os11\debug>hello.exe
运行结果(如果运行不成功,则可能的原因是什么?
):
(2)计算进程在核心态运行和用户态运行的时间
步骤1:
按照
(1)中的步骤创建一个新的“Win32ConsolApplication”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2:
在创建一个新的“Win32ConsolApplication”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:
在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
E:
\课程\os课\os实验\程序\os12\debug>timeTEST.exe
步骤4:
运行结果(如果运行不成功,则可能的原因是什么?
):
processID:
3716,EXEfile:
3.exe,%dinKernelmode:
60
步骤5:
分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
processID:
1412,EXEfile:
3.exe,%dinKernelmode:
62
屏蔽j循环:
processID:
1816,EXEfile:
3.exe,%dinKernelmode:
34
调整循环变量i的循环次数:
processID:
2616,EXEfile:
3.exe,%dinKernelmode:
64
调整循环变量j的循环次数:
processID:
1868,EXEfile:
3.exe,%dinKernelmode:
50
3、实验结论
对Win32ConsolApplication有进一步的认识,WIN32API也就是核心态就是一个是直接的代码运行,即win32consolApplication下代码运行;而用户态是在DOS下运行的,对编译好的程序进行的运行,核心态速度较快,没有太多的约束,而用户态的运行需要时间较长,由于有相应的约束。
实验二进程管理
背景知识
Windows所创建的每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。
每一进程都以调用ExitProcess()或TerminateProcess()API函数终止。
通常应用程序的框架负责调用ExitProcess()函数。
对于C++运行库来说,这一调用发生在应用程序的main()函数返回之后。
1.创建进程
CreateProcess()调用的核心参数是可执行文件运行时的文件名及其命令行。
表3-4详细地列出了每个参数的类型和名称。
表3-4CreateProcess()函数的参数
可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。
然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。
经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。
当准备好时,应该使用ResumeThread()API来启动进程。
另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。
这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。
接着是CreateProcess()函数调用所需要的三个通常使用缺省值的参数。
第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查看 程序 进程 线程 实验 报告