进程AND线程

之间面试被问到进程和线程,以及进程之间通信,答得很差,下面做些整理:
进程是一个具有独立功能的程序关于某次数据集合的运行活动,是操作系统分配资源的基本单位。
线程:一个进程中包含若干个线程,线程是独立运行、独立调度的基本单位。
简单来讲就是:进程是程序在计算机上的一次执行活动,当你运行一个程序时,就启动了一个进程;而线程可以说是一个程序中独立运行的程序片段,是进程中独立执行的一个单元执行流,是程序执行的最小单位。


进程&线程区别:

①进程是资源分配的最小单位,线程是程序执行的最小单位
②一个程序至少有一个进程,一个进程至少含有一个线程;
③线程是属于进程的,线程运行在线程空间内,当进程退出时,进程所产生的的线程都会被强制退出和清除;
④进程有自己的独立地址空间,每启动一个进程,系统为其分配地址空间,线程没有独立的地址空间,线程与属于同一进程的其他线程共享进程拥有的全部资源,但其本身基本上不拥有系统资源,只拥有程序运行时,必不可少的信息(程序计数器、一组寄存器和栈);
⑤创建一个线程比进程开销小快,线程占用资源比进程少,CPU切换线程比进程花费小,线程之间的通信更方便,多进程程序更安全,一个进程死掉不会对其他进程产生影响(因为进程有独立的地址空间),而一个线程死掉整个进程就死掉了(共享地址空间);
⑥进程和线程在执行过程中有所区别:每个进程都有自己的程序运行入口,程序执行序列,程序出口,但线程不能独立执行,必须依存在应用程序中,有应用程序提供多个线程执行控制;
⑦一个程序中多线程指多个执行部分可以同时执行,但是操作系统并没有把多个线程看做多个独立应用来实现进程的调度管理和资源分配。

并发技术:

在同一时间一台计算机上是允许多个进程处于运行状态的–多任务,现代的操作系统几乎都是多任务管理系统的,能够同时管理多个进程的运行,然而一个CPU只能分配一个进程,通常一个计算机上只有一个CPU,那么如何做到一台计算机上同时运行多个进程,就必须使用并发技术。并发技术较容易理解的就是:“时间片轮转进程调度算法”,就是在操作系统的管理下,多个线程轮番使用CPU,每个进程占用CPU的时间非常短,不易察觉,就好像所有进程都在不断的运行,实则在任何时刻都是一个CPU占用一个进程。
如果一台计算机上有多个CPU时,就不同了,当运行进程数<CPU数,每个进程占用一个CPU,可以实现真正的进程同时运行(并行),但当进程数>CPU数,仍然要用到并发技术。


线程之间通信
Java中创建线程的方法:

1.继承Thread类创建线程类:定义Thread类的子类,重写run方法–>创建Thread子类实例–>调用线程对象的start()方法;
2.定义Runnable接口的实现类,重写接口的run方法–>创建Runnable实现类的实例,并用该实例作为Thread的Target来创建Thread对象–>调用线程对象的start方法启动线程;
3.通过Callable和Future创建线程(不常用)
总结上面的方法主要是:继承Thread类&实现Runnable、Callable接口的方式来创建线程
两种方法:继承Thread类的方法:编写简单,但是已经继承了Thread类不能再继承其他类,访问当前线程时直接this即可;
实现接口的方法:编程稍微复杂,但是只是实现了接口,还可以继承其他类,访问当前线程时,需要通过Thread.currentThread()方法,此外多个线程可以使用同一个Target对象(适合在需要用多个相同线程来访问同一资源时使用)。

线程的六种状态

Java中线程的状态分为6中:
1.初始(NEW):新创建Thread对象还没有调用start方法时;
2.运行(RUNNING):包括就绪(ready)和运行中(running)两种状态,当Thread对象调用start方法后就进入ready转台,线程此时位于线程池,等待被线程调度选中,ready状态的线程在获取CPU时间片后进入running的状态;
3.阻塞(BLOCKED):线程阻塞与锁(常用synchronized);
4.等待(WAITING):(wait join方法调用时)进入该状态的线程需要其他线程做出一些特定动作(通知或中断);
5.超时等待(TIMED_WAITING):(例如:sleep方法调用时)与WAITING不同的是超出时间会自行返回;
6.终止(TERMINATED):线程执行完毕。

线程池?
我们在创建启动线程时,是通过Thread的start方法来启动线程的,但是在实际开发中如果每个请求到达就创建一个线程,开销很大,服务器上创建销毁线程花费的时间消耗的资源都是相当大的,而且活动的线程也会消耗大量的资源,如果同时创建过多的线程,系统过多的消耗内存,使系统资源不足,于是引入线程池。线程池其实就是对多线程的一个管理,不用手动维护,通过有限固定的线程提供大量操作服务,减少创建销毁线程的消耗。
合理使用线程池的好吃:
1.减低资源消耗:重复利用已创建的线程,较少创建销毁线程消耗资源;
2.提高运行速度:任务到达时,可以不必等到创建线程就能立即执行;
3.提高线程的可管理性:使用线程池对线程进行统一分配调优监控。

线程之间如何通信?

常用的方法:
1.synchronized关键字:多个线程访问同一个变量时,谁先拿到锁,谁就获得访问权限,运行该线程,其他线程进入阻塞状态;
2.wait/notify机制


进程
进程之间如何通信?

进程之间通信先简单了解一下:

  • 无名管道:半双工,数据只能一个方向上传输,只能在亲缘关系的进程(父子进程)间通信使用。
  • 命名管道:半双工,能在无亲缘关系的进程之间通信。
  • 信号量通信:常作为锁机制,防止某个进程正在访问共享资源时,其他进程也访问该资源。主要作为进程间以及同一进程中多线程之间的同步手段。
  • 信号:通知接收进程某件事情已经发生。
  • 消息队列:一系列保存在内核中消息的列表,用户进程可以向消息队列中添加消息也可以向消息队列中读取消息。
  • 共享内存通信:最快,效率高。共享内存允许多个进程共享一个给定的存储区,这个存储区可以被映射到各自的地址空间,一个进程写入内存的信息,其他进程可以通过内存读取读出,实现进程之间的通信。
  • Socket套接字:用于不同机器之间进程通信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值