面对多任务处理、程序员是怎样榨干计算机资源的

 

你是否经常遇到这样的问题?“进程和线程有什么区别?请简述下对协程的认识?”等等。

当然这些问题可谓是老生常谈。但是我想,如果我们从计算机发展史的角度,回答这些问题,会不会更容易让人理解呢?

 

1. 批处理操作系统

故名思意,这个时期的操作系统非常简单,同一时间只能处理一个任务/作业。把作业载入到内存中,这个处理完了,再处理下一个,一批一批的串行执行。这个时候,就没有什么进程、线程的概念了。因为IO设备比CPU慢太多了,所以它的缺点也很明显,CPU使用率不高,很多时候都是处于空闲状态。比如有两个任务A和B,其中A的IO操作时间为100s,CPU计算时间为10s;B的IO操作时间为10s,CPU计算时间为100s.那么它们之间的总耗时式 A(100s+10s) + B(10s+100s)=220s,CPU使用率只有50%。

 

2. 多任务处理系统

这个时候,多任务处理系统就被提出来了。原理简单说就是,A任务在等待IO的时候,让出CPU给B或者其他任务。那么这里面的难题就是,作业之间怎么切换。具体说来分为三个问题:

1. 多个程序(任务/作业)进入到内存中,操作系统要解决好空间分配的问题,程序之间内存空间应该独立无干扰——虚拟存储器

2. CPU控制权怎样分配和转移

3. 共享设备的管理,多个程序访问同一个设备时,如何解决冲突

这里正在运行的程序可以理解为是一个进程。进程需要内存地址空间,如下图

 

3. 分时操作系统

上述操作系统的缺点非常明显,只能处理一个用户的任务。如果又增加了一个用户,那就得新增加一台机器,这个成本就很高了。那么如何支持多用户呢,方法就是CPU时间分片,分成很短的时间片给不同的用户,这样在感知上,仿佛同一时间内,多个用户的任务在同时进行。于是就演化出了现在分时多任务多用户的操作系统linux。

 

4. fork和写时复制技术

如果用户有多个类似的任务,比如都是从某个文本文件中查询关键字,那么启动两个任务时,这两个进程之间是有很多相同的内存段。如果每启动一个查询任务就从磁盘上加载程序来启动一个进程,效率是很低的。通过复制已经存在在内存中进程地址空间可以提高效率,毕竟内存的访问速度要比IO快的多,这就是fork。fork可以会产生一个和父进程完全相同的子进程。在多数应用中,父子进程之间很多相同内容的内存是不会改变的,于是为了提高节约内存,引入了“写时复制“技术,即只有进程空间的某段内容要发生变化时,才会将父进程的内容复制一份给子进程。当然,进程之间的地址空间从逻辑上还是相互独立的,只是物理层面做出了优化。

 

5. 轻量级进程(light weight process)——线程的引入

前面所讲的进程,做为资源(PCB、IO、内存等)的拥有者,在创建、切换、撤销等操作中有很大的开销。假设父进程fork出N个子进程,那么它们的并发程序是有所限制的。于是为了减少开销,操作系统把进程作为资源分配单位和调度单位这两个基本属性给分离开了。即进程还是资源分配单位,但是调度单位由线程来替代。那么线程拥有的资源就轻很多了,其中包括包括保存线程状态的寄存器、函数栈、线程优先级、专用变量、信号屏蔽等。一个线程需要依附进程,线程可以访问进程的内存地址空间。线程状态分为执行、阻塞、等待,CPU调度起来更轻盈,能更好的发挥多处理器机器的性能。

 

6. 把任务放到用户态来管理——协程

线程是CPU调度的基本单位,也就是说线程是内核来调度的,需要切换到内核态。并且如果线程之间有共享资源,加锁的话,那效率会更低。这个时候协程就登场了,协程在用户态进行调度,并且它在一个线程中执行,不存在资源访问的冲突,也就没有锁,执行效率自然就高了。一个协程可以简单理解成一个函数或者一个执行过程,协程也是有调度器的,协程之间切换,调度器保存和恢复它的上下文(寄存器状态)。

线程处理任务:当一个线程在等待IO的时候,比如读取每个文件的数据时,会阻塞当前线程(因为IO比较慢,这时CPU会空闲)切换到其他线程,阻塞IO这段时间,CPU可以执行其他线程任务,这个过程是用户不可控的,由内核来调度的。

协程处理任务:当一个协程等待IO时,协程调度器会“阻塞”协程,即保存协程的上下文,调度执行其他协程,恢复其他协程的上下文,继续执行。整个过程还是在原线程中,没有发生系统调用,没有发生到内核态的切换操作。

通过这个例子,我们也能看出协程其实非常适合IO密集型的场景。但对于CPU密集型的场景,其实优势不大。

 

总结:

不管是进程、线程、协程都是用来处理用户任务的。他们的发展历程,也是前辈们对程序优化的精益求精来解决不断增长的业务需求的结果。不过线程并非在所有场景下都比进程方案要好,比如单核单机系统。协程也只是适合IO密集型的场景,并不能完全替代线程。

有时候也在思考一个问题,如果存储技术突飞猛进,磁盘IO的访问速度和CPU的寄存器一样快或者说在能一个数量级上的话,这些技术还会那么重要吗?

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值