西 安 邮 电 大 学 (计算机学院)
操作系统课内实验报告
实验名称:线程实验
专业名称:计算机科学与技术
班 级:计科1503
学生姓名:魏新超
学号(8位):04151091
指导教师:陈莉君
实验日期:2017年4月18日
一. 实验目的及实验环境
通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握POSIX 规范中pthread_create() 函数的功能和使用方法。
实验环境:deepin-15.3
二. 实验内容
- 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?
不想等,最后一列两边数字是相等的,前三列的调度是不同的 - 最后的结果如你所料吗?有什么特点?对原因进行分析。
不是的,结果是最后一列两边的数字不是相等的,前面的小于后面的,因为main_counter属于临界资源,可能会出现当一个线程正在执行 main_counter++时,另一个线程也要执行main_counter++的情况,这样就会使 main_counter的值不准确。又线程运行顺序的不确定性(交替性),可能在一个线程执行main_counter++后,还未执行counter[thread_num]++时,CPU便被主线程抢去,执行for(i = 0;i<MAX_THREAD; i++)循环,使sum += counter[i];此时sum的值便比 main_counter的值小了。再输出个各线程巡行的次数,及main_counter和sum的值,结果与预期的理论值不符。 - thread 的CPU 占用率是多少?为什么会这样?
我测试的结果是157.9%,因为三个线程一直在死循环里无法退出,所以导致cpu占用率明显增大 - thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?
按q退出,这样不好,子进程强制退出。
三.方案设计
按照注释里的要求把代码补充完整,正确编译程序后,先预计一下这个程序的运行结果。具体的结果会是什么样?运行程序。开另一个终端窗口,运行“ps aux”命令,看看thread 的运行情况,注意查看thread 的CPU 占用率,并记录下这个结果。
四.测试数据及运行结果
![V8`RD@R]N)3YS6]KWP0D.png
五.总结
在本实验中了解到进程线程的创建等相关系统调用。pthread_create() 函数的功能和使用方法。对缓冲区有一定的了解。
六.附录:源代码(电子版, 纸质版不打印)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
//unsigned long long main_counter,counter[MAX_THREAD];
//pthread_mutex_mutex=PTHREAD_MUTEX_INITIALIZER;
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/
int arr[MAX_THREAD]={0,1,2};
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
*
* 线程id存入pthread_id[i],线程执行函数是thread_worker
*
* 并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,&arr[i]);
}
//加锁
// pthread_mutex_lock(&mutex);
do {/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum = 0;
/* 求所有线程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n",counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
}while ((ch = getchar()) != 'q');
//解锁
//pthread_mutex_unlock(&mutex);
//pthread_mutex_destroy(&mutex);
//pthread_mutex_destory(&mutext);
return 0;
}
void* thread_worker(void* p) {
int thread_num;
/* 在这里填写代码,把main中的i的值传递给thread_num */
thread_num=*((int *)p);
for(;;)
{ /* 无限循环 */
//pthread_mutex_lock(&mutext);
counter[thread_num]++; /* 本线程的counter加一 */
main_counter++; /* 主counter 加一 */
// sleep(1);
// pthread_mutex_unlock(&mutext);
}
}