内存管理

内存 (随机访问存储器,RAM) 是计算机中一种需要认真管理的重要资源。不管存储器有多大,程序都能把它填满。经过多年的探索,我们有了 分层存储器体系 (memory hierarchy) 的概念,即计算机拥有若干 MiB 快速、昂贵且易失性的 Cache,数 GiB 速度与价格适中的易失性内存,以及数 TiB 快速、廉价但非易失性的磁盘存储。计算机中管理分层存储器体系的部分被称为 存储管理器 (memory manager)。它的任务是有效地管理内存,记录哪些内存正在使用,哪些内存是空闲的,在进程需要时为其分配内存,在进程使用完后释放内存。

进程与线程

进程 (Process) 是操作系统中的核心概念,是对正在运行的程序的抽象。即使只有一个可用的 CPU,也可以启动多个进程,让操作系统具有并发能力。

一个进程就是一个正在执行的程序实例,每个进程都拥有一个自己的虚拟 CPU、程序计数器、寄存器、内存地址空间等,这些是一个进程私有的,不可被其他进程所访问、修改,真正的 CPU 在各个进程之间来回切换。

使用 KMS 激活 Microsoft 软件

微软的软件主要可以通过以下三个渠道获取:

  • 零售
  • 原始设备制造商 (OEM)
  • 批量许可协议

OEM 在工厂执行激活,比如说新买的笔记本电脑自带的系统就是这种方式。零售主要通过联机、电话或 VAMT 代理激活。批量激活产品主要选择 MAK (多次激活密钥) 、 KMS (密钥管理服务) 以及 AD (Active Directory) 进行激活。

初识 Phoenix Framework

Phoenix Framework 是一个 MVC web 框架,与 Ruby 的 Rails 和 Python 的 Django 类似,是整个 Elixir 社区的核心项目之一,推荐阅读 Phoenix 文档

我们使用 Phoenix (v1.5.7) 前,需要安装相关依赖与 mix

  • Elixir (>= v1.6)
  • Erlang (>= 20)
  • node.js [optional] (>= 5.0.0)
  • Database [default=PostgreSQL]
  • inotify-tools [linux]

erlang 与 elixir 是运行时环境,数据库方面使用同为社区维护的 Ecto 来操作,Phoenix 使用 node.js 的原因是使用 webpack 编译静态资源,当然你可以只开发 API 不使用静态资源

原子操作

原子操作是一个不可分割的操作,系统的所有线程不会观察到原子操作完成了一半。如果读取对象的加载操作是原子的,那么这个对象的所有修改操作也是原子的。

标准原子类型全部定义于头文件 atomic 中,这些类型的操作都是原子的,但是其内部实现可能使用原子操作或互斥量模拟,所以原子操作可以替代互斥量完成同步操作,但是如果内部使用互斥量实现那么不会有性能提升。

并发标准库

新的线程会在 ::std::thread (头文件 thread 中) 对象创建的时候被启动,在函数执行完毕后,该线程也就结束了,提供的函数对象会复制到新线程的存储空间中,函数对象的执行与操作都在线程的内存空间中执行。在创建新线程时你可以指定一个函数作为任务,或者是 仿函数,当然也可以是 lambda 表达式

搭建邮箱服务器

搭建邮局服务器的想法之前一直都有,不过一直没有尝试,国庆的时候从阿里云换到了腾讯云的时候尝试直接使用 postfixdovecot 搭建,尝试了大概3天被劝退了,重新使用现成的解决方案也算终于搭建好了,可以愉快的使用自建邮箱了 (可以愉快的装逼了

GPG 入门指北

Pretty Good Privacy (PGP),是一套用于讯息加密、验证的应用程序,由 Phil Zimmermann 于1991年发布,由一系列散列、数据压缩、对称密钥加密以及公钥加密的算法组合而成。GNU Privacy Guard (GPG),是一个用于加密、签名通信内容以及管理非对称密钥的自由软件,遵循IETF订定的 OpenPGP技术标准 设计,并与PGP保持兼容。