首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Linux内核进程管理

通常进程还要包含其他资源,像用来存放全局变量的数据段(text section)、打开的文件、挂起的信号等,当然还包含地址空间及一个 或几个执行线程(threads of execution)。...写时拷贝是种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写人的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。...fork的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据) 。...从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当作进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个使用某些共享资源的进程。...●调用_ cxit_ files()、_ cxit fs()、 exit_ namespace()和exit sighand(), 以分别递减文件描述符、文件系统数据进程名字空间和信号处理雨数的引用计数

1.8K30

【Linux内核进程调度

文章目录 前言 I/O消耗型与处理器消耗性 进程优先级 时间片 进程抢占 前言 调度程序没有太复杂的原理。最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。...但是只要系统中进程的数目比处理器的个数多,就注定会有一些进程不能一 直执行。这些进程在等待运行。在一 组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。...这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。...当一个进程的时间片耗尽时,就认为进程到期了。没有时间片的进程不会再投入运行,除非等到其他所有的进程都耗尽了它们的时间片(也就是说它们]的剩余时间片为0)。在那个时候,所有进程的时间片会被重新计算。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

2.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核进程原理

进程的概念 进程是指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序本身只是指令、数据及组织形式的描述,而进程才是程序真正的运行实体。...在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...EXIT_ZOMBIE(僵尸状态);子进程退出时父进程应使用 wait 或 waitpidtask_struct数据结构 进程控制块PCB的内核实现:task_struct结构体:图片下面介绍一些核心成员...内核线程是直接由内核本身启动的线程,内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行执行”(实际上也并行于内核自身的执行)。...内核线程经常称之为守护进程

1.9K10

Linux内核15-内核如何创建进程

:创建旧进程的副本,比如进程描述符和子进程运行需要的其它内核数据结构。...进程描述符相关变量初始化 // 7. 完成调度器相关数据结构的初始化 retval = sched_fork(clone_flags, p); // 8....在未来的某个进程切换时间点上,调度器把子进程描述符中的thread成员中的值加载到CPU上,赋予子进程CPU的使用权。...esp寄存器加载thread.esp的值(也就是获取了子进程内核态栈的地址),eip寄存器加载ret_from_fork()函数的返回地址(子进程执行的下一条指令)。...创建完进程的4要素之后,把新进程的最开始执行的指令设置到eip寄存器即可。然后就是等待内核调度。当轮到新进程使用CPU的时候,就从eip寄存器开始执行。

2K10

Linux内核编程--进程组和守护进程

会话和进程进程组:进程组是多个进程的集合, 接收同一个终端的各类信号信息。进程调用setpgid(pid, pgid)可以加入一个现有的进程组或者创建一个新的进程组。...进程组长(头部进程):每个进程组都有一个进程组ID, 每个进程组都有一个组长(头部进程), 在大部分系统中, 进程组ID一般就是头部进程ID。获得一个进程所在的进程组ID用getpgid(pid)。...作业:是一个进程组,作业分为前台作业(前台进程组),后台作业(后台进程组) 会话:会话是若干进程组的集合。会话有一个前台进程组和多个后台进程组。...fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。...子进程继承了父进程进程组ID,不过它有自己的进程ID,这就保证了子进程不是一个进程组的头部进程 Step.3 调用setsid( ),给守护进程创建一个新的进程组和会话,使当前进程成为新进程组的头部进程

2.9K20

进程切换内核源码分析

罗军 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程调度的时机 (1)进程状态转换的时刻...标记调用schedule(),此时发生了用户抢占 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;...用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度 进程切换的一般过程 (1)正在运行的用户态进程X (2)发生中断——save cs:eip/esp/...Y 进程上下文信息 用户地址空间:包括程序代码,数据,用户堆栈等 控制信息:进程描述符,内核堆栈等 硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同) 进程切换源码结构 ?...]\n\t" /* save ESP */ \//保存当前的栈顶 "movl %[next_sp],%%esp\n\t" /* restore ESP */ \//这里实现内核堆栈的切换

