操作系统(哈工大视频教程)第六讲到第十讲

第六讲 操作系统的历史

伴随着计算机的发展,操作系统随之发展。
(1955-1965)的上古神机IBM7094,造价在250万美元以上,此时的计算机使用原则是只专注与计算,使用批处理操作系统(Batch System),典型的代表:IBSYS监控系统;
(1965-1980)计算机开始进入更多的行业,科学计算(IBM7094),银行(IBM1401),此时需要让计算机做更多事情,进而有了多道程序,逐渐的作业之间的切换和调度成为核心:既有IO任务,又有计算任务,需要CPU处于忙碌状态(这是多进程结构和进程管理概念的萌芽),此时典型的操作系统为 IBM OS/360(360表示全方位服务),开发周期为5000个人年;
(1965-1980)同样随着计算机进入多个行业,使用人数增加,则如果每个人启动一个作业,作业之间需要快速切换,实现分时系统(timesharing)核心任务仍然是切换任务,代表系统是 MIT MULTICS;
(1980-1990)小型化计算机出现,越来越多的个人可以使用计算机,贝尔实验室的 Ken Thompson和 Dennis Ritchi 在一台没人用的PDP-7上开发了一个简化的MULTICS,就是后来的 UNIX,核心概念没变,但是更加的灵活;
(1990-2000)Linux Torvalds 在学习 minix(类似UNIX)时,做出了小Linux并于 1991 年发布,1994 年,Linux 1.0发布,并采用GPL协议;
多进程切换图谱:
在这里插入图片描述
文件操作图谱:在这里插入图片描述

第七讲 我们的任务

在这里插入图片描述
在这里插入图片描述
操作系统允许起来以后,通过对CPU和内存的管理实现多进程的管理,既进程view,通过对终端设备和磁盘的管理实现文件的管理,既FIle View:
在这里插入图片描述
通过fork()接口进入操作系统,结合地址,实现对内存的操作,进而实现多进程;将设备作为文件进行管理,纳入到统一的文件系统,进行文件的管理:
在这里插入图片描述

第八讲 CPU 管理的直观想法

多进程图像是操作系统的核心图像,是管理CPU引发出来的,故从操作系统管理CPU开始切入学习。
CPU的工作原理:自动的取指——执行,既PC获得取出的地址指令之后,接着向下,取指执行。
管理CPU的最直观的方法:给CPU一个地址,既给PC赋初值,既赋一段程序的开始地址,CPU随后依次的取指执行。
正如下图,IO操作所需要的时间远比正常的CPU进行的计算操作慢的多,这里相差10^6倍。这样将非IO操作指令和CPU的其他操作计算指令直接结合在一起,进行依次的取指操作,就会导致CPU的利用率很低。
在这里插入图片描述
要解决CPU的利用率低的问题,就需要CPU能够在多道程序直接进行切换,保证CPU处于忙碌状态,提高CPU的利用率。
在这里插入图片描述
多道程序交替执行成为管理CPU的核心,这样一个CPU上交替执行多个程序,实现并发。
在这里插入图片描述
在这里插入图片描述
要想实现PC的切换,除了需要能够修改PC的值,还需要同时可以切换程序的上下文,既PCB(Process Control Block):
在这里插入图片描述
进程,可以理解为进行中的程序,因为和运行的程序和静态的程序不一样,要想实现程序的切换,就需要记录这些不一样,进而使程序在切换出去之后,还能够切换回来,故引进了“进程”的概念:
在这里插入图片描述
操作系统要管理CPU,那么操作系统首先要使用CPU,操作系统执行一段程序的过程,就是使用CPU的过程,而只执行一个程序,CPU的利用率就会非常低,那么为了提高CPU的利用率,就需要同时执行多个程序,进而交替执行这多个程序。而为了能够顺利的交替执行这多个程序,就需要在程序之间进行切换,要想切得出去的同时又可以切的回来,就需要记录执行中的程序的状态 ,进而引进了“进程”的概念。

第九讲 多进程图像

