Linux系统进程深入理解

西伯利亚196

西伯利亚196

2016-03-31 15:25

下面,图老师小编带您去了解一下Linux系统进程深入理解,生活就是不断的发现新事物,get新技能~

Linux系统进程深入理解

   1. 什么是进程

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/fuwuqi/)

  进程是处于执行期的程序以及它所包含的所有资源的总称,包括虚拟处理器,虚拟空间,寄存器,堆栈,全局数据段等。

  在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(Process Control Block,简称PCB)。PCB中包含了很多重要的信息,供系统调度和进程本身执行使用。所有进程的PCB都存放在内核空间中。PCB中最重要的信息就是进程PID,内核通过这个PID来唯一标识一个进程。PID可以循环使用,最大值是32768。init进程的pid为1,其他进程都是init进程的后代。

  除了进程控制块(PCB)以外,每个进程都有独立的内核堆栈(8k),一个进程描述符结构,这些数据都作为进程的控制信息储存在内核空间中;而进程的用户空间主要存储代码和数据。

  2.进程的创建

  进程是通过调用::fork(),::vfork()和::clone()系统调用创建新进程。在内核中,它们都是调用do_fork实现的。传统的fork函数直接把父进程的所有资源复制给子进程。而Linux的::fork()使用写时拷贝页实现,也就是说,父进程和子进程共享同一个资源拷贝,只有当数据发生改变时,数据才会发生复制。通常的情况,子进程创建后会立即调用exec(),这样就避免复制父进程的全部资源。

  三者的区别如下:

  ::fork():父进程的所有数据结构都会复制一份给子进程(写时拷贝页)。

  ::vfork():只复制task_struct和内核堆栈,所以生成的只是父进程的一个线程(无独立的用户空间)。

  ::clone():功能强大,带了许多参数。::clone()可以让你有选择性的继承父进程的资源,既可以选择像::vfork()一样和父进程共享一个虚拟空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系。

  3. 进程的撤销

  进程通过调用exit()退出执行,这个函数会终结进程并释放所有的资源。父进程可以通过wait4()查询子进程是否终结。进程退出执行后处于僵死状态,直到它的父进程调用wait()或者waitpid()为止。父进程退出时,内核会指定线程组的其他进程或者init进程作为其子进程的新父进程。当进程接收到一个不能处理或忽视的信号时,或当在内核态产生一个不可恢复的CPU异常而内核此时正代表该进程在运行,内核可以强迫进程终止。

  4. 进程管理

  内核把进程信息存放在叫做任务队列(task list)的双向循环链表中(内核空间)。链表中的每一项都是类型为task_struct,称为进程描述符结构(process descriptor),包含了一个具体进程的所有信息,包括打开的文件,进程的地址空间,挂起的信号,进程的状态等。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/fuwuqi/)

  Linux通过slab分配器分配task_struct,这样能达到对象复用和缓存着色(通过预先分配和重复使用task_struct,可以避免动态分配和释放所带来的资源消耗)。

  内核把所有处于TASK_RUNNING状态的进程组织成一个可运行双向循环队列。调度函数通过扫描整个可运行队列,取得最值得执行的进程投入执行。避免扫描所有进程,提高调度效率。

  5. 进程的内核堆栈

  Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构:thread_info和进程的内核堆栈。

  进程处于内核态时使用不同于用户态堆栈,内核控制路径所用的堆栈很少,因此对栈和描述符来说,8KB足够了。

展开更多 50%)
分享

猜你喜欢

Linux系统进程深入理解

服务器
Linux系统进程深入理解

深入理解Linux文本流

电脑入门
深入理解Linux文本流

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入理解 ViewState

Web开发
深入理解 ViewState

深入理解sizeof

C语言教程 C语言函数
深入理解sizeof

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

android ListView深入理解

编程语言 网络编程
android ListView深入理解

java 递归深入理解

编程语言 网络编程
java 递归深入理解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

苹果iPhone6s处理器版本如何鉴别

苹果iPhone6s处理器版本如何鉴别

Linux/Unix操作系统目录结构的来历

Linux/Unix操作系统目录结构的来历
下拉加载更多内容 ↓