java ,多个线程为什么要 “抢夺”cpu的执行权 ? 比如有4个 thread 线程,然后cpu也是4核 , 那不就是刚好 一个核对应一个线程吗 , 就不用抢夺了呀 ?
java ,多个线程为什么要 “抢夺”cpu的执行权 ? 比如有4个 thread 线程,然后cpu也是4核 , 那不就是刚好 一个核对应一个线程吗 , 就不用抢夺了呀 ?
1、首先要区分CPU是多处理器架构,还是多核心架构 这是两种不同的处理器架构
多处理器架构是指多个cpu核心分别有自己的一套Cache和MMU
多核心架构是指多个cpu核心共用一套Cache和MMU
多处理器架构可以并行 多核心架构只能并发
现代的CPU基本上都实现了多处理器架构,所以可以实现并行
你可以看一下这篇回答里用户“勇往直前”的回答[https://www.zhihu.com/question/271821176]
这个回答引用了哈工大李治军的《操作系统》
2、你说的线程“抢夺”cpu的执行权,一般是指多个线程被操作系统分配到同一个cpu核心上执行的情况,而不是你说的这种线程在同一数量cpu核心数的前提下执行任务的情况,操作系统肯定是优先把能用的cpu资源分配给能够应付的线程的,能均分更好(也就是说如果按你题目的假设来说,你的说法是正确的)。如果一直让一个线程霸占着核心直到它做完任务为止,一是资源浪费 二是有可能这个线程会陷入死循环 系统会出现假死的情况 所以现代操作系统一般使用时间片轮转调度算法,也就是隔一段时间就切换一个进程来执行任务 这个进程里的线程之间就可能存在竞争所在进程资源的情况(它们之间同样使用时间片轮转调度算法来进行切换,事实上在类Unix操作系统比如Linux里,进程和线程之间的界限被模糊了,它们都是“任务”),同一时间一个cpu核心只能执行一个线程的任务,剩下的线程在当前执行的线程的时间片执行完后当然就要去抢夺cpu的执行权了,但是最终谁能抢到执行权就不一定了,线程之间是共享进程的资源的,对于它们自己而言只想赶紧拿到资源完成自己的任务,自然就要打架来获得执行权了。
抢占式调度是一种比较常见的多任务调度方式,因为这种方式具有灵活性和高效性。
如果采用不抢占式的方式,当一个线程开始执行时,它将一直执行直到自己主动让出 CPU 的执行权,或者执行完任务并结束。此时,其他线程就只能等待当前线程执行完后才能获得 CPU 的执行权,这就会导致其他线程响应时间延长、CPU 资源利用率低下、性能下降等问题。另外,线程自行让出 CPU 的执行权也存在问题,因为线程的执行时间片无法精确控制,而且线程之间的优先级、负载和资源占用等情况不容易准确确定,可能会导致死锁、饥饿等问题。
相比之下,抢占式调度可以更加灵活和高效地利用 CPU 资源。通过时间片轮转、优先级调度等方式,可以保证所有线程都能够公平地竞争 CPU 的执行权,并且能够及时地切换到其他线程进行执行。这样,就可以避免线程之间出现长时间阻塞、响应延迟等问题,提高系统的并发性和资源利用率。因此,抢占式调度在实际应用中被广泛采用。
你看,一个简单的Web项目。活动线程33,守护线程26。
在看
public static void main(String[] args) throws InterruptedException {
while (true) {
TimeUnit.MINUTES.sleep(10);
}
}
另外,你这机器不止运行Java程序。还有OS本身
首先得知道什么是线程什么是进程,进程是运行到核心上的任务,而线程是在进程中的小任务,而你的系统里有N个进程,有N * M 个线程,进程线程同时运行的话,你的核心就不太够了
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.7k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
那要是再多怎么怎么办