makefile的基本使用
目标 + 依赖 + 命令
目标 = 需要生成的目标文件
依赖 = 生成目标文件所需要的子文件
非必须,可以省略
命令 = 生成目标文件使用的命令
非必须, 可以省略
指令前加上@可以让该指令运行时不输出
指令前加上-表示报错时,仍然继续向下执行
使用.PHONY:对应的命令名可以将对应的命令声明为伪目标,不受目录下同名文件的影响
-f 可以指定使用的 makefile 文件
例如:make -f makefile1
实例Lost Image!!
进阶函数
wildcard
使用通配符来匹配文件
patsubst
将文件内容进行替换
模式匹配
$@代表目标文件
$< 代表全部依赖
$^ 第一个依赖
$? 第一个变化的依赖
示例1234567891011#get all .cpp filesrc=$(wildcard *.cpp)#turn all .cpp file into .o fileobj=$(patsubst %.cpp, %.o, $(src))add:$(obj) g++ -o $@ -I. ...
OS-内存系统
深入了解计算机系统–存储系统随机访问存储器
SRAM
DRAM、
只读存储器(ROM)
磁盘(disk)
闪存(SSD)
高速缓存高速缓存内部组成
有效位
为缓存行的的第一位
提供这个位只是为了方便,实际上它并不是高级告诉缓存的一部分
组(S)
行(E)
块(B)
块大小(m)
地址组成
组索引
记录需要寻找的地址的组编号
标识符
记录当前组标识编号
由于存在存储器块的数目比高速缓存组数多的情况 ,所以为了解决冲突,将对应的块编号对组数进行取模运算存入对应的高速缓存组当中,同时为了标识当前表示的存储块编号,引入标识符用来区分块的编号
块偏移
缓存中的块其实就相当于索引的 value 部分,真正存储的地址内容放在块中
同时块一般含有多个字节数据,其空间又是连续的,所以可以视为一个数组
块偏移是从缓存(块可以视为一个数组)中取到对应的数据(组索引和标识符用来匹配所寻找的地址缓存中是否存在)
地址计算方法
计算块偏移
首先将所需要寻找的地址除以块字节数,得到的余数即是块偏移的大小
因为缓存取数据是以块为单位,每次缓存不命中时,缓存会向 ...
操作系统
操作系统的职责
管理资源
抽象接口
文件系统
地址空间
进程管理
输入/输出管理
保护
动态规划
动态规划
确定 dp 数组及其下标的含义
确定递推公式
dp 数组如何初始化
确定遍历顺序
举例推导 dp 数组
debug 时打印 dp 数组
动态规划学习---01背包问题
动态规划学习—01 背包问题01 背包问题背景
拥有固定容量大小的背包
有 n 种物品, 每种物品只能取 1 次
需要返回背包能装下的最大价值
暴力解法
[dfs(深度优先搜索算法) / 回溯]
列出所有情况, 最后返回最大价值
动态规划解法基础解法: 二维数组动规五部曲:
确定dp[i][j]数组下标含义
i 表示编号为**[0 - i]**的物品均判断过
j 表示容量为 j 的背包
dp[i][j]表示容量为 j 的背包, 在[0 - i]物品中能装下的最大价值
递推公式
根据dp[i][j]的定义可以知道:
判断容量为 j 的背包最大值(即dp[i][j])时
只需要判断本次加入的物品**( i 物品)**是否需要放入背包
那么只有两种情况 :
放入 i 物品
由于需要放入 i 物品, 那么当前背包的价值, 应该是 :
判断完了[0 到 i - 1]物品价值的容量 j 的背包容量减去 i 物品的重量, 价值加上 i 物品的价值
故背包价值为 : dp[i - 1][j - weight[i]] + value[i]
不放入 i 物品
不放 ...
第一章--TCPIP协议族
第一章–TCP/IP 协议族TCP / IP 协议族体系结构以及主要协议TCP / IP 协议族是一个四层协议系统 :
数据链路层
网络层
传输层
应用层
*每一层完成相应的功能, 并且通过若干协议实现, 上层协议使用下层协议提供的服务*
数据链路层
实现了网卡接口的网络驱动程序, 以处理数据在物理媒介上的传输
物理媒介 : 以太网, 令牌环等…
不同的物理网络具有不同的电气特性, 网络驱动程序隐藏了这些细节, 为上层协议提供了一个统一的接口
数据链路层的常用协议
APR 协议 (Address Resolve Prosolve, 地址解析协议)
RARP 协议 (Reverse Address Resolve Protocol, 逆地址解析协议)
这两种协议实现了**IP 地址和机器物理地址 ( 通常为 MAC 地址)**的相互转换
网络层
实现数据包的选路和转发
WAN (Wide Area NetWork 广域网)通常使用众多分级的路由器来连接分散的主机和 LAN (Local Area Network 局域网), 因 ...
第五章--Linux网络编程基础APi
第五章–Linux网络编程基础APi主要讨论Linux网络编程基础Api与内核中 TCP / IP协议族之间的关系, 并为后续章节提供编程基础
socket地址Api
socket最开始的含义是一个IP地址和端口对 (ip, port)它唯一地表示了使用TCP通信的一端
socket基础api
socket的主要Api 都定义在sys/socket.h头文件中, 包括
创建socket
命名socket
监听socket
接收连接
读写数据
获取地址信息
检测带外标记
读取和设置socket选项
网络信息APi
Linux提供了一套网络信息Api, 以实现主机名和IP地址之间的转换, 以及服务名称和端口号之间的转换
这些Api都定义在netdb.h头文件中
socket地址API要学习 socket 地址API, 先要理解主机字节序和网络字节序
主机字节序和网络字节序现代CPU的累加器一次都能装载(至少)4字节(这里考虑32位机,下同),即一个整数。
那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数的值。这就是字节序问题。
字节序分为大端字节序(big ...
第八章--高性能服务器程序框架
第八章–高性能服务器程序框架这一章中, 我们按照服务器程序的一般原理, 将服务器解构为如下三个主要模块
I / O 处理单元
本章将介绍 I / O 处理单元的四种 I / O 模型和两种高效事件处理模式
逻辑单元
本章将介绍逻辑单元的两种高效并发模式, 以及高效事件处理模式—-有限状态机
存储单元
这里不讨论存储单元, 因为他只是服务器程序的可选模块, 并且其内容与网络编程本身无关
服务器模型C / S 模型TCP / IP 协议在
Socket基本api
Socket 网络编程准备工作服务器客户端(前端)
建立一个 Socket 接口
连接服务端
向服务端发送数据
接受服务端数据
关闭 Socket
服务器服务端(后端)
建立一个 Socket 接口
绑定端口
监听网络接口
等待客户端链接
接受客户端数据
向客户端返回客户端需要的 数据
关闭 Socket
基本处理
基本操作目录
工程文件重定向(非必须)
头文件
函数部分
代码展示
工程文件重定向(非必须)
输出目录重定向
$$(Solution)../result/$(Platform)/$(Configuration)/$
中间目录重定向
$$(Solution)../temp/$(Platform)/$(Configuration)/$(ProjectName)/$
头文件
Windows.h
WinSock2.h
需要进行宏定义,或者将 WinSock2.h 放在 Windows.h 之前定义
#define WIN32_LEAN_AND_MEAN
函数部分
启动函数WSAStartup()
包含所需要的静态链接库
#pragma comment(lib, "ws2_32.lib")
该写法为显示声明所需要的静态库,在 window 系统下有效,其他平台上不支持
在项目属性中包含依赖项ws2_32.lib
参数 1:WORD的版本号 ...