操作系统(哈工大李治军老师)2

L9

多进程都放在内存中,会出现问题。就把进程2的东西修改了。
在这里插入图片描述
解决的办法:
限制对地址100的读写
多进程的地址空间分离:内存管理的主要内容

通过映射的方法,这边是内存管理的内容。映射表是内存管理的核心。
在这里插入图片描述
访问的【100】不是真实的内存,是映射表

每个进程都有一个映射表
在这里插入图片描述

逻辑地址和物理地址

多进程合作:
在这里插入图片描述
问题:
有人向里面放东西,有人取东西。假设进程1,2都看到7这边可以放,但是交替执行导致1没放完,2就也往里放,所以7这边就乱套了
在这里插入图片描述
buffer是共享缓存区,缓存区满了就不能往里放了
交替执行会出现乱套的情况。
在这里插入图片描述
切换的时候必须要合理的推进顺序

在这里插入图片描述
不能随便的切换,要控制切换的时机

在这里插入图片描述

L10 用户级线程

进程A切换到进程B除了切换指令,还要切换映射表

问题:
能否在一个资源下启动多个指令,还可以来回切。不切换映射表(内存)不需要

回答:
引入线程
进程 = 资源 + 指令执行序列
将资源和指令执行分开
一个资源+多个指令执行序列在这里插入图片描述
线程:映射表不动,只有指令切换(PC指针变),没有内存切换,这就是分治。

线程既有多段程序交替执行,切换起来又快,既保留了并发的优点,又避免了进程切换的代价

扫描二维码关注公众号,回复: 12687860 查看本文章

线程,有时被称为轻量进程,是程序执行流的最小单元。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

在这里插入图片描述
如果是顺序程序,就是先下载数据,后面显示文本,这样的话,屏幕在一定时间内什么都没有。
为什么说是线程不是进程呢?因为没有切换内存。

线程必须要同时触发,并且交替执行。

在这里插入图片描述
在这个例子中,create完成了同时触发,需要用yield函数实现主动切换

在这里插入图片描述
yield函数需要实现切换和返回
在这里插入图片描述
两个执行序列不能使用一个栈
在这里插入图片描述
两个线程要使用两个不同的栈
问题:
栈怎么切换?
回答:
使用TCB(线程控制模块),TCB.esp中记录栈的栈顶指针。寄存器的esp执行切换
在这里插入图片描述
create就是做出切换的样子。主要是三样东西:申请内存作为TCB,申请内存作为栈,在栈里面压入起始地址。创建的时候就是把要切换的PC指针放到自己的栈中,创建好TCB。将来切换的时候,TCB到栈,在弹出PC指针。
在这里插入图片描述
梳理用户态多线程的全部过程(没有完全懂…)
在这里插入图片描述
用户级线程在用户态来回切换,所以操作系统感知不到它的存在。
缺点:
当线程(getData)访问内核态(等待网卡IO),会产生阻塞,操作系统内核会切换到别的进程,因为内核看不到用户态中的线程(看不到show),所以会导致当前进程的其余线程(show)不执行

猜你喜欢

转载自blog.csdn.net/m0_51082307/article/details/109584517
今日推荐