当前位置:  技术问答>linux和unix

Linux 线程 时钟中断

    来源: 互联网  发布时间:2016-12-28

    本文导语:  最近在看Modern Operating System,第三版,其中章节2.2.2倒数第4段如下: Another common thread call is thread-yield, which allows a thread to voluntarily give up the CPU to let another thread run. Such a call is important because there is ...

最近在看Modern Operating System,第三版,其中章节2.2.2倒数第4段如下:
Another common thread call is thread-yield, which allows a thread to voluntarily
give up the CPU to let another thread run. Such a call is important because
there is no clock interrupt to actually enforce multiprogramming as there is with
processes. Thus it is important for threads to be polite and voluntarily surrender
the CPU from time to time to give other threads a chance to run. Other calls allow
one thread to wait for another thread to finish some work, for a thread to announce
that it has finished some work, and so on.
大意是一个良好设计的多线程程序中,每个线程应该及时调用thread_yield释放CPU,因为线程库无法像进程那样通过时钟中断强制线程让出CPU。
我的理解是如果一个线程霸占了CPU(单核系统),那么该进程中的其他线程就无法执行了。但是我测试的结果却正好相反,线程间交替执行,测试代码见最下方。
我猜测可能有两个原因:
1、书上写错了,不过觉得不大可能
2、每次进程新获取时间片时,从就绪的线程中随机选了一个来执行(该线程由于进入死循环,会占用整个进程的时间片),所以看上去好像是在进程时间片内轮流执行。
我感觉应该是第2种原因,但不知道该如何用一段测试代码去证明,请教各位大牛有没有什么好的方法。如果上面两种猜测都不对,那么究竟是什么原因造成的呢?
PS:分数只剩下58分了,有点少,不好意思...

测试代码如下:
#include 
#include 
#include 
#include 
#include 
#define MAX 10
pthread_t thread[10];
pthread_mutex_t mut;
int number=0, i;
int a = 1;
void *thread1(void* arr)
{
if (a == -1)
         printf ("thread1 : I'm thread 1n");
else
a = -1;
        while(1+1>1){
printf("thread 1 runningn");
}
        pthread_exit(NULL);
}
void *thread2(void* arr)
{
if (a == -1)
        printf("thread2 : I'm thread 2n");
else
a = -1;        
while(1+1>1){
printf("thread 2 runningn");
}
        pthread_exit(NULL);
}
void *thread3(void* arr)
{
if (a == -1)
        printf("thread3 : I'm thread 3n");
else
a = -1;        
while(1+1>1){
printf("thread 3 runningn");
}
        pthread_exit(NULL);
}
void *thread4(void* arr)
{
if (a == -1)
        printf("thread4 : I'm thread 4n");
else
a = -1;        
while(1+1>1){
printf("thread 4 runningn");
}
        pthread_exit(NULL);
}
void thread_create(void)
{
        int temp;
        memset(&thread, 0, sizeof(thread));          //comment1
printf("create thread 1n");
        if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)       //comment2
{
}
        else
{
}
printf("create thread 2n");
        if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0)  //comment3
{}
        else
{}
printf("create thread 3n");
if((temp = pthread_create(&thread[2], NULL, thread3, NULL)) != 0)  //comment3
{}
        else
{}
printf("create thread 4n");
if((temp = pthread_create(&thread[3], NULL, thread4, NULL)) != 0)  //comment3
{}
        else
{}
}
void thread_wait(void)
{
        if(thread[0] !=0) {                   //comment4
                pthread_join(thread[0],NULL);
        }
        if(thread[1] !=0) {                //comment5
                pthread_join(thread[1],NULL);
        }
}
int main()
{
        pthread_mutex_init(&mut,NULL);
        thread_create();
        thread_wait();
        return 0;
}


|
linux的调度策略是几种调度策略的综合,不是简单一种调度策略。
要不系统很容易挂掉。

给你个链接看看
http://topic.csdn.net/u/20100511/14/8E9B2F67-4527-476A-B4BB-E46D19885E9A.html#r_65356828

    
 
 

您可能感兴趣的文章:

  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在linux RH73下为什么单进程只能开1021个线程线程.
  • Linux下如何让主线程挂起一个指定的时间段而子线程继续运行?谢谢
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  • linux线程编程问题
  • linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么?
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么? iis7站长之家
  • linux 下子线程不能执行的问题?
  • linux多线程编程的问题
  • linux多线程编程
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • linux时钟为何与BIOS时钟不同步?如何使其同步?
  • 如何得到linux机器的时钟频率?
  • Linux的时钟精度达到多高?
  • 关于linux系统的时钟滴答疑问
  • linux 内核时钟频率
  • 关于linux时钟中断的问题.
  • linux下时钟问题
  • 如何截取linux时钟中断?
  • vmware里linux的时钟跑得很慢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在linux上怎么编写一个模块来提供某个中断的中断处理程序呢?而且有哪些中断可以自己添加中断处理程序呢?
  • Linux 系统中的中断是不是没有中断优先级
  • 在Linux驱动中如何开中断和关中断?
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • linux内核中的中断向量号是如何与硬件的中断Pin关联的?
  • linux中断处理 如何调用内核的中断操作
  • 关于linux内核中中断处理的问题
  • 关于linux驱动中的中断速度问题
  • 在linux中,中断处理是否作为单独的进程执行?
  • arm+linux下,中断怎么使用呢?
  • linux中r3如何进行中断响应
  • Linux驱动中注册的中断号与实际的硬件中断号的关系
  • 求一linux下串口中断的程序
  • linux0.11的bios中断
  • linux应用层如何select底层的中断
  • 关于《LINUX设备驱动程序 第三版》里面的中断部分的问题
  • 请教一个关于linux系统中断亲缘性绑定的问题
  • linux 信号中断
  • 请教关于arm-linux中断的问题~~~~~~~~~
  • 在Linux应用程序模式下如何设置中断!!!
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3