简单个人理解(一):对于时间片和Java中进程和线程
作者:互联网
简单个人理解(一):对于时间片和Java中进程和线程
一.时间片
如果大家想要清楚清晰的了解进程和多线程的关系,那我们就不得不先提一个叫做时间片的东东,让我们先来瞅瞅百度词条是怎么说的:
- - 时间片(timeslice)又称为“量子(quantum)”或“处理器片(processor slice)”是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。现代操作系统(如:Windows、Linux、Mac OS X等)允许同时运行多个进程 —— 例如,你可以在打开音乐播放器听音乐的同时用浏览器浏览网页并下载文件。事实上,虽然一台计算机通常可能有多个CPU,但是同一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在Linux上为5ms-800ms),用户不会感觉到。
- 时间片由操作系统内核的调度程序分配给每个进程。首先,内核会给每个进程分配相等的初始时间片,然后每个进程轮番地执行相应的时间,当所有进程都处于时间片耗尽的状态时,内核会重新为每个进程计算并分配时间片,如此往复。
其实时间片说到底是操作系统给每个进程划分的最小的在cpu中进行处理的最小时间段。咦,进程,那进程又是啥呢?
二.什么是进程
依旧是先看百度百科词条哟!
- 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
-
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
是不是看完仍有一丝疑惑?这是啥,看完表示头大好吧!
其实你可以这么理解呀,依玩英雄联盟为例,我们来简单解释下:
Q:什么叫进程是正在运行的程序的实例 ?
A:你打开联盟是不是就会运行一个叫做LOL的进程啊!不然它就在那儿就只是一个图标好吧。
Q:为啥每一个进程都有它自己的地址空间,进程是一个“执行中的程序 ?
A:其实我们下载的游戏都是存在磁盘上的,当我们运行它时,读取关键的数据,写入到内存中,这样就有了再内存中的一 个独特的地址空间(里边存有英雄皮肤什么)。
一个进程对应一个应用程序。在java的开发环境下启动JVM,就表示启动了一个进程。在同一个操作系统中,可以启动多个进程,其实进程就是具有独立功能,从而进行资源分配的最小单位,而进程又是由许多线程组成的。每启动一个进程,系统就会为它分配地址空间,建立数据表来维护程序的代码段、数据结构段(堆栈段和数据段)。
好的,我们成功的又引入了下一个问题什么是线程!
三.什么是线程:
先瞅词条:
- 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
一个进程可以有很多线程,每条线程并行执行不同的任务。
在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。
说到线程这就涉及比较多了,多线程,线程栈,并发和并行
个人理解:
线程:就是一系列方法调用(main方法进栈到main中一系列方法的调用入栈依次出栈到main出栈叫做一个线程)线程栈里的每一个方法都是拷贝过来的,称为栈帧。(帧是最小单元)
线程栈:可以简单理解为是一系列函数调用的栈控制。线程方法调用 控制mian方法进栈,对应的里面的方法依次进栈按循序调用方法,一个方法进栈后若是没有调用其他方法会执行一次直接出栈,若是有调用其他方法会按顺序继续调用其他方法,先后进栈出栈,直到方法内没有调用其他方法,执行后出栈。
并发:
指两个或多个事件在同一个时间段内发生,交替执行。就好比如你在看书的时候像听歌,但你只能选一个,就只好看书和听歌交替进行
并行:
指两个或多个事件在同一时刻发生,同时执行。依旧是上边的例子,不过这次可以边听歌边看书了,同时进行
需要注意的细节:
进程和进程之间的内存是独立的
线程与多线程
线程是一个进程中的执行场景。一个进程可以启动多个线程
多线程作用不是为了提高执行速度,而是提高应用程序的使用率
线程和线程共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个栈
由于多线程在来回切换,所以给现实世界中的人类一种错觉:感觉多个线程在同时并发执行。
假如我们定义一个main方法对输入的一个数据进行处理,main方法里包含A,B,C三个方法,其中A方法里进行一次+1,B方法里进行一次+5,然后再调用两次A方法,C方法里调用一次A,一次B方法。
那么我们的线程栈的流程应该是 main方法进栈,然后A进栈,因为A方法里没有调用其他方法,所以A方法出栈,B方法进栈,执行一次+5然后调用两次A依次进出栈,C方法进栈,调用A方法,B方法。
**进出栈顺序依次是:main进栈---A进栈---A出栈---B进栈---A进栈---A出栈---A进栈---A出栈---B出栈---C进栈---A进栈---A出栈---B进栈---A进栈---A出栈---A进栈---A出栈---B进栈---C进栈---main进栈**
一些个人理解
多线程
main方法是对外界调用的
两个线程时回生成俩个线程栈,拷贝两个方法以及在方法内部声明的变量,这两个方法不互相干扰
执行main时遇到不同的线程,每个线程拷贝一个方法,但是对同一个变量进行操作。
每一个线程对于共同变量进行操作是会先拷贝一份方法,再进行操作再改数据,线程不安全,会产生脏数据
main方法属于主线程
maib方法里调用的,属于子线程
拷贝只能拷贝栈里的,堆里的是公共的
拷贝的是指针
栈帧和顺序指令相关的放在栈里,没有指令顺序的放在堆里
栈帧》》变量表》》各自在堆里的地址
引用类型k没有具体空间,所以记的同一个地址
标签:调用,出栈,线程,进程,Java,进栈,方法 来源: https://blog.csdn.net/nn1656353506/article/details/104078255