标题 1.操作系统和进程,线程
操作系统
在计算机中,核心是CPU,所有的计算任务都是在CPU中进行,而操作系统是计算机的管理者,也就相当于一个国家的政府,一个国家有很多项目,资源,政府负责资源的调度分配,以及任务的调度和管理,在计算机中有很多应用程序,这些程序都是在操作系统的基础上运行的,就像社会上很多公司,公司的运行都是在政府的管理以及规则下运作的。
进程
在程序执行的时候,计算机中就创建进程去执行程序需要执行的任务,所以进程是程序执行的一个周期,是正在执行的程序,也就是程序执行的实体。一个程序理论上是一个进程,但是很多时候回伴随着许多子进程,这些子进程关闭父进程不会关闭,但是父进程关闭子进程会随之关闭。在打开QQ后,任务管理器中的后台进程就不止多一个进程,所以进程是随着程序的运行而创建,程序结束而销毁,并且一个程序可能打开多个进程。
总的来说:
进程是一个具有独立功能的程序在一个数据集上的一次动态执行的过程。
是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要描述的功能,是控制进程执行的指令集;数据集合是程序在执行时所需的数据和工作区;程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标志。
换句话说,可以总结进程具有以下特征:
- 动态性:进程是程序的一次执行过程,是临时的,动态产生动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是系统进行资源分配和调度的一个独立单位。
- 结构性:进程由程序,数据,和进程控制块三部分组成
线程
在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各个进程之间的内存地址互相隔离。
后来随着计算机的发展,对CPU的要求越来越高,进程之间切换开销较大,无法满足越来越复杂的程序要求,于是就有了线程。
线程作为程序执行中一个单一的控制流程,是程序执行流的最小单位,是处理器调度和分派的最小基本单位。一个进程可以有多个线程,用一个进程中的各个线程之间共享程序的内存空间。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。
线程也有自己独立的内存空间,寄存器和栈,线程的私有内存在JVM中一般是程序计数器(用来记录线程运行到了那个指令行,用来保证多线程切换),本地方法栈,虚拟机栈。
线程和进程的区别
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位
一个进程由多个线程组成,线程是一个进程中代码的不同执行路线。
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源,某进程内的线程在其他进程不可见
调度和切换:线程上下文切换比进程上下文切换要快的多
为什么进程切换开销比线程大
经过上面的讲述,我们知道的是,进程拥有独立的内存空间和资源,在同一个进程中的线程,共享该进程的内存空间。
还有一个就是进程内的内存地址都是逻辑地址,通过这个逻辑地址可以转换成每个进程对应的物理内存空间,但每个进程所对应的物理内存空间都不一样,所以如果进程间转换,要对内存空间进行切换,这个增加了IO的开销。
但是线程切换的话,如果是在同一进程中,就不需要进行地址的切换,而且资源也不需要进行切换,因为都是共享同一进程的,所以线程切换开销会小很多。
除了内存地址的切换,因为进程的切换涉及到CPU使用权的转接以及系统调用,中断等操作,所以也有用户态和内核态的切换,这个过程其实也是开销很大的过程。