单核不可能实现真正意义的多任务
这里所说的多任务,指的是多个任务在同一时刻,一起执行。
多进程之间通过抢占时间片的方式获取cpu资源,单核只有一个处理器,因此,在时间维度上,同一时间只能有一个进程在执行。
单核给用户在感受上有多个程序在执行,实际上是在多个进程之间来回切换,由于时间片分配的单位很小,一般人为地无法感知到。但实际上,在时间维度上,同一时间只有一个进程在执行。
多核多任务
单个处理器上可以同时执行一个进程,那么多核就可以各自执行一个进程,进而实现多任务同时处理的功能。
各个处理器有各自的时间片,各自在某一时刻均可以执行一个进程的任务,因此多核可以实现多任务。
上下文切换
单个处理器在多个进程之间切换的时候,需要在切换前完成“现场保存”,以便该进程再次获取到时间片后能够继续执行。在切换回来后,也要先完成“现场恢复”。这叫做上下文切换。
现场保存涉及到:程序计数器(保存指令的位置)、寄存器值、现场恢复所需要的数据。
上下文的切换的代价是很大的。
多核实现并行
当单个任务,不再逐步执行,而是分割成多个相对独立的单元分别执行,这样的独立单元可以在不同的处理器上同时运行,这就叫并行处理。
假设1、2、3之间存在依赖关系,4、5、6之间存在依赖关系,但是1、2、3与4、5、6之间没有任何依赖,此时可以分为1、2、3和4、5、6两个组,两组可以在两个不同的处理器上同时执行。这就是并行。
线程
但是问题来了,进程之间是不允许相互访问资源的。当两个组分别执行完成,怎么对结果进行汇总呢?当然,进程之间可以通过套接字、管道等等方式实现进程之间的通信,但是有没有更简单的方式?那就是线程。线程与进程类似,但是线程是分属于进程的,单个进程可以包含多个线程,并且线程之间是可以共享资源的,也就更方便的进行通信了。
单个进程的线程之间共享进程的资源和内存,同时相对独立:
程序计数器(线程执行位置)、堆栈(局部变量)、私有内存(Thread Local Storage)