进程和线程

1 篇文章 0 订阅

基础概念

  • 程序是为了完成某个特定任务,使用某种计算机语言编写的一组指令的有序集合
  • 进程是具有一定独立功能的程序的运行过程,是系统进行资源分配和任务调度的一个独立单位
  • 线程是进程中的一个独立执行线索,是CPU调度和分配的基本单位,自己基本上不拥有系统资源

进程

每个进程都有独立的代码和数据空间,进程切换成本较高,一个进程中可以包含1-n个线程,进程是资源分配的最小单位

同一个进程中的线程可能会有共享代码,可以共享进程的数据空间,每个线程由独立的运行栈和程序计数器,线程切换的开销很小,线程是CPU调用的最小单位

启动进程

进程和线程一样分为5个阶段:创建、就绪、运行、阻塞和终止

cmd /c启动运行名称后会关闭关闭窗口

启动方法1
ProcessBuilder builder=new ProcessBuilder("cmd","/c","ipconfig/all");//构建进程的对象
Process process=builder.start(); //启动进程
//获取ipconfig/all命令的执行结果
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
String tmp=null;
while((tmp=reader.readLine())!=null)
	System.out.println(tmp);
启动方法2
String cmdStr="cmd /c ipconfig/all";
Process process=Runtime.getRuntime().exec(cmdStr);
//用于获取ipconfig/all进程的执行结果
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
String tmp=null;
while((tmp=reader.readLine())!=null)
	System.out.println(tmp);
应用

考试系统中生成java代码文件并编译运行

//生成T1.java文件
File f=new File("T1.java"); //这个类名称也可以通过用户输入查找到
if(f.exists())
  	f.delete(); //如果T1.java已经存在则删除旧有文件
PrintWriter out=new PrintWriter(new FileWriter(f));
out.println("public class T1 {");
out.println("public static void main(String[] args)throws Exception {");
out.println("System.out.println(\"Hello java!\");");
out.println("}}");
out.close();
//编译T1.java,对应的命令为javac T1.java
Process process=Runtime.getRuntime().exec("cmd /c javac T1.java");
boolean runnable=true;
//process.getInputStream()获取获取所执行进程的输出信息,注意不是报错信息。如果需要获取报错信息则应该使用process.getErrorStream()。注意javac编译器编译通过实际上是没有响应信息的
BufferedReader br=new BufferedReader(new InputStreamReader(process.getErrorStream()));
while(true){
  	String tmp=br.readLine(); //整行读取javac编译的报错信息
  	if(tmp==null)
    	break;  //如果没有报错信息则直接退出循环
  	System.out.println(tmp);
  	runnable=false; //告知系统编译失败
}

//如果编译通过则调用解释器java执行T1.class
if(runnable){
	process=Runtime.getRuntime().exec("cmd /c java T1");
  	br=new BufferedReader(new InputStreamReader(process.getInputStream()));
  	//输出执行结果
  	while(true) {
    	String tmp=br.readLine();
    	if(tmp==null)
      		break;
    	System.out.println(tmp);
  	}
}

进程三大特征

独立性:进程是一个能够独立运行的基本单位,是系统资源分配和调度的独立单位

动态性:进程的实质就是程序的一次执行过程,动态的产生、动态的消亡

并发性:任何进程都可以同其它进程一起并发执行

僵尸进程和孤儿进程

僵尸进程就是当子进程比父进程先结束,但是父进程没有回收子进程,并没有释放子进程所占用的资源。

  • 父进程先退出,子进程会给init进程接管,子进程退出后init会回收子进程所占用的相关资源
  • 是对系统资源的浪费,测试人员有业务发现,需要处理解决

孤儿进程就是当父进程退出,而多个子进程还在运行

  • 孤儿进程会被init进程管理,并由init进程对其进行状态收集工作
  • 没有什么危害

并行与并发

并行是指多个CPU或者多台机器同时执行一段处理逻辑,是真正的同时执行

并发是指通过CPU调度算法,使用户看上去似乎是在同时执行,实际从CPU操作层面上不是真正的同时执行

主线程

线程是进程中的一个实体,用来描述进程的执行,负责执行包括在进程内部地址空间中的代码

创建一个进程时,它的第一个线程称为主线程,是由系统自动生成的

  • 主线程是产生其它子线程的线程
  • 通常都是最后执行完成的,因为还需要它来执行各种关闭动作
public class Test1{
	public static void main(String[] args)throws Exception{ //当java程序运行时,首先创建一个运行main方法的线程---主线程
    System.out.println(Thread.currentThread().getName());//获取运行main方法的线程名称
		//在主线程内容可以启动子线程
		Thread t=new Thread(){
			public void run() {
        System.out.println(Thread.currentThread().getName());
      }
		};
    t.start();//启动线程t的运行
    System.in.read(); //阻塞当前main线程
	}
}
进程中线程之间的关系

一个进程中的线程之间没有父子关系之分,都是平级关系,所有线程都是一样的,一个退出不会影响另外一个。但是在主线程中执行完毕可以使用System.exit(int)强制结束当前进程,exit方法会使整个进程停止,那么所有的线程都会自动退出

进程 vs 线程
  • 一个线程只能属于一个进程,而一个进程可以包含多个线程,至少有一个线程(主线程)
  • 资源调度和分配给进程,同一进程中的所有线程共享该进程的所有资源
  • 线程在执行过程中,共享数据一般都需要进行协作同步
  • CPU分给线程,真正在处理机上运行的是线程
  • 线程是指在进程内部的一个执行单元,也是进程内的可调度的实体,两者都是动态的概念

进程和线程最大的区别在于:进程是由操作系统来控制的,而线程是由进程来控制

线程本身的数据通常只有寄存器数据以及当前程序在运行时使用的堆栈,所以线程的切换比进程切换的成本要小的多。

多个进程的内部数据和状态是完全独立的,而同一个进程内的多线程共享一块内存空间和一组系统资源,有可能互相影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的进程线程有以下几个区别: 1. 数据结构:在Linux中,线程是通过进程模拟出来的,没有真正意义上的线程数据结构。而在Windows中,操作系统线程创建了thread_struct数据结构,因此有真正意义上的线程。 2. 执行流:在Linux中,每个线程实体对应着操作系统下的一条执行流,通过PCB(task_struct)来模拟。而用户态下创建的线程是通过线程库(pthread_struct)来进行管理。 3. 标识作用:在Linux中,轻量级进程ID(tid)对不同的线程起标识作用,操作系统在进行调度时使用tid。而进程ID(pid)对不同的进程起标识作用。在只有一个线程进程中,tid的值等于pid的值。 4. 线程私有部分:线程私有部分包括运行时栈、一组寄存器/硬件上下文/任务状态段等。 5. 多线程提高效率:多线程能够提高效率的原因是多核和单核环境下的不同。在多核环境下,多线程可以将庞大的任务分成若干份,并交给不同的线程进行处理,同时执行不同步骤的代码,从而提高效率。而在单核环境下,多线程并发执行,使用线程切换来提高整体代码的运行效率。 6. 进程线程的区别:进程是程序运行的实例,是系统分配资源的基本单位,拥有独立的地址空间;线程进程中的一条执行流,是CPU调度的基本单位,共享同一地址空间。创建和撤销进程的开销大于线程,不同进程间不互相影响,而一个线程挂掉可以将整个进程挂掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值