自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 收藏
  • 关注

原创 操作系统Lesson13 - 进程和线程常见面试题及练习

时间片由100个tick组成,在执行进程任务的过程中,每隔一段固定的tick甚至是每一个tick时,检查一下是否有优先级更高的任务;3.不同优先级的队列存放了不同类型的任务:I/O密集型,CPU密集型,所以不同类型的任务的调度算法不一样,是先进先出,还是最短作业,还是最短剩余作业…,包括创建、切换、摧毁线程等操作需要系统调用来支持,使用系统调用陷入内核中,就会导致中断触发,保护/恢复上下文等操作,系统开销就大。一个进程可以fork多个子进程,都是这个管道,这些进程都可以用它的读端写端。

2024-12-13 16:49:50 762

原创 操作系统Lesson12 - 交互式和实施系统调度

用于非抢占式调度算法。基于时间片 -> 抢占式 -> 绝对非抢占磁盘任务放到内存 -> 作业调度内存任务放到CPU -> 进程调度缺陷:某任务耗时非常长,整个任务队列的任务的周转时间非常长,整个系统的体验很差。评估作业的时间,短的优先。缺陷:你怎么知道哪个作业运行多少时间?周转时间现实中,不会那么多任务一起到达,如果B执行了99%,来了个A任务,作业时间比B短,那就又跑过去执行B了。所以动态优化,优先调度剩余时间最短的任务。

2024-12-11 21:31:40 672

原创 操作系统Lesson11 - 进程调度和批处理系统调度

进程运行 -> 调用I/O -> 进入内核 -> 查找驱动 -> 没反应(无I/O) -> 休眠进程并放入对应队列,同时调用调度程序。若是单核系统,CPU密集型意义就不大了,如果有死循环,直接死机了。1.创建时:可以选择调度父进程还是子进程,但是实际上其实是不管的,比如Linux就是随机的;2.当CPU执行完了P1之后,主动放弃时间片,去执行调度算法重复上述过程;2.从哪里调度任务 - - 执行 - - 从就绪队列中选一个。调度:老状态保护起来,保存到PCB,读取一个新状态,新PCB。

2024-12-10 20:51:31 630

原创 操作系统Lesson10 - 管程、消息通信、屏障等

虽然我们两个进程映射不同的物理内存,但是我们都能找到相同的磁盘,如果我们通过文件名找对对应的磁盘位置,就能实现了两个进程的通信。1.如果代码写先去西安再去北京,这只能保证单个线程流程的先后性,不能保证大家都在西安呆着,然后一起走;借鉴此思路,我们用一文件名,这个文件名不指向磁盘了,改为指向内存,那不就快了嘛。4.只能通过调用固定的方法进入,一次只能允许一个线程进入,自动加锁;读不需要加锁,但是写需要复制一份数据写,等读操作完了再复制过去。A:不可以,两个任务有两个不一样的映射关系,

2024-12-09 20:40:58 865

原创 操作系统Lesson9 - 信号量机制与生产者消费者问题

在linux系统中会有90-10保护机制,100次调度中,高优先级占90,低优先级占10,以此来保证不会饿死。纯软的缺陷:操作分为三步,非原子性的,会被打断,也就是说执行睡眠代码段时被打断,导致错误。锁也有一个等待队列,A尝试加锁,加不上锁进入队列然后放弃CPU资源;如果高优先级是黑客,一直执行,其他低优先级的任务就“饿死”。2.如果资源为负,则调用睡眠队列,将这个人送去睡觉。B正常执行,完了解锁,然后唤醒锁等待队队列。1.在临界资源访问时,有多少进程等待该资源;资源为0:正常状态,只不过资源耗尽。

2024-12-09 00:02:10 262

原创 操作系统Lesson8 - 同步互斥机制和编程方法

