一、进程
1.什么是进程?
进程是操作系统进行资源分配和调度的基本概念,可以说进程是线程的容器,一个进程里包括数据区域和堆栈存储着活动过程调用的指令和本地的变量,进程没运行时候处于没有生命的一个实体的状态,运行时依赖处理器给他活体状,一个进程至少有一个线程,如果没有的话那么这个线程就是它本身。
一、多进程的概念
理论上一个CPU只能给一个进程,如果想一个CPU运行多个进程的话,那就是多进程,就要使用并发技术,实现并发技术非常复杂,说一下简单的并发技术 "时间片轮转进程调度算法" 在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10ms),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,但实际上在任何一个时间内有且仅有一个进程占有CPU。 如果一台计算机有多个CPU,情况就不同了,如果进程数大于CPU数的时候,使用这种并发技术。目前都是几核的CPU都能够处理。
同时,这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
2.什么是线程?
线程是程序执行流的最小单元,一个线程的信息包括(线程ID,指令集合,堆栈组)组成的线程这种单位,上面进程提到进程是线程的一个容器,说明线程运行在进程里面的,那就是运行在进程里面的一个实体,它不拥有系统资源,但它拥有进程的资源。
一、线程的三种状态
1.就绪状态:
是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机的过程。
2.阻塞状态:
是指线程在等待某一个事件(信号量)。
3.运行状态:
是指线程占有处理机正在运行。
二、多线程
同时运行多个线程完成不同的工作,就叫做多线程,使用多线程的好处有:
1.资源利用率更好: 想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景。比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒。处理两个文件则需要14s,在这段时间里,CPU非常的空闲,它可以做一些别的事情,那么我们使用多个线程的话,是不是可以处理文件的同时去读取新的文件,这样就提高了时间效率,
2.程序响应更快:假设做某一个服务的时候,它在某一个端口监听进来的请求,当一个请求到来时,它去处理这个请求,然后再返回去监听。
3.程序设计简单
做多线程的时候运用多线程的技术设计非常简单易用,遵循好一些规则,避免造成阻塞等操作,基本可以很快设计程序的需求。
4.使用场景:
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
三、线程与线程主要依靠什么通信
线程间通信主要通过共享内存
3.什么是协程?
一个程序可以包含多个协程,线程相对独立有自己的上下文,协程也是,但是协程由自己控制,不受操作系统控制,可以不加锁的访问全局变量,所以上下文的切换非常快,可以说是轻量级的线程,也可以说称之为用户级别的线程就叫协程,一个线程可以多个协程,一个进程也可以单独拥有多个协程,线程进程都是同步机制,而协程则是异步。
1.使用场景:
又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。genventmonkey.patchall
多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的,处理磁盘的I/O比较慢,处理网络I/O性能还是比较高。
4.进程线程上下文切换
顺便说一下上下文切换上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。进程上下文切换与线程上下文切换最主要的区别就是线程的切换虚拟空间内存是相同的(因为都是属于自己的进程),但是,进程切换的虚拟空间内存则是不同的。同时,这两种上下文切换的处理都是通过操作系统内核来完成的。
【写在最后】
工作一到五年的程序员朋友面对目前的技术无从下手,感到很迷茫可以加群978730098,领取java相关资料及视频,里面有阿里Java高级大牛直播讲解知识点,分享知识,课程内容都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
最后祝那些积极向上的程序猿们好好学习、天天向上,早日打破牢笼,展望更高层次的世界。