java 进程、线程

进程是操作系统中运行的一个任务(一个任务程序运行在一个进程中),如一个qq程序就是一个进程。进程是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元,这些功能单元就称为进程。进程还拥有一个私有的虚拟地址空间仅能被它所包含的线程访问。线程只能归属于一个进程且只能访问该进程拥有的资源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。

一个线程是进程的一个顺序执行流,同类的多个线程共享一块内存空间和一组系统资源,线程本身有一个供程序执行时的堆栈。线程在切换时负荷小,因此线程也被称为轻负荷进程,一个进程可以包含多个线程。

进程与线程的区别:一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高,此外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大提高了程序的运行效率。线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程的执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。

线程通常用于在一个程序中需要同时完成多个任务的情况,将每个任务定义为一个线程,使这些任务一同工作。虽然一个程序也可用于单一线程中完成,但是使用多线程可以提高效率,比如下载文件等。

然而,多个线程“同时”运行只是感官上的一种表现,事实上,线程是并发运行的,操作系统将时间划分为很多时间片段(时间片),尽可能均匀的分配给每一个线程,获取时间片段的线程被CPU运行,而其他的线程全部处于等待状态,所以宏观上都在运行,但并不是绝对意义上的同时发生,即并发原理。

对于多线程的理解:看了一篇博客,举的例子很贴切,很生动,在此,借用一下。

假如你去一家餐馆吃饭,那家餐馆只有一个服务员,所以这个唯一的服务员给你点菜的时候,别的去餐馆吃饭的人就得等着。但是如果这个餐馆有多个服务员的话,那么在同一时刻就可以给多个去餐馆吃饭的人点菜,这里举A、B两个服务员,分别接待甲、乙两个顾客,而每个顾客点了不同的三道菜。

上面例子中的餐馆可以理解成一个程序,而A、B两个服务员可以理解成两个线程,后厨做菜的厨师可以看做是CPU(假设只有一个CPU)。

从A、B两个服务员同时接待甲、乙两个顾客这个表象来看线程是“同步”、“并发”执行的,但是在厨师做菜的过程中还是有先后之分的,只是厨师会把甲乙两个顾客点的菜分开来做,做完甲的一道菜后立刻开始做乙的一道菜,这样不停地切换着做甲乙两个顾客点的菜。而在甲乙顾客看来他们桌上都有着菜吃,误以为他们的菜是同时做出来的。

而计算机里的多线程也是如此,cpu会分配给每一个线程只有极少的运行时间,时间一到就交出运行权,所有线程被快速的切换执行,因为cpu的执行速度非常的快,所以在执行的过程中我们可以简单的认为这些线程是“并发”执行的。

上面厨师做菜的原则是:不同的切换顾客们点的菜。假设厨师做菜的原则变了,是单顾客原则:给一位顾客做完所有的菜后再给别的顾客做菜,就是说先一下子把甲点的三道菜全做出来后再去做乙点的那三道菜,这样的话如果厨师在做甲的某一道菜时发现甲点的那道菜的原料没有了,那么乙的菜就得一直等着。

扫描二维码关注公众号,回复: 4148688 查看本文章

如果是在计算机中,单顾客原则执行线程的话,当一个恶性的线程运行不下去时,计算机就会出现死机的现象,这时候只能重启。

上面介绍的厨师做菜的两种原则分别代表着计算机中线程的两种调度形式:抢占式调度和非抢占式调度。应用中我们一般用抢占式调度(即厨师的第一种做菜原则)。

转自:https://blog.csdn.net/yhc0322/article/details/6801074

猜你喜欢

转载自blog.csdn.net/qq_38332574/article/details/84023133