现代操作系统——并行处理多任务

并行处理多任务

我一直疑惑操作系统究竟是什么?为什么要引入操作系统?Linux是什么?学习Linux学习的是什么?是那些指令吗?还是那些函数(API)?操作系统引入那么多概念是做什么的?
如果用自顶向下的学习方法来回答这些问题,我并不会直接开始将概念,像书中讲的一样,操作系统是资源管家、是程序员的好帮手云云(这已经是很通俗的话来说)但对于初学者来说还是无法深刻的取体会这些话术。
让我们来引入现代使用电脑的一个场景:当我们需要完成一份程序设计作业时,我会打开一个编辑器来编写代码,同时我不懂的地方需要打开浏览器来查询资料,这意味着我需要连网,我害怕无聊还会边听着音乐,甚至查不到的地方,我需要用聊天软件来和老师聊天。这是我们非常非常日常的一个学习情景。但是这究竟是如何实现的呢?学习过c语言的同学们应该都知道,程序是自上向下运行的,也就是同一个时间只能完成一个任务(现如今也是如此,如果你的电脑只有一个cpu的话)。那我们现在使用的电脑,多个程序并行执行究竟是怎么实现的呢?或者说其中的一个策略是什么?
先将上面我们所有的任务剥离出来:

  1. 在编辑器中编辑代码
  2. 打开浏览器查询资料
  3. 用音乐软件听音乐
  4. 聊天软件问问题
    类比为我们看电影,其实电影是由一帧一帧的图片利用人们视觉暂留的特定,快速连续的播放,来让人们觉得视频是动态的,那如果帧率过低,我们就会感觉到卡顿。
    计算机看似并行的处理好几个任务,其实也是采用了这个策略,比如说:检测键盘是否有输入(1ms)浏览器是否有相应(1ms)播放音乐(1ms)…也就是计算机将一个大任务分为了好几个小任务,每个任务执行的时间很短,来让用户觉得多个任务之间是同时进行。也就是宏观并行,微观串行
    现在大家已经把握了计算机基本的处理策略的思想,那么现在用专业的术语来描述上面的一个场景,每个任务我们称之为一个进程,在我们用百度查看视频时可以同时评论作者,同一个进程中多个任务称为线程。那么任务和任务之间是否有执行的优先级?如果有优先级会不会出现某个任务长时间不响应(卡住)现象,那这些任务是由谁来做的?答案就是我们今天的主角:操作系统,操作系统帮我处理好这些细节的内容,让我们不用考虑太多底层的知识,比如:用的是什么芯片、使用什么架构、内部原理是什么样的?操作系统帮我们处理好这些,封装起来供我们使用,也就是我们常说的API。
    这就引入了线程调度的概念,线程调度的意思就是觉得这些任务到底谁先执行、怎么执行,我们上面描述的就是其中一种:时间片轮转法。相应的还有先来先服务、优先级调度、O(n)调度、O(1)调度、完全公平调度…这是更加深入的知识,但是对于初学者,只需要把握住,究竟什么是进程?有个直观的感受而不是背概念。只要有了直观的概念,那么线程、进程调度、同步、异步、死锁…这些概念都可以自然而然的引入。
    一个进程也可能同时完成多件事情,所以引入线程,其实要解决问题的本质是一致的。只是略有差别,那我们经常说的进程同步又是什么呢?想象一下多个任务同时执行,且任务顺序是随机的,会出现什么问题?来考虑一个最简单的场景。比如一个任务输出1,一个线程任务2,一个线程输出3。由于执行的顺序是随机的那可能的输出结果有:123、132、213、231、312、321,这是一个全排列,这不难理解,因为我们完全都不知道执行顺序,所以任何可能的执行顺序都是可能的。这会带来一些很糟糕的问题,虽然能够多任务同时进行了,但是相当于程序顺序执行,我们根本不知道程序会发生什么事情。所以我们需要采用一种策略,使得一个多个进程\线程的运行顺序是固定的。这就需要引入一种机制:锁。当一个锁被一个进程使用,别的进程就无法执行。可以理解为,程序执行之前需要一把钥匙,而这个钥匙只有一把,别人用完你才能用,而程序员来分配这个钥匙到底谁来用。
    比如说一台打印机,微信要用、WPS要用、QQ要用,那三个人同时来用肯定会出问题,所以锁是一种资源保护机制。常见的由读写锁、互斥锁…这里不做一一介绍。有了锁,我们就能保证进程\线程是安全的,但是策略使用不当也会引起死锁的问题,这是因为一个进程完成任务可能不止需要一个资源,比如同时需要:打印机、音响、键盘。那假设说打印机有了,而另外两个没有,但是打印机已经被分配给当前的微信,而另外两个被分配给QQ,QQ也需要打印机才能完成,这就陷入的很尴尬的境地,所以又引入了避免死锁的各种方法,像是银行家算法。
    那任务和任务之间如果需要通信呢?比如我们常用的,从微信转发一条消息给QQ好友,或者用其它应用打开当前应用的一个资源。这又该如何实现,这就涉及到进程通信的问题,进程通信可以使用的方法有:管道、共享内存、信号量、信号…这些方式都有不同的实现方法,操作系统也会为给程序员提供相应的API。
    假如现在正在听音乐,但是来了个电话,我们的手机就会终止听音乐(可能此时你听的正high),这是由于操作系统提供了中断机制。
    现在让我们来复习一下:

为什么需要进程?

我们可能需要同时做多件事情,边听音乐边查资料,用到是不同的应用程序

为什么需要线程?

同一个应用程序可能也需要同时完成多件事情比如一边播放视频一边可以评论

为什么需要进程调度?

不同任务的优先级不同,避免一个一直得不到响应。

为什么要锁?

用来保护资源,让程序更有掌控感,而不是过于随机

为什么需要进程通信?

用来更方便的完成一些特定的需求,使得不同程序之间可以相互配合

为什么需要中断?

可能有些事情很急,但是当前又有任务在cpu中执行。所以就要一种机制让当前正在做的事情停下来

我们为什么需要操作系统?

由于底层的硬件、芯片可能会不同,实现上述概念的具体策略可能会不同,为了让不懂硬件的程序员也可以编程实现很酷的事情,操作系统将操作硬件的部分隐藏起来。想象一下作为一个软件开发人员,你需要在别人的芯片上做以上工作是多么痛苦的一件事,你需要看得懂电路图、寄存器…幸运的是,我们如今站在巨人肩膀上,所以只需要懂得基本的理论就可以使用这些高级的功能。当然操作系统完成的功能不止于此还有内存管理、文件系统、IO设备…而不同的IO设备又有不同的型号,操作系统是个超级庞大的系统,它来实现底层硬件的所有操作,只留下一个接口供程序员使用,这后面当然还涉及十分多的知识,今天的介绍就先介绍到这里,期待下次再见。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值