0%

客户端-服务器编程模型

每个网络应用都是基于客户端-服务器模型的,服务器管理某种资源,客户端向其请求,服务器处理请求,再发送响应,客户端再处理响应。这就是一个事务(模型中的基本操作)。

对一个主机而言,网络只是一种I/O设备。客户端和服务器通过在连接上发送和接受字节流来通信,这些字节流使用套接字接口函数和Unix I/O函数进行处理。

一个套接字是连接的一个端点,每个套接字都有相应的套接字地址,由一个因特网地址和一个16位的整数端口组成。客户端中的地址的端口是由内核自动分配的,称为临时端口。服务器中的通常是某个知名的端口。

一个连接是由它两端的套接字地址唯一确定的,这对套接字地址叫做套接字对(socket pair),表示为(cliaddr: cliport, servaddr: servport)

IP地址结构是一个32位无符号整数,放在所谓的IP地址结构中:

1
2
3
struct in_addr{
unsigned int s_addr;
}

IP地址总是以(大端法)网络字节顺序存放的,主机字节顺序是小端法,Unix提供了下面的转换函数:

1
2
3
4
5
6
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong); //将32位主机字节顺序转为网络字节顺序
unsigned short int htons(unsigned short int hostshort); //16位

unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
阅读全文 »

做39. combinationSum时发现的问题,第一次写的答案如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static List<List<Integer>> ret = new ArrayList<>();
public void combinationSum(int[] candidates, int target) {
List<Integer> oneSolve = new ArrayList<>(); //问题在这里1
help(candidates, target, oneSolve, 0);
}
public static void help(int[] candidates, int target, List<Integer> oneSolve, int sum){
if (sum == target){
ret.add(oneSolve); //和这里2
return;
}

for (int i = 0; i < candidates.length; i++) {
int temp = candidates[i];
if (sum + temp <= target){
oneSolve.add(temp);
help(candidates, target, oneSolve, sum+temp);
oneSolve.remove(oneSolve.size()-1); //这里3
}else
break;
}
}

问题

最后ret 得到的结果为空值,但通过 2 中每次也都正确添加了oneSolve 的列表

阅读全文 »

做完 cache lab 后做的总结,先简单说一下cache和块

cache

是什么:

高速缓存存储器(Cache Memory)是 CPU 缓存系统甚至是金字塔式存储体系中最有代表性的缓存机制,它也与虚拟存储器有着很深的关联。

三个关键组成部分(注意区分大小写):

  • S 表示集合(set)数量
  • E 表示数据行(line)的数量
  • B 表示每个缓存块(block)保存的字节数目

存放数据的空间大小为:C=S×E×B

一些相关的介绍可以参考之前写的 编写高速缓冲友好的代码

分块

是什么

  • 在内循环中提高局部性
  • 将数据结构组织成很多块,载入L1 cache
  • 用完一个后再载入下一个块
阅读全文 »

输入输出是在主存和外部设备(如硬盘,网络,终端)之间拷贝数据的过程,Unix将所有I/O设备都抽象为文件,输入输出被当作对相应文件的读和写来执行。

文件

什么是文件

Unix文件是一个m个字节的序列,系统将一切I/O设备(如硬件设备,终端,网络)都抽象为文件,再通过描述符(内核返回的非负整数)这个接口去操作,使所有设备的访问都是以文件的方式进行,优雅且统一。

文件的类型

  • 普通文件

    一般来说需要区分出文本文件和二进制文件。文本文件只包含 ASCII 或 Unicode 字符。除此之外的都是二进制文件(对象文件, JPEG 图片, 等等)。对于内核来说其实并不能区分出个中的区别。文本文件就是一系列的文本行,每行以 \n 结尾,新的一行是 0xa,和 ASCII 码中的 line feed 字符(LF) 一样。不同系统用用判断一行结束的符号不同

  • 目录

    目录文件包含其他文件的信息,目录包含一个链接(link)数组,并且每个目录至少包含两条记录:

    • .(dot) 当前目录
    • ..(dot dot) 上一层目录
  • 套接字

    一种通过网络与其他进程通信的文件

对文件的操作

阅读全文 »

什么是虚拟存储器

一种对主存的抽象概念,为每个进程提供一个更大的,一致的和私有的地址空间。

物理内存 + 磁盘 = 虚拟内存

一些概念

什么是物理地址,虚拟地址

  • 物理地址单指主存中的地址,系统将主存看作是一个非常大由M个连续字节大小的单元组成的数组,每个字节都有一个唯一的物理地址,第一个字节的地址为0,下面一个是1,以此类推
  • 同理在虚拟存储器中的数组元素的地址就是虚拟地址

什么是物理寻址,虚拟寻址

  • CPU使用物理地址访问主存的方式就叫做物理寻址
  • 同理使用虚拟地址访问主存的方式叫做虚拟寻址,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器前先转换为适当的物理地址

什么是地址空间

