【OSTEP】Abstraction Process | 进程 | 虚拟化 | 进程API

简介: 【OSTEP】Abstraction Process | 进程 | 虚拟化 | 进程API

💭 写在前面

本系列博客为复习操作系统导论的笔记,内容主要参考自:

  • Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
  • Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

0x00 什么是进程?

" Process is a running program. "

何为进程?进程就是运行中的程序。

A program is a passive entity. (比如存储在磁盘上的可执行文件)

A process is an active entity with a program counter.

当一个可执行文件被加载到内存中时,一个程序就成为了一个进程。

一个程序可以创建多个进程。

我们几乎可以互换地使用工作、任务和进程。

A process is comprised of code section, data section, stack and heap and program counter.

一个进程是由代码、数据、栈和堆,以及程序计数器组成的。

0x01 系统是如何营造出有许多CPU的错觉的

CPU虚拟化(CPU virtualizing)!

  • 操作系统可以营造有许多CPU的错觉。
  • 时间共享(Time Sharing):运行一个进程,然后停止它去运行另一个进程(潜在的开销 - 性能的损失)。

🔺 总结:操作系统通过虚拟化(virtualizing)CPU 来提供这种假象。

0x02 进程API

这些 API 适用于现代 CPU:

创建(Create):

  • Create a new process to run a program(创建一个新的进程,在 shell 中键入命令或双击应用程序图标时,会调用操作系统来创建新进程,运行指定的程序)

销毁(Destroy):

  • Halt a runaway process (由于存在创建进程的接口,对应的操作系统还提供了一个强制销毁进程的接口。当然,很多进程会在运行完成后自行退出。但是,如果他们不退出,用户可能希望终止他们,因此停止失控进程的接口非常有用。)

等待(Wait):

  • Wait for a process to stop running(有时候等待进程运行是有用的,因此提供某种等待接口)

其他控制(Miscellaneous Control):

  • Some kind of method to suspend a process and then resume it(例如:大多数操作系统提供某种方法来暂停进程)

状态(Status):

  • Get some status info about a proces(通常有一些接口可以获得有关进程的状态信息,例如运行了多长事件,或者处于什么状态)

0x03 创建进程(Process Creation)

Step1:将一个程序代码载入到内存中(进入进程的地址空间)

  • 程序最初以可执行格式(executable format)的状态存在磁盘(disk)上
  • 现代操作系统会惰性处理(lazily),像是有拖延症一样去执行加载的过程
  • 在程序需要时才去加载代码和数据段(可以理解为不到DDL不去做,就硬托)
  • "Loading pieces of code or data only as they are needed during program execution."

Step2:程序运行时栈被分配

  • 将栈用于局部变量(local variables)、函数参数(function parameters)和返回地址(return address)。
  • 用主函数的 argc 和 argv 数组初始化栈。

Step3:程序的堆被创建

  • 用于动态分配有明确需求的数据
  • 程序通过调用 malloc() 来申请空间,通过调用 free() 来释放空间

Step4:OS做一些其他的初始化任务

  • Input / Output (I/O)设置
  • Each process by default has three open file descriptors.
  • Standard input (stdin), standard output (stdout) and standard error (stderr)

Step5:启动入口程序 main

  • OS将CPU控制权转移给新创建的进程。

在内存中的进程:

0x04 程序状态和中转(Process States and Transition)

一个进程通常有三种状态:

Ready(就绪):进程已经准备好运行,但由于某种原因,操作系统选择不在此时运行。

A process is ready to run but for some reason the OS has chosen not to run it at this given moment.   在就绪状态下,进程已经准备好运行,但由于某种原因,操作系统选择不在此时运行。

Running(运行):进程正在处理器上运行

A process is running on a processor. 在运行状态下,进程正在处理器上运行(这意味着它正在执行指令)。

Blocked(阻塞):一个进程执行了某个操作(比如I/O),因此其他进程可以使用处理器。

A process has performed some kinds of operations. (such as IO)

When a process initates an I/O request to a disk, it becomes blocked and thus some other process can use the processor.

