在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?相关的知识,希望对你有一定的参考价值。

0.8072

得看线程是什么线程,除此之外还要看操作系统的调度策略。内核级线程理论上是可以同时在两个核心上运行的,但是现实情况是线程数远远大于CPU数量或者核心数,所以就是多个线程抢占系统的CPU了。 参考技术A 实际上有些操作系统在内部并不分进程和线程,调度方式是一致的。比如Linux,共享内存的就是线程,不共享内存的就是进程,然后把包装好的创建函数暴露给POSIX API。 参考技术B 使用top命令,具体用法是 top -H,加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
使用ps命令,具体用法是 ps -xH,这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
使用ps命令,具体用法是 ps -mq PID,这样可以看到指定的进程产生的线程数目。
更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了。

进程切换 多线程并发

并发:是指两个或更多独立的活动同时发生,在单个系统里同时执行多个独立任务,而非顺序地进行一些活动

老:单个处理器,某一时刻执行一个任务,可以每秒进行多次任务切换

技术分享图片

新:多核处理器,真正的并行多核任务,同时也可以进行任务切换

技术分享图片

系统从一个任务到另一个任务(即进行切换),要进行一次上下文切换,切换时,操作系统必须为当前运行的任务保存CPU的状态和指令指针,并计算出要切换到哪个任务,并为即将切换到的任务重新加载处理器状态。然后,CPU将新任务的指令和数据的内存载入缓存中。

进程切换:从正在运行的进程中收回处理器,实质是把进程存放在处理器的寄存器中的中间数据找个地方存起来,从而把处理器的寄存器腾出来,让其他进程使用。被终止运行进程的中间数据被存放在进程的私有堆栈。

让进程来占用处理器,实质上是把某个进程存放在私有堆栈中寄存器的数据(前一次本进程被中止时的中间数据)再恢复到处理器的寄存器中去,并把待运行进程的断点送入处理器的程序指针PC,于是待运行进程就开始被处理器运行了,也就是这个进程已经占有处理器的使用权了。   

多进程并发:

技术分享图片

这种进程间通信设置复杂,速度慢,因为操作系统会在进程间提供一定的保护措施,以避免一个进程去修改另一个进程的数据,另一个缺点是,运行多个进程所需的固定开销,需要时间启动进程等。

优点是:因为进程间有保护,更容易编写安全的并发代码等。

多线程并发:

技术分享图片

一个进程中的所有线程,共享地址空间,并且线程访问到大部分数据可以在线程之间传递,地址共享,缺少线程间数据保护,使操作系统的记录工作量减小,多线程开销远远小于多进程。

共享内存有代价:数据要被多个线程访问,必须保证每个线程所访问到的数据是一致的。

线程是有限的资源,太多线程同时运行会消耗很多操作系统资源,从而使操作系统整体上运行得更加缓慢。

每线程需要一个独立的堆栈空间,运行太多的线程会耗尽进程的可用内存或地址空间。

每个线程都会有一个1MB的堆栈(很多系统都会这样分配),对于一个可用地址空间4GB(32bit)的平坦架构的进程来说,4096个线程会用尽所有地址空间,不会给代码,静态数据或者堆数据留有任何空间。

运行越多线程,操作系统就要做越多的上下文切换。

 

以上是关于在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?的主要内容,如果未能解决你的问题,请参考以下文章

多线程

进程切换 多线程并发

多核并行编程技术

进程和线程

linux单进程如何实现多核cpu多线程分配?

并发线程、进程和多核