摘要:
一、左值和右值 左值: 一般来说,能在内存中取得其地址, 即是左值。比如正常的某个变量,有变量名,有相应的内存空间。 右值:在内存在无取得其地址的,或者说没有变量名的,即是右值。比如函数传参时,拷贝出来的临时变量,比如 a = b+c 中的 (b+c)结果。 左值对应变量的存储位置,而右值对应变量的 阅读全文
摘要:
在服务端中,listen() 只是让套接字进入监听状态,并没有真正接收客户端请求,listen() 后面的代码会继续执行,直到遇到 accept()。accept() 会阻塞程序执行,直到有新的请求到来。 socket结构体不仅仅记录了本地的IP和端口号,还记录了目的IP和端口。 服务器端使用 ac 阅读全文
摘要:
常见 I/O 模型 同步阻塞IO(Blocking IO):用户线程通过调用系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接受的数据拷贝到用户空间,完成read操作。整个IO请求过程,用户线程都是被阻塞的,对CPU利用率不够 同步非阻塞IO(Non-blocki 阅读全文
摘要:
new & delete 过程 当我们使用关键字 new 在堆上动态创建一个对象A时,比如 A* p = new A() ,它实际上做了三件事: 1.向堆上申请一块内存空间(做够容纳对象A大小的数据)( operator new ) 2.使用 static_cast 进行类型转换 3.调用构造函数 阅读全文
摘要:
TCP 包头信息 16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。 阅读全文
摘要:
Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请失败返回NULL。默认情况下,Linux内核使用“乐观的”分配内存策略,首先粗略估计系统可使用的内存数,然后分配内存,但是在使用的时候才真正把这块分配的内存给你。这样一来,即使用malloc申请内 阅读全文
摘要:
说法 1: 局部变量是在程序运行时由栈分配,对于没有初始化的局部变量,VC的DEBUG版会把未初始化的变量value,初始化为sizeof(value)个0xCC。所以我们会看到未初始化的整型的值始终是-858993460,而不是任意值。有意思的是汉字“烫”的编码恰好就是11001100110011 阅读全文
摘要:
树结构 1.二叉搜索树 typedef int DataType; struct TreeNode { DataType data; std::shared_ptr<TreeNode> left_node; std::shared_ptr<TreeNode> right_node; TreeNode 阅读全文
摘要:
直观对比 物理内存:也就是安装在计算机中的内存条,比如安装了 2GB 大小的内存条,那么物理内存地址的范围就是 0 ~ 2GB。这也是CPU可以直接进行寻址的内存空间大小 虚拟内存:虚拟的内存地址。由于 CPU 只能使用物理内存地址,所以需要将虚拟内存地址转换为物理内存地址才能被 CPU 使用,这个 阅读全文
摘要:
进程 VS 线程 进程是资源分配的最小单位,线程是程序执行CPU 调度的最小单位。这个太老生常谈了。 在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。 任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位。 进程有自己的独立地址空间 阅读全文