操作系统【入门篇】

参考博客
MOOC视频

1、什么是操作系统/h2>

操作系统是计算机硬件和应用之间的一层软件

  • 方便我们使用硬件,如使用显存…
  • 高效的使用硬件,如开多个终端(窗口)

image-20221010214800928

主要介绍前五个内容,后三个不涉及。

学习目标:

? 改CPU管理

? 改屏幕输出

? 改系统接口

? 改内存管理

进入操作系统:能理解真实操作系统的运转!

我们要成为掌握计算机关键技术的工程师

Standford操作系统课程中的一句话:(通过编码了解操作系统概念)

计算机存储程序的主要思想:将程序和数据存放到计算机内部的存储器中,计算机在程序的控制下一步一步进行处理

计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器

计算机怎么工作/strong>

四个字——取指执行

先把程序放到存储器里,然后指针指向它,然后就是取指执行。控制器从存储器中取出数据后,分析指令,运算器执行逻辑运算。

image-20221011202613258

image-20221011211855931

各种初始化,永不退出。

mem_init() 初始化页内存

image-20221011213100293操作系统接口连接的不是用户

用户该如何使用计算机呢/h2>
  • 命令行
  • 图形按钮
  • 应用程序

image-20221011214138022

图形按钮又是怎么回事/strong>

image-20221011220437066

4、系统调用的实现

不应该随意访问内核

不能随意的调用数据, 不能随意的jmp/mov(尽管都是在内存中)【是系统调用不是直接函数调用】。这会导致安全和隐私问题,如:可以看到root密码,可以修改root密码,可以通过显存的缓冲看到别人的东西等。而操作系统的调用便正好提供了能够合理进入内核的一种手段。

怎么不让你访问内核

将内核程序和用户程序隔离!!!它把非内核的和内核的东西划分成了用户态和内核态。因此对应的内存中的区域叫用户段和内核段。(通过处理器的“硬件设计”来防止你访问)

image-20221012202519754

整个过程可详细展开为:

image-20221012214027535

image-20221012214248690

了解系统调用的背后发生了什么。

6、CPU管理的直观想法

操作系统正是在管理CPU的时候,引出了多进程图像(操作系统中的核心图像)这个概念。

CPU怎么工作/h2>

工作过程: 将一段程序存放在内存里,设置PC指针的地址,CPU会根据PC指针发出取址的命令,命令通过总线到达内存,内存将PC地址上的指令再通过总线传回给CPU。CPU看到该指令后,CPU便开始执行该指令。

1、CPU上电之后,会去自动的取址—执行。只需要给CPU设置一个PC初值 (一个程序的开始地址),他就会不断的去取址执行。

image-20221013203842228

上述某程序等待文件输出的时候,CPU不会向下执行,可以切到其他程序让CPU继续执行【多道程序同时执行】。

一个CPU上交替的执行多个程序:

CPU工作时是如何来回切换执行多个程序的呢(并发)/h2>

“进程”的概念

在并发的过程时,注意不仅仅修改PC寄存器就可以(还要修改各种命令)显然这种方式不可取,需要记录信息(切出去的时候,这个程序执行到哪里,执行时刻的样子)。因此静态程序和运行的程序不一样(不运行时,就那么多字,但一旦运行起来,随时准备记录切出去时的样子)。

image-20221013210905749

图中,负责记录好进程的便是PCB1,其为process control block进程控制块。

多进程图像从启动开始到关机结束

image-20221013212046608

操作系统通过管理进程来管理用户对计算机的使用。

多进程如何组织/h2>

多进程的组织:PCB+状态+队列(PCB+状态形成不同的队列,放在不同的位置)

操作系统对多进程的感知组织全靠PCB。

image-20221013212957672

多进程如何交替/h2>

交替的三个部分:队列操作+调度+切换

依靠一个函数,叫做schedule(),根据调度getNext()方法,有很多调度算法:FIFO、Priority等)取出来下一个要切换的进程,随后与当前进程进行switch切换switch_to() 方法;切换时,CPU会将当前进程的信息保存在相应的PCB中)即可。

image-20221013215026712

多进程如何影响/h2>

由于多个进程会同时存在内存中,此时他们就有可能会互相影响。例如进程1访问的地址,可能存放有进程2的代码,因此有可能进程1会修改进程2的代码从而导致进程2执行时发生错误。

解决办法:限制对地址的读写(会通过每个进程的映射表,将部分地址映射出去)

