- 博客(69)
- 收藏
- 关注
原创 13.进程-fork函数的原理和进程空间
进程空间这里说的进程空间,指的是进程虚拟地址空间;每个进程都有自己的4GB 虚拟地址空间,这里指的是32位系统下的进程;每个进程的进程虚拟地址空间是相互隔离的,互不影响;...
2018-06-29 22:44:04 340
原创 12.进程-进程的产生(fork函数)
上篇文章中的a.out进程实际上是由终端 bash 进程创造出来的;那 bash 进程的父进程又是谁呢?如果你不断追溯下去,你就会发现,最终的那个进程就是 pid 为1 的 init 进程,而 init 进程,又是由一个 pid 为 0 的进程通过系统调用 fork 生成的,它也是第一个由 fork 函数创造出来的进程;fork 是用户创建进程的唯一方法(万事都有特例,现阶段可忽略);fork函数...
2018-06-29 22:27:17 396
原创 21.TCP协议-拥塞控制概述
概述在学习拥塞控制前,我们假设:接收方总是有足够大的缓存空间,接收方的接收窗口大小总是很大——这意味着接收方对数据来者不拒。在基于这样的理想条件上,如果发送方发送的数据接收方没有收到,那么大抵上可以判断为网络出现了拥网络拥塞是怎么来的图1 某个小型局域网 图 1 所示的是一个典型的小型局域网,SW 表示交换机,R 表示路由器。基于第 1 节中所述的假设,如果 PC1 给主机 PC3 发送 TCP ...
2018-06-25 22:34:07 649
原创 111.二叉树的最小深度(Minimum Depth of Binary Tree)
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.解题思路...
2018-06-19 22:29:04 562
原创 13.TCP协议-同时关闭
有同学会问,为什么不写同时打开?(同时打开指的是两端都是服务器,两端同时向对方建立连接请求)。一方面,在我们实际生活中几乎遇不到;另一方面,很多操作系统实际都不能正确的支持同时打开,所以,这里就不写了,如果你对这个很感兴趣,请参考《TCP/IP 详解卷1:协议》的 18.8 小节。1. 同时关闭同时关闭,指的是已建立连接的两端同时发起主动关闭。TCP 协议允许这种事情发生。见图 1. 图1 同时关...
2018-06-14 20:28:47 1014
原创 12.TCP协议-半打开
1. 半打开(Half-Open)如果一方已经关闭或异常终止,而另一方却对此毫不知情,这种连接就称为半打开的。比如:其中一端突然断网了,或者停电导致的异常关机。假设在主机 A 和 B 之间建立了一条 TCP 连接,由于停电导致主机 B 异常关机。接下来,我们分三种情况讨论,A 此时继续给 B 发数据,会有什么现象。B 仍然关机B 开机,但是未启动服务B 开机并重新启动了服务2. 实验serv 程序...
2018-06-14 20:28:03 787
原创 11.TCP协议-连接异常与RST
RST段当TCP连接出现严重的错误时,必须释放连接;通过将TCP 首部中的 RST 标志位置 1,就可以通知对端发生错误,以终止连接;我们在 TCP 协议(连接异常)一文中已经看到过这种错误,当时实验演示的是向一个不存在的端口建立连接,导致对端发送过来一个 RST 段。异常终止连接正常情况下,关闭连接的方式是发送 FIN 段,即四次挥手。这种方式也称为有序释放(orderly release)。也...
2018-06-14 20:20:48 960
原创 2.TCP协议-基础
什么是TCP协议你和你对象(没有对象那就选你上铺或下铺的同学吧)发短信,事先约定,你给他发送任何短信,TA 都得回复你一句:收到。我想这个在你平时生活中应该有所遇到。比如你发送“早安”给 TA,TA 会回复你:“收到”。如果过了 1 分钟你还没有收到 TA 的回复(也许是你发送的短信 TA 没收到,也许是 TA 已经回复了,但是因为网络原因你没收到),你就再发送一次“早安”给 TA,直到 TA 回...
2018-06-13 22:13:19 680
原创 1.基础知识
协议协议,如果换成C语言来描述,那就是一个struct结构体,有很多函数可以对结构体(协议)进行解读;底层的协议,可以为其上层协议服务,是指底层的结构体中的数据域,就是上层的某个结构体(协议)的对象;数据链路层上传输是2型以太网帧,你可以把帧理解为一个struct frame结构体;struct frame { char destination[6]; // 目标网卡地址 char sou...
2018-06-13 21:58:37 684
原创 11.进程-基础
当你编译完一段代码生成 a.out 后,在命令行键入 ./a.out,这时候,就有一个(或多个)新的进程产生了(前提你的 a.out 没问题^_^).在此之前,a.out 文件只是一份保存在你硬盘上的死物而已,它并不是进程。一旦你在你的终端里键入./a.out,你的终端 shell(它也是个进程,一个活物) 就会把 a.out 文件读到内存,一旦把控制权交给内存中的这段 a.out (称之为内存映...
2018-06-13 10:47:16 1087
原创 5.文件IO-fcntl函数(修改文件表的 f_flags 标志)
阻塞与非阻塞是文件本身的属性;每个文件描述符是数组的一个索引,这个数组每个元素保存了一个指向文件表的指针;这个文件表的结构如下:
2018-06-12 21:58:38 1023
原创 4.文件IO-阻塞与非阻塞IO
通常来说,从普通文件读数据,无论你是采用 fscanf,fgets 也好,read 也好,一定会在有限的时间内返回;但是如果你从设备,比如终端(标准输入设备)读数据,只要没有遇到换行符('\n'),read 一定会“堵”在那而不返回;还有比如从网络读数据,如果网络一直没有数据到来,read 函数也会一直堵在那而不返回;read的这种行为,称之为block,一旦发生block,本进程将会被操作系统设置为睡眠,直到等待的事件发生(比如有数据到来),进程才会被唤醒;系统调用 write 同样有可能
2018-06-12 21:57:41 1156
原创 3.文件IO-文件描述符,文件表与lseek
文件描述符在上一篇博客当中,我们知道open函数会返回一个整数,它在本进程中唯一标识了一个文件;在一个进程中,存在着一个大数组,记录了打开的文件;这个数组的索引就是open函数返回的整数,而这个索引就是文件描述符;而这个数组的每一项,都记录了与打开的文件相关的信息;在操作系统当中,是通过进程控制块(PCB)来描述进程信息和相关资源的;实际上在Linux中,PCB就是一个巨大的结构体,即task_s...
2018-06-12 21:45:53 982
原创 2.文件IO-read/write/open函数
用Linux接口实现文件拷贝#define BUFFERSIZE 4096int main(int argc, char* argv[]) { int srcfd = open(argv[1], O_RDONLY); // 用只读的方式打开一个已经存在的文件 //创建一个新的文件,这个文件只能写,权限是 0666 int dstfd = open(argv[2], O_CREAT ...
2018-06-12 16:56:07 1325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人