进程(Process)

来源:互联网 发布:全国行政区查询软件 编辑:程序博客网 时间:2024/06/05 17:18

进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。

 

 进程: 进程控制块、程序段、数据段。一个进程由若干个线程(Thread)组成,线程可以帮助应用程序同时做几件事(一个线程向磁盘写入文件,另一个则接受用户的按键操作并及时作出反应,互相不干扰)。并发执行程序:在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径、或任务。

   进程可以划分 运行  阻塞  就绪三种状态。

 

进程的引入:

   多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行行表出现断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程。而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程(Process)”概念。

 

  进程是一个具有独立功能的程序关于某个数据集合的一次运动活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不是程序的代码,还包括当前的活动,是通过程序计数器的值和处理器的内容来表示。

 

 

进程的定义

  进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

 

 注意: 进程是实体。每一个进程都是他自己的地址空间,一般情况下,包括文本区域(text region),数据区域(data region) 和堆栈(stack region). 文本区域存储处理器执行的代码;数据域存储变量和进程执行期间使用的动态分配的内存; 堆栈区域存储着活动过程调用的指令和本地变量。

 二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

 

 

原因

  操作系统引入进程的概念的原因:

  从理论角度看,是对正在运行的程序过程的抽象;

  从实现角度看,是一种数据结构,目的在于清晰地刻划动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。

 

 

 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。  并发性:任何进程都可以同其他进程一起并发执行  独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;  异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进

  结构特征:进程由程序、数据和进程控制块三部分组成。

 

 

 

存储器重的内容包括可运行代码,特定进程的数据(输入、输出)、调用堆栈。诸如进程拥有者和进程的权限集。

 

进程收回处理器:

                      实质上就是把进程存放在处理器的寄存器中的中间数据找个地方存起来,从而把处理器的寄存器腾出来让其他进程使用。那么被中止运行进程的中间数据存在何处好呢?当然这个地方应该是进程的私有堆栈。

 

                       在切换时,一个进程存储在处理器各寄存器中的中间数据叫做进程的上下文,所以进程的 切换实质上就是被中止运行进程与待运行进程上下文的切换。在进程未占用处理器时,进程 的上下文是存储在进程的私有堆栈中的

 

 

 

 

#①当前进程路径

@echo off

  wmic process get executablepath>path.txt

  start path.txt

 

 

 

#当前进程调用的服务

 @echo off

  tasklist/svc

  set /p c=请输入服务名:

  sc getdisplayname %c%

  pause

  %0

 

9 线程调度算法:

      FIFO(First input First Output(先进先出)

 

      RR (时间片轮转算法)

 

      HPF(最高优先级算法) 

 

 

 

普通java线程的线程调度:

  出于缓存性能的原因,Linux尝试在同一个处理程序中执行线程

  线程调度主要使用处理器级别的锁而不是系统级别的锁。

 

  Linux 可以通过让步(调用Thread.yield())自愿的放弃他的时间片。

 

  RT线程

   javax.realtime.RealtimeThread的一个实例。RTSJ要求规范的实现必须为RT线程提供至少28个连续的优先级。--> 实时优先级

 

  RT线程的推动

    JVM还需要对内部线程使用线程使用优先级达到一些特殊目的,比如垃圾收集(GC)

 

  RT应用程序的线程化考虑

   RT线程的新扩展,RTSJ指定了一下工具,用于创建在某个特定或相关时间启动RT线程。你可以创建一个线程,用于在指定的时间间隔或时期运行某种逻辑。你可以定义一个线程,用于未在指定时期完成次逻辑

 

Thread.interrupt() 和pending异常

  AsynchronousEventHandler。您还可以定义线程所能够使用的内存类型和数量的限制,如果超过该限制,则抛出OutOfMemoryError。这些工具只对 RT 线程可用,而对普通 Java 线程不可用。您可以在 RTSJ 中找到关于这些工具的更多信息。

 

 

Thread.interrupt() 和pending异常

  线程返回池中任然随时附InteruptedException。执行线程入池的代码显示的清除异常。

 

 JNI AttachThread()

   java Native interface(jni) 允许使用JNI AttacheThread() API 将使用c代码创建线程加入到JVM中,但RTSJ 并不对JNI接口进行更改或配置以便加入RT线程。因此,应用程序应该避免用c代码创建准备加入到JVM中的POSIX RT线程。反过来,应该在Java语言中创建此类RT线程。

 

  派生线程和RT优先级

      一个线程可以派生另一个线程。在Linux 上,派生进程的原始线程继承派生它的父线程的优先级。如果派生进程是一个jvm,则jvm的原始线程创建时具有RT优先级。比如原始线程的调度优先级比RT 线程低。为了防止这种情况,jvm强制原始线程拥有非RT优先级----sched_other 策略。

 

   派生进程和 RT 优先级

     一个线程可以派生另一个进程。在 Linux 上,派生进程的原始线程继承派生它的父线程的优先级。如果派生进程是一个 JVM,则 JVM 的原始线程创建时具有 RT 优先级。这将与普通 Java 线程的顺序冲突,比如原始线程的调度优先级比 RT 线程低。为了防止这种情形,JVM 强制原始线程拥有非 RT 优先级 —— 即拥有 SCHED_OTHER 策略。

 

Thread.yield():

         Thread.yield() 只让步给具有相同优先级的线程,决不会让步给高于或低于自身优先级的线程。只让步给具有相同优先级的线程意味着在使用多个 RT 优先级的 RT 应用程序中使用 Thread.yield() 可能会出现问题。应该避免使用Thread.yield(),除非完全有

 

NoHeapRealtimeThreads

      javax.realtime.NoHeapRealtimeThread (NHRT) 是 RTSJ 中的另一种新的线程类型,它是 javax.realtime.RealtimeThread 的一个子类。NHRT 具有与我们所描述的 RT 线程相同的调度特征,只是 NHRT 不会被 GC 抢占并且 NHRT 无法读或写 Java 堆。NHRT 是 RTSJ 的一个重要方面,本系列的后续文章中将对它进行讨论。

 

AsynchronousEventHandlers

AsynchronousEventHandler (AEH) 是 RTSJ 附带的新增程序,可将它视为发生事件时执行的一种 RT 线程。例如,可以设置 AEH 在某个特定或关联时间激发。AEH 还具有与 RT 线程相同的调度特征并具有堆和非堆两种风格。

 

 

Java语言同步概况

   。同步的方法和代码块允许线程在入口处锁住特定对象并在出口解锁

 。 Object。waitI() 释放对象锁,线程等待。

 。Object.notify()为wait() 对象的线程解锁。nitifyAll()为所有等待的线程解锁

 

 

 

 

 

 

 

原始线程和应用调度逻辑

 原始线程通常是普通Java线程-----而不是RT线程。第一个RT线程总是普通Java线程创建。如果没有足够的可用处理器来同事运行RT线程和普通Java线程,则这个是RT线程会立即抢占普通Java线程。

 

原始线程和应用程序调度逻辑:

     原始