是一个非负整数地址的有序集合,如果整数是连续的,就是一个线性地址空间

  • 虚拟地址空间:
    • 有2的n次方个地址的地址空间,n是电脑位数决定的,比如32位,64位
    • 位数是数据总线的宽度,是指一次能传输的数据的位数,通常就是CPU一次能处理的数据的位数,所以字长就是取决于数据总线
    • 所以虚拟存储器的大小是不一定的,同时有上限的,我们可以设置的非常大,但是访问不到也就没有用了
  • 物理地址空间:与系统中物理存储器的M个字节相对应
阅读全文 »

异常控制流

定义

一系列指令组成的序列称为控制流,现代系统通过控制流发生突变对系统状态变化作出反应,这些突变称为异常控制流(ECF)。

异常控制流发生在系统各个层次,操作系统,硬件层,应用层。

理解 ECF 的重要性;

  • 有助理解应用程序如何与操作系统交互(陷阱或系统调用)
  • 有助理解并发
  • 有助理解异常如何工作

类型

类别 原因 异步/同步 返回行为
中断 来自 IO设备的信号 异步 总是返回下一条指令
陷阱 有意识的异常 同步 总是返回到下一条指令
故障 潜在可恢复的错误 同步 可能返回当前指令
终止 不可恢复的错误 同步 不会返回

中断不是从任何一个专门的指令造成的,从这个意义上它是异步的;所以同步是执行一条指令的结果,所以称为同步的???

阅读全文 »

Java中int和Integer的关系是什么

还有boolean和Boolean,short和Short,char和Character,byte和Byte,long和Long,float和Float,double和Double。初学Java时有些困惑,拿int和Integer举例说明:

  1. int是基本数据类型,和C++中类似,但Java是一门面向对象语言,所以对其进行了扩展,封装,形成了Integer类,使其拥有了更多的方法。
  2. 初始化时int的变量初始化为0,为Integer为null
  3. 他们都可以表示数值,但不能互用
  4. 当使用hashmap这样的容器时无法使用int,因为容器内装的都是object
  5. 如果只是用于简单的运算和参数传递可以使用int,想要使用更多方法就声明为一个对象

对其他的基本类型和封装类也是同样的道理。


Java并不是完全面向对象的语言,依旧保留了基本类型,所以有些地方使用是有点麻烦的,比如在调用函数时,对对象赋值传递的是地址,而基本类型传递的值,所以参数中 int 类型是值传递,不会对实参造成影响,但又不能使用 C 中指针或引用,最近就遇到了这个问题:

  • 我先尝试使用 Integer 封装对象,但实参依旧没有改变,原因是 Integer 中的值 int 为 final 类型,无法改变,所以在改变 Integer 对象时是创建了新的对象
  • 网上有一些方法,但我觉得都太麻烦了,比如自己封装一个类,传递专用AtomicInteger原子整型对象等。最后选择了最简单的解决办法:将原本要传递的 int 参数改为 int[] 数组类型,可以达到效果

今天无意中看到这个主题,功能强,界面又好看,好像有动力写博客了呢,就顺便把这两天的东西记一下,,,

编辑:通过七牛云配合qimage工具制作图床( https://jverson.com/2017/05/28/qiniu-image-v2/ ),保存的typora图片终于可以在别处显示啦

servlet

idea配置遇到的几个坑:

  1. 在project struct中设置class输出路径到WEB-INF
  2. 写好的Java文件要自己手动编译一下
  3. 最惨的是把 WEB-INF 打成了 WEB_INF,找了半天错fxxx

运行流程:

mYmVoR.png

阅读全文 »

每次用到什么list, map时都要Google一下初始化,取值各种方法,还有Arrays工具类等等,真的感觉Java很麻烦不习惯,还是写个总结好好梳理一下吧,至于这些类的底层实现以及运行效率分析什么的以后再做总结吧。

另外使用集合而不是数组的主要原因是集合提供了很多方法,并且长度是可变的。首先集合分两大类:

mYmPQU.png

Collection

有各种数据结构,就分了多种集合类,然后这些集合类共性提取,最终形成了一个集合的继承体系,最高层的类就是collection。

collection的功能有:

阅读全文 »

看Java编程思想做的一点笔记,有点乱,但也能看,,,

异常

throws

考虑如下情况:
主方法调用method1, method1调用method2, method2中打开文件

  • method2中需要进行异常处理,但是method2不打算处理,而是把这个异常通过throws 抛出去。在方法声明中使用throws处理异常。
  • 那么method1就会接到该异常。 处理办法也是两种,要么是try catch处理掉,要么也是抛出去
  • method1选择本地 try catch 住,一旦try catch住了,就相当于把这个异常消化掉了,主方法在调用method1的时候,就不需要进行异常处理了

对象

将对象看作“服务提供者”,程序本身将向用户提供服务,它将调用其他对象提供的服务来实现这一目的。我们的目标是创建或寻找能够提供理想的服务来解决问题的一系列对象。

阅读全文 »