OS | 4 抽象:进程
文章目录
- OS | 4 抽象:进程
- CPU虚拟化的方法
- 进程:是一种抽象
- 非正式定义
- 进程的机器状态
- 进程API
- 程序转换为进程的过程
- 进程状态
- >>>>> 欢迎关注公众号【三戒纪元】 <<<<<
CPU虚拟化的方法
操作系统通过虚拟化(virtualizing)CPU来提供这种现象:通过让1个进程只运行1个时间片,然后切换到其他进程,操作系统系统了存在多个CPU的假象。
实现CPU虚拟化,现代操作系统都采用时分共享机制
时分共享(time sharing):通过允许资源由一个实体使用一小段时间,然后由另一个实体使用一小段时间,如此下去,资源(CPU或网络连接)可以被许多人共享。
时分共享对应技术是空分共享
空分共享:资源在空间上被划分给希望使用它的人。例如磁盘空间就是一个空分共享资源。
进程:是一种抽象
非正式定义
进程就是运行中的程序。
程序本身没有生命周期的,它只是存在磁盘上的一些指令(也可能是一些静态数据)。
是操作系统让这些字节运行起来,让程序发挥作用
所以“字节跳动”就是一个进程?!
操作系统为正在运行的程序提供的抽象,就是所谓的进程(progress)。
在任何时刻,我们都可以清点程序在执行过程中访问或影响的系统的不同部分,从而概括一个进程。
进程的机器状态
-
内存
指令存在内存中,正在运行的程序读取和写入的数据也在内存中。因此进程可以访问的
内存(地址空间)
是该进程的一部分; -
寄存器
如
程序计数器(Program Counter, PC)
指示程序即将执行哪个命令;栈指针(stack pointer)
和相关的帧指针(frame pointer)
, 用于管理函数参数栈、局部变量和返回地址。
进程API
操作系统提供API的形式
- 创建 create:操作系统必须包含一些创建新进程的方法
- 销毁 destroy:由于存在创建进程的接口,因此系统还提供了一个强制销毁进程的接口。当然,很多进程会在运行完成后自动退出。
- 等待 wait:有时等待线程停止运行是有用的,因此经常提供某种等待接口
- 其他控制 miscellaneous control:除了扇死或等待进程外,有时还可能有其他控制。例如暂停进程,然后恢复(继续运行)
- 状态 status:可以获取进程有关的状态信息的接口,例如运行了多长时间,或者处于什么状态
程序转换为进程的过程
-
将代码和所有静态数据(例如初始化变量)加载到内存中,加载到进程的地址空间中
程序最初以某种可执行格式驻留在磁盘上。
操作系统需要从磁盘读取这些字节,并将它们放在内存中的某处。
现代操作系统
惰性(lazily)执行该过程
,即仅在程序执行期间需要加载的代码或数据片段,才会加载。想真正理解惰性加载,必须充分了解分页
和交换
的机制。
-
为程序的运行时栈(run-time stack 或 tack)分配一些内存
栈用来存放局部变量、函数参数和返回地址。
操作系统分配内存,并提供给进程。
操作系统可能也会用参数初始化栈。例如会将参数填入
main(int argc, char** argv)
函数 -
操作系统可能为程序的堆(heap)分配一些内存
堆用于显式请求动态分配数据,通过调用
malloc()
请求空间,并通过调用free()
明确释放堆数据结构(如
链表
、散列表
、树
和其他有趣的数据结构)需要堆 -
操作系统还将执行一些其他初始化任务,特别是与输入/输出(I/O)相关的任务
例如,在
UNIX
系统中,默认情况下每个进程都有3个打开的文件描述符(file descriptor)
,用于标准输入
、输出
和错误
。
通过将代码和静态数据加载到内存,通过创建和初始化栈以及执行与I/O 设置相关的奇台工作,操作系统开始启动程序,在入口处运行,一般是main() 函数。
通过跳转到 main() 例程,OS将CPU的控制权转移到新创建的进程中,从而程序开始执行。
进程状态
进程可以出在以下3种状态之一
-
运行(running)
在运行状态下,进程正在处理器上运行。意味着它正在执行指令
-
就绪(ready)
进程已经准备好运行,由于某种原因,操作系统选择不在此时运行
-
阻塞(blocked)
一个进程执行了某种操作,进入阻塞状态,直到发生其他事件时才会准备运行。