You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
|
|
|
|
|
### 内存管理
|
|
|
|
|
段:存放全局变量和静态变量
|
|
|
|
|
栈:系统自动分配释放,函数参数值,局部变量,返回地址等在此
|
|
|
|
|
堆:存放动态分配的数据,由开发人员自行管理
|
|
|
|
|
|
|
|
|
|
不同操作系统进程和线程实现机制有不同。
|
|
|
|
|
|
|
|
|
|
虚拟内存技术,把进程虚拟地址空间划分成用户空间和内核空间。
|
|
|
|
|
在 32 位操作系统中,4GB 的进程地址中用户空间为 0~3G,内核地址空间为 3~4G,
|
|
|
|
|
用户不能直接操作内核地址,只有通过系统调用的方式访问。
|
|
|
|
|
|
|
|
|
|
线程共享虚拟内存和全局变量等资源,线程拥有自己的私有数据比如栈和寄存器。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 多任务
|
|
|
|
|
多任务就是可以同时运行多个任务。分为并行和并发两种。
|
|
|
|
|
并行是真在不同CPU核上同时执行,并发是轮换在一个核上执行。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 阻塞/非阻塞
|
|
|
|
|
等候消息的过程中能不能干其他事
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 同步/异步
|
|
|
|
|
一个任务完成后才能开始下一个任务是同步,
|
|
|
|
|
多个任务同时在运行状态是异步 。
|
|
|
|
|
通知调用者的三种方式,如下
|
|
|
|
|
状态:即监听被调用者的状态,调用者每隔一段时间检查一次是否完成(轮询)。
|
|
|
|
|
通知:当被调用者执行完成后,发出通知告知调用者。
|
|
|
|
|
回调:当被调用者执行完成后,调用调用者提供的回调函数 。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 进程、线程
|
|
|
|
|
|
|
|
|
|
运行一个软件就是开了一个进程
|
|
|
|
|
比如,一个游戏启动后为一个进程
|
|
|
|
|
但一个游戏需要图形渲染,联网操作能同时运行
|
|
|
|
|
所以将其各个部分设计为线程
|
|
|
|
|
即一个进程有多个线程
|
|
|
|
|
|
|
|
|
|
从操作系统层面而言
|
|
|
|
|
进程是分配资源的基本单位
|
|
|
|
|
进程之间是独立的
|
|
|
|
|
一个进程无法访问另一个进程的空间
|
|
|
|
|
一个进程运行的失败也不会影响其他进程的运行
|
|
|
|
|
|
|
|
|
|
因为操作系统可以切换进程,所以并发的进程数会超过核数
|
|
|
|
|
当需要创建的子进程数量巨大时,可以创建进程池
|
|
|
|
|
进程间常通过消息队列程序实现数据传递
|
|
|
|
|
|
|
|
|
|
一个进程内可以包含多个线程
|
|
|
|
|
线程是程序执行的基本单位
|
|
|
|
|
线程是操作系统分配处理器时间的基本单元
|
|
|
|
|
线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
|
|
|
|
|
|
|
|
|
|
一个进程下的多个线程可以共享该进程的资源,包括内存。
|
|
|
|
|
多个线程同时对同一个全局变量操作,会出现竞争问题,从而数据结果会不正确
|
|
|
|
|
解决办法:某个线程要更改数据时,先将其锁定,直到将状态变成“非锁定”,其他的线程才能锁该资源。
|
|
|
|
|
如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
|
|
|
|
|
可以用一些机制解决死锁,比如超时。
|