目录
拿餐厅吃饭举例子,餐厅来了三个客人,有这些菜的需求
- 串行:就是这个餐厅只有一个厨师,想要满足3个客人的要求,只能一道一道的去做菜,先满足完你的三道菜的需求,才能去满足我的三道菜的需求。这种按顺序一道一道满足的模式就是串行处理方式
- 并行:这个餐厅有三个厨师,每个厨师去服务自己的客户,这样就是同时满足三个客户的需求,这种处理模式就是并行处理方式
- 并发:餐厅还是只有一个厨师,但是我给其中一个客户做了一道菜,然后就转向给另一个用户做菜,按照一种时间片的概念去处理,每个时间片可能处理的事情是不一样的
- 如果厨师做菜的速度非常快,1分钟就能出一道菜,那么我上了一道菜,然后过了3分钟又出了一道菜,那么在现实生活中,我们就会感觉这个厨师就是专门在为我们服务,将这种思想用到计算机中,我们知道CPU的处理速度是非常快的,基本是以ns为单位的处理速度,所以在CPU在并发的执行计算机任务,在我们主观的意识中,我们就感觉这个CPU是在并行的处理任务
什么是程序
程序就是一系列有组织的文件,封装操作系统的各种API,实现不同的效果(程序就是指令序列,程序的代码放入程序段中,输出和输入的数据放入数据段中),比如QQ就是一个程序
什么是进程
进程就是程序执行的一次执行过程,是系统进行资源分配的一个独立最小单位(资源指CPU,内存等关键系统资源)
比如我登录了两次QQ,那么我在后台任务管理器,出现了两次QQ的进程,每个进程都是QQ执行的一次过程
为何引入进程
因为当代操作系统都是具有多道程序技术实现并发处理,在内存中会放入多个程序,那么会存在多个程序段和数据段,操作系统如何正确找到对应的程序和数据段,所以引入了进程的概念(为了使程序可以并发的执行,并且可以对并发执行的程序加以描述和控制)
进程和程序的区别
- 进程是动态的,程序是静态的
- 进程可以并发执行,但是程序不可以
- 二者无一一对应的关系
- 进程与程序又有密切的联系: 进程不能脱离具体程序而虚设, 程序规定了相应进程所要完成的动作。
- 组成不同。进程包含PCB、程序段、数据段。程序包含数据和指令代码。
- 程序是一个包含了所有指令和数据的静态实体。本身除占用磁盘的存储空间外,并不占用系统如CPU、内存等运行资源。
- 进程由程序段、数据段和PCB构成,会占用系统如CPU、内存等运行资源。
- 一个程序可以启动多个进程来共同完成。
例子
什么是线程
现代操作系统都是多线程操作系统,线程就是进程的一个子任务,进程就是轻量级的进程
我们打开的浏览器这个进程,然后每打开的一个网页都是独立的线程,每个线程都可以执行一个子任务
为什么引入线程
有些进程可能需要“同时”做很多事,但是传统的进程只能串行得与执行一系列程序(比如你在使用QQ时,你登陆了账号,相当于创建了一个进程,你可以一边打字,一边视频聊天,这些是“同时”进行的,但是传统的进程是不能实现这样的功能,所以引入线程,加快并发的速度)
- 如果说在OS中引入进程的目的是为了使多个程序能够并发执行,比提高资源利用率和系统吞吐量,那么在OS中引入线程,是为了减少程序在并发执行时所付出的时间和空间开销,让OS具有更好的并发性(让进程并发得完成多种功能)
- 引入了线程之后,进程是除CPU之外系统资源的分配单元,如打印机,内存空间都是分配给进程的
- 引入了线程之后,不仅程序能够并发执行了,进程也能并发执行了,从而提高了系统并发度
线程和进程的比较
- 进程是OS资源分配的基本单位,线程是调度的基本单位
- 创建和消耗进程的开销远远比创建和消耗线程大的多
- 调度一个线程比进程快的多
- 进程包含线程,每个进程至少包含一个线程(主线程)
- 进程之间相互独立,不同的进程不会共享内存空间,但是同一个进程的线程会共享内存空间(共享进程的资源),线程几乎不拥有系统资源
- 在多CPU操作系统中,不同的线程可以去占用不同的CPU
- 同一进程的线程切换不会导致进程切换,但是不同进程的线程切换,会导致进程的切换
- java 主类名称 启动的是JAVA进程
- 类中的主方法是这个类的主线程
线程是操作系统中的概念 . 操作系统内核实现了线程这样的机制 , 并且对用户层提供了一些 API 供用户使 用( 例如 Linux 的 pthread 库 ). Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装