Linux系统进程深入理解

   1. 什么是进程

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

  在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),包含了一个具体进程的所有信息,包括打开的文件,进程的地址空间,挂起的信号,进程的状态等。


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

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

  5. 进程的内核堆栈

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

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

时间: 2024-08-30 08:12:12

Linux系统进程深入理解的相关文章

Linux系统进程管理命令详解

1.at命令:定时运行命令 作用:at命令在指定时刻执行指定的命令序列. 格式: at [-V] [-q x] [-f file] [-m] time atq [-V] [-q x] atrm [-V] [-q x] job- batch [-V] [-f file] [-m] 主要选项如下. -V:显示作业将被执行的时间. -q:选用q参数则可选队列名称,队列名称可以是a-z和A-Z之间的任意字母.队列字母顺序越高则队列优先级别越低. -f:从文件中读取命令或shell脚本,而非在提示后指定它

linux基础-深入理解计算机系统疑问

问题描述 深入理解计算机系统疑问 为什么说代码段总是从0x08048000开始,这句话说的是所有程序的代码段吗? 解决方案 对于所有进程来说,代码都是从同一固定地址开始,如Linux系统通常从0x08048000开始代码段(如前所述,从地址0到代码段起始地址的部分通常为操作系统保留区).代码及只读数据区是直接按照可执行目标文件的内容初始化的,与目标文件中的代码段(.text).初始化段(.init)及只读数据段(.rodata)相对应. 解决方案二: <深入理解计算机系统>(二)深入理解计算机

防止Linux系统进程被杀的方法

Linux的内存管理有一套机制:当系统内存溢出的时候,它会选择一个/几个适当的进程杀掉以维持系统的稳定运行.不过机器毕竟是机器,虽然它竭尽全力去选择那些真正是罪魁祸首的进程,但是难免会出错,或者是不公平,到头来系统还是因为误杀而变得残缺不全,甚至不能这场运行.这个时候可能就需要:人为地干预.引导系统做出正确的选择. 这种行为的控制是通过调整进程相应目录下的/proc/[PID]/oom_adj来实现的,其中oom_adj的取值返回是-17~15,当进程的oom_adj是-17时,系统将不会杀死它

shell监控linux系统进程创建脚本分享_linux shell

复制代码 代码如下: #!/bin/shwhile truedo ps ax -o command | sort | uniq > 1.txt usleep 100000 ps ax -o command | sort | uniq > 2.txt diff  1.txt 2.txt | grep '^\+[^\+]' | while read a do  a=`echo ${a#*+}`  if [[ "$a" != "uniq" ]] &&a

linux shell-Linux Bash脚本理解的问题

问题描述 Linux Bash脚本理解的问题 我看到一段bash脚本,请问怎么理解?这个hide 和下面的 ${hide} echo hide := @ SHOWTIMECMD := date "+%Y/%m/%d H:%M:%S" ifeq ($(TRUSTZONE_PARTITION),yes) ifneq ($(wildcard $(TRUST_TEE_WD)/build.sh),) $(hide) echo $(SHOWTIME) $@ ing ... $(hide) echo

linux实训

目  录 Unit 1 操作系统安装.... 3 1.1 多操作系统安装... 3 1.1.1 VMware简介... 3 1.1.2 VMWare基本使用... 4 1.2 安装Red Hat Linux 9.0. 15 1.3 思考题... 15 [实习报告]... 16 Unit 2  Linux命令接口使用.... 17 2.1 访问Linux系统... 17 2.1.1 创建用户组... 17 2.1.2 删除用户组... 17 2.1.3 创建用户... 18 2.1.4 删除用户.

Linux 命令行界面

简述 Linux 操作和 Windows 有很大不同.要熟练的使用 Linux 系统,首先要了解 Linux 系统的目录结构,并掌握常用的命令,以便进行文件的操作.信息查看和系统参数配置等.Shell 是用户与操作系统进行交互的编译器,如果没有 Shell,用户将无法与系统进行交互,也就无法使用系统中相关的软件资源.充分了解并利用 Shell 的特性可以完成简单到复杂的任务调度.管道与重定向是 Linux 系统进程间的通信方式,在系统管理中起着举足轻重的作用. 简述 命令行模式 为什么要先学习S

深入 Linux 的进程优先级

深入 Linux 的进程优先级 为什么要有进程优先级?这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情.因为有的进程相对重要,而有的进程则没那么重要. 本文作者:邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架构规划设计. 曾任新浪动态应用平台系统架构师,负责微博.新浪博客等重点业务的内部私有云平台架构设计和运维管理工作. 进程优先级起作用的方式从发明以来基本没有什么变化,无

linux进程管理之wait系统调用

六: wait4 ()系统调用 在父进程中,用wait4()可以获得子进程的退出状态,并且防止在父进程退出前,子进程退出造成僵死 状态.这是我们这节分析的最后一个小节了. 关于wait4()在用户空间的调用方式可以自行参考相关资料,在这里只是讨论内核对这个系统调用的实 现过程. Wait4()的系统调用入口为sys_wait4().代码如下所示: asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr, int options, st