多进程的地址空间分离:内存管理的主要内容

image-20221013220916097

多进程如何合作/h2>

典型的生存者-消费者模式

程序不做干预的话,程序可以一直执行下去。

核心在于进程同步(合理的推进顺序),不能进程之间随意切换,会导致执行错误(执行顺序错乱),应该规定好合理的推进时机。
(通过上锁、开锁和检查锁)【加锁、持有锁、解锁,同一把锁只能被一个线程持有】

总结

image-20221015095815131

线程的出现是否实用/h2>

【例子】:浏览器搜索会发生什么/p>

image-20221015101408626

其Create(需要创造出第一次切换时应该的样子)之后,就靠Yield来交替切换线程执行。那么核心其实就是Yield(要知道切换时需要是个什么样子)。【先切出去再切回来来回切换】

Yield是如何做到线程切换的/h2>

多个线程能共享一个栈吗/strong> 答案是不可以。

执行函数要将此时地址压栈,如下图,执行到最后会发现,栈中最后的地址是404,后面开始出栈操作,弹出404不是我们期望的204地址不就出问题了吗(也就是说,跑到人家线程里去了,这种情况就不太好回到我们切换前的线程了)。

image-20221015104015159

因此,

再看看ThreadCreate做了什么/strong>

ThreadCreate的核心就是用程序做出这三样东西申请栈、申请TCB、func等入栈、关联TCB和栈

image-20221015105331754

为什么说是用户级线程——Yield是用户程序

因为Yield是用户程序。它是用户程序里面的线程不断切换(在用户态中来回切换)。有其优点也有缺点,缺点:由于线程都是在用户段的,其内核感知不到该进程有多个线程。当浏览器整个进程在调用网卡IO等待的时候,内核会自动切换到另一个进程。因此一旦内核阻塞,其用户部分的多线程根本没有并发性的效果,因为本身CPU已经不在当前进程工作了。

image-20221015110752053

9、内核级线程

处理器的多核能工作,都依靠核心级线程。由下图也可以知道,多核处理器中共用一个MMU(MMU就是映射),这正是符合线程共享资源的定义。多核的多个CPU能够并行执行

image-20221015124442833

用户栈和内核栈之间的关联

一旦出现了中断(int 0x80)进入了内核,便会启用内核栈。此时计算机硬件寄存器会根据用户栈找到其对应的内核栈,并会将用户程序和用户栈的一些寄存器值压入内核栈。当结束中断时,会弹出内核栈的内容,从而恢复至用户态继续执行。

image-20221015155343568

内核线程switch_to的五段论

内核线程切换,核心栈切换

image-20221015163646593

10、内核级线程实现

进程里面的执行序列其实就是内核级线程

,两套栈之间的切换

image-20221015181522247

第二三四段

当其状态阻塞或者时间片不够的时候,则会发生schedule,内核栈便开始发生切换。

第五段

最后一段就是中断返回,将压入内核栈和system_call中存储的各种状态进行pop弹出 返回,iret返回对应的用户态

11、CPU调度策略

image-20221018232439942

image-20221018233338473

各种CPU调度算法

各个任务到达时间及耗时情况

image-20221018234347891

可以让CPU区间短的作业优先执行,短作业就可以提前结束,短作业周转时间就会变小,短作业就会比较满意,在整体系统中,有短作业也有长作业,短作业整体满意度上升,系统整体满意度也会上升。可以证明,该算法可以达到最短的周转时间。但与此同时,响应时间可能会变长(如下图),也许你一开始点了个鼠标,但由于你的任务比较耗时,因此被排到最后执行,最开始点击反而最后执行,用户体验就会很差。

image-20221018235739003

image-20221019001441931

因此为了解决上述问题,后台的任务优先级应该动态升高,不能一味的只执行前台任务需要适当的执行后台任务,并且为了照顾到各自的响应时间情况,应该前后台任务都用时间片。下文将介绍一个完整的不错的调度算法。

12、实际的schedule函数(linux 0.11调度函数)

找到next,然后switch_to(next)

image-20221019224321160

时钟中断中counter每次都–,当减为0时,就进行调度。所以counter是典型的时间片,所以是轮转制度,保证了响应。

counter的另一个作用: 优先级

image-20221020214315117

