Linux 线程 时钟中断

wd9053 2011-09-04 10:54:07
最近在看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 <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#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 1\n");
else
a = -1;
while(1+1>1){
printf("thread 1 running\n");
}
pthread_exit(NULL);
}
void *thread2(void* arr)
{
if (a == -1)
printf("thread2 : I'm thread 2\n");
else
a = -1;
while(1+1>1){
printf("thread 2 running\n");
}
pthread_exit(NULL);
}
void *thread3(void* arr)
{
if (a == -1)
printf("thread3 : I'm thread 3\n");
else
a = -1;
while(1+1>1){
printf("thread 3 running\n");
}
pthread_exit(NULL);
}
void *thread4(void* arr)
{
if (a == -1)
printf("thread4 : I'm thread 4\n");
else
a = -1;
while(1+1>1){
printf("thread 4 running\n");
}
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread)); //comment1
printf("create thread 1\n");
if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2
{
}
else
{
}
printf("create thread 2\n");
if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3
{}
else
{}
printf("create thread 3\n");
if((temp = pthread_create(&thread[2], NULL, thread3, NULL)) != 0) //comment3
{}
else
{}
printf("create thread 4\n");
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;
}

...全文
215 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtingguang 2011-09-04
  • 打赏
  • 举报
回复
Linux结合实时进程和非实时进程(普通进程)自身的特点,综合了上述几种调度策略,实现了高效、灵活的进程调度。
wangtingguang 2011-09-04
  • 打赏
  • 举报
回复
linux的调度策略是几种调度策略的综合,不是简单一种调度策略。
要不系统很容易挂掉。

给你个链接看看
http://topic.csdn.net/u/20100511/14/8E9B2F67-4527-476A-B4BB-E46D19885E9A.html#r_65356828
第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.4 分析Linux内核的意义 1.5 Linux内核结构 1.6 Linux内核源代码 1.7 Linux内核源代码分析工具 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.2 内存地址 2.3 段机制和描述符 2.4 分页机制 2.5 Linux中的分页机制 2.6 Linux中的汇编语言 第三章中断机制 3.1 中断基本知识 3.2中断描述符表的初始化 3.3异常处理 3.4 中断处理 3.5中断的后半部分处理机制 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2 Linux中的进程概述 4.3 task_struct结构描述 4.4 task_struct结构在内存中的存放 4.5 进程组织的方式 4.6 内核线程 4.7 进程的权能 4.8 内核同步 第五章进程调度 5.1 Linux时间系统 5.2 时钟中断 5.3 Linux的调度程序-Schedule( ) 5.4 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.2 Linux内存管理的初始化 6.3 内存的分配和回收 6.4 地址映射机制 6.5 请页机制 6.6 交换机制 6.7 缓存和刷新机制 6.8 进程的创建和执行 第七章 进程间通信 7.1 管道 7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.3 文件的访问权限和安全 9.4 链接文件 9.5 分配策略 第十章 模块机制 10.1 概述 10.2 实现机制 10.3 模块的装入和卸载 10.4 内核版本 10.5 编写内核模块 第十一章 设备驱动程序 11.1 概述 11.2 设备驱动基础 11.3 块设备驱动程序 11.4 字符设备驱动程序 第十二章 网络 12.1 概述 12.2 网络协议 12.3 套接字(socket) 12.4 套接字缓冲区(sk_buff) 12.5 网络设备接口 第十三章 启动系统 13.1 初始化流程 13.2 初始化的任务 13.3 Linux 的Boot Loarder 13.4 进入操作系统 13.5 main.c中的初始化 13.6 建立init进程 附录: 1 Linux 2.4内核API 2.1 驱动程序的基本函数 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备

4,466

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