今天开始系统的学习一下多线程,参考:
https://blog.csdn.net/luoweifu/article/details/46595285
http://www.cnblogs.com/lisuyun/articles/3293580.html
我们从最基本的操作系统概念来了解。大部分操作系统的任务调度是采用时间片轮转的抢占式调度方式,每一小段时间执行一个任务,轮流来执行任务。故任务有不用的状态,如运行状态和就绪状态等。CPU的效率非常的高,时间片非常短,能够在不同的任务之间快速的穿梭切换,给人的感觉像是多个任务“同时进行”,这也就是并发。但是同一个时间点,只有一个任务在执行。(多核除外)。
操作系统是计算机的管理者,负责资源分配,任务调度等。应用程序是具有某个功能的程序,是运行在操作系统之上的。
1、线程、进程、程序、应用程序四个之间的关系。
我们要搞懂线程和进程、程序、应用程序之间的关系。有一种说法是“一个程序至少有一个进程,一个进程至少有一个线程”,这种说法是错误的。程序(program)只能有一个进程,一个进程就是一个程序。打开chrome,有十多个进程,那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的cpu。但是对于用户而言,他们是一个整体,称之为应用程序(application)。对于计算机而言,一个进程就是一个程序,多个进程(比如一个浏览器的多个进程),就是多个不同的程序,它不会把它们理解为一个完整的“程序”。也就是说一个应用程序可能会包含很多的程序,程序和进程是一样的,独立的。其实进程之间的关系只有父子关系,没有主从关系,他们之间是并行独立的。但是线程之间是有主从关系的,而且他们共享的是同一块内存块(包括程序、数据和堆栈)。
打个比方,进程之间是父子关系,父进程fork子进程,就好比你养了个儿子。这个子进程会拷贝一份内存块,把程序和数据都复制过去,你儿子跟你长的也很像。但是一旦出生下来了,你们就是两个独立的个体,法律上都是平等的。子进程之后就完全独立了,父进程与子进程之间的关系,与其他进程的关系都是一样的,平等的,谁也管不着谁了,他们也只能采用进程间通信才能相互了解。父亲死了,儿子还活着;父进程over了,子进程可以照样活的好好的。(除非程序员认定有一个进程over了,其他进程没有存在的意义,比如浏览器负责渲染的进程如果down掉了,其他进程自动kill掉)。
但是进程的不同线程的关系可不是这样的。进程可以由多个线程组成,这称之为多线程程序,他们之间的关系就好比你的大脑与四肢和身体其他部分的关系一样。大脑就是主线程,其他部分就是子线程。子线程由主线程派生,而依附于主线程。主线程一旦over,进程就over了,其他子线程更是over了。他们的内存和数据都是同一份,没有进行隔离(既方便,也危险),不需要额外的通信函数。
父亲死了,儿子依旧活下去,你头断了,人还能活吗?
了解进程与线程的关系,就要了解他们的区别。一个计算机可以有多个进程,这称之为多任务,他们共享的是CPU,硬盘,打印机,显示器,但他们的内存是独立的,所以需要进程间通信,这是计算机发展的第一步。一个进程可以有多个线程,这称之为多线程,他们除了共享进程间的共享内容之外,还共享内存,这是计算机发展的第二步,主要是为了满足并行运算时共享数据,无需额外的通信。
所以正确的结论是:一个程序(program)就是一个正在执行的进程,而每个进程,可以是单线程的,也可以是多线程的。一个应用程序(application)通常由多个程序组成。
还是强调下程序(program)和应用程序(application)的区别。一个程序就是一个进程,永远不要说一个程序可能有多个进程。你打开一个应用程序(比如chrome),会有十多个进程,对于计算机而言,它们都是独立的。好比,父亲和儿子在外人看来是一家人,但是对于法律上来说,就是独立的法人。