constconstexpr

constexpr

常量表达式:是指值不会改变且在编译期间就可以计算处结果的表达式

常量表达式是由

  • 数据类型
  • 数据初始值

决定的。

int a = 1 a 不是一个常量表达式,因为它的数据类型不是常量

const int b = get_val() b不是一个常量表达式,因为它的初始值不是常量

由于使用const 不能确定一个表达式是不是常量,因此C++11使用constexpr 修饰符,可以让编译器在编译期间检查一个表达式是不是常量。

阅读全文 »

并发编程 - CS:APP 第十二章

本章主要内容:

  • 实现并发程序的三种方法:
    1. fork() 进程
    2. I/O 多路复用
    3. 使用线程
  • 使用信号量同步线程
  • 线程安全问题
阅读全文 »

网络编程 - CS:APP 第十一章

客户端和服务器都是进程,而不是机器或主机。

IP地址

IP地址结构:由于早期的一些原因,存放IP地址的32位无符号整数被放到了一个结构中

1
2
3
struct in_addr {
uint32_t s_addr; // 32位IP地址,使用网络字节顺序(大端法)
}

由于不同的设备,使用的字节顺序不同。因此,在网络上进行传输时,会首先把字节转换成网络字节顺序,接受时,会再转换回本地字节顺序。

阅读全文 »

系统级I/O - CS:APP 第十章

Linux 所有的IO设备都被模型化为文件,所有的输入输出都被抽象成文件的读写。这种将设备映射成文件的方式,允许内核提供一些低级的函数接口还读写,被称为Unix IO。

在Linux中,较高级的IO函数(C标准库IO)是由内核提供的系统级Unix IO来实现的。

文件描述符

  • 定义:一个应用程序要通过内核打开文件,内核返回一个非负小整数,叫做文件描述符,应用程序要操作文件,只需要知道文件描述符即可。

  • Linux Shell 创建的进程会打开三个文件:

    0:标准输入;也可以使用定义在unistd.h 中的STDIN_FILENO 来显示表述

    1:标准输出;STDOUT_FILENO

    2:标准错误;STDERR_FILENO

  • EOF:如果一个字节数为m的文件,一个读操作,读到k字节处。如果k >= m,则触发一个End of file条件,应用程序可以检测这个条件,但文件末尾并不是真的有EOF符号。

阅读全文 »

虚拟内存视角下的Linux进程 & 动态内存分配

Linux的虚拟内存系统

Linux为每个进程提供了一个虚拟地址空间。而这些地址空间被分为两部分:

  • 进程虚拟内存部分
  • 内核虚拟内存部分

进程虚拟内存部分我们已经很熟悉了,按照地址从低到高,他们分别是:

用户栈
%rsp →
共享库的内存映射区域
brk →
运行时的堆(通过malloc分配的)
未初始化的数据(.bss)
已初始化的数据(.data)
0x400000 → 代码(.text)
阅读全文 »

异常控制流 - CS:APP 第8章

这一章更多的是实践,理论的部分实在不多

本文将介绍:

  1. 常见的异常
  2. (Linux)部分并发编程

一系列的指令组成的流叫做控制流,现在的操作系统通过使控制流突变来对异常情况作出反应,这种突变就叫做异常控制流。

阅读全文 »

存储器层次结构 - CS:APP 第六章

本章的主要内容有四:

  1. 介绍存储技术
  2. 介绍存储器的层次结构思想
  3. 特别介绍高速缓存的原理和细节
  4. 使用局部性优化程序的性能

本文主要介绍前三条内容,第四条内容可以说是优化程序性能的一部分,所以本文暂不深入。另外,本章和第九章虚拟内存密切相关,因此本文也会介绍第九章的虚拟内存,来完整的总结计算机的存储系统。

阅读全文 »

CS:APP 读后感

这本书,给了我 一个在Linux下运行的程序 的直观印象。下面是每一章让我产生 “惊讶” 的内容,这些内容是我在这本书中新接触到的内容。(以下内容是在阅读完第一遍之后,第二遍之前写的)

接下来会陆续更新各章的详细笔记 …

阅读全文 »