![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统阅读笔记
文章平均质量分 58
zakariyaa33
这个作者很懒,什么都没留下…
展开
-
2022-3-12
进程间通信管道管道又名匿名管道,这是一种最基本的IPC机制,由pipe函数创建:#include <unistd.h>int pipe(int pipefd[2]);调用pipe函数时在内核中开辟一块缓冲区用于通信,它有一个读端,一个写端:pipefd[0]指向管道的读端,pipefd[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过read(pipefd[0])或者write(pipefd[1])向这个文件读写数据,其实是在读写内核缓冲区。一般使用管道的时候是原创 2022-03-12 11:26:26 · 2413 阅读 · 0 评论 -
2022-2-23
2022-2-23I/O设备标准协议利用中断减小开销利用DMA进行更高效的数据传送设备驱动程序磁盘驱动器磁盘调度SSTF:最短寻道时间优先SPTF:最短定位时间优先I/O设备标准协议一个简化的设备接口包含三个寄存器:状态寄存器、指令寄存器、数据寄存器,操作系统与该设备的经典交互如下该协议包含 4 步。第 1 步,操作系统通过反复读取状态寄存器,等待设备进入可以接收命令的就绪状态。我们称之为轮询(polling)设备(基本上,就是问它正在做什么)。第2 步,操作系统下发数据到数据寄存器。例如,你可以原创 2022-02-23 10:26:47 · 332 阅读 · 0 评论 -
2022-2-19
2022-2-19条件变量生产者/消费者(有界缓冲区)问题最终的生产者/消费者方案信号量信号量的定义二值信号量(锁)信号量用作条件变量生产者/消费者(有界缓冲区)问题第一次尝试第二次尝试读写锁哲学家就餐问题一个简单的尝试解决方法条件变量线程可以使用条件变量(condition variable),来等待一个条件变成真。条件变量是一个显式队列,当某些执行状态(即条件,condition)不满足时,线程可以把自己加入队列,等待(waiting)该条件。另外某个线程,当它改变了上述状态时,就可以唤醒一个或者多原创 2022-02-19 14:19:01 · 185 阅读 · 0 评论 -
2022-2-8
2022-2-8锁休眠代替自旋锁为了让自旋锁不要浪费太多时间在自旋上,最简单的方法就是让线程自旋的时候让出cpu但这里也有个问题,当一个进程有100个线程,且采用轮转调度,那么一个线程持有锁,其他99个线程调用锁,发现被占用然后让出cpu,虽然比一直自旋要更有效率,但99个上下文切换也是很耗时间的休眠代替自旋为了防止前文提到的多个上下文切换,我们使用队列记录下一个应该持有锁的线程这里的flag表示的是锁是否正在被使用,guard表示锁是否正在被其他人读取,当最开始没人使用的时候,flag和原创 2022-02-08 20:05:19 · 287 阅读 · 0 评论 -
2022-2-7
2022-2-7并发线程的创建共享数据插叙:线程API创建完成锁自旋锁评价自旋锁并发本章将介绍为单个运行进程提供的新抽象:线程线程与进程的不同之处在于,在进行上下文切换的时候,进程需要改变地址空间,也就是需要换新的页表,而线程不需要,不同线程共享同一个地址空间。对于并发,也即多线程而言,与单线程不同的地方在于,单线程的地址空间中只有一个栈,而多线程有多个栈线程的创建可以看到,我们先创建了两个线程,然后使用两个pthread_join来等待线程的结束,但我们无法控制这两个线程哪个先执行,线程被创原创 2022-02-07 16:26:11 · 48 阅读 · 0 评论 -
2022-1-24
2022-1-24超越物理内存策略简单策略:FIFO利用历史数据:LRU近似LRU考虑脏页超越物理内存策略在内存满了的时候,我们需要将内存中不要用到的页与硬盘中需要用到的页进行替换,那么究竟替换哪一个呢简单策略:FIFO如题,类似一个队列,先进先出利用历史数据:LRU“最不经常使用”(Least-Frequently-Used,LFU)策略会替换最不经常使用的页。同样,“最少最近使用”(Least-Recently-Used,LRU)策略替换最近最少使用的页面。近似LRULRU有一个问题,原创 2022-01-24 13:22:45 · 319 阅读 · 0 评论 -
2020-1-22
2020-1-22分页分页与分段多级页表超越两级超越物理内存机制分页线性页表有可能会非常耗费空间,假设我们有一个16kb的地址空间和1kb的页可以看到有很大一部分都没被使用分页与分段一种不太好的解决方案是混合分页和分段,也即为每个逻辑分段构建各自的页表我们将进程分为三个段,代码段、堆段和栈段,每个段都与之前提及的分段一样,有一个基址寄存器和界限寄存器,要确认地址引用的哪个段,我们可以使用地址空间的前两位标记,例如00是未使用的段,01是代码,10是堆,11是栈,虚拟地址如下所示在得知使原创 2022-01-22 19:52:54 · 271 阅读 · 0 评论 -
2022-1-20
2022-1-20分页地址转换旁路缓冲存储器(TLB)上下文切换时(切换进程)TLB替换策略分页在管理内存空间的时候,我们一般对其进行分页处理对于进程而言,它看到的是一共4页的连续空间,每页16字节,而在真实物理空间里,他们的页是被分开放的,类似于虚拟内存的分段为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存一个数据结构,称为页表。页表的主要作用是为地址空间的每个虚拟页面保存地址转换,从而让我们知道每个页在物理内存中的位置。页表是每一个进程的数据结构,如果操作系统运行原创 2022-01-20 23:12:00 · 177 阅读 · 0 评论 -
2022-1-18
2022-1-18地址转换动态重定位分段我们引用哪个段栈共享支持空闲空间管理底层机制地址转换动态重定位对于程序而言,其地址转换过程的不存在的,程序认为自己的地址就是开始于0kb,结束于固定大小,这就是地址转换的透明性,对cpu而言,实现程序地址到真实物理地址的转换很简单,cpu有两个寄存器,基址寄存器和界限寄存器,基址寄存器存储了程序的真实物理地址的起始点,界限寄存器存储了程序物理地址的终点分段如果我们直接将进程占用的内存连续设定,可能会出现很多未被使用的内存,造成资源浪费,这时我们需要将代码段,原创 2022-01-20 21:38:23 · 173 阅读 · 0 评论 -
2021-1-15
原创 2022-01-15 19:19:09 · 88 阅读 · 0 评论 -
2022-1-14
2022-1-14调度:多级反馈队列基本规则改变优先级降级升级更好的计时方式调度:比例份额基本概念:彩票数表示份额调度:多级反馈队列基本规则多级反馈队列(MLFQ)的基本规则就是,同优先级的进程轮转运行,不同优先级的进程按由高到低运行改变优先级降级如果在长时间占用cpu,但是不包含io的密集运算型程序之后,又进入了一个交互性程序的话由于交互型程序运行时间很短,所以在被移入最低优先级之前就运行完了升级按照上面的想法,让主动放弃cpu的进程保持优先级不变的话,可能会产生下面的情况:有个原创 2022-01-14 12:26:13 · 97 阅读 · 0 评论 -
2021-12-27
2021-12-27进程与线程进程间通信竞争屏蔽中断锁变量自旋锁互斥锁读写锁进程与线程进程间通信竞争当程序中有大家都能读取的共享变量或文件,就会产生竞争情况,考虑一个假脱机打印程序,该程序有一个脱机打印目录,里面是需要被打印的文件名,in指向最后一个空位,out指向下一个应该被打印的文件。如果进程A想打印文件,它读到in的位置是7,然后发生了中断,转到进程B执行,B也读到in为7,于是B把要打印的文件放入7,然后使in+1,这时B也中断,回到进程A,A将自己的文件也放入7,覆盖了B的文件,然后让i原创 2022-01-08 16:53:32 · 229 阅读 · 0 评论 -
2021-12-26
2021-12-26进程与线程进程与线程的区别进程中分多线程的好处进程与线程进程与线程的区别进程:一个程序在执行过程中的动作,类似于按照说明书做菜,说明书是程序,人是cpu,各种原料是输入,人按说明书做菜的全过程就是进程线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。区别:地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。资源:线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的原创 2021-12-26 21:21:06 · 62 阅读 · 0 评论