在多核的系统中,同一个进程的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)上吗?的主要内容,如果未能解决你的问题,请参考以下文章