zoukankan      html  css  js  c++  java
  • linux的进程调度-抛砖引玉

    今天看到网上一篇介绍linux进程调度的文章(https://blog.csdn.net/21cnbao/article/details/77505330),里面提了一些问题,本文试着进行解答。

    本文会持续更新。

    1.    Linux进程和线程如何创建、退出?进程退出的时候,自己没有释放的资源(如内存没有free)会怎样?

    解答:

    Linux进程通过fork来创建

    Linux线程通过pthread_create创建,

    2.    什么是写时拷贝?

    解答:

    写时拷贝(copy-on-write, COW)就是等到修改数据时才真正分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝。

    Linux 的fork系统调用就使用了写时拷贝技术,具体细节如下:

    现在有一个父进程P1,这是一个主体,那么它是有灵魂也是有身体的。现在在其虚拟地址空间(有相应的数据结构表示)上有:正文段,数据段,堆,栈这四个部分,相应地,内核要为这四个部分分配给自的物理块。即正文段块、数据段块、堆块、栈块。

    1)现在P1用fork()函数为进程创建一个子进程P2

    内核:

    (1) 复制P1的正文段,数据段,堆,栈这四个部分,注意是其内容相同。

    (2) 为这四个部分分配物理块,P2的:正文段(为P1的正文段的物理块,其实就是不为P2分配正文段块,让P2的正文段指向P1的正文段块),数据段(P2自己的数据段块,为其分配对应的块),堆(P2自己的堆块),栈(P2自己的栈块)。如下图所示,同左到右大的方向箭头表示复制内容:

    2)写时复制技术

    写时复制技术:内核只为新生成的子进程创建虚拟空间结构,它们复制于父进程的虚拟空间结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应的段的行为发生时,再为子进程相应的段分配物理空间。

    3)vfork

    vfork的做法更加简单粗暴,内核连子进程的虚拟地址空间也不创建了,直接共享了父进程的虚拟空间,当然了,这种做法就顺水推舟的共享了父进程的物理空间

    总结

    传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝将是无用功。

    Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间的页的拷贝被推迟到实际发生写入的时候。

    3.    Linux的线程如何实现,与进程的本质区别是什么?

    解答:

    进程是资源分配和管理的单位,线程是调度的基本单位,进程有独立的地址空间,拥有PCB,其中包含进程标识符(非负整数)、进程资源、进程调度信息、进程间通信相关资源、处理机状态(便于调度后恢复原状态)等,线程具有单独的堆栈和寄存器,保存自己允许的相关上下文,具有TCB。各线程还共享以下进程资源和环境: 

    1)文件描述符表 
    2)每种信号的处理方式(SIG_IGN,SIG_DFL,用户自定义) 
    3)当前工作目录 
    4)用户id和组id 
    但有些资源是线程独享的: 
    1)线程id 
    2)上下文,包括各种寄存器的值,程序计数器和栈指针 
    3)栈空间 
    4)errno变量 
    5)信号屏蔽字 
    6)调度优先级 

    4.    Linux能否满足硬实时的需求?

    5.    进程如何睡眠等资源,此后又如何被唤醒?

    6.    进程的调度延时是多少?

    7.    调度器追求的吞吐率和响应延迟之间是什么关系?CPU消耗型和I/O消耗型进程的诉求?

    8.    Linux怎么区分进程优先级?实时的调度策略和普通调度策略有什么区别?

    9.    nice值的作用是什么?nice值低有什么优势?

    10.  Linux可以被改造成硬实时吗?有什么方案?

    11.  多核、多线程的情况下,Linux如何实现进程的负载均衡?

    12.  这么多线程,究竟哪个线程在哪个CPU核上跑?有没有办法把某个线程固定到某个CPU跑?

    13.  多核下如何实现中断、软中断的负载均衡?

    14.  如何利用cgroup对进行进程分组,并调控各个group的CPU资源?

    15.  CPU利用率和CPU负载之间的关系?CPU负载高一定用户体验差吗?

  • 相关阅读:
    面试题:Spring的理解
    静态块与静态变量
    构造方法与构造块的执行顺序(区别于static)
    子类调用父类的构造函数几种情况
    使用json遇到的问题
    页面加载,使用ajax查询某个类别,并且给它们添加(拼接)连接
    对某个商品的上下架状态进行改变
    SSH后台管理系统,实现查询+分页
    跟上Java8
    java中值传递和引用传递
  • 原文地址:https://www.cnblogs.com/jerry116/p/8887007.html
Copyright © 2011-2022 走看看