一些有用的/易忘的常识

一些有用的/易忘的常识

专业

字节与比特

  • 字节 B 用来表示文件的大小,KB,MB,GB 互隔 2^10^
    • 作为存储容量时,有时会互隔 1000
  • 比特 bit 每秒 bps 用来表示网络速度,Kbps,Mbps,Gbps 互隔 2^10^

移位运算

  • << 左移:右边空出的位置补 0,其值相当于乘以 2
  • >> 右移:左边空出的位
    • 如果是正数则补 0,若为负数则补 0 或 1,取决于所用的计算机系统 OS X 中补 1
    • 其值相当于除以 2,向下取整

按位运算

  • & 按位与
    • 只要任何一位是 0,& 运算的结果就是 0,所以可以用 & 把某个变量不必要的位设为 0
      • 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低 4 位,消除高 4 位,用 & 0x0F 就可以了(注:0x0F 为 16 进制表示法,对应的二进制为 0 0 0 0 1 1 1 1),这个特性在编码中使用很广泛。
    • 一个整数 n,n&1 这个表达式可以用来判断 a 的奇偶性
      • n&1 相当于取 n 二进制形式的最低位。
      • 二进制的末位为 0 表示偶数,末位为 1 表示奇数。 使用 n%2 来判断奇偶性 和 n&1 是一样的作用,但是 n&1 要快好多。
  • | 按位或
  • ^ 按位异或
  • ~ 取反

动态类型语言

  • 动态性语言是指在运行期间才去做数据类型检查的语言
  • 使用动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。
  • Python 和 Ruby 就是一种典型的动态类型语言,其他的各种脚本语言如 VBScript 也多少属于动态类型语言

静态类型语言

  • 静态类型语言的数据类型在编译期间检查
  • 使用静态类型语言写程序时要声明所有变量的数据类型
  • C/C++ 是静态类型语言的典型代表,其他静态语言还有 C#、Java、Golang 等

强类型语言

  • 强制类型定义的语言
  • 即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就死该数据类型。
  • 强类型语言包括:Java、.net、Python、C++、Golang 等语言
    • 其中 Python 是动态语言,是强类型定义语言,是类型安全的语言
    • Java 是静态语言,是强类型定义语言,也是类型安全的语言

弱类型语言

  • 某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。
  • 弱类型语言包括:VB,PHP,JavaScript 等语言。
    • 其中 VBScript 是动态语言,是一种类型不安全的原因

IO 路复用

IO 多路复用(IO Multiplexing)是一种用于处理并发 IO 操作的技术。它允许单个线程同时监视多个 IO 通道(如套接字、文件描述符等),并在有 IO 事件发生时进行通知和处理,从而实现高效的并发 IO 操作。

传统的 IO 模型中,每个 IO 操作通常需要一个独立的线程来处理,这样在面对大量并发的 IO 操作时,线程的创建和切换开销会变得很高,影响系统性能。而 IO 多路复用采用了事件驱动的方式,使用一个线程同时监听多个 IO 通道,当某个通道有 IO 事件发生时,通过系统调用将其通知给应用程序,然后应用程序可以针对发生的事件进行相应的处理。

常见的 IO 多路复用机制包括以下几种:

  1. select:select 函数是最早的 IO 多路复用函数,它可以同时监视多个文件描述符的可读、可写和异常等事件,但它有一些限制,如文件描述符的数量有限,效率较低等。
  2. poll:poll 函数也可以同时监视多个文件描述符的 IO 事件,相比 select 函数,它没有文件描述符数量的限制,并且效率更高。
  3. epoll:epoll 是 Linux 特有的 IO 多路复用机制,通过 epoll_ctl 函数向内核注册文件描述符,并使用 epoll_wait 函数获取就绪的事件,它具有高效、可扩展等特点,被广泛应用于高性能的网络编程。

IO 多路复用的优点在于减少线程数目,降低了线程管理的开销,并且避免了线程切换的开销。它适用于需要同时处理大量并发 IO 操作的场景,如网络服务器编程中的并发连接处理。使用 IO 多路复用可以提高系统的响应速度和并发处理能力,提升系统性能。

其他

Windows 安装路径

  • C:\Program Files
    • 64 位的软件安装目录,所有用户都能使用,程序安装到这里需要管理员权限。若程序数据也写在这个目录下,软件每次启动都会要求授予管理员权限,存在很大的安全隐患。
  • C:\Program Files(x86)
    • 和上面的一样,只是该目录用于存放 32 位的应用。
  • C:\Users\用户名\AppData\Roaming
    • 通过环境变量 %AppData% 可以访问,这里用来存放当前登录用户所产生的数据,对其他的用户不可见。如果你在公司网络,加入了域,这个文件夹会通过网路同步,让你的数据在不同的计算机上漫游。该目录常被滥用。
  • C:\Users\用户名\AppData\Local
    • 通过环境变量 %LocalAppData% 可以访问,这个目录和上面的基本一样,不过仅限本地,加入了域也不会同步。一般情况下,如果不加入域,Roaming 和 Local 并没有什么区别,但是需要网络同步的时候,尽量把不必要的数据留在本地。个人使用的软件可以装在 C:\Users\用户名\AppData\Local\Programs 下面 。
  • C:\ProgramData
    • 和 AppData 的区别在于,这里存放的数据是公用的,如果你希望软件的数据在所有的用户之间保持一致,那么程序生成的数据应当存放在这里。
  • C:\Users\用户名
    • 用户的家目录。Linux 和 MacOS 用户应该很熟悉,所有个人数据都应该放在家目录下。一些跨平台软件喜欢在这里写数据,并生成一堆文件名以 . 开头的文件,这在 Linux 下是隐藏文件,但 Windows 文件管理器并不按这个逻辑处理,用户只能主动给所有点号开的文件加上隐藏属性,并文件管理器里设置成不显示。
  • C:\Users\用户名\Documents
    • 又称我的文档。看名字就知道,这里存放的是用户主动保存的数据。比如各种文稿,照片,音乐,视频,档案 之类的。有的软件会无脑把程序数据写在这里,导致文档目录混乱。有些数据 (日志、配置、缓存数据) 是给软件服务的,用户无法直接使用这些文件,那么这些数据就应该放到 AppData 下面去。