进程的概念
线程的由来:
有的时候碰着I/O访问,阻塞了后面所有的计算。空着也是空着,内核,操作系统就直接把CUP切换到其他进程,让人家先用着,除了I/O阻塞,还有始终阻塞等等。后来发现太慢了,原因一切换进程就得反复进出内核,置换出一大堆状态。进程数一高,大部分系统资源就被进程切换给吃掉了,再后来就有了线程的概念,意思是:这个地方阻塞了,但还有其他地方的逻辑流可以计算,这些逻辑流式共享一个地址空间的,不用特别麻烦的切换页表、刷新TLB(用于改进虚拟地址到物理地址转换速度的缓存,TLB是一个小的,虚拟寻址的缓存),只要把寄存器刷新一遍就可以了,能比切换进程开销少点
如果连时钟阻塞、 线程切换这些功能我们都不需要了,自己在进程里面写一个逻辑流调度的东西。那么我们即可以利用到并发优势,又可以避免反复系统调用,还有进程切换造成的开销,分分钟给你上几千个逻辑流不费力。这就是用户态线程。从上面可以看到,实现一个用户态线程有两个必须要处理的问题:一是碰着阻塞式I\O会导致整个进程被挂起;二是由于缺乏时钟阻塞,进程需要自己拥有调度线程的能力。如果一种实现使得每个线程需要自己通过调用某个方法,主动交出控制权。那么我们就称这种用户态线程是协作式的,即是协程。
是系统进行资源分配和调度的基本单位。
是操作系统的基础
早期面向进程设计的计算机结构中,进程是程序的基本执行实体
在当代面向线程设计的计算机结构中,进程是线程的容器
主要概念(两点)
一、进程是实体。每一个进程都有自己的地址空间。
包括文本区域:用来存储处理器的执行代码
包括数据区域:用来存储变量和进程执行期间使用的动态分配内存
包括堆栈区域:用来存储活动过程调用的指令和本地变量
二、是一个执行中的程序
程序是一个没有生命的实体,只有处理器赋予程序生命时(就是操作系统执行时),才是一个活动的实体,成为进程
线程概念
是程序执行的最小单元
是进程中的一个实体
是被系统调度和分派的基本单位
是进程内相对独立的执行单位
是系统独立调度和分派CPU的基本单位
一个标准的线程由ID,当前指令(PC),寄存器和堆栈组成
线程本身不拥有资源(只有一点运行中必不可少的资源)
有就绪,阻塞,运行,三种状态
可以与同属一个进程的其他线程共享全部资源
统一进程中的多个线程之间可以并发执行
阻塞状态是指线程在等待一个事件,逻辑上不可以执行
协成概念
一个程序可以包含多个协成,VS一个进程包含多个线程
多线程相对独立,有自己的上下文,切换受系统控制
协成也相对独立,有自己的上下文,但是切换有自己控制,由当前协成切换到其他协成由当前协成来控制
协成的好处:
并发的由来:
多个程序一起运行,或者计算量不叫大就容易死机,于是就有了并发
从程序员的角度可以理解是多个独立的逻辑流,内部可以是多个cpu并行,也可以是一个cpu时间分片,能快速的切换逻辑流,看起来是一起跑。
但是一起运行就有了一个问题,计算到一半,突然别的插入进来,自己处于中间状态,自己用来存储的内存空间被覆盖掉了,所以在跑一个cpu里面的并发都需要处理上下文切换的问题。进程就是这样抽象出来的概念,搭配虚拟内存、进程表之类的东西,用来管理独立的程序运行、切换
后来电脑有好几个cpu,一人跑一个。就是所谓的并行