操作系统-上

Linux操作系统概览

内核初始化

用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态

Image.png

Image.png

内核初始化

用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态

do_execve->do_execveat_common->exec_binprm->search_binary_handler

Image.png

Image.png

Image.png

Image.png

系统调用的过程

Image.png

进程

进程从代码到二进制到运行时的过程

Image.png

进程相当于一个项目,而线程就是为了完成项目需求,而建立的一个个开发任务

Image.png

在程序执行过程中,一旦调用到系统调用,就需要进入内核继续执行。那如何将用户态的执行和内核态的执行串起来呢?

Image.png

调度

一个 CPU 上有一个队列,CFS 的队列是一棵红黑树,树的每一个节点都是一个 sched_entity,每个 sched_entity 都属于一个 task_struct,task_struct 里面有指针指向这个进程属于哪个调度类, 在调度的时候,依次调用调度类的函数,从 CPU 的队列中取出下一个进程

Image.png

Image.png

主动调度

主动调度的过程,也即一个运行中的进程主动调用 __schedule 让出 CPU。在 __schedule 里面会做两件事情,第一是选取下一个进程,第二是进行上下文切换。而上下文切换又分用户态进程空间的切换和内核态的切换

抢占式调度

Image.png

进程Fork创建的过程

download.jpeg

创建线程

创建进程的话,调用的系统调用是 fork,在 copy_process 函数里面,会将五大结构 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct 都复制一遍,从此父进程和子进程各用各的数据结构。而创建线程的话,调用的是系统调用 clone,在 copy_process 函数里面, 五大结构仅仅是引用计数加一,也即线程共享进程的数据结构。

Image.png

一个进程运行需要的内存结构

用户态:

  • 代码段、全局变量、BSS
  • 函数栈
  • 内存映射区

内核态:

  • 内核的代码、全局变量、BSS
  • 内核数据结构例如 task_struct
  • 内核栈
  • 内核中动态分配的内存

Image.png

请我吃🍗