进程和线程之间的关系以及个人的理解

        我们都可以知道底层中,所有的程序都要内存中运行。而进程就相当于我们单独的画了一片区域给一个进程。进程都有自己独立的内存地址空间,包括代码段、数据段、堆栈段等。不同进程之间的内存空间是完全独立的,互相不能直接访问彼此的内存。

        但是,我依然有访问彼此内存的需求。所以线程诞生了。我们将进程的内存分成若干个小的区域,而每个小的区域就是一个线程。        

        线程之间共享该进程的内存空间,包括代码段、数据段和堆栈段。这意味着所有线程可以直接访问和修改共享的变量和数据。

        多线程执行是使用上下文切换来实现的。

        在上下文切换时,操作系统会保存当前线程的状态(包括程序计数器、寄存器、栈指针等),然后加载下一个线程的状态来恢复执行。

        而多进程就更加的复杂

轮转机制实际上能够实现多个进程的切换,而不仅仅是两个。关键在于操作系统如何管理和保存每个进程的上下文信息。

1. 保存进程上下文

  • 操作系统为每个进程分配了一个 进程控制块(Process Control Block, PCB)。PCB 是一种数据结构,用于保存与该进程相关的所有重要信息。
  • PCB 的内容
    • 进程 ID(PID):唯一标识进程。
    • 寄存器状态:包括程序计数器(PC)、栈指针(SP)、通用寄存器等的值。
    • 内存管理信息:如页表、段表等。
    • I/O 状态信息:如进程打开的文件、设备信息。
    • 进程状态:如运行、就绪、阻塞等。

2. 多进程的调度与切换

  • 操作系统使用 进程调度器 来管理所有正在运行的进程。调度器决定哪个进程应该在什么时候运行。
  • 调度器的工作流程
    1. 选择下一个进程:调度器根据调度算法(如轮转、优先级调度等)选择下一个要运行的进程。
    2. 保存当前进程的上下文:在 PCB 中保存当前正在运行进程的寄存器状态、程序计数器、栈指针等信息。这保证当该进程再次获得 CPU 时,可以从上次暂停的地方继续执行。
    3. 加载下一个进程的上下文:从下一个进程的 PCB 中恢复寄存器状态、程序计数器、栈指针等信息。这样 CPU 就可以继续执行下一个进程。
    4. 切换内存映射:如果是在多进程环境下,操作系统还会切换内存映射,使得新的进程可以访问它自己的内存空间。
    5. 切换到下一个进程:恢复下一个进程的上下文后,CPU 开始执行该进程的指令。

3. 多进程的执行

  • 假设你有三个进程 A、B 和 C,调度器会如下工作:
    1. 执行进程 A:保存进程 A 的上下文(如 PC、SP 等)到它的 PCB 中。
    2. 切换到进程 B:从进程 B 的 PCB 中加载它的上下文,执行进程 B。
    3. 执行进程 B:保存进程 B 的上下文到它的 PCB 中。
    4. 切换到进程 C:从进程 C 的 PCB 中加载它的上下文,执行进程 C。
    5. 执行进程 C:保存进程 C 的上下文到它的 PCB 中。
    6. 切换回进程 A:再从进程 A 的 PCB 中加载它的上下文,继续执行进程 A。

4. 同时管理多个进程的关键

  • PCB 列表:操作系统维护一个 PCB 列表,其中包含所有进程的 PCB。当需要切换进程时,调度器会从列表中选择下一个要执行的进程,并根据该进程的 PCB 恢复它的上下文。
  • 调度算法:调度算法决定了多个进程之间的切换顺序。无论有多少个进程,只要有足够的时间片,调度器就能确保每个进程都能在一定时间内得到执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值