【xv6】夯实基础
第一个进程每个进程都有一个运行线程(或简称为线程)来执行进程的指令。线程可以被暂时挂起,稍后再恢复运行。系统在进程之间切换实际上就是挂起当前运行的线程,恢复另一个进程的线程。线程的大多数状态(局部变量和函数调用的返回地址)都保存在线程的栈上。
每个进程都有用户栈和内核栈(p->kstack)。当进程运行用户指令时,只有其用户栈被使用,其内核栈则是空的。然而当进程(通过系统调用或中断)进入内核时,内核代码就在进程的内核栈中执行;进程处于内核中时,其用户栈仍然保存着数据,只是暂时处于不活跃状态。进程的线程交替地使用着用户栈和内核栈。要注意内核栈是用户代码无法使用的,这样即使一个进程破坏了自己的用户栈,内核也能保持运行。
当进程使用系统调用时,处理器转入内核栈中,提升硬件的特权级,然后运行系统调用对应的内核代码。当系统调用完成时,又从内核空间回到用户空间:降低硬件特权级,转入用户栈,恢复执行系统调用指令后面的那条用户指令。线程可以在内核中“阻塞”,等待 I/O, 在 I/O 结束后再恢复运行。
p->state 指示了进程的状态:新建、准备运行、运行、等待 I/O 或退出状态中。 ...
高性能 Linux 服务器编程
TCP/IP 协议栈详解TCP/IP 协议族
协议栈层次
具体协议
应用层
telnet, OSPF, DNS
传输层
TCP, UDP
网络层
ICMP, IP
数据链路层
ARP, RARP
数据链路层
ARP (Adress Resolution Protocol)地址解析协议
RARP (Reverse Address Resolution Protocol)反向地址解析协议实现了 IP 地址到 MAC 地址的映射。RARP通常用于(无盘)磁盘less工作站,因为这些工作站没有存储自己的 IP 地址。网络层网络层实现数据包的路由和转发,主要协议有 IP 和 ICMP。
IP(Internet Protocol)互联网协议
ICMP(Internet Control Message Protocol)互联网控制报文协议ICMP 是 IP 协议的重要补充,主要用于网络故障的诊断和错误报告。ICMP的报文是封装在 IP 数据包中的。报文格式如下:12345678910111213141516struct icmp { u_int8_t ...
C++ 11/14/17/20
高速上手 C++ 11/14/17/20与 C 的兼容在不得不使用 C 时,应该注意使用 extern "C" 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
123456789101112131415161718192021222324252627// foo.h#ifdef __cplusplusextern "C" {#endifint add(int x, int y);#ifdef __cplusplus}#endif// foo.cint add(int x, int y) { return x+y;}// 1.1.cpp#include "foo.h"#include <iostream>#include <functional>int main() { [out = std::ref(std::cout << "Result from C code: " &l ...
多核调度算法
多级反馈队列 (MLFQ)
优先级高的任务先执行
优先级相同的任务按照时间片轮转(Round Robin)
新任务默认进入最高优先级队列
若任务再执行时配额用尽,则将其移动至下一级优先级队列。队列已用配额累计记录。
若任务在配额用尽前自愿放弃CPU,则保持在当前优先级队列
每隔一段时间,将所有任务移动至最高优先级队列配额:任务在每个优先级队列中可以执行的时间片数量
CFS (Completely Fair Scheduler)“让系统里的多有进程尽可能公平地共享处理器”
为每个进程记录精确的运行时间
中断/异常发生后,切换到运行时间最少的进程执行
下次中断/异常后,当前进程可能就不是运行时间最少的了
Linux 的选择:通过红黑树实现
键是进程的运行时间
节点是进程
左子树是运行时间更少的进程
右子树是运行时间更多的进程
根节点是运行时间最少的进程
优先级翻转
Linus:”没法解决,CFS凑合用吧”
IDLE多处理器调度的挑战既不能简单地分配线程到处理器,也不能简单地“谁空分给谁”多处理器调度的两难境地:
迁移开销
不迁移可能导致负载不均衡
其他补充知识lsto ...
【Rust】tokio
首先,我们需要了解什么是 I/O 密集型任务和 CPU 密集型任务。
CPU-bound tasks:CPU 密集型任务,指的是任务需要大量的 CPU 计算资源,而不是 I/O 操作。CPU 密集型任务的特点是 CPU 使用率高,计算时间长,I/O 操作少。
I/O-bound tasks:I/O 密集型任务,指的是任务需要大量的 I/O 操作,而不是 CPU 计算资源。I/O 密集型任务的特点是 CPU 使用率低,计算时间短,I/O 操作多。
异步编程是一种编程模型,用于处理 I/O 密集型任务。在异步编程中,任务的执行不会被阻塞,而是在等待 I/O 操作完成的过程中,可以执行其他任务。这样可以充分利用 CPU 资源,提高系统的性能。
async/await 是 Rust 语言提供的异步编程特性。通过 async/await 关键字,可以定义异步函数。异步函数可以在执行过程中暂停,等待 I/O 操作完成,然后继续执行。这样可以避免线程阻塞,提高系统的并发能力。
暂不关心底层,从高层看,#[tokio::main] 宏的作用是,启动一个 tokio 运行时,然后复制函数体给这个运行 ...
【DragonOS】DragonReach主线程优化
issue: https://github.com/DragonOS-Community/DragonReach/issues/46目前dragonreach是单线程逻辑,主循环中主要处理以下事务:1234567891011// 启动完服务后进入主循环loop { // 检查各服务运行状态 Manager::check_running_status(); // 检查cmd进程状态 Manager::check_cmd_proc(); // 检查计时器任务 TimerManager::check_timer_task(); // 监听systemctl Systemctl::ctl_listen();}主线程逻辑会一直循环,但是真正执行任务的时间很短,导致大量的cpu资源浪费。需求:用更优雅的方式去处理主循环:
阻塞读命令管道
子进程状态以及计时器任务可以使用信号等机制优化
方案設計:
在主线程中使用多线程,阻塞读取命令管道,如此主线程就不是 IO 密集型,而是 CPU 密集型
用信号机制处理子进程状态以及计时器任 ...
【DragonOS】ssh支持
调研openSSH-protable,redox-ssh,tinysshd,dropbear
数据库实践经验
错误日志分析:
aborted connection
https://www.cnblogs.com/chenjw-note/p/14362239.html
got-an-error-reading-communication-packets
https://stackoverflow.com/questions/48951549/docker-and-mysql-got-an-error-reading-communication-packets
https://blog.csdn.net/KangKangShenShen/article/details/116208961
「问题排查案例」MySQL报错Got an error reading communication packets问题分析指南
数据库卡死如果执行 DELETE FROM test_table LIMIT 1 也花费了很长时间没有反应,这表明表格可能非常大,或者存在其他问题导致删除操作非常缓慢。以下是一些建议和步骤,可以帮助你更有效地删除表格并释放空间:
检查当前活动的查询首先,检查数据库服务器上是否 ...