linux的进程调度-抛砖引玉

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

本文会持续更新。数据结构

 

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

解答:负载均衡

Linux进程经过fork来建立函数

Linux线程经过pthread_create建立,性能

 

2.    什么是写时拷贝?优化

解答:spa

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

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负载高必定用户体验差吗?

相关文章
相关标签/搜索