zoukankan      html  css  js  c++  java
  • Python IO内核交互了解

    注:Unix Linux 环境下的network IO
     

    用户空间与内核空间

      现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
    注:系统内核空间就是系统保留的内存空间。
    注:内存分为两个空间,用户空间,内核空间。
    注:访问硬件只允许内核空间访问。
    注:程序在读取io数据是存在硬件访问时,用户空间是不能直接访问的,需要内核空间再次进行掉用,在将请求的结果copy一分交给程序。
     
     
     
    进程切换
      为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
      从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:
        1. 保存处理机上下文,包括程序计数器和其他寄存器。
        2. 更新PCB信息。
        3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
        4. 选择另一个进程执行,并更新其PCB。
        5. 更新内存管理的数据结构。
        6. 恢复处理机上下文。
      总而言之就是很耗资源,具体的可以参考这篇文章:进程切换
    注:进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息 
     
     
     
    进程的阻塞
      正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。
     
     
     
    文件描述符fd
      文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。
      文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
    注:打开文件,或是创建一个新文件,内核就会向进程返回一个文件描述符。文件描述符是一个整数,是一个索引值,它指向了内核中维护列表进程的列表中,这个列表是有序的,通过索引值到内核进程对象的列表中取到文件的句柄,文件句柄是一个对象,通过他来打开文件。
     
     
    缓存 I/O
      缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
     
    缓存 I/O 的缺点:
      数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。
    注:1.用户调去内存数据时,系统会将io数据缓存到内核内存中,内核在将数据copy给用户程序。
    注:2.程序需要收io数据,请求数据是,先发到io的接口内,接口读到内核空间,在copy给程序的用户空间里。
     
  • 相关阅读:
    线段树、树状数组
    贪心算法(Fatmouse’Trade、今年暑假不AC)
    搜索+DP专题(背包问题、N个数选K个使平方和最大且和为X、divide by three, multiple by two、全排列、组合、N皇后、jugs、掉石头迷宫、斐波那契、最大连续子序列和、最长上升子序列、非常可乐、导弹拦截系统:最长不降子序列)
    计算机考研机试指南(九)——搜索(百鸡问题、ABC、胜利大逃亡、迷宫问题、C翻转、旋转矩阵、字符串匹配、)
    计算机考研机试指南(八)——图论(畅通工程、还是畅通工程、最短路、more is better、Freckles、legal or not、确定比赛名次、产生冠军、最短路径问题)
    String与StringBuffer与StringBuilder
    replace into
    eclipse迅速新建main函数
    数据库视图什么时候需要用到
    springboot实现拦截器
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8204843.html
Copyright © 2011-2022 走看看