
### 内存管理
段：存放全局变量和静态变量
栈：系统自动分配释放，函数参数值，局部变量，返回地址等在此
堆：存放动态分配的数据，由开发人员自行管理

不同操作系统进程和线程实现机制有不同。

虚拟内存技术，把进程虚拟地址空间划分成用户空间和内核空间。
在 32 位操作系统中，4GB 的进程地址中用户空间为 0～3G，内核地址空间为 3～4G，
用户不能直接操作内核地址，只有通过系统调用的方式访问。

线程共享虚拟内存和全局变量等资源，线程拥有自己的私有数据比如栈和寄存器。


## 多任务
多任务就是可以同时运行多个任务。分为并行和并发两种。
并行是真在不同CPU核上同时执行，并发是轮换在一个核上执行。


## 阻塞/非阻塞
等候消息的过程中能不能干其他事


## 同步/异步
一个任务完成后才能开始下一个任务是同步，
多个任务同时在运行状态是异步 。
通知调用者的三种方式，如下
状态：即监听被调用者的状态，调用者每隔一段时间检查一次是否完成（轮询）。
通知：当被调用者执行完成后，发出通知告知调用者。
回调：当被调用者执行完成后，调用调用者提供的回调函数 。


## 进程、线程

运行一个软件就是开了一个进程 
比如，一个游戏启动后为一个进程
但一个游戏需要图形渲染，联网操作能同时运行
所以将其各个部分设计为线程
即一个进程有多个线程

从操作系统层面而言
进程是分配资源的基本单位
进程之间是独立的
一个进程无法访问另一个进程的空间
一个进程运行的失败也不会影响其他进程的运行

因为操作系统可以切换进程，所以并发的进程数会超过核数
当需要创建的子进程数量巨大时，可以创建进程池
进程间常通过消息队列程序实现数据传递

一个进程内可以包含多个线程
线程是程序执行的基本单位
线程是操作系统分配处理器时间的基本单元
线程之间没有单独的地址空间，一个线程死掉就等于整个进程死掉

一个进程下的多个线程可以共享该进程的资源，包括内存。
多个线程同时对同一个全局变量操作，会出现竞争问题，从而数据结果会不正确
解决办法：某个线程要更改数据时，先将其锁定，直到将状态变成“非锁定”，其他的线程才能锁该资源。
如果两个线程分别占有一部分资源并且同时等待对方的资源，就会造成死锁。
可以用一些机制解决死锁，比如超时。