1.2K30

【Linux 内核进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

文章目录 一、内核线程概念 二、内核线程、普通进程、用户线程 三、内核线程、普通进程区别 四、内核线程主要用途 五、内核线程创建函数 kernel_thread 源码 一、内核线程概念 ---- 直接...由 Linux 内核 启动的线程 , 被称为 " 内核线程 " ; " 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程..." 与 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ; " 内核线程 " 也称为 " 守护进程 " ; 二、内核线程、普通进程、用户线程 ---- 在 【Linux 内核...】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程...用户线程 ; 三、内核线程、普通进程区别 ---- " 内核线程 " 与 " 普通进程 " 区别是 , 内核进程 没有 " 独立的进程地址空间 " ; 在 task_struct 进程描述符 结构体中的

3.7K20

Windows内核进程的终止和子进程

C++对象将可以使用它们的析构函数得以释放 操作系统可以正确的释放该线程使用的堆栈内存 系统将进程的退出代码设置为进入点函数的返回值 系统将内核对象的计数值减去1 1.2...2 进程终止时的情况 进程中全部剩余线程将被终止 进程中指定的用户对象,GDI对象被释放,内核对象被关闭 内核对象的状态编程收到通知的状态 进程的退出代码由STILL_ACTIVE...变为ExitProcess或者TerminateProcess传递的的退出代码 进程内核对象计数减去1 能够通过函数 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD...,所以必须等待此函数运行完成,才干运行后面的代码 3.2 开辟新线程 这样可以在新线程运行的时候,同一时候运行其它线程的代码,可是这种缺点是不同线程之间须要交流数据时候,会产生同步的问题...3.3 开辟子进程 这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程的代码。缺点是开辟新进程,会造成地址空间的浪费。

1.6K20

Linux内核编程--进程通信信号

在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。 c) 软件异常将产生信号。 当检测到某种软件条件已发生(如:定时器alarm),并将其通知有关进程时,产生信号。...内核在递送一个原来阻塞的信号给进程时(而不是在产生信号时),才决定对他的处理方式。所以,进程在信号递送给他之前仍可以改变该信号的处理动作。...pid_t pid, int sig, const union sigval value) 功能: 给任意进程发送信号,并且可以传递数据 value为随信号一起传递的数据 1.新的发送信号函数,主要用于实时信号...如下图示: 十一,信号集: 多个信号可使用一个称之为信号集的数据结构来表示,其系统数据类型为 sigset_t 信号集的常用函数: #include //sigset_t

2.8K20

Linux内核调度分析(进程调度)

红黑树是一种非常著名的数据结构,但这里我们不讨论它的实现和诸多特性(过于复杂),我们记住:红黑树是一种自平衡二叉树,再简单一点,它是一种以树节点方式储存数据的结构,每个节点对应了一个键值,利用这个键值可以快速索引树上的数据...所有有关等待队列的数据结构被定义在中,具体的实现代码则被定义在中。...为此,内核为每个进程设置了一个标志来表明是否需要重新执行一次调度,当某个进程应该被抢占时,会设置这个标志,当一个优先级高的进程进入可执行状态的时候,也会设置这个标志位,内核检查到此标志位就会调用重新进行调度...意思是说,既然要重新进行调度,那么可以继续执行进入内核态之前的那个进程,也完全可以重新选择另一个进程来运行,所以如果设置了,内核就会选择一个更合适的进程投入运行。...除了响应中断后返回,还有一种情况会发生内核抢占,那就是内核中的进程由于阻塞等原因显式地调用来进行显式地内核抢占:当然,这个进程显式地调用调度进程,就意味着它明白自己是可以安全地被抢占的,因此我们不用任何额外的逻辑去检查安全性问题

14.8K113

Linux内核13-进程切换