操作系统让程序执行起来,来使用CPU,但要充分的利用CPU就需要启动多个程序,交替执行。而启动了的程序就是进程,所以是多个进程推进,操作系统只需要把这些进程记录好,按照合理的次序进行推进(分配资源、进行调度),这就形成了多进程图像:
在这里插入图片描述
多进程图像从启动开始到关机结束一直存在(计算机要解决实际问题,需要执行一个任务,而要执行一个任务,落到操作系统里面就是启动一个进程,所以启动一个进程,执行一个任务,解决一个问题,就是对计算机的使用。操作系统通过管理进程进而管理用户对计算机的使用,既用户使用计算机就是启动了一堆的进程,用户管理计算机就是管理这一堆进程):
在这里插入图片描述
多进程的组织:操作系统管理进程的核心是PCB(Process Control Block)结构体,一个CPU在同一时刻只能执行一个进程,其他的进程需要存放在相应的队列:
在这里插入图片描述
多进程的组织:进程的状态分为新建,就绪,运行,阻塞(等待),终止,故操作系统根据进程的状态将进程连接到不同的队列;操作系统对各个进程的状态的切换管理,就是对进程的管理。
在这里插入图片描述
schedule()函数是切换的核心,getNext()是进程队列的调度函数,获得下一个要执行的进程。
在这里插入图片描述
调度算法:FIFO(简单,易于实现,但造成CPU利用率低)和Priority(提高利用率,但可能造成优先级低的进程从不执行 )
在这里插入图片描述
切换:将进程的当前状态进行保存,再将下一个要执行的进程的状态切换成CPU要执行的当前状态
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
多个进程同时存在于内存中,会出现一些问题:
在这里插入图片描述
通过映射表实现内存的分离(物理内存地址是唯一的,但虚拟的映射地址可以重复):
在这里插入图片描述
在这里插入图片描述
多个进程需要相互合作:
在这里插入图片描述
生产者向共享内存中写数据,消费者从共享内存中写数据
在这里插入图片描述
写数据和读数据如果是面向同一块内存,那么需要可以保证正确切换进程的方法,否则会造成数据错乱:
**加粗样式**
使用上锁的方式,是同一段内存的数据在同一时刻只能由同一进程访问,只有该进程释放了该段内存,才允许其他的进程访问该段内存:
在这里插入图片描述
在这里插入图片描述

L10 用户级线程

多进程的基本图像:
在这里插入图片描述
在一个进程下面,生成几个同样可以来回切换的指令,但是不用切换资源,减少切换的时间,这就引入了线程的概念:
在这里插入图片描述
一个进程对应一个地址空间,一个映射表,一套资源,这样一个地址空间的几个执行序列就相当于这个地址空间内有多个线程并发执行:
在这里插入图片描述
以一个浏览器为例,浏览器打开网页时,获取网上内容,加载到本地内存,显示函数将内容输出到显示屏。显然,若要将全部的数据加载到本地后再进行显示,用户等待的时间过长,最好是能够把已经加载的部分先输出到屏幕,这就相当于要对加载数据的内存段进行并发处理,且由于针对相同的一套资源,故使用线程:
**加粗样式**
这里使用的用户级线程,这里的两个核心函数分别是 生成线程的函数和切换线程的函数:
在这里插入图片描述
当并发的线程使用的相同的资源包括栈时,由于弹出序列的错乱,不能够进行合理有序的切换:
在这里插入图片描述
这样提出了每个线程拥有自己的栈,这样在自己的线程中保证栈正确的弹出顺序,以保证指令的正确执行顺序;切换函数保证将当前线程指向到的位置的地址赋值给其TCB的esp变量,并将目标线程的TCB的esp变量赋值给程序的esp变量:
在这里插入图片描述
这样每个栈像进程一样,有自己 的线程控制块TCB(thread control block),自己的栈;线程在创建对应程序序列的线程时,同时将序列的首地址赋值给了该线程的栈,并将该栈的地址赋值给TCB的成员变量esp,以使线程在最开始的时候能够切换进来:
在这里插入图片描述
从上到下的写法:
在这里插入图片描述
用户线程的切换,在同一个进程中,某一个线程阻塞时,可能不会跳转到该进程的另一个线程,而是直接由于进程的切换,而切换到另一个线程中,这就造成了线程的浪费:
在这里插入图片描述
这样,就有了一对一的模式:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值