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.
CodePattern/B 高性能模式/02 操作系统相关知识.md

85 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 内存管理
段:存放的是全局变量和静态变量
栈:系统自动分配释放,函数参数值,局部变量,返回地址等在此
堆:存放动态分配的数据,由开发人员自行管理
进程表会记录进程在内存的位置PID 是多少,以及当前什么状态,内存给它分配了多大使用空间以及属于哪个用户
每个用户态线程通过系统调用创建一个绑定的内核线程Windows NT 即采用这种模型
n 个用户态线程对应 m 个内核态线程。m 通常设置为核数Linux 即采用的这种模型
在 Linux 中,操作系统采用虚拟内存管理技术,使得进程都拥有独立的虚拟内存空间,理由也比较直接,物理内存不够用且不安全(用户不能直接访问物理内存)。Linux 内核看来只有进程而没有线程。Linux所谓的线程其实是与其他进程共享资源的轻量级进程。为什么说是轻量级呢在于它只有一个执行上下文和调度程序所需的信息与父进程共享进程地址空间 。
虚拟内存技术,把进程虚拟地址空间划分成用户空间和内核空间。
在 32 位的操作系统中4GB 的进程地址空间分为,用户空间和内核空间,用户空间为 03G内核地址空间占据 34G
用户不能直接操作内核空间虚拟地址,只有通过系统调用的方式访问内核空间。
线程共享虚拟内存和全局变量等资源,线程拥有自己的私有数据比如栈和寄存器。
## 并发/并行
多任务简单地说,就是操作系统可以同时运行多个任务。分为并行和并发两种。
并行是真在不同CPU核上同时执行并发是轮换在一个核上执行。
【顺序】 你做作业,然后看综艺,
【并发】 你写程序到一半,综艺开始,看完综艺后继续写程序。两件事情都处于启动状态
【并行】 你写程序到一半,综艺开始,你一边做作业一边写程序。两件事情同时做
## 阻塞/非阻塞
等候消息的过程中能不能干其他事
## 同步/异步
指的是消息通知的机制
主动听消息则为同步(一直等,轮流取)、被动听消息则为异步
异步过程调用发出后,可以继续执行其它操作
通知调用者的三种方式,如下
状态:即监听被调用者的状态(轮询),调用者没隔一段时间检查一次,效率会很低。
通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。
## 进程、线程、协程
一个游戏,启动后为一个进程
运行一个软件就是开了一个进程
但一个游戏需要图形渲染,联网操作能同时运行
所以将其各个部分设计为线程
即一个进程有多个线程
从操作系统层面而言
进程是分配资源的基本单位
进程之间是独立的
一个进程无法访问另一个进程的空间
一个进程运行的失败也不会影响其他进程的运行
一个进程内可以包含多个线程
线程是程序执行的基本单位,是进程中的实际运作单位
线程是操作系统分配处理器时间的基本单元
线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
协程运行在线程之上
协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈
通常我们所说的电脑配置几核就是最大可以运行的进程,
因为电脑会切换进程,所以看起来电脑会同时运行的进程数会超过核数
当需要创建的子进程数量巨大时,就可以创建进程池
进程是常通过Queue实现数据传递Queue是一个消息队列程序
线程是进程的一部分,一个进程下的多个线程可以共享该进程的所有资源
多个线程共享内存(数据和全局变量共享)。
如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确
需要进行同步控制。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。
如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
可以添加超时时间等,解决死锁
协程是在一个线程中
协程是异步编程的一种具体实现。异步编程是一种编程范式,旨在提高程序的并发能力。
协程是一种允许在特定位置暂停或恢复的子程序。协程提供了一种轻量级的并发方式,允许多个任务在单线程内交错执行,非常适合 I/O 密集型场景。
和回调等其他异步技术相比,
协程维持了正常的代码流程,在保证代码可读性的同时最大化地利用了 阻塞 IO 的空闲时间。
协程在Python中有三种实现方式
- 生成器中使用 yield/send
- 第三方库 gevent
- Python 3.5 以后的标准库中的 async/await
异步编程在当前 python 社区,常常等价于协程,甚至等价于 async