进程 进程与线程的历史 计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
在早期的操作系统里,计算机只有一个核心,进程是执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构)的出现,可以满足多个运行单位,而多进程并行开销过大。 这个时候就引入了线程的概念。 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。 线程没有自己的系统资源,只拥有在运行时必不可少的资源。但线程可以与同属于同一进程的其他线程共享进程所拥有的其他资源。
进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
重点: 进程: 优点: 同时利用多核cpu,能够同时进行多个操作 缺点:耗费资源(每个进程内核都要为其开辟线性地址空间,概念清看下面的)
线程: 优点:共享内存,I/O操作可以并发,比如爬虫 缺点:抢占资源,内核会枷锁,容易造成死锁
子进程不是越多越好,跟cpu核数相近或处理速度够快,根据处理速度进行启动,太多的话,除了资源浪费,还有进程上下文切换,cpu的中断interrupt,如果涉及到io操作的话还有模式转换 子线程也不是越多越好,进程上下文切换,cpu的中断interrupt 计算机最小的任务执行单元:线程。说的微线程:协程 后面有介绍,其实就是控制线程的执行位置
主线程 我们创建多线程时候,这些线程都是子线程,那肯定有个主线程的。
进程 和 线程的概念 进程和程序关系
出现内核之后 有内核这个监控调度工具:内核就负责这样几项: 以后这个程序再想执行,是直接向内核注册申请的,内核决定,你可以使用cpu,使用2ms,分配给你,不管2ms以后你有没有结束,都要交给另一个程序。这样轮询交替,让用户看起来是同时运行的。其实在同一时间只能有一个程序来占用一个cpu运行的。 所以,进程的启动调度都是由内核完成的。
线程: thread 一个进程内部有多个执行流来并行操作,但是出现资源争抢线性 线程是一个进程内部的多个执行流 单进程、单线程:一个进程内存空间内有一个执行流。 单进程、多线程:一个进程内的指令集分成多个执行流 不管你的一个进程空间内部有多少个执行流,说白了就是多少个线程,但是你有一个cpu,多个线程没有什么明显的地方,除了麻烦以外。 多个cpu就有好多好处了。
web服务器工作模型及短板。: web服务器:web服务进程。有一个用户访问时,我不能直接访问,否则有问题,那第二个来访问怎么办,只能等着。 怎么办呢?给每个用户生成一个子进程,每个用户一个子进程,一个用户需要10M内存,1000个用户就是10g。还要涉及到进程切换。但是如果访问主页,主页这个内存空间的话,每个用户这一个子进程就要开辟一块,那我们的服务器资源都要撑坏了。所以为了让众多用户共享一个资源来说,我们就要采用线程模型。web服务比如启动一个进程,里面分配多个线程,这样我们就打开一份数据就行了。cpu多的话就好了。 但是多个I/O争用的。虽然我们cpu多个,里面处理数据很快,但是我们网卡就有一个,还是会堵在网卡队列这里。 所以我们要理解原理,我们就知道系统瓶颈短板在哪了。
|