Java多线程(一):进程与线程的基本概念

881 阅读3分钟

进程与线程

前言

现代操作系统具有能够同时运行多个任务的能力。如:可以在电脑上边听音乐边聊QQ。

能够实现多个任务同时运行,离不开进程线程这两个重要的概念。

进程

进程就是加载到内存并执行的程序

引入线程前,分时操作系统采用时间片轮转的方式运行进程:操作系统给每个进程分配一个时间段,称作时间片

如果在时间片结束时进程还在运行,就暂停这个进程的运行,并且操作系统将CPU分配给另一个进程。(这个过程叫做上下文切换

当进程暂停时,它会保存当前进程的状态(进程标识,进程使⽤的资源等),在下⼀次切换回来时根据之前保存的状态(CPU寄存器和程序计数器的内容)进⾏恢复,接着继续执⾏。

如果在时间片结束前,进程阻塞或结束运行,则操作系统会让CPU立即进行切换,不用等待时间片用完。

时间片的大小通常为10~100ms,加上CPU运算速度极快。因此从宏观上来看,所有的程序在 “同时” 进行。但事实上,对于单核CPU来说,任意时刻都只有一个进程在占用CPU资源。

注:引入线程后,线程是CPU分配时间的单位。

线程

一个进程中,往往有若干个子任务。 能不能让这些子任务也 “同时” 进行呢?这就要用到线程。

⼀个线程执行⼀个⼦任务。这样,一个进程就包含了多个线程(至少一个线程),每个线程负责⼀个单独的⼦任务。

例如,当⽤户使⽤扫描病毒功能时,就让扫描病毒这个线程去执⾏。同时,如果⽤户⼜使⽤清理垃圾功能,那么可以先暂停扫描病毒线程,先响应⽤户的清理垃圾的操作,让清理垃圾这个线程去执⾏。响应完后再切换回来,接着执行扫描病毒线程。

进程让操作系统的并发性成为了可能,⽽线程让进程的内部并发成为了可能。

进程与线程的区别

进程是⼀个独⽴的运⾏环境,⽽线程是在进程中执⾏的⼀个任务。

他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(比如I/O)

  • 进程单独占有⼀定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不⼲扰;⽽线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。

  • 进程单独占有⼀定的内存地址空间,⼀个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性⾼;⼀个线程崩溃可能影响整个程序的稳定性, 可靠性较低。

  • 进程单独占有⼀定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较⼤;线程只需要保存寄存器和栈信息,开销较小。因此,线程又称作轻量级的进程

另外⼀个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位。