zoukankan      html  css  js  c++  java
  • 《分布式系统》复习2

    什么是进程:进程状态上下文中的执行流

    执行流:执行指令流、一段运行的代码、指令的顺序、控制线程。

    进程状态:运行的代码能影响或者被影响的方面。

    进程与程序区别

    • 程序是静止的,进程是代码和数据的动态实例。
    • 程序和进程之间没有一对一的映射。
      • 同一个程序中可以有多个进程:很多用户同时运行“ls命令”
      • 一个程序可以调用多个进程:make命令

    每个进程都处于运行(占用cpu)、就绪(等待cpu)、阻塞(睡眠,等待I/O或者同步完成)三种状态。

    UNIX进程内存创建

    资源管理

    • 创建新的进程时,分配地址空间、复制数据。
    • 调度
      • 上下文切换
        • 进程上下文:CPU上下文和存储上下文
    • 协作
      • 进程间通信
      • 共享内存

    线程是最小的处理器,在其上下文中可以执行一些指令,保存线程上下文意味着停止当前的执行并保存所有需要的数据,以便在以后的阶段继续执行。

    上下文切换

    • 处理器上下文:存储在CPU寄存器中用于执行一系列指令的最小值的集合(栈断点、地址寄存器、程序计数器)
    • 线程上下文:存储在寄存器和内存中用于执行一系列指令的最小值的集合。(CPU上下文、状态)
    • 进程上下文:存储在寄存器和内存中,用于执行一系列线程的最小值的集合。(线程上下文、内存管理单元MMU的值)

    线程共享相同的地址空间、线程上下文切换完全独立于操作系统。

    进程上下文切换通常代价更大,涉及到捕获操作系统内核等操作,创建和销毁线程的代价比进程小。

    用户级线程:

      所有的线程都在用户的进程地址空间中创建。

    优点:所有的操作都能在单个进程中完成,导致实现起来很高效。

    缺点:难以从操作系统和block中得到支持。内核提供的所有服务都是代表线程所在的进程执行的,如果内核决定阻塞一个线程,那么整个进程将被阻塞。

    线程和操作系统:

    让内核包含线程包的实现,则所有的操作以系统调用的方式返回:

    • 操作系统堵塞线程不再成为问题:内核在同一进程中调用另一个可用的线程。
    • 处理外部事件也很简单:内核调度和事件相关联的线程。
    • 缺点在于由于每个线程操作都需要一个内核陷阱而导致的效率损失。

    线程实现

    尝试将用户级线程和内核级线程混合到一个概念中,然而,性能的提高并没有抵消复杂性的增加。

    隐藏网络延迟:Web浏览器扫描传入的HTML页面,发现需要获取更多的文件。每个文件通过独立的线程获取,每个线程做一个HTTP获取,当所有的文件传进来,浏览器将其显示。

    对其他计算机(RPC)的多个请求-响应调用:一个客户端同时做出多个请求,每一个请求由一个线程完成;等待直到所有的结果都返回。如果请求的是不同的服务器,可能需要一个线性加速。

    提高性能:

    • 启动线程比启动进程代价小得多
    • 单线程服务器禁止简单地扩展到多处理器系统
    • 与客户端一样:在响应前一个请求时,通过响应下一个请求来隐藏网络延迟

    改进的结构:

    • 大多数服务器都有很高的I/O要求。使用简单、易于理解的阻塞调用可以简化整个结构。
    • 由于简化了控制流,多线程程序往往更小,更容易理解。

    虚拟化

    虚拟化越来越重要:

    • 硬件改变得越来越快
    • 易于移植和代码迁移
    • 故障或受攻击组件的隔离

    虚拟化可以在非常不同的级别上进行,主要取决于各种系统组件提供的接口:

    计算机系统多种界面

    进程VM与VM监视器

    进程VM(进程虚拟机):将程序编译为中间(可移植的)代码,然后由运行时系统执行(例如:Java VM)

    VM监视器(虚拟机监视器):一个独立的软件层模拟硬件指令集,生成一个完整的操作系统,并支持它的应用程序(例如:VMware、KVM、XEN)

     进程虚拟机(a)虚拟机监视器(b)

    操作系统上的VM监视器:

    • 执行二进制转换:在执行应用程序或操作系统时,将指令转换为底层机器的指令。
    • 区分敏感指令:捕获原始内核(考虑系统调用或特权指令)。
    • 将敏感指令替换为对VMM的调用。

    客户端:用户接口

    客户端软件的主要部分是(图形化)用户界面

     X Windows系统基本组织结构

    客户端软件 一般为分布透明度量身定做

    • 访问透明性:用于RPCs的客户端存根位置/迁移透明性:让客户端软件跟踪实际位置
    • 故障透明性:通常只能放在客户端(我们试图掩盖服务器和通信故障)。
    • 复制透明性:由客户端存根处理的多个调用

    服务器

     服务器是一个在特定传输地址等待传入服务请求的进程。实际上,端口和服务之间存在一对一的映射。

    文件服务器:

     调度程序/工作程序模型中组织的多线程服务器:

    服务器:类型

    • 超级服务器:监听多个端口的服务器。提供多项独立服务。实际上,当出现服务请求时,它们启动一个子进程来处理请求(UNIX inetd)
    • 迭代与并发服务器:与并发服务器相比,迭代服务器一次只能处理一个客户端

    服务器一旦接受(或正在接受)服务请求,是否可以中断它?
    紧急数据使用单独的端口:

    • 服务器有一个单独的线程/进程来处理紧急消息
    • 紧急信息传来,有关的请求暂时搁置
    • 注意:我们要求操作系统支持基于优先级的调度

    使用传输层的带外通信设施:

    • 例如:TCP允许在同一连接中发送紧急消息
    • 可以使用OS信令技术捕获紧急消息

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Caffe2——C++ 预测(predict)Demo
    Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
    Effective C++ 条款05:了解C++编写并调用哪些函数
    Effective C++ 条款04:确定对象被使用前已经先被初始化
    Effective C++ 条款03:尽可能使用const
    Effective C++ 条款02:尽量以const,enum,inline替换 #define
    使用队列(Queue)解决简单的并发问题
    关于C#中Queue的线程安全问题
    C#多线程编程
    跨线程访问控件的问题和编程方法
  • 原文地址:https://www.cnblogs.com/dlutjwh/p/12116319.html
Copyright © 2011-2022 走看看