漫谈并行,串行,流水线,线程和进程
在说并行串行流水线时,我们先要说一个概念双核四程,四核八程代表什么。
双核四程 指处理器中有两个核心, 但是利用了超线程技术,一个核心就有2个线程,所以两个核心就有4个线程。一般来说,两个核心就只有2线程。
超线程技术 就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。因此支持Intel超线程技术的cpu,打开超线程设置,允许超线程运行后,在操作系统中看到的cpu数量是实际物理cpu数量的两倍,就是1个cpu可以看到两个,两个可以看到四个。有超线程技术的CPU需要芯片组、软件支持,才能比较理想的发挥该项技术的优势。
上述是一种减少命令执行时间的一种方式,Linux自从2.6内核开始,就会把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。
然后说下:并行,串行,流水线
并行: 时间片机制(也有其他的机制,自己百度),让每个进程占用相同的cpu时间,在宏观上,可以实现多个进程同时完成。
串行: 一个进程完成,在执行下一个进程
流水线: 在A命令在执行时,B命令在解析,C命令在读取。这样子循环。
再说下线程和进程关系
我们开发应用程序,基本上分为2种进程:io消耗(文件读写);cpu消耗(图像视频压缩)。
线程就是轻量化的进程。为什么有了进程还要线程呢?
进程执行时间:事件的触发到响应时间、申请处理器的等待时间、数据的处理时间、申请设备的时间,以及写数据的时间。这只是单任务情况下,并没有考虑多任务引起的中断。
进程:需要独立堆栈空间,在进程切换时,需要申请堆栈等时间消耗。不同进程通讯复杂一点。
线程:共享同一个进程的堆栈,所以相对切换速度跟快,不同线程通讯简单。
每一个进程(线程)都有一个task_struct结构体。
进程:资源分配单位。
线程:调度单位。
综合上述:
1.并行,串行,流水线:是cpu的底层指令执行逻辑,是cpu核心对编译完成的二进制指令的一种读取,解释,执行方法。
2.多核多线程:是cpu的硬件概念,多个指令执行的硬件单元。
3.多线程和多进程:是系统概念,软件的概念,是用户概念。是系统层对多个进程的一种切换逻辑。
linux内核调度算法
快速找到最高优先级进程
内核调度的内核源码在kernel/sched.c的schedule函数中。内核为每一颗CPU分配了一个runqueue(优先级队列),用于维护这颗CPU可以运行的进程。LINUX默认配置(如果你用默认选项编译内核的话)MAX_PRIO是140,就是说一共内核对进程一共定义了140种优先级。等待某个CPU来处理的进程中,可能包含许多种优先级的进程,但,LINUX是个抢占式调度算法的操作系统,就是说,需要调度时一定是找到最高优先级的进程执行。
对于相同的优先级的进程 LINUX是一个时间多路复用的系统,就是说,通过把CPU执行时间分成许多片,再分配给进程们使用,造成即使单CPU系统,也貌似允许多个任务在同时执行。
多核系统的负载均衡
如果我们没有对进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,这是内核的负载均衡。上文说过,每个处理器上有一个runqueue队列,表示这颗处理器上处于run状态的进程链表,在多处理器的内核中,就会有多个runqueue,而如果他们的大小很不均衡,就会触发内核的load_balance函数。这个函数会把某个CPU处理器上过多的进程移到runqueue元素相对少的CPU处理器上。
发生负载均衡的时机:
1、当cpu1上的runqueue里一个可运行进程都没有的时候;在cpu0上还有许多进程等待运行,那么它会从cpu0上的可运行进程里找到优先级最高的进程,拿到cpu1上的runqueue里开始执行。
2、但是当cpu0上一直有10个可运行进程,cpu1上一直有1个可运行进程,显然,cpu0上的进程们得到了不公平的对待,它们拿到cpu的时间要小得多。所以,实际上,每经过一个时钟节拍,内核会调用scheduler_tick函数,而这个函数会做许多事,例如减少当前正在执行的进程的时间片,在函数结尾处则会调用rebalance_tick函数,该函数保证不同CPU的运行队列包含数量基本相同的可运行进程。
来源:CSDN
作者:mitugaoyang1993
链接:https://blog.csdn.net/mitugaoyang1993/article/details/104040650