「OS」IO管理
I/O 设备可以将数据输入到计算机,或接收计算机输出数据的外部设备。
UNIX 系统将外部设备抽象为一种特殊的文件 ,用户可以使用与文件操作相同的方式对外部设备进行操作。
总线(Bus)是接入 I/O 设备的主要方式
分类按使用特性:人机交互类、存储类、网络通信类
按信息交换单位 :
块设备:数据传输单位为块,传输速率高,可寻址。如磁盘
字符设备:数据传输单位为字符,一般采用中断驱动。如鼠标键盘等。
I/O 控制器CPU 通过一个电子部件——I/O 控制器来实现 CPU 对设备的控制。
功能
接受和识别 CPU 发出的指令。I/O 寄存器有相应的控制寄存器来存放命令和参数。
向 CPU 报告设备的状态。I/O 控制器有相应的状态寄存器记录 I/O 设备当前的状态。
数据交换。I/O 控制器中会设置相应的数据寄存器。输出时,数据寄存器用于暂存C PU发来的数据,之后再由控制器传送备。输入时,数据寄存器用于暂存设备发来的数据,之后C PU从数据寄存器中取走数据。
地址识别。类似于内存的地址,为了区分设备控制器中的各个寄存器,也需要给各个寄存器设置一个特定的“地址”。I/O控制器通过 ...
「C++ 内存管理」
内存布局
代码段:程序的所有指令会存放在这个区域,这是已经编译后的机器码。
字面量池:程序初始化时的一些字符串字面量,在程序中用于显示文字
全局数据段:程序初始化时的常量和全局/静态的变量。C/C++ 用global/static声明的变量都存放在这个区域,对所有函数公开可见。
堆:这里保存的数据只是为了临时存储一些值而创建的,而我们可能在程序运行过程中可能会回收此内存。因为我们在程序执行期间不需要很长时间,所以使用C中的new或malloc这类内存分配程序来为我们所需的特定数据类型提供新的空间,并且随着我们要求越来越多的动态数据空间而该区域不断扩大,并且在内存中逐渐增长到更高的地址。
栈:存储着该程序 “上下文”,它将从内存的高层地址开始,然后向另一个方向向下扩展。上下文其实就是程序中各个函数之间调用的先后顺序。
程序栈帧帧(frame),在进程中每个函数被调用时分别从这个栈占用一段区域,就称为帧。
「C++ 基础」泛型与模板
函数模板术语1234template<typename T>T max(T a, T b){ return b<a?a:b;}
T是模板的**模板参数(Template Parameter)**,可以表示一个具体的数据类型,例如int,double,std::string
typename关键字来定义模板参数,也可以使用class关键字替换
T a, T b称调用参数
函数体称模板函数
「C++ 基础」重载
重载为方便使用,C++ 允许在同一个作用域内,声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,不能仅通过返回类型的不同来重载函数。
当调用一个重载函数或重载运算符时,编译器通过把所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
函数重载在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,不能仅通过返回类型的不同来重载函数。
123456789101112131415161718192021class printData{ public: void print(int i) { cout << "整数为: " << i << endl; } void print(char c[]) { cout << "字符串为: " ...
「JVM」垃圾回收机制
与 C++ 程序设计语言相比,Java 程序设计语言拥有一个独特的语言特性——自动垃圾回收机制 (Garbage Collection)。在 Java 和 C++ 中,新创建一个对象都需要使用 new 运算符。然而,在 C++ 中,程序员需要人工管理内存,对于不再使用的对象使用 delete 运算符显式地回收内存;在 Java 中,程序员无需人工管理内存,JVM 会自动触发垃圾回收,将没有被引用的对象占据的内存空间释放。
基本垃圾回收机制基本的 Java 垃圾回收机制如下:
首先,垃圾回收器会找出当前哪些对象是正在使用中的,并将其标记为存活对象;以及哪些对象是没有被引用的,并将其标记为未引用对象,这一步称为标记 。下图显示了一个标记前后的内存图的样式:
其次,垃圾回收器会将当前所有未引用对象删除,也就是上图中橙色的部分。
最后,为了提升性能,在删除完未引用对象后,通常还会采取压缩操作,将内存中的存活对象放置在一起,以便后续能够更加高效快捷地分配新的对象。
分代垃圾回收机制在实际的程序中,如果完全采用上面的基本垃圾回收机制,会导致垃圾回收非常低效,这是因为每一次垃圾回收都需要标记所 ...
「C++ 基础」继承 & 多态 内存原理
继承继承可以重用代码功能和提高执行效率的效果。
一个类可以派生自多个类。类派生列表以一个或多个基类命名,形式如下:
1class derived-class: access-specifier base-class
未使用访问修饰符 access-specifier,则默认为 private。
一个派生类继承的基类方法不包括如下几种:
基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符。
基类的友元函数。
继承类型通常使用 public 继承
public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中均不变
protected 继承:基类 public 成员的访问属性在派生类中变成 protected。其他两种访问属性不变。
private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中均变成 private
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
1234class <派生类名>:<继承方式1><基类名1&g ...
「OS」进程管理
进程基本概念进程:为了揭示多道程序、分时系统引发的动态特性(执行-暂停 -执行),而引入了进程。定义可参看内存管理。并发:有两个活动a1和a2,如果在某一时刻t,无论它们是在同一处理机上还是在不同的处理机上执行,只要都处在各自的起点和终点之间的某一处,则称a1和a2是并发执行的。并行:两个程序在同一时间度量下同时运行在不同的处理机上,则称这两个程序是并行执行的竞争:多个进程在读写一个共享数据时结果依赖于它们执行的相对时间竞争条件:多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关,称为竞争(发生)条件。Bernstein条件:满足该条件,则程序并发执行结果可再现。该条件可简单理解为两个程序只可以同时读。
响应时间:进程到达直至进程结束之间的时间。响应比=响应时间/运行时间
进程与程序
进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件,静态和可以复制。
进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存。
进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包 ...
「OS」内存管理
基本概念地址空间:一个进程能够用于访问内存的地址集合
程序:是静止的,存放在磁盘上的可执行文件,是进程的实体。
进程:是动态的,包括进程控制块 PCB,程序和程序处理对象(数据集),是一个程序的执行过程,是资源分配的基本单位。通常把进程分为系统进程和用户进程。
作业:用户需要计算机完成的某项任务,是要求计算机所做工作的集合。通常包括程序、数据、操作说明书。
系统碎片:内存中无法被利用的存储空间称为碎片
内部碎片:分配给作业的存储空间中未被利用的部分
外部碎片:系统中无法利用的小的空闲分区,如分区与分区之间存在的碎片。这是造成内存系统性能下降的主要原因,它可以通过紧凑技术等被整理后清除。
紧凑技术:通过移动作业,把多个分散的小分区拼接成一个大分区。
时机:找不到足够大的空闲分区,但总空闲分区容量满足要求。
实现支撑:动态重定位
存储管理的功能
存储分配和回收
地址变换 可执行文件生成中的链接技术、程序加载时的重定位技术、进程运行时硬件和软件的地址变换技术
存储共享和保护
存储器扩充
分区式内存管理分区式分配把内存分为大小相等或不等的分区,每个应用程序占用一个或几个分区。
固定式分 ...
「C++ 基础」类 & 对象
类 & 对象定义
概念
描述
类成员函数
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。
类访问修饰符
类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。
构造函数 & 析构函数
类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。
C++ 拷贝构造函数
拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
C++ 友元函数
友元函数可以访问类的 private 和 protected 成员。
C++ 内联函数
通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。
C++ 中的 this 指针
每个对象都有一个特殊的指针 this,它指向对象本身。
C++ 中指向类的指针
指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。
C++ 类的静态成员
类的数据成员和函数成员都可以被声明为静态的。
...
「Algorithmic questions」动态规划
开个坑。感觉算法题还是要经常练保持手感,前段时间蓝桥杯,感觉大一时洛谷那么多题白刷了,那么多算法模板白总结了,都忘完了。做算法题还是要尽量自己多想,不思考看题解忘得太快。虽然最近比较忙,但每两天做一点应该还是可以的(吧)。希望不咕。
一维T198. House Robber
假如你是一个劫匪,并且决定抢劫一条街上的房子,每个房子内的钱财数量各不相同。如果 你抢了两栋相邻的房子,则会触发警报机关。求在不触发机关的情况下最多可以抢劫多少钱。
输入是一个一维数组,表示每个房子的钱财数量;输出是劫匪可以最多抢劫的钱财数量。
思路很基础的dp,dp[i]表示前i个房子劫匪最多抢劫的数量,那么它有两种情况组成:一种是我们选择不抢劫这个房子,此时累计的金额即为 dp[i-1];另一种是我们选择抢劫这个房子,那么此前累计的最大金额只能是 dp[i-2]。因此本题的状态转移方程为 dp[i] = max(dp[i-1], nums[i-1] + dp[i-2])。
123456789int rob(vector<int>& nums) { int n = nums.siz ...