但是,linux2.6版本以后,通过软件进行进程切换,原因如下: 通过一连串的mov指令,一步步执行切换,可以更好地控制加载数据的合法性。尤其是ds和es段寄存器中的值,有可能会被恶意用户篡改。...如果使用远程跳转指令是无法进程数据检查的。 新旧方法所要求的时间是大致相同的。...后面我们会看到,该数据结构包含了大部分的CPU寄存器,除了通用目的寄存器,比如eax、ebx等,它们被存储在内核态的栈中。...2 执行进程切换 进程切换的时机: 中断处理程序中直接调用schedule()函数,实现进程调度。 内核线程,是一个特殊的进程,只有内核态没有用户态。...加载新进程的fs或gs寄存器内容。数据来源是新进程的thread_struct描述符中对应的值。汇编语言如下: ebx寄存器指向next_p->thread结构。 载入新进程的调式寄存器中的信息。

1.8K20

聊聊Linux内核进程调度下篇

进程优先级 Linux内核进程优先级一般分为动态优先级和静态优先级,动态优先级是内核根据进程的nice值、IO密集行为或者计算密集行为以及等待时间等因素,设置给普通的进程;静态优先级是用户态应用设置给实时进程...一般应用分为IO密集型和计算密集型;I/O密集型是进程执行I/O操作时候等待资源或者事件时候,数据读取到后恢复进程的运行,这样基本出于等待IO和运行之间进行交替,由于具有这样的特性,进程调度器通常会将短的...任何普通进程的nice值在-20~19之间,0是默认,较高的nice值表示较低的进程优先级;实时进程的优先级范围是在0~99 从内核的优先级角度,所有的进程都处于0~139,其中的0~99是分配实时进程...实际调度器 调度器通用元素 CFS(完全公平)调度器 Linux内核中所有动态优先级的进程都是有CFS调度器处理,通常Linux内核中大部分都是非实时进程,所以CFS进程调度器也是最繁忙的调度器。...在计算进程优先级的时候,CFS不仅依赖于进程的nice值,同时还要考虑进程的负载,内核中维护了进程的负载权重数组(prio_to_weight),每个nice值对应一个负载权重;对于进程来说,nice值减一

1.1K20

Linux 内核进程管理之基础

没有废话,内存管理暂时告一段落,正式进入进程管理的内容。 内核通过 task_struct 描述进程 用命令 pstree 可以让内核以树形的结构把进程之间的关系列出来,如下图: ?...这是进程内核中的结构形式,那么内核是如何来以树形结构管理描述这些进程的呢?用来描述进程数据结构,可以理解为进程的属性。...比如进程的状态、进程的标识(PID)等,都被封装在了进程描述符 task_struct 这个数据结构中。...状态:任务状态,退出代码,退出信号等 优先级:相对于其他进程的优先级 程序计数器:程序中即将被执行的下一条指令的地址 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针 上下文数据...void *stack 指向内核栈的指针,内核通过 dup_task_struct 为每个进程都分配内核栈空间,并记录在此。

1.3K50

windows内核代码之进程操作

