惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
TaoSecurity Blog
TaoSecurity Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
SecWiki News
SecWiki News
L
LINUX DO - 最新话题
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
Help Net Security
Help Net Security
Security Latest
Security Latest
T
Troy Hunt's Blog
腾讯CDC
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
T
Threatpost
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
Microsoft Security Blog
Microsoft Security Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
M
MIT News - Artificial intelligence
量子位
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
G
Google Developers Blog
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
C
Cisco Blogs
罗磊的独立博客
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cybersecurity and Infrastructure Security Agency CISA
有赞技术团队
有赞技术团队
Application and Cybersecurity Blog
Application and Cybersecurity Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
The Hacker News
The Hacker News
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
N
News and Events Feed by Topic
S
Securelist

博客园 - 12不懂3

IOC容器 分布式锁 分布式事务 Myql索引篇+c#性能优化篇 jwt验证机制 HttpHelper .net7.0 .net升级7.0报错1. MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse 2.SqlSugar.SqlSugarException: Cannot Open when State is Connecting. 3.The current TransactScope is already complete Windos Elastocsearch安装部署汉化 Mysql ElasticSearch C# Common中心目录 ABP.VNET 原书籍《Effective C#:改善C#代码的50个有效方法》 精炼18点 ABP c# 技术点总结 kuberspere管理工具+k8s安装 K8s核心组件理解 数据库事务和锁
IO读写+Epoll多路复用,计算机底层解析
12不懂3 · 2022-08-06 · via 博客园 - 12不懂3

更具体的解析视频地址:https://www.bilibili.com/video/BV11K4y1C7rm?from=search&seid=1779865754374798584&spm_id_from=333.337.0.0&vd_source=12d06e602c3462c026d1a4781241f2d4

程序是如何调用 内存+磁盘+CPU+网卡的

1.内存:

一个简单的C#程序在硬盘里面就是文件,只有被加载到内存中才会有主线程,变成一个进程程序

而电脑开机第一个夹菜到内存里面的就是Kernel(内核) 

Kernel(内核) :

相当于一个管理,管理计算机的网卡磁盘等硬件 而Kernel(内核)进入到内存第一件事就是创建一个GDT(全局描述附表)

GDT:

把Kernel(内核) 进程所在的内存空间和其他进程的内存空间划分出来  相当于我们的内存里面就存两部分数据  Kernel(内核) 内存+其他程序的内存 +其他如DMA

为什么要什么划分:因为Kernel(内核) 管理了计算机的硬件等,如果不划分 其他进程去随便操作里面的东西就会造成黑屏蓝屏等问题

GDT会开启保护模式:使其他进程是不能访问硬件资源(磁盘网卡等) 

CPU:

指令集概念,指令集又有rang0 rang1 rang2 rang3的概念 

普通进程的指令集的级别是3  Kernel(内核) 的指令级别是0 

所以CPU是从内存里面找到进程读取他们的指令集

有了上面的概念呢解析 那么我们一个普通的进程想要进行IO操作,但是又有GDT又不能访问 怎么办?

Kernel(内核)是能直接访问硬件资源,但是GDT又不能普通进程访问Kernel(内核) 的内存空间,于是Kernel(内核) 对外暴露了一个接口使其能访问(系统调用软中断,kernel提供一个syscall),

但也就造成了我们的进程每次想要访问磁盘资源都会去请求Kernel(内核) 的接口 IO成本太高了,如果一个服务进程 有10W个客户端来链接,但是只有两个人发了信息,还是得请求10W次这样就造成了极大的浪费 复杂度也是O(n)O1次请求(n=10W)

所以我们要解决这个问题    于是 就有了Epoll IO多路复用 

Epoll 返回的是IO状态   读写是需要程序自己完成的

IO Redis

Redis worker单线程  但是使用的又是epoll多路复用器   用epoll告诉redis 即使有十万个客户端  也只需要读那几个

kafak 和kernel 为了减少对kernel系统调用  使用了 kernel的缓存页  kafak+kernel共享一部分内存 然后把数据刷入到磁盘, 所以kafak只需要把数据push到自己本地的内存  kernel就能把数据刷到磁盘,避免kernel自己系统调用,有缓存有会有数据丢失问题

零拷贝:sendfile-系统调用 在kernel里面  前提是数据不需要加工,已经在内存片区里面 使用sendfile的参数 输入输出就行