linux核心之进程管理

简介:   进程就是处于执行期的程序(目标码存放在某中介质上)。进程并不仅仅局限于一段可执行程序代码,通常还包括其他资源,例如打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,当然还包括用来存放全局变量的数据段等;   线程是在进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈、一组进程寄存器。

  进程就是处于执行期的程序(目标码存放在某中介质上)。进程并不仅仅局限于一段可执行程序代码,通常还包括其他资源,例如打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,当然还包括用来存放全局变量的数据段等;

  线程是在进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈、一组进程寄存器。

  内核调度的对象是线程, 而不是进程

  进程是处于执行期的程序以及相关的资源的总称;进程的另一个名字是任务(task)。Linux 内核通常把进程也叫做任务。

 内核把进程的列表存放在叫做任务队列(task list)的双向循环链表中; 链表中的每一项都是类型是task_struct, 称为进程描述符(process descriptor)的结构,该结构定义在<linux/sched.h>文件中。 进程描述符中包含一个具体进程的所有信息;

  linux通过slab分配器来分配task_struct 结构;

  在内核中,访问任务通常需要获得指向其task_struct的指针。在x86体系结构下,由于寄存器并不富余,只能在内核栈的尾端创建 thread——info结构,通过计算偏移量间接地查找task_struct结构;

  进程状态:系统中每个进程必定处于五种进程状态中的一种;

   1、TASK_RUNNING(运行)  2、TASK_INTERRUPUTIBLE(可中断)  3、TASK_UNINTTERRUPUTIBLE(不可中断)

     4、_TASK_TRACED(被其他进程跟踪的进程)  5、_TASK_STOPPED(停止)

 进程的创建

  许多其他的操作系统都提供了产生进程的机制,首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。

 Unix采用了与众不同的实现方式,它把上述步骤分解到两个单独的函数中执行:fork() 和 exec()

  1、fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于PID(每个进程唯一)、 PPID(父进程的进程号)和某些资源和统计量(例如:挂起的信号,它没有必要被继承)

  2、exec()函数负责读取可执行文件并将其载入地址空间开始运行。

 把这两个函数组合起来使用的效果跟其他系统使用的单一函数的效果相似。

写时拷贝

  linux的fork()使用写时拷贝(copy-on-write)页实现。 写时拷贝 是一种可以推迟甚至免除拷贝数据的技术。内核测试并不复制整个进程地址空间,而是让父进程 和子进程共享一个拷贝。

  只有在需要写入的时候,数据才会被复制,从而使得各个进程拥有的各自的拷贝。 也就是说,资源的赋值只有在需要写入的时候才进行,在此之前,只是以只读方式共享。 这种技术使得地址空间上的也的拷贝被推迟到实际发生写入的时候才进行。 在页根本不会被写入的情况下它们就无须复制了;

  fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。 在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含10M的数据),由于Unix强调进程快速执行的能力,这个优化很重要。

  Linux通过clone()系统调用实现fork()。这个调用通过一系列的参数标志来指明父、子进程需要共享的资源。fork(), vfork() 和 clone()库函数都根据各自需要的参数标志去调用clone(), 然后由clone()去调用do_fork();

  do_fork()完成量创建中的大部分工作,它的定义在kernel/fork.c文件中。该函数调用copy_process()函数,然后让进程开始运行,copy_process()函数完成的工作很有意思:

  1、调用dup_task_struct()为新进程创建一个内核栈、thread_info结构和task_struct,  这些值与当前进程的值相同,此时,子进程和父进程的描述符是完全相同的;

  2、检查并确保创建这个子程序后,当前用户所拥有的进程数目没有超出给它分配资源的限制;

  3、子进程着手使自己与父进程区别开来,进程描述符内的许多成员

 

 

 

相关文章
|
1月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
38 0
|
3月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
673 2
|
3月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
70 2
|
21天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
79 4
linux进程管理万字详解!!!
|
12天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
53 8
|
9天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
20天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
58 4
|
21天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
23天前
|
消息中间件 存储 Linux
|
29天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
39 1
下一篇
无影云桌面