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、子进程着手使自己与父进程区别开来,进程描述符内的许多成员

 

 

 

时间: 2024-11-05 14:47:35

linux核心之进程管理的相关文章

Linux常用的进程管理和查看指令

  &背景工作做符 ctrl+ z 暂停 ctrl + c 停止 jobs [-l(list) , r(running jobs) ,-s(stop jobs)] 观察背景工作的状态 fg %jobnumber 将背景工作拿到前景执行 bg %jobnumber 让工作在背景的状态变成运作中(被ctrl暂停在背景的工作) ========================================================= kill -l ===>列出q能够使用的signal有哪

linux进程管理之进程创建

所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应一个task.就是以前所讲的PCB.它的结构如下(include/linux/sched.h): struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; at

Linux进程管理之“四大名捕”

一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手"无情".内功卓越的高手"铁手".腿功惊人的"追命"和剑法一流的"冷血" 本文四大名捕由linux命令所出演 无情:ps 出演 铁手:dstat 出演 追命:top 出演 冷血:htop 出演 二.进程相关基础知识 介绍四大名捕之前先介绍一下进程相关的基础知识,话不多说,看图. 三.轻功暗器高手"

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme   目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS   日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gat

简述linux的进程管理和作业任务

进程是为了使多个程序可以并发的执行,提高系统的资源利用和吞吐量 1.linux中每个进程都有一个识别号PID 2.系统第一个启动进程是init,PID是1,是唯一一个由系统内核直接运行的进程,新的进程都是系统调用fork来产生,除了init之外,每个进程都有一个父进程. 3每个进程有实际用户识别号(运行此进程的用户识别号),实际组识别号(运行此进程的组识别号). 4.进程的类型,交互进程,由一个Shell启动的进程. 批处理进程,不与特定的终端相关联,提交到等待队列中顺序执行的进程. 守护进程,

Linux进程管理及作业控制

Linux是一个多任务的操作系统,系统上同时运行着多个进程,正在执行的一个或多个相关进程称为一个作业.使用作业控制,用户可以同时运行多个作业,并在需要时在作业之间进行切换.本章详细介绍进程管理及作业控制的命令,包括启动进程.查看进程.调度作业的命令. 进程及作业的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时间使用计算机系统:多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务. 操作系统管理多个用户的请求和多个任务.大多数系统都只

Linux进程管理机制概述

一 .进程的概念和分类 1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时间使用同一个linux系统:多任务是指在Linux下可以同时执行多个任务,更详细的说,linux采用了分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片很短,用户根本感觉不到是多个任务在运行,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这

Linux进程管理的4个常用命令

Linux是一个多用户.多任务的操作系统.在这样的系统中,各种计算机资源(如文件.内存.CPU等)的分配和管理都以进程为单位.为了协调多个进程对这些共享资源的访问,操作系统要跟踪所有进程的活动,以及它们对系统资源的使用情况,从而实施对进程和资源的动态管理.进程在一定条件下可以对诸如文件.数据库等客体进行操作.如果进程用作其他不法用途,将给系统带来重大危害.在现实生活当中,许多网络黑客都是通过种植"木马"的办法来达到破坏计算机系统和入侵的目的,而这些"木马"程序无一例

linux进程管理和作业任务

  进程是为了使多个程序可以并发的执行,提高系统的资源利用和吞吐量 1.linux中每个进程都有一个识别号PID 2.系统第一个启动进程是init,PID是1,是唯一一个由系统内核直接运行的进程,新的进程都是系统调用fork来产生,除了init之外,每个进程都有一个父进程. 3每个进程有实际用户识别号(运行此进程的用户识别号),实际组识别号(运行此进程的组识别号). 4.进程的类型,交互进程,由一个Shell启动的进程. 批处理进程,不与特定的终端相关联,提交到等待队列中顺序执行的进程. 守护进