在多核计算机上,线程和进程调度的问题
在一台4核的计算机上,我做了两个测试程序A,B,在A上面创建4个线程,B上面创建4个进程,每个进程和线程中执行一样的函数,做循环的i++操作。用top观察运行情况,在运行A的过程中cpu使用率接近400%,运行B的过程中创建的4个进程的CPU使用率都接近100%。在进程的运行过程中,只能有一个上下文环境,在一个事件点上就只能运行一个进程(是不是这里我理解错了),怎么能够使4个进程都并行的运行起来呢?如果没有并行的运行,那么4个进程的CPU怎么都是100%呢? 我想你的B应该是没有绑核操作,所以内核给负载均衡了吧。可以确认下主线程被绑到哪个核。 回复 2# polejo我现在理解的是一个时刻只能运行一个进程而不是像线程一样四个线程能同时运行?内核里面有自动的进程和cpu的映射,每个进程能得到独立的cpu,但是会有独立的上下文环境吗? 用户态进程和线程在内核看来都是一个task_struct,没有特殊的设置,调度都是一样的。
另外,top的CPU占用率不准 回复 1# jhl19880722
对于实验现象,我的理解:
[*]A和B的操作内核层面来看都差不多:四个任务在四个核上面做i++操作,唯一的不同时,B对应的4个进程不共享地址空间,即四个任务的i对应不同的内存地址;而A对应的4个线程共享地址空间,也就是说4个线程共享变量i;
[*]因为top命令是按照进程来统计占用率的,所以A的四个进程各占100%,而B一个进程独占400%;
对于你的疑问,我的解答:
[*]"在进程的运行过程中,只能有一个上下文环境",这句话你理解的有问题。这句话中的“进程”如果替换成内核理解的“任务task”就没有问题了。事实上进程A的四个线程实际上就是运行在四个核上的不同任务,而每一个线程对应的任务都有自己的一个上下文环境,只不过四个上下文有些相同的东东罢了。
[*]核心问题是,上下文到底指什么?操作系统和硬件密切相关,上下文概念与CPU密切相关。上下文说白了就是CPU的状态。系统要实现多任务在单CPU的轮转执行,就要不断的保存和恢复CPU的状态,这就叫上下文切换。
回复 5# bensenq
谢谢。一直以为在多核的环境下只有多线程才能同时多个线程进行并发执行,进程每次只能执行一个,多进程不能充分利用多核的性能。
jhl19880722 发表于 2013-12-21 22:43 static/image/common/back.gif
在一台4核的计算机上,我做了两个测试程序A,B,在A上面创建4个线程,B上面创建4个进程,每个进程和线程 ...
线程和进程的调度方式是一样的,你看到的top 400%,应该是因为top命令的Irix和线程模式吧,top执行后按H和I,就可以看到区别了。
另外,每个进程都有独立的上下文,4个进程可同时在4个核上执行(当然,还取决于是否有临界资源) 回复 1# jhl19880722
内核在做调度的时候不区分线程和进程。top -H
回复 8# 瀚海书香
线程间有一定相关度,可能会使调度器认为它们最好运行在同一CPU上,比如为了提高cache命中率。 回复 9# tempname2
貌似不区分的。
页:
[1]
2