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、子进程着手使自己与父进程区别开来,进程描述符内的许多成员
linux核心之进程管理的更多相关文章
- Linux学习之进程管理(十九)
Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...
- 【Linux学习】Linux系统管理1—进程管理
Linux系统管理1-进程管理 一.Linux的三种进程 Linux包括3中不同类型的进程: 交互进程:由一个shell启动的进程.交互进程可以在前后台运行 批处理进程:该进程和终端无联系,是一个进程 ...
- 深入Linux内核架构——进程管理和调度(下)
五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...
- Linux系列之进程管理
前言 进程是正在运行的程序,Linux系统通常有数百个进程同时运行.本文就来介绍下Linux是如何进行进程管理的. 我们可以看到: 查看进程(Viewing processes) 查找进程(Findi ...
- Linux学习之进程管理
|-进程管理 进程常用命令 |- w查看当前系统信息 |- ps进程查看命令 |- kill终止进程 |- 一个存放内存中的特殊目录/p ...
- Linux网络和进程管理
1) 计算机网络是通过外围的设备和连接,将分布在相同或不同区域的多台计算机 连接在一起所形成的集合.网络中的计算机实现彼此间互相通信,并且可以共 同使用硬件.软件和数据资源,实现资源共享.Lin ...
- Linux网络配置&进程管理
原理图 查看ip和网关
- Linux系统分区 进程管理 软件包安装
对于一块新的磁盘来说,系统能够使用需要有分区.格式化文件系统.挂载等主要操作,下面通过命令的方式对一块磁盘进行操作. 一. Linux系统分区 1.1 在虚拟机开机前选择虚拟机配置,添加一个新的SCS ...
- 深入Linux内核架构——进程管理和调度(上)
如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...
随机推荐
- 分享一个自用的 Inno Setup 软件打包脚本
此脚本支持打包mysql.安装mysql服务.安装windows服务.操作ini文件.操作注册表.高效压缩文件等功能,基本能满足常用的软件打包需求. ;定义各种常量 #define MyAppName ...
- POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...
- Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装Solaris 11 64位并且配置好C/C++开发环境 本文所 ...
- NOI2014 Day1
NOI2014 Day1 起床困难综合症 题目描述:给出\(n\)个操作,每个操作包含一种运算\((XOR.OR.AND)\)和一个数,已知一开始的数字为\([0, m]\),问经过\(n\)次操作后 ...
- poj1651 最优矩阵乘法动态规划解题
题目描述: 有若干个矩阵{Ai},元素都为整数且已知矩阵大小. 如果要计算所有矩阵的乘积A1 * A2 * A3 .. Am,最少要多少次整数乘法? 输入 第一行一个整数n(n <= 100), ...
- 用sqlserver处理excel表格
本来最近在研究微信公众平台的,老大临时交我个任务,把excel表格里的数据导入sql数据库,我想这so easy嘛. 没想都在上面消磨了两天... 把情况介绍下:在数据库中有如下这样结构的表(A表) ...
- #include <algorithm>
1 adjacent_find 查找重复的元素 2 find_if 查找符合条件的第一个元素 3 find_if_not 查找不符合条件的第一个元素 4 for_each 可以遍历每一个元素 5 pa ...
- 编程之美之数独求解器的C++实现方法
编程之美的第一章的第15节.讲的是构造数独.一開始拿到这个问题的确没有思路, 只是看了书中的介绍之后, 发现原来这个的求解思路和N皇后问题是一致的. 可是不知道为啥,反正一開始确实没有想到这个回溯法. ...
- 一个简单的游标删除SQL SERVER表
use databaseName declare @tblname char(100) declare @sql char(5000) declare table_cursor cursor for ...
- 权威指南之脚本化jquery
jqury函数 jquery()($())有4种不同的调用方式 第一种是最常用的调用方式是传递css选择器(字符串)给$()方法.当通过这种方式调用时,$()方法会返回当前文档中匹配该选择器的元素集. ...