从无限循环来理解操作系统的几个核心概念

类比
1.线程/进程<==>循环执行的函数
    一个个在大循环中的函数,其在逻辑上等价于各个函数内部无限循环,并按一定时间轮换占用CPU。
    各个函数占用CPU的时间之比,为它们各自执行一个循环所需的时间之比。
    通过等价逻辑替换,把外部无限循环替换进内部无限循环,这样各个函数占用CPU的时间就不再由其执行长短确定。再配合一套额外的任务分配机制,对他们的分配将可以自由而灵活,可从由重要性、实时性、任务量等各个角度出发。
    所以操作系统的第一个核心问题是,把任务的表现形式,从大无限循环的内函数,转变为一个个小无限循环的进程或线程。
    第二个核心问题是,为各个进程和线程,分配CPU占用时间。
    第三个问题是,设计任务休眠机制,为处于暂停中的任务保存运行数据。
2.信号量<==>全局变量
    首先声明,信号量和全局变量在功能的实现上起到了相同的作用——使得各个任务相互协作(告知各自的运行状态),共同完成系统的目标。而在操作系统中使用信号量而不是全局变量就是为了应对第一点中的场景,一个大的无限循环,被分解为了很多小无限循环,从而各个任务在“一段时间内”不能独享全部资源。这样情况下,函数所操作的全局变量可能会被其他函数修改,导致运行错误。
    在大循环里的各个任务们就是循环内的一级函数。它们之间各自处理同一系统的不同任务,通过对全局变量的读写,来告知系统中的其他任务其各自的执行状态,并作为其他任务的判断条件。
    由于在同一段时间内CPU总是被一个函数独占,所以不会出现两个函数同时操作一个全局变量的情况。也就是说,在一个函数运行期间,他相当于使用了所有CPU和所有的数据空间,排除少量中断的场景,它所使用的数据不会被其他函数修改。而用少量的中断函数只是用于改变状态(全局变量)而不依据变量执行操作,所有的操作几乎都是可以预计且可靠的。
    用于各个任务间的关联,区别于全局变量的解决方法,通过信号量来传递,避免了任务因为操作同一个全局变量(耦合)而错误运行不可知的代码。

posted @ 2020-08-26 13:37  expertobe  阅读(548)  评论(0)    收藏  举报