编译器和操作系统 他们两个都是软件和硬件接口的桥梁.
编译器是code和cpu的桥梁
操作系统原理
线程模型
线程机制是现代编程中常用的一种抽象概念。在多处理器系统上,它能保证真正的并行处理。
线程实现
线程实现, 主要有三种实现方式
- 在用户空间中实现线程; 内核不感知用户进程内有多个线程,如果阻塞的话就全阻塞了。
- 在内核空间中实现线程;
-
在用户和内核空间中混合实现线程。
- pthread https://www.cs.cmu.edu/afs/cs/academic/class/15492-f07/www/pthreads.html
- std::thread
- boost::thread
- bthread
- Eigen::ThreadPool 底层是 std::thread
- openMP
线程本地存储:thread local storage(简称TLS)。也叫线程特有存储:thread specific storage(简称TSS)或线程私有存储:thread private storage https://www.homedt.net/283433.html
线程参考资料
内存模型
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
- VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) Linux:VSS、RSS、PSS和USS的图解说明 内存耗用:VSS/RSS/PSS/USS 的介绍
$ free -h -w
total used free shared buffers cache available
Mem: 754G 335G 281G 4.1G 1.9G 135G 400G
Swap: 0B 0B 0B
memory arena (memory pool)
申请一大块连续的内存,然后自己管理(如何使用、如何分配、如何回收)
BFC 内存分配策略 - best-fit with coalescing
- kNextPowerOfTwo:后续扩展/收缩的值更大/更小(乘以/除以 2)
- kSameAsRequested:根据需要扩展/收缩
IO模型
socket系统调用,是进行TCP/IP通信的接口。
- 阻塞IO:应用程序调用recvfrom,如果没有数据来,程序会阻塞在这里。
- 非阻塞IO: 应用程序调用recvfrom,如果没有数据来,就直接返回EWOULDBLOCK。
高并发下的IO模型
- 信号驱动式IO
- IO多路复用
- 异步IO
文件I/O
标准I/O
Linux
Page Cache 和 Buffer Cache
页面缓存又叫文件缓存. 文件读取是由外存上不连续的几个磁盘块,到buffer cache,然后组成page cache,然后供给应用程序。
Android
https://source.android.com/docs/core/architecture
Fuchsia
Google 近期在 github 上建立了一个新的 organization,名为 Fuchsia,这是Google正在研发的另一款操作系统。因为 Google 已经拥有 Android 和 Chrome OS 两种操作系统,大家都在猜测为什么还要费力去开发新的系统。有两种猜想,一个是因为 Linux 内核的GPL协议一直限制着商用闭源,另一个是新的操作系统的目标是要打造嵌入式的实时操作系统用于日益成熟的虚拟现实、智能家电等设备。
Fuchsia OS的内核名为magenta,其中有MIT和BSD两种协议。微内核kernel用的是MIT协议,用户空间的服务、库、驱动用的是BSD协议。除了输入输出端口读操作、wait、sleep这些API以外的API都设计为非阻塞的。Fuchsia支持X86和ARM处理器。
LK 嵌入式内核
LK embedded kernel 是 另一个内核开源项目, 专门为移动小型设备打造,起能够应用在RAM很小、外设有限的系统中。 Magenta内核的内部构建基于LK,上层实现了进程、对象句柄、安全机制的概念。
Magenta 内核对象
Magenta 是基于对象的内核。用户空间的程序通过内核对象句柄和系统资源进行交互。内核对象由C++类实现,派生自Dispatcher类,目前实现了下面几种对象。
- 进程
- 线程
- 事件
- 消息管道
- I/O中断请求
- 虚拟内存对象
内核对象的生命周期是由引用计数器来控制的。一个内核对象一般因某个系统调用而产生,将一个句柄与其绑定,引用数refcount设为1。该对象呗其他句柄引用时,计数加1。调用sys_close等调用讲句柄与对象分离后,引用计数减1。当引用计数为0时内核对象会被销毁。