计算机系统是由硬件和软件组成的,它们共同协作以运行应用程序。先来看下面这张一个典型的计算机系统的硬件组成图
从上图中看出一个系统由 CPU、ALU(算术逻辑单元)、PC(程序计数器)、总线(贯穿整个系统的一组电子管道)、IO设备、主存等组成。这些硬件的管理都是由操作系统来完成的。
进程
进程是操作系统对一个正在运行的程序的抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。在大多数系统中,需要运行的进程数是多于可以运行他们的CPU个数的。传统的系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序。无论是在单核系统还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这个通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制成为上下文切换。进程也是操作系统进行资源分配的最小单位。
操作系统保持跟踪进程运行所需的所有状态信息。这种状态也就是上下文,它包括许多信息,例如PC和寄存器文件的当前值,以及主存内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前系统转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文,恢复新进程的上线文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始。
程序本身不是进程,它只是一个被调用的实体,就是存在磁盘上的内容,进程是一个活动的实体,他有程序计数器以指示下一个要执行的指令。
上图展示了进程的上线文切换
上图展示创建一个进程时所属的资源
线程
进程间的切换和通信存在较大的开销,为了能并行执行更多的任务,提升系统的效率,才引入了线程的概念。线程间的切换开销比进程间的切换开销小的多。线程是CPU调度的最小单位,它是进程的一部分,只能由进程创建。一个进程有用很多个线程,这些线程共享进程的资源和程序代码。
尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上线文中,并共享同样的代码和全局数据。由于网络服务器对并行处理的需求,线程成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程一般来说都比进程更高效。当有多处理器可用的时候,多线程也是一种使程序可用更快运行的方法。
总结
进程和线程都是计算系统抽象的一个概念,了解他们之间的区别和运行机制,对编写程序有很大的帮助,后面继续介绍Java中的jvm对线程的创建和管理。 线程的出现也如操作系统一样都是为了最大限度的合理分配管理和利用CPU的空闲资源。