第一条:其时间片最长也就是2P,所以是可以保证有限时间的。也就是上面为什么除以2,而且右移一位对于硬件运算来说是非常快的(其实除以几都ok,但是右移动一位最快,而右移动一位正好是除以2)

第三条:时间片会不断轮转,这样还是短作业的先完成(时间片用光了就复位,肯定短作业先完成),因此近似SJF。

13、进程同步与信号量

进程合作:多进程共同完成一个任务

进程同步—让多进程之间进行地合理有序,其依靠的工具就是信号量

经典生产者-消费者实例,。

image-20221021205158769

只发信号还不能解决全部问题,两个生产者对应一个消费者就会出现以下问题,导致P2不会被唤醒。因此单纯依靠counter这种语义判断是不够的,因为它仅知道有生产者在睡眠但是不知道到底有几个生产者在睡眠。

image-20221021211631738

sem为负几就代表有几个生产者正在睡眠等待。

看到信号量是负的,代表在等待资源,因此此时可以wakeup(包括信号为0)(产生资源,其加1)也可以sleep(消耗资源,其减1)。看到信号量是正的,便无需操作,可以运行。

看如下问题:

image-20221021215250474

临界区(Critical Section)

临界区: 一次只允许一个进程进入的该进程的那一段代码

一个重要的工作:

image-20221021220039677

临界区代码保护原则

  1. 互斥进入
  2. 有空让进
  3. 有限等待

image-20221021220542780
  • P0进程执行完turn=1,P1进程完全可以不执行(例如阻塞),P0完成后不能接着再次进入,尽管进程P1不在临界区…(不满足有空让进)

标记法

image-20221021221750359

非对称标记

关键: 选择一个进程进入,另一个进程循环等待

image-20221021222307494

多进程怎么办/p>

面包店算法

面包店算法——仍然是标记和轮转的结合

如何轮转: 每个进程都获得一个序号,序号最小的进入。
如何标记: 进程离开时序号为0,不为0的序号即标记

image-20221021224312029

硬件提供命令关中断,开中断;问题是在多核CPU的环境下不好用,因为关中断也只能关掉当前进程的中断,其他的CPU是不理会的,也就说其他的进程有可能再引起竞争条件!

临界区保护的硬件原子指令法

通过一个原子指令实现一个1的锁信号量,用其修改一个整型变量,根据这个变量,再来判断要不要进入临界区。因此,修改这个变量的过程要求一步完成(硬件帮忙、原子操作),中间绝不能被打断

image-20221025202911515

死锁处理方法

死锁预防

破坏死锁出现的条件

方法例子:

  1. 在进程执行前,,不会占有资源再去申请其它资源(缺点:需要预知未来,编程困难;许多资源分配后很长时间后才使用,资源利用率低)
  2. 对资源类型进行排序,,不会出现环路等待(缺点:仍然造成资源浪费)

死锁避免

检测每个资源请求,如果造成死锁就拒绝

每次请求不做任何要求,可以随便申请,但是每次请求需要算一下判断此次请求是否会引起死锁

怎么判断呢要算法——银行家算法

安全状态: 如果系统中的所有进程存在一个可完成的执行序列P1,…Pn,则称系统处于

银行家算法: 找安全序列的银行家算法(Dijkstra提出)

算法过程: 其算法如下:就是不断对比工作向量Work和需要的资源量,分配后再加进程结束后归还的已分配资源,再去比较下一个需要分配的资源类,查看是否可以找到一个安全状态的可执行序列。(m是资源个数,n是进程个数,因此时间复杂度是较高的)

image-20221025210435124

16、内存使用与分段

如何让内存用起来/h2>

将程序放到内存中,计算机不断从内存中取值执行,内存就被用起来了。

内存使用:将程序放到内存中,PC指向开始地址

重定位:

重定位: 修改程序中的地址(是相对地址)

在内存使用过程中,当遇到指令call 40(40刚好是main函数地址)时,理论上,存放main函数的物理地址就应该是40,但是如果这样很明显可能与其他程序中的40地址相等造成冲突(而且OS放在低位的地址上),因此应该找个空闲的地址开始存放,同时把40当作一个逻辑地址,同时找到空闲的地址,将该逻辑地址修改为物理地址(即如下图将40改成1040这个过程就是重定位)。

image-20221025213937102

因此,在运行每条指令时才完成重定位(地址翻译)。

image-20221025220359435

引入分段: 是将整个程序

来源:Geek!

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年10月2日
下一篇 2022年10月2日

相关推荐