长期屏蔽中断,CPU无法接收IO消息,也无法被时间片打断,也就无法被其他任务调度,如果此时发生错误,CPU也接收不到中断,会导致死机。由于多核CPU执行屏蔽中断代码,只是针对自己一个CPU,而其它CPU不知道,所以使用TSL、XCHG指令,用来把整条数据线掐断。而对于之前的接口,软间实现不变,OS根据硬件是否支持硬件中断来决定是否翻译为TSL指令集。内核中有些适合忙等,因为睡眠需要维护睡眠队列等结构,耗时长,有时不如忙等。从硬件方面锁定,会将总线锁定,其他所有CPU都无法访问,来解决多核问题.

2024-12-07 21:46:06 917

原创 操作系统Lesson7 - 线程编程模型和进程间通信概述

进程调度是系统调用,属于操作系统的库函数,操作系统的编译器里自带了;而进程是需要第三方库,这两个实现方式不一样,一个系统调用,一个第三方库,所以进程号和线程号直接没有关系。而如果内核支持线程,我们可以在创建线程时指定是用户空间来描述还是内核空间来描述。执行完线程创建函数之后,本函数完结,局部变量 task1 的资源被回收,会发生危险。有一个二级指针参数,用来接收子线程退出时的发出的数据,也就是。但是在cpp中,有严格格式要求,所以要强转。有人说:不行,必须强转为 void* 类型。错,c可以,cpp不行。

2024-12-06 23:48:35 906

原创 操作系统Lesson6 - 进程切换和线程调度

进程,init 进程作为所有其他进程的根,负责系统的初始化和后续进程的创建。例如, init 会根据系统配置读取信息,为每个可用的终端创建一个新的进程,这些进程通常用于等待用户登录。但是对于需求高的html资源来说,我们可以将其放入缓存以便快速响应,而如果用进程来访问这块资源,会导致不必要的浪费,所以用线程共享这块资源。当切换任务的时候,我们需要花费许多资源去更改这些数据,但是有时候这是没有必要的,所以就有了线程。,之后会由操作系统回收。也就是说,在Linux上,子进程的父进程死了,这个进程会变为。

2024-10-22 21:22:14 769

原创 操作系统Lesson - 5 进程简介及进程编程模型

