实验三

2017-05-02  本文已影响0人  空白_ce1f

西 安 邮 电 大 学 (计算机学院)

操作系统课内实验报告

实验名称:线程实验

专业名称:计算机科学与技术

班 级:计科1503

学生姓名:魏新超

学号(8位):04151091

指导教师:陈莉君

实验日期:2017年4月18日

一. 实验目的及实验环境
通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。掌握POSIX 规范中pthread_create() 函数的功能和使用方法。
实验环境:deepin-15.3

二. 实验内容

  1. 你最初认为前三列数会相等吗?最后一列斜杠两边的数字是相等,还是大于或者小于关系?
    不想等,最后一列两边数字是相等的,前三列的调度是不同的
  2. 最后的结果如你所料吗?有什么特点?对原因进行分析。
    不是的,结果是最后一列两边的数字不是相等的,前面的小于后面的,因为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的值,结果与预期的理论值不符。
  3. thread 的CPU 占用率是多少?为什么会这样?
    我测试的结果是157.9%,因为三个线程一直在死循环里无法退出,所以导致cpu占用率明显增大
  4. thread_worker()内是死循环,它是怎么退出的?你认为这样退出好吗?
    按q退出,这样不好,子进程强制退出。
    三.方案设计
    按照注释里的要求把代码补充完整,正确编译程序后,先预计一下这个程序的运行结果。具体的结果会是什么样?运行程序。开另一个终端窗口,运行“ps aux”命令,看看thread 的运行情况,注意查看thread 的CPU 占用率,并记录下这个结果。

四.测试数据及运行结果

![V8`RD@R]N)3YS6]KWP0D.png

4OJJ0I1HX91C4D9G)MO4222.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);
             
     } 
 
 }
上一篇 下一篇

猜你喜欢

热点阅读