For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
线程与进程都是java编程开发程序员需要重点掌握的一个编程技术知识,下面我们就通过案例分析来了解一下,java编程进程基础知识分享。
为什么需要进程?
程序,就是指令的集合,指令的集合说白了就是文件,让程序跑起来,在执行的程序,才是进程。程序是静态的描述文本,而进程是程序的一次执行活动,是动态的。进程是拥有计算机分配的资源的运行程序。
我们不可能一个计算机只有一个进程,就跟我们全国不可能只有一个市或者一个部门,计算机是一个庞然大物,里面的运转需要有条理,就需要按照功能划分出比较独立的单位,分开管理。每个进程有自己的职责,也有自己的独立内存空间,不可能混着使用,要是所有的程序共用一个进程就会乱套。
每个进程,都有各自独立的内存,进程之间内存地址隔离,进程的资源,比如:代码段,数据集,堆等等,还可能包括一些打开的文件或者信号量,这都是每个进程自己的数据。同时,由于进程的隔离性,即使有一个程序的进程出现问题了,一般不会影响到其他的进程的使用。
进程在Linux系统中,进程有一个比较重要的东西,叫进程控制块(PCB),仅做了解:
PCB是进程的标识,由链表实现,是为了动态的插入以及删除,创建进程的时候,生成一个PCB,进程结束的时候,回收这个PCB。PCB主要包括以下的信息:
进程状态
进程标识信息
定时器
用户可见的寄存器,控制状态寄存区,栈指针等等。
进程怎么切换的呢?
先明白计算机里面的一个事实:CPU运转得超级无敌快,快到其他的只有寄存器差不多能匹配它的速度,但是很多时候我们需要从磁盘或者内存读或者写数据,这些设备的速度太慢了,与之相差太远。(如果不特殊说明,默认是单核的CPU)
假设一个程序/进程的任务执行一段时间,要写磁盘,写磁盘不需要CUP进行计算,那CPU就空出来了,但是其他的程序也不能用,CPU就干等着,等到写完磁盘再接着执行。这多浪费,CPU又不是这个程序一家的,其他的应用也要使用。CPU你不用的时候,总有别人需要用。
所以CPU资源需要调度,程序A不用的时候,可以切出来,让程序B去使用,但是程序A切回来的时候怎么保证它能够接着之前的位置继续执行呢?这时候不得不提上下文的事。
当程序A(假设为单进程)放弃CPU的时候,需要保存当前的上下文,何为上下文?也就是除了CPU之外,寄存器或者其他的状态,就跟犯罪现场一样,需要拍个照,要不到时候别的程序执行完之后,怎么知道接下来怎么执行程序A,之前执行到哪一步了。总结一句话:保存当前程序的执行状态。
上下文切换一般还涉及缓存的开销,也就是缓存会失效,一般执行的时候,CPU会缓存一些数据方便下次更快的执行,一旦进行上下文切换,原来的缓存就失效了,需要重新缓存。
调度一般有两种(一般是按照线程维度来调度),CPU的时间被分为特别小的时间片:
分时调度:每个线程或者进程轮流的使用CPU,平均时间分配到每个线程或者进程。
抢占式调度:优先级高的线程/进程立即抢占下一个时间片,如果优先级相同,那么随机选择一个进程。
时间片超级短,CPU超级快,给我们无比丝滑的感觉,就像是多个任务在同时进行
我们现在操作系统或者其他的系统,基本都是抢占式调度,为什么?
因为如果使用分时调度,很难做到实时响应,当后台的聊天程序在进行网络传输的时候,分配予它的时间片还没有使用完,那我点击浏览器,是没有办法实时响应的。除此之外,如果前面的进程挂了,但是一直占有CPU,那么后面的任务将永远得不到执行。
由于CPU的处理能力超级快,就算是单核的CPU,运行着多个程序,多个进程,经过抢占式的调度,每一个程序使用的时候都像是独享了CPU一样顺滑。进程有效的提高了CPU的使用率,但是进程在上下文切换的时候是存在着一定的成本的。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。