进程 = 程序运行的过程,系统进行资源管理和调度的独立单位。静态区:代码段:保存了代码。数据段:保存全局变量等数据。动态区:堆区:保存程序动态申请的空间。栈区:保存程序自动分配的内存。多个程序同时运行(并发单个程序同时多次运行。所以需要操作系统来帮助程序运行。

2024-10-14 19:29:21 773

原创 操作系统Lesson4 - 操作系统发展史

传统上,所有的层都被置于内核中,但这并非必要,且可能不是最佳实践。实际上,减少内核中的功能以达到最小化内核的目标可能是更优的选择。因为内核中的错误难以处理,一旦出现错误,可能导致整个系统的崩溃。所以就将操作系统划分为微小且功能明确的模块,这些模块中只有微内核在内核模式下运行,其他都在用户态下运行。若文件数据不在内存中,则会调用驱动访问磁盘,这个属于I/O操作了,所以进程会进入休眠。为了增强系统的模块性和可扩展性,现代操作系统引入了模块化和动态加载的机制。将系统分为多层,类似于网络分层,每层通过接口通信。

2024-10-13 18:45:42 581

原创 Lesson3 - 操作系统软件视角和系统调用

程序在执行时,会有对硬件进行操作的需求,但是程序在用户空间执行,不能直接对内核区的硬件进行操作,所以就需要。为了更有效地管理这些硬件资源,系统设计者引入了抽象的概念,其中最为核心的三大抽象便是。shell是封装在OS之上的一种软件,提供了一系列指令给操作者来对OS进行操作。从操作系统层级上看,虚拟地址空间主要分为两个部分内核区和用户区。当程序正在执行时,发生了一个错误导致未能正常运行,这个就叫。异步分为两种:软件异步和硬件异步。他们的流程都是一样的。同步就是程序的顺序执行过程。

2024-10-07 19:22:05 828

原创 Lesson1 - 操作系统概述与硬件视角

操作系统是一组控制和管理计算机硬件和软件资源合理地对各类作业进行调度,方便用户使用计算机的程序集合。操作系统的核心目标是,使系统资源的利用率高系统的吞吐量大。寄存器分为:普通寄存器特殊功能寄存器PC寄存器:保存下一个任务的地址SP寄存器:保存数据存放的栈指针PSW寄存器:保存状态记录。

2024-10-05 16:38:28 1030

原创 LeetCode - 2207. 字符串中最多数目的子序列

那么我们应该如何在只遍历一遍的情况下得到原本字符串中的子序列个数(未插入情况下)呢?由于子序列长度只有2,所以要么首位插入队头,要么末位插入队尾,就能取得最大数目。的个数,两者取最大值,就是插入的字符组成的子序列个数。于是遍历一遍字符串,统计。

2024-09-24 22:30:54 453

原创 Linux中read()函数与拷贝文件

read()每次调用会读取指定缓冲区大小的数据,直到到达文件末尾。在文件没有读完之前,read()返回读取的字节数(非零)。只有当文件被完全读取时,read()才会返回0,表示没有更多的数据可读了。

2024-09-12 23:28:32 392

原创 Linux计算文件权限的mode和umask

是一个权限掩码,用于指定在创建新文件或目录时应当“屏蔽”(即剥除)哪些权限位。它不直接设置权限,而是从默认权限中去掉一些权限。它在创建新文件或目录时,影响文件系统的权限掩码,从而影响最终设置的权限。这个公式是用来计算新创建文件或目录的最终权限的。文件权限由三个数字组成,每个数字分别表示文件所有者、所属组和其他用户的权限。是一个八进制数,由三个部分组成,每个部分表示不同的用户组对文件的权限。通过这种方式,可以灵活地为不同的用户组设置文件的权限。指定的权限位从默认权限中去掉。,这表示屏蔽写权限(写权限是。

2024-09-12 22:10:52 1208

原创 C++提高篇 - 模板

默认模板参数应该在模板参数列表的末尾。也就是说,如果有多个模板参数,只能将最右边的一个或多个参数设置为默认参数。默认值可以是任何合法的类型,包括基本类型(如intdouble)、自定义类型(如类、结构体、枚举等)以及其他模板类型。如果一个模板有多个参数,并且其中一个有默认值,则只有最右边的参数可以有默认值。其余的参数必须显式提供模板实参。

2024-07-26 12:10:31 1036

原创 C++文件操作

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化C++中对文件操作需要包含头文件文本文件- 文件以文本的ASCII码形式存储在计算机中二进制文件- 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们ofstream:写操作ifstream: 读操作fstream : 读写操作。

2024-07-22 11:22:37 925

原创 C++类与对象 - 多态

多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料。​ 1. 虚析构或纯虚析构就是用来解决通过父类指针释放子类对象。​ 2. 如果子类中没有堆区数据,可以不写为虚析构或纯虚析构。重写:函数返回值类型 函数名 参数列表 完全一致称为重写。​ 3. 拥有纯虚析构函数的类也属于抽象类。解决方式:将父类中的析构函数改为。

2024-07-21 21:29:36 391

原创 C++类与对象 - 继承

继承实现:总结:继承的好处:可以减少重复的代码class A : public B;A 类称为子类 或 派生类B 类称为父类 或 基类派生类中的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员。从基类继承过过来的表现其共性,而新增的成员体现了其个性。继承的语法:继承方式一共有三种:示例:继承中的对象模型问题: 从父类继承过来的成员,哪些属于子类对象中?解答: 子类全部继承父类中的所有成员,只不过对无法访问父类私有成员进行访问。示例:利用工具查看:即可查看类的结构等信息子类继承父

2024-05-17 15:00:03 507

原创 C++类和对象 -封装

但是对于一些地址来说,只拷贝地址数值是不行的,因为对于这两个对象的释放来说,这两个属性所指向的地址是相同的,所以会造成二次释放的问题,所以我们就需要在拷贝的时候在堆区申请一个新空间。**注意:**在函数参数中的引用不可以传入一个临时变量,如果真的想引用这个变量,用。**作用:**重载关系运算符,可以让两个自定义类型对象进行对比操作。**作用:**函数传参时,可以利用引用的技术让形参修饰实参。作用: 通过重载递增运算符,实现自己的整型数据。**优点:**可以简化指针修改实参。**作用: **给变量起别名。

2024-05-16 17:39:18 617

原创 LeetCode - 1702. 修改后的最大二进制字符串

简单来说我们需要想办法将0配对,将其变为10,对于单个的0,我们需要用10->01这个操作将后面的0冒泡到前面进行配对。

2024-04-10 23:40:48 580 3

原创 LeetCode - 2529. 正整数和负整数的最大计数

【代码】LeetCode - 2529. 正整数和负整数的最大计数。

2024-04-09 20:30:20 425

原创 Leetcode - 2009. 使数组连续的最少操作数

枚举窗口的右边界,也就是让数组中的每一个数都充当一次右边界,然后我们的左边界从0开始,看是否符合窗口大小,不符合就一直推进左边界到合法,然后重新计算窗口内的数字多少,取最大值,此值就是我们能保留的数目的最大值,那么需要修改的最小数目用数组长度减去保留的最多数目。题中所述的连续数组就是一串连续的自然数,想问需要多少次操作能将原数组变为连续的数。我们排序去重,用逆向思维想能保留的数字数目最多是多少,及用滑动窗口来获取最大数目。

2024-04-08 22:05:04 363

原创 Leetcode - 2580. 统计将重叠区间合并成组的方案数

区间和并,快排(对二维数组进行排序),快速幂

2024-03-27 22:18:15 400

原创 按位取反~

计算机如何读取数呢?

2024-03-17 13:46:14 142

原创 计数类Dp

我们可以用完全背包的思想来做:在前 i 件物品中,选出若干件,使其和正好为 j。然后根据完全背包的优化思路将其压缩至一维即可。

2024-03-14 20:05:53 325

原创 LeetCode 2864. 最大二进制奇数

我们可以利用双指针,一个指着原数组,一个指着新开的数组(全0)。原指针一直走,当原数组中碰到1时,就给交换一下,新指针指向下一位,一直循环。当走到末尾,只要把新指针的后一位跟末尾的0交换即可。但是其实我们发现这可以在一个数组中直接操作,我们默认新指针指的元素一直是0,等到原指针碰到1交换,最后交换末位。由于二进制基数的最后一位必须是1,而其他位越大越好,所以让一个1在最低位,其他全部放到最高位即可。所以我们数出字符串中1的个数,另开一个字符空间,把最后一位置1,把剩余的1全部放在前面。

2024-03-13 20:10:34 359

原创 计网Lesson19 - 应用层之WWW

应用层协议 (application layer protocol)定义了在不同端系统上应用程序是如何相互传输报文的。交换的报文类型交换的是请求报文还是响应报文。报文字段的解释:对报文中各个字段的详细描述。报文字段的语义:报文各个字段的含义是什么。报文交换时间、方式:程序何时、以什么方式发送报文以及响应。应用层只关心数据的产生和使用,是一个逻辑层,并不关心数据的传输。应用层共有两种层次结构。

2024-03-11 16:21:47 867

原创 计网 - 子网掩码的改变与内网之间通信的关系

想要弄清楚这个问题,必须了解数据包在网络上是如何传输的:

2024-02-29 23:31:40 916

原创 计网Lesson18 - TCP链接管理

两次挥手之后,从TCP客户进程到TCP服务器进程这个方向的连接就释放了,但TCP服务器进程如果还有数据要发送,TCP客户进程仍要接收,也就是从TCP服务器进程到TCP客户进程这个方向的连接并未关闭。这是 TCP 协议的一个重要特性,它确保了连接的双向性和全双工通信。如果遇到大量CLOSE_WAIT情况是什么原因,怎么解决?如果遇到大量TIMe_WAIT状态是什么原因,该如何解决?无论是客户端还是服务器,

2024-02-28 11:44:24 1039

原创 计网Lesson17 - 拥塞控制

拥塞:在某段时间,若对网络中某⼀资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞(congestion)。计网中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络资源。两条马路合并成一条,那么当两条路车流量都很大时,汇聚时会造成拥堵。拥塞控制是⼀个全局性的过程:涉及到所有的主机、路由器,以及与降低⽹络传输性能有关的所有因素。是需要靠所有节点共同努力的结果。防止过多的数据注入到网络中,使网络能够承受现有的网络负荷。

2024-02-27 21:12:34 546

原创 计网Lesson16 - TCP选择重传和流量控制

TCP通信中,发送序列中的某一包丢失(1,2,3,4,5 中 3 丢失),如果全部重传消耗太大,接收方会确认 2 ,然后窗口划过去,将3,4,5重传,但是由于4,5传过了,造成重复。发送方给出窗口为0,之后又有了一些缓存,想让发送方继续发送数据,发送非0窗口报文,结果这个报文丢失了,改如何解决?机制,以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。TCP为应用程序提供了。

2024-02-26 22:59:07 1215

原创 计网Lesson15 - TCP可靠传输

当发送方发出一连串数据,但是其中丢了几个包,接收方会确认第一个丢失的包的位置(ACK),之后会在选项中标注出哪些包丢失了,也就是选择性确认技术(SACK)。例如,在TCP(传输控制协议)中,重传5次还未成功就会发送RST报文,连接将被断开。发送方迟迟没收到确认报,于是重传,重传的接收到确认报了,之后前面的确认报才来,这时候无事发生。发送方依然没有收到确认报,所以会触发重传,而接收方接收到两个重复的包,直接将后来的包丢掉。发送方过久没有接收到接收方的确认报,这种情况会触发超时重传机制,发送方重新发送报文。

2024-02-26 22:24:37 724

原创 计网Lesson14 - 传输层协议头分析

计网中的物理层、数据链路层和网络层共同解决了异构网络之间的通讯问题,实现主机到主机的通信。为运行在不同主机上的应用进程提供直接的逻辑通信服务,也叫端到端的通信。传输层为应用层提供端口,用来区分不同应用进程的标识符,为应用层屏蔽了下层的细节,好像一根管道直接连接了两主机的同一应用。

2024-02-26 10:57:40 660

原创 简单区间DP

区间Dp指的是某些问题可以用区间来划分解决。

2024-01-30 21:23:41 940

原创 简单线性Dp

处理起来是线性的(???

2024-01-30 20:01:37 730

原创 计网Lesson12 - UDP客户服务器模型和UDP协议

丢个图在这,实在不是很明白在讲啥,等学完网编的我归来狠狠拿下它。

2024-01-29 20:18:09 252

原创 计网Lesson11 - 虚拟机网络环境及socket概述

socketsocketsocket是一种用于应用层的用户态与应用层以下的内核态交互的工具,本意为“插座”。也就是用来连接数据包到各个端口的一个工具。但具体是什么我也不太懂,网编这块之后再来补坑吧 >\/<

2024-01-29 20:05:58 256

原创 简单背包问题

01背包就是指问题:从NNN件物品中选出kkk件放入容量是VVV的背包中,最终答案具有某种属性(价值最大/最小/物品数量最多…),而且每种物品只能选一次。我们可以看出,其实动态规划就是把每一种可能滚了出来,然后选取符合要求的那一个解。与01背包类似,唯一区别就是物品数量无限。附加条件:每件物品限制个数,且个数不一每一次选则一个组别里面的某一个元素。现在是选不选,选的话选组里面的哪个?

2023-12-18 21:57:27 1045

原创 容斥原理的并

画了图,清晰易懂,懒得打字了。SS1S2S3−S1∩S2−S1∩S3−S2∩S3S1∩S2∩S3S​S1​S2​S3​−S1​∩S2​−S1​∩S3​−S2​∩S3​S1​∩S2​∩S3​​我们可以把这个式子推导到nnn维,奇加偶减。

2023-12-17 21:29:26 890

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除