NJU操作系统(jyy OS)课程笔记-虚拟化部分
· 18 min read
lec14 操作系统上的进程
cpu有初始pc地址->放置固件上的初始程序(固件状态机)->启动OS(os状态机)->load init程序(程序状态机), 之后OS完全把行为转交给init(进程树的root)
llm 知道存在与知道的界限正在模糊: 知道存在且合理 逐渐趋同于 能做
例如 qemu 相关的一些东西
问llm发散出的概念->知识体系的快速建立
fork? 以状态机的视角理解
经典的for fork + printf
写了个示例
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <unistd.h>
#include <vector>
#include <mutex>
#include <sys/wait.h>
#include <map>
#include <string>
using namespace std;
const size_t buf_size = 1024;
const std::map<int, std::string> mode_map = {
{_IONBF, "no buffer"},
{_IOLBF, "line buffer"},
{_IOFBF, "full buffer"},
};
void test(int __modes) {
printf("test in mode %s\n", mode_map.at(__modes).c_str());
fflush(stdout);
vector<int> childs;
std::mutex mtx;
setvbuf(stdout, nullptr, __modes, 0);
for (int i = 0; i < 2; ++i) {
int pid = fork();
printf("hello from pid %d\n", pid);
if (pid > 0) {
std::lock_guard<mutex> lock(mtx);
childs.push_back(pid);
}
}
}
int main() {
// _IOLBF, _IOFBF, _IONBF
test(_IOFBF);
printf("\n");
fflush(stdout);
return 0;
}
在_IOLBF和_IONBF的情况下会出来6个hello
每次printf都直接刷新/检测到换行符刷新缓冲, fork的时候没有IO状态
而_IOFBF会有8个hello, 在fork第二次的时候会带着缓冲区(就是一段内存空间)进行fork,所以最后的4个进程每个都带着2个hello
系统里面没有魔法
fork: 把所有的知道的不知道的都复制了
“是不是这样?” -> 不知道的底层状态被复制了
execve: 重置状态机 argc, argv, envp -> main()
execve是唯一一个可以新建一个状态机的系统调用
exit?
- main return
exitlibc提供的_exit系统调用退出(== asm volatile("mov ..., %rax; syscall"))- 直接
SYSCALL
前两个在c语言的空间, 是“normal exit”
后两个不是normal的, _exit exit_group , __exit exit self
行为区别? strace