Preemptive Multitasking(抢占式多任务处理)
在单cpu的系统里,同一时间只能有一个进程运行,在进程切换的时候,kernel根据进程的状态和优先级来选择如何切换。在普通系统中,只要选择最高优先级的就好,而在实时系统(real-time system)中,还需要考虑系统需要的响应时间。
在一个进程中,同一时间也只有一个线程在运行,多线程其实也是每个时间段单线程,多个线程不停的快速切换。
Multitasking: sharing the CPU amongst different tasks that are running at the same time is known as multitasking.
在以前的操作系统中,如Windows 3.1,多任务方式是“协作式多任务”,意思是说一个任务得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,放弃使用,其它的任务也如此,才能保证系统的正常运行;而在现行使用的操作系统中,如Window 95及之后的Windows版本,使用的就是“抢占式多任务”了,它的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务。[1]
大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下:
* OS schedules processes. OS interrupts processes when time expired.
Preemptive Multiprocessing(抢占式多进程)
单个CPU上,某个时间段内只有一个process可以运行。由OS来基于状态和优先级来选择执行哪个process。
【nice命令用于调整Linux系统中进程的优先级。
通俗地讲,Linux系统中,进程有-19到19这39个优先级。-19最优先,19最不优先。进程的默认优先级为0。如果希望将进程调整为最优先,则将进程的nice值设置为-19;如果希望进程最不优先,占用最少的系统CPU时间,则将其设置为19。http://blog.csdn.net/gua___gua/article/details/42536127
* $nice +10 sort --> 降低当前process的 优先级。】
Multiple Processors(多处理器)
多处理器系统(Multiprocessor Systems)是指包含两台或多台功能相近的处理器,处理器之间彼此可以交换数据,所有处理器共享内存,I/O设备,控制器,及外部设备,整个硬件系统由统一的操作系统控制,在处理器和程序之间实现作业、任务、程序、数组极其元素各级的全面并行。
Multiple Processors(MP)的机器支持同一时间真正的多个进程同时运行。因此多处理器可以提高系统performance。
多处理器(Multiprocessor)系统由不同芯片上的多个处理器组成。多处理器系统因IT服务器的应用在上世纪九十年代得以普及。在当时,它们是可以插入机架服务器的处理器主板。现在,多处理器系统可以构建在同一块电路板上,处理器之间通过一个高速通信接口连接。
多处理器系统的复杂度低于多核系统,因为它们本质是互连在一起的单芯片CPU。多处理器系统的不足在于其高昂的价格,因为它们需要多个芯片,这比单芯片解决方案要昂贵得多。
进程被放在一组处理器上,操作系统在这个处理器池(processors pool)间schedules各个进程。这些处理器都共享内存,因此可以hold共享的代码和数据。所以同一时间可以有多个进程在运行。因此系统的性能得以提高,
Symmetrical multiprocessing对称多处理器:每一个处理器都是完全相同的,没有类似于主处理器/副处理器这种关系。通过内存来交互。这种对称多处理器的一个瓶颈是共享的硬件资源,尤其是内存。对称式多处理器系统通常有不超过8个处理器,而真正的多处理器可能会有成千上万的处理器。
Multithreading(多线程)
在以前的操作系统里,process是一个indivisible(不可分割的)unit of work with single execution path.
现在的操作系统里,一个单一的进程可以有多个线程,通过‘同时’运行不同的线程,一个application也可以同时进行多个操作。
在多处理器的系统上,多个线程可以同时在不同的cpu上运行,因为每一个进程都有它自己的context。系统的性能会大大提高。然而,系统的性能会有多大的提高还得看系统的并发行,即多久这个program需要同步。
总的来说,不管是不是多处理器的系统,多线程都会提高performance。
先提一句什么是线程:a path of execution through process。can be taken as a light weight process.
http://blog.csdn.net/luoweifu/article/details/46595285
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
后来,随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见
同一个进程下的多个线程可能会被安排在不同的处理器上,这些都是由进程管理器来管理。进程必须要管理它下面多个线程共享的资源。
[1].https://baike.baidu.com/item/%E6%8A%A2%E5%8D%A0%E5%BC%8F%E5%A4%9A%E4%BB%BB%E5%8A%A1/8675779?fr=aladdin