[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码....二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即可.标准方法可以使用ZwQuerySystemInformation函数.使用SystemProcessInformation...三丶Windows内核之暂停与恢复进程 在Ring3我们想暂停与恢复进程一般都是使用NativeApi.动态获取等等....在内核中一样也有.在VISTA之后,便有导出了. ** NTKERNELAPI NTSTATUS PsSuspendProcess(PEPROCESS Proc) ** ** NTKERNELAPI NTSTATUS...四丶结束进程 4.1 标准方法结束 标准方法结束 就是采用ZwOpenProcess 打开进程获取句柄.然后使用内核函数 ZwTerminateProcess结束. 最后ZwClose关闭句柄.

3K10

4.5 Windows驱动开发:内核中实现进程数据转储

多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出...在上一篇文章《内核R3与R0内存映射拷贝》介绍了一种方式SafeCopyMemory_R3_to_R0可以将应用层进程的内存空间映射到内核中,要实现内存转储功能我们还是需要使用这个映射函数,只是需要在此函数上增加一些功能而已...在实现转存之前,需要得到两个东西,进程内模块基地址以及模块长度这两个参数是必不可少的,至于内核中如何得到指定进程的模块数据,在很早之前的文章《内核中枚举进线程与模块》中有详细的参考方法,这里就在此基础之上实现一个简单的进程模块遍历功能...如下代码中使用的就是枚举进程PEB结构得到更多参数的具体实现,如果不懂得可以研读《内核通过PEB得到进程参数》这篇文章此处不再赘述。...4.调用函数 SafeCopyMemory_R3_to_R0,将要转储的内存空间中的数据复制到缓冲区中。 5.如果线程被切换到了要转储的进程的上下文中,则将线程切换回当前进程的上下文中。

15630

java开发系统内核:使用LDT保护进程数据和代码

上一节,我们开发了一个流氓程序,当他运行起来后,能够把自己的数据写入到另一个进程数据内存中。之所以产生这样的漏洞,是因为被入侵进程数据段所对应的全局描述符在全局描述符表中。...当进程内核加载运行时,它可以让CPU加载自己的局部描述符表,然后把自己的数据段描述符和代码段描述符存入局部描述符表。...(TSS),当前我们的系统内核最多支持同时运行的进程数是MAX_TASK,因此从第7个描述符往后数MAX_TASK个描述符,全都是用来指向用户进程的任务门描述符。...我们总结一下当前进程加载的基本逻辑: 1,每一个控制台进程都对应着一个数据结构叫TSS 2,在全局描述符表中含有一个表项对应着这个TSS数据结构 3,当启动控制台进程时,内核用一个jmp指令,指令的参数就是步骤...的控制权交还给内核内核在异常处理中会强行中的crack程序,这样crack程序就无法入侵客户进程了。

75030

【Linux 内核进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核进程相关概念 | Linux 查看进程命令及输出字段解析 )

文章目录 一、进程特殊形式 ( 内核线程 | 用户线程 ) 二、C 标准库与 Linux 内核进程相关概念 三、Linux 查看进程命令及输出字段解析 一、进程特殊形式 ( 内核线程 | 用户线程 )...---- 普通的进程 , 包含 内核虚拟地址空间 和 用户虚拟地址空间 , 其中 内核虚拟地址空间 所有进程共享 , 用户虚拟地址空间 由进程独立拥有 ; 除了 普通进程 外 , 进程 还有 2...种 特殊形式 : 内核级线程 : 只有 内核虚拟地址空间 , 没有 用户虚拟地址空间 的进程 , 称为 内核线程 ; 用户级线程 : 共享 用户虚拟地址空间 的进程 , 称为 用户线程 ; 线程 : 用户线程...内核 中的 进程 这两个概念是不同的 ; C 标准库 中的 包含多个线程 的进程 , 在 Linux 内核中 称为 " 线程组 " ; C 标准库 中的 只有一个线程 的进程 , 在 Linux 内核中...称为 " 任务 / 进程 " ; C 标准库 中的 线程 , 在 Linux 内核中 称为 " 共享 用户虚拟地址空间 的 进程 " 三、Linux 查看进程命令及输出字段解析 ---- 在 Ubuntu

8.4K20

聊聊Linux内核进程调度上篇

基本介绍 Linux的进程调度器是内核中最重要的核心组件,它决定了一个进程合适获取CPU的时间以及占用CPU的时间。...最佳情况下每个进程需要CPU执行指令的时间,如果需要保证进程之间的如何合理的分配CPU的指令执行时,进程的调度器需要具备如下的特性....dl_sched_class)、实时调度器(struct sched_class rt_sched_class)、完全公平调度器(struct sched_class fair_sched_class) 内核中运行队列包含了所有的进程...内核进程运行队列是通过struct rq来定义 // 省略大部分字段,着重描述下运行队列中的一些字段 struct rq { // 每个CPU的运行队列的锁 raw_spinlock_t lock...; unsigned long next_balance; }; 进程调度实现 进程调度是调用进程第一层的通用调度器,内核是从__schedule()函数开始,该函数是挑选下一个最佳的可运行的进程任务

63520
领券