
操作系统
文章平均质量分 88
笔记
2301_78981471
这个作者很懒,什么都没留下…
展开
-
操作系统Lesson13 - 进程和线程常见面试题及练习
时间片由100个tick组成,在执行进程任务的过程中,每隔一段固定的tick甚至是每一个tick时,检查一下是否有优先级更高的任务;3.不同优先级的队列存放了不同类型的任务:I/O密集型,CPU密集型,所以不同类型的任务的调度算法不一样,是先进先出,还是最短作业,还是最短剩余作业…,包括创建、切换、摧毁线程等操作需要系统调用来支持,使用系统调用陷入内核中,就会导致中断触发,保护/恢复上下文等操作,系统开销就大。一个进程可以fork多个子进程,都是这个管道,这些进程都可以用它的读端写端。原创 2024-12-13 16:49:50 · 765 阅读 · 0 评论 -
操作系统Lesson12 - 交互式和实施系统调度
用于非抢占式调度算法。基于时间片 -> 抢占式 -> 绝对非抢占磁盘任务放到内存 -> 作业调度内存任务放到CPU -> 进程调度缺陷:某任务耗时非常长,整个任务队列的任务的周转时间非常长,整个系统的体验很差。评估作业的时间,短的优先。缺陷:你怎么知道哪个作业运行多少时间?周转时间现实中,不会那么多任务一起到达,如果B执行了99%,来了个A任务,作业时间比B短,那就又跑过去执行B了。所以动态优化,优先调度剩余时间最短的任务。原创 2024-12-11 21:31:40 · 680 阅读 · 0 评论 -
操作系统Lesson11 - 进程调度和批处理系统调度
进程运行 -> 调用I/O -> 进入内核 -> 查找驱动 -> 没反应(无I/O) -> 休眠进程并放入对应队列,同时调用调度程序。若是单核系统,CPU密集型意义就不大了,如果有死循环,直接死机了。1.创建时:可以选择调度父进程还是子进程,但是实际上其实是不管的,比如Linux就是随机的;2.当CPU执行完了P1之后,主动放弃时间片,去执行调度算法重复上述过程;2.从哪里调度任务 - - 执行 - - 从就绪队列中选一个。调度:老状态保护起来,保存到PCB,读取一个新状态,新PCB。原创 2024-12-10 20:51:31 · 638 阅读 · 0 评论 -
操作系统Lesson10 - 管程、消息通信、屏障等
虽然我们两个进程映射不同的物理内存,但是我们都能找到相同的磁盘,如果我们通过文件名找对对应的磁盘位置,就能实现了两个进程的通信。1.如果代码写先去西安再去北京,这只能保证单个线程流程的先后性,不能保证大家都在西安呆着,然后一起走;借鉴此思路,我们用一文件名,这个文件名不指向磁盘了,改为指向内存,那不就快了嘛。4.只能通过调用固定的方法进入,一次只能允许一个线程进入,自动加锁;读不需要加锁,但是写需要复制一份数据写,等读操作完了再复制过去。A:不可以,两个任务有两个不一样的映射关系,原创 2024-12-09 20:40:58 · 870 阅读 · 0 评论 -
操作系统Lesson9 - 信号量机制与生产者消费者问题
在linux系统中会有90-10保护机制,100次调度中,高优先级占90,低优先级占10,以此来保证不会饿死。纯软的缺陷:操作分为三步,非原子性的,会被打断,也就是说执行睡眠代码段时被打断,导致错误。锁也有一个等待队列,A尝试加锁,加不上锁进入队列然后放弃CPU资源;如果高优先级是黑客,一直执行,其他低优先级的任务就“饿死”。2.如果资源为负,则调用睡眠队列,将这个人送去睡觉。B正常执行,完了解锁,然后唤醒锁等待队队列。1.在临界资源访问时,有多少进程等待该资源;资源为0:正常状态,只不过资源耗尽。原创 2024-12-09 00:02:10 · 264 阅读 · 0 评论 -
操作系统Lesson8 - 同步互斥机制和编程方法
长期屏蔽中断,CPU无法接收IO消息,也无法被时间片打断,也就无法被其他任务调度,如果此时发生错误,CPU也接收不到中断,会导致死机。由于多核CPU执行屏蔽中断代码,只是针对自己一个CPU,而其它CPU不知道,所以使用TSL、XCHG指令,用来把整条数据线掐断。而对于之前的接口,软间实现不变,OS根据硬件是否支持硬件中断来决定是否翻译为TSL指令集。内核中有些适合忙等,因为睡眠需要维护睡眠队列等结构,耗时长,有时不如忙等。从硬件方面锁定,会将总线锁定,其他所有CPU都无法访问,来解决多核问题.原创 2024-12-07 21:46:06 · 920 阅读 · 0 评论 -
操作系统Lesson7 - 线程编程模型和进程间通信概述
进程调度是系统调用,属于操作系统的库函数,操作系统的编译器里自带了;而进程是需要第三方库,这两个实现方式不一样,一个系统调用,一个第三方库,所以进程号和线程号直接没有关系。而如果内核支持线程,我们可以在创建线程时指定是用户空间来描述还是内核空间来描述。执行完线程创建函数之后,本函数完结,局部变量 task1 的资源被回收,会发生危险。有一个二级指针参数,用来接收子线程退出时的发出的数据,也就是。但是在cpp中,有严格格式要求,所以要强转。有人说:不行,必须强转为 void* 类型。错,c可以,cpp不行。原创 2024-12-06 23:48:35 · 910 阅读 · 0 评论 -
操作系统Lesson6 - 进程切换和线程调度
进程,init 进程作为所有其他进程的根,负责系统的初始化和后续进程的创建。例如, init 会根据系统配置读取信息,为每个可用的终端创建一个新的进程,这些进程通常用于等待用户登录。但是对于需求高的html资源来说,我们可以将其放入缓存以便快速响应,而如果用进程来访问这块资源,会导致不必要的浪费,所以用线程共享这块资源。当切换任务的时候,我们需要花费许多资源去更改这些数据,但是有时候这是没有必要的,所以就有了线程。,之后会由操作系统回收。也就是说,在Linux上,子进程的父进程死了,这个进程会变为。原创 2024-10-22 21:22:14 · 772 阅读 · 0 评论 -
操作系统Lesson - 5 进程简介及进程编程模型
进程 = 程序运行的过程,系统进行资源管理和调度的独立单位。静态区:代码段:保存了代码。数据段:保存全局变量等数据。动态区:堆区:保存程序动态申请的空间。栈区:保存程序自动分配的内存。多个程序同时运行(并发单个程序同时多次运行。所以需要操作系统来帮助程序运行。原创 2024-10-14 19:29:21 · 774 阅读 · 0 评论 -
操作系统Lesson4 - 操作系统发展史
传统上,所有的层都被置于内核中,但这并非必要,且可能不是最佳实践。实际上,减少内核中的功能以达到最小化内核的目标可能是更优的选择。因为内核中的错误难以处理,一旦出现错误,可能导致整个系统的崩溃。所以就将操作系统划分为微小且功能明确的模块,这些模块中只有微内核在内核模式下运行,其他都在用户态下运行。若文件数据不在内存中,则会调用驱动访问磁盘,这个属于I/O操作了,所以进程会进入休眠。为了增强系统的模块性和可扩展性,现代操作系统引入了模块化和动态加载的机制。将系统分为多层,类似于网络分层,每层通过接口通信。原创 2024-10-13 18:45:42 · 584 阅读 · 0 评论 -
Lesson1 - 操作系统概述与硬件视角
操作系统是一组控制和管理计算机硬件和软件资源合理地对各类作业进行调度,方便用户使用计算机的程序集合。操作系统的核心目标是,使系统资源的利用率高系统的吞吐量大。寄存器分为:普通寄存器特殊功能寄存器PC寄存器:保存下一个任务的地址SP寄存器:保存数据存放的栈指针PSW寄存器:保存状态记录。原创 2024-10-05 16:38:28 · 1035 阅读 · 0 评论