在阻塞状态下,一个进程执行了某种操作,直到发生其他事时才会准备运行。比如进程向磁盘发起 I/O 请求时,它会被阻塞。因此其他进程可以使用处理器。

将这些状态映射到图上表示:

(进程:状态转换)

Example : Tracing Process State (跟踪进程状态)

0x05 数据结构(Data Structures)

PCB (Process Control Block)    - 进程控制块

用于存储关于进程的信息的个体结构称为进程控制块,是谈论包含每个进程信息的C结构的一种方式。

A structure that contains information about each process.

Includes register context: a set of registers that define the state of a process.

Other information associated with each process

Process List (Queue)   - 进程列表

Ready processes(进程准备)

Blocked processes(进程阻塞)

Current running processes(当前运行进程)

例子:XV6 内核结构

// the information xv6 tracks about each process
// including its register context and state
struct proc {
    char *mem;                  // Start of process memory
    uint sz;                    // Size of process memory
    char *kstack;               // Bottom of kernel stack
    // for this process
    enum proc_state state;      // Process state
    int pid;                    // Process ID
    struct proc *parent;        // Parent process
    void *chan;                 // If non-zero, sleeping on chan
    int killed;                 // If non-zero, have been killed
    struct file *ofile[NOFILE]; // Open files
    struct inode *cwd;          // Current directory
    struct context context;     // Switch here to run process
    struct trapframe *tf;       // Trap frame for the
                                // current interrupt
};
// the registers xv6 will save and restore
// to stop and subsequently restart a process
struct context {
    int eip; // Index pointer register
    int esp; // Stack pointer register
    int ebx; // Called the base register
    int ecx; // Called the counter register
    int edx; // Called the data register
    int esi; // Source index register
    int edi; // Destination index register
    int ebp; // Stack base pointer register
};
// the different states a process can be in
enum proc_state { UNUSED, EMBRYO, SLEEPING,
RUNNABLE, RUNNING, ZOMBIE };

Example : Linux task_struct

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.10.20
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

相关文章
|
8月前
|
人工智能 自然语言处理 Linux
进程(process) vs 线程(Thread)
本文主要介绍了进程和线程的基本概念、区别以及操作系统如何调度线程的方式。同时,还介绍了线程锁的核心原理和实现方式。在多线程编程中,理解进程和线程的概念以及线程锁的使用,对于保证程序的安全性和性能非常重要。
152 0
|
消息中间件
每日一博 - 图解进程(Process)和线程(Thread)区别联系
每日一博 - 图解进程(Process)和线程(Thread)区别联系
73 0
|
5月前
|
Python
python Process 多进程编程
python Process 多进程编程
46 1
|
5月前
|
JavaScript 前端开发
nodejs process进程
nodejs process进程
43 0
|
Python
Python线程锁(Thread Lock)和进程锁(Process Lock)
Python线程锁(Thread Lock)和进程锁(Process Lock)
309 0
|
8月前
|
消息中间件 监控 安全
探究如何在Linux系统中修改进程资源限制:四种方法调整进程限制,让你的系统高效运行(包含应用层getrlimit和setrlimit API)
探究如何在Linux系统中修改进程资源限制:四种方法调整进程限制,让你的系统高效运行(包含应用层getrlimit和setrlimit API)
1177 0
|
8月前
|
Java API 调度
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
82 0
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
|
1天前
|
JSON API 数据格式
京东商品SKU价格接口(Jd.item_get)丨京东API接口指南
京东商品SKU价格接口(Jd.item_get)是京东开放平台提供的API,用于获取商品详细信息及价格。开发者需先注册账号、申请权限并获取密钥,随后通过HTTP请求调用API,传入商品ID等参数,返回JSON格式的商品信息,包括价格、原价等。接口支持GET/POST方式,适用于Python等语言的开发环境。
27 11
|
24天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
72 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
12天前
|
JSON 安全 API
淘宝商品详情API接口(item get pro接口概述)
淘宝商品详情API接口旨在帮助开发者获取淘宝商品的详细信息,包括商品标题、描述、价格、库存、销量、评价等。这些信息对于电商企业而言具有极高的价值,可用于商品信息展示、市场分析、价格比较等多种应用场景。