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

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

_do_fork()函数 不论是clone()、fork()还是vfork(),它们最核心的部分还是调用_do_fork()(一个与体系无关的函数),完成创建进程的工作。...:创建进程的副本,比如进程描述符和子进程运行需要的其它内核数据结构。...分配一个新的task_struct结构,与父进程完全相同,只是stack不同 p = dup_task_struct(current, node); // 4....esp寄存器加载thread.esp的值(也就是获取了子进程内核态栈的地址),eip寄存器加载ret_from_fork()函数的返回地址(子进程执行的下一条指令)。...创建进程的4要素之后,把新进程的最开始执行的指令设置到eip寄存器即可。然后就是等待内核调度。当轮到新进程使用CPU的时候,就从eip寄存器开始执行。

2K10

linux内核进程创建fork源码解析

平时写过多进程多线程程序,比如使用linux的系统调用fork创建进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大...这次在自己写操作系统的时候,看了一遍linux内核进程创建过程。算是有了比较深入的理解。     进程概念:进程是对正在运行程序的一个抽象。...一个标准的线程由线程ID,当前指令指针,寄存器集合,堆栈等,线程创建速度快,因为线程和所属进程共享资源,避免了资源复制和重新创建的开销。...在linux下线程属于轻量级进程,拥有完全一样的数据结构,是系统调度的最小单位。并且线程和cpu是1:1模型,也就是说当前cpu在一个时间片周期内只运行一个线程,这样可以充分利用硬件。    ...,进程线程的创建都要调用同一个函数就是do_fork, 系统调用sys_fork,sys_clone,和内核线程的创建kernel_thread函数最终都要调用do_fork。

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

Linux内核进程管理

文章目录 简介 执行线程 两种虚拟机制 进程描述符与任务队列 PID 进程状态转化图 进程级联 进程创建过程 写时拷贝 fork() 线程在Linux中的实现 clone参数标志 内核线程 进程终结 删除进程描述符...进程状态转化图 进程级联 Linux进程之间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。...->parent ) ; /* task 现在指向init */ 进程创建过程 Linux进程创建很特别。...因为在一般情况下, 进程创建后都会马上运行一个可执行的文件。由于Unix强调进程快速执行的能力,所以这个优化是很重要的。 fork() Linux通过clone(系统调用实现fork()。...从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当作进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个使用某些共享资源的进程

1.8K30

Linux内核进程调度

Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个一个,重复进行)。...在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。调度程序总是选择时间片未用尽面且优先级最高的进程运行。用户和系统都可以通过设置进程的优先级来影响系统的调度。...时间片 时间片是一个数值,它表明进程在被抢占前能持续运行的时间。调度策略必须规定一个默认的时间片,但这并不是一个简单的事。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程

2.8K20

Linux内核进程原理

Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...进程拥有两种特殊的形式:没有用户虚拟地址空间的进程内核线程(守护进程便属于内核线程),共享用户虚拟地址空间的进程叫用户线程,共享同一个用户虚拟地址空间的所有用户线程称为一个线程组。...Linux内核 包括多个线程的进程 线程组 只有一个线程的进程...而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件时会属于不同的状态: 创建态:创建进程 就绪态:进程获取可以运作所有资源及准备相关条件 执行态:进程正在使用...图片 Linux内核提供了一组宏值来表示进程的状态: TASK_RUNNING(可运行状态或就绪状态);Linux并没有严格区分运行态或就绪态,统一为TASK_RUNNING

1.9K10

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

会话和进程进程组:进程组是多个进程的集合, 接收同一个终端的各类信号信息。进程调用setpgid(pid, pgid)可以加入一个现有的进程组或者创建一个新的进程组。...会话的创建进程调用setsid函数创建一个新的Session,并成为Session Leader a.调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。...fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。...独立启动的守护进程:httpd、named、xinetd等。 守护进程创建方式: 让一个普通进程变成守护进程的操作步骤: Step.1 调用fork( )。...子进程继承了父进程进程组ID,不过它有自己的进程ID,这就保证了子进程不是一个进程组的头部进程 Step.3 调用setsid( ),给守护进程创建一个新的进程组和会话,使当前进程成为新进程组的头部进程

2.9K20

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

文章目录 一、内核线程概念 二、内核线程、普通进程、用户线程 三、内核线程、普通进程区别 四、内核线程主要用途 五、内核线程创建函数 kernel_thread 源码 一、内核线程概念 ---- 直接...由 Linux 内核 启动的线程 , 被称为 " 内核线程 " ; " 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程...】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程..., mm 指针指向的空间就是 " 独立的进程地址空间 " ; 在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构体 进行描述的 ; Linux 内核中 , 所有 进程管理...进程 来说 , active_mm 字段 与 mm 字段 指向同一个 " 内存描述符 " ; 但对于 " 内核线程 " 来说 , mm 字段 指向 空指针 , active_mm 字段 指向 从进程借用的

3.7K20

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

这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...2) 未决状态:在信号产生和递送之间的时间间隔内,称信号是未决的(pending) 如果为进程产生了一个被该进程设置为阻塞的信号,而且对该信号的动作是默认或者捕捉该信号,则内核为该进程将此信号保持为未决状态...内核在递送一个原来阻塞的信号给进程时(而不是在产生信号时),才决定对他的处理方式。所以,进程在信号递送给他之前仍可以改变该信号的处理动作。...信号的 “阻塞” 是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。 每个进程都有一个阻塞集,创建进程时子进程将继承父进程的阻塞集。

2.8K20

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

本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。...一个可能的流程如下: 调用宏创建一个等待队列的项(链表的节点) 调用把自己加到队列中去。...为此,内核为每个进程设置了一个标志来表明是否需要重新执行一次调度,当某个进程应该被抢占时,会设置这个标志,当一个优先级高的进程进入可执行状态的时候,也会设置这个标志位,内核检查到此标志位就会调用重新进行调度...意思是说,既然要重新进行调度,那么可以继续执行进入内核态之前的那个进程,也完全可以重新选择另一个进程来运行,所以如果设置了,内核就会选择一个更合适的进程投入运行。...为了支持内核抢占,Linux做出了如下的变动: 为每个进程的引入了计数器,用于记录持有锁的数量,当它为0的时候就意味着这个进程是可以被抢占的。

14.8K113

聊聊Linux内核进程调度下篇

进程优先级 Linux内核进程优先级一般分为动态优先级和静态优先级,动态优先级是内核根据进程的nice值、IO密集行为或者计算密集行为以及等待时间等因素,设置给普通的进程;静态优先级是用户态应用设置给实时进程...实际调度器 调度器通用元素 CFS(完全公平)调度器 Linux内核中所有动态优先级的进程都是有CFS调度器处理,通常Linux内核中大部分都是非实时进程,所以CFS进程调度器也是最繁忙的调度器。...CFS调度器根据虚拟时间值,CFS决定进程的最终运行时间,同时也会涉及使用nice来衡量一个进程和其他进程的竞争关系。...在计算进程优先级的时候,CFS不仅依赖于进程的nice值,同时还要考虑进程的负载,内核中维护了进程的负载权重数组(prio_to_weight),每个nice值对应一个负载权重;对于进程来说,nice值减一...一个进程内运行多个任务,每个任务都会有一个截止期(在截止期内必须完成执行)和一个计算时间,该时间定义ICPU完成进程执行所需要的时间。

1.1K20

Linux 内核进程管理之基础

没有废话,内存管理暂时告一段落,正式进入进程管理的内容。 内核通过 task_struct 描述进程 用命令 pstree 可以让内核以树形的结构把进程之间的关系列出来,如下图: ?...这是进程内核中的结构形式,那么内核是如何来以树形结构管理描述这些进程的呢?用来描述进程的数据结构,可以理解为进程的属性。...//进程标识符,用来代表一个进程 pid_t pid; .........Linux中的 ready 和 running 对应的都是TASK_RUNNING标志位,ready 表示进程正处在队列中,尚未被调度;running 则表示进程正在CPU上运行; ?...图中可知,上层应用通过各种方式创建进程时,最终都会通过 _do_fork 新建一个 task_struct。 ?

1.3K50

Linux内核13-进程切换

1 进程切换 进程切换,又称为任务切换、上下文切换、或者任务调度。本文就研究Linux内核进程切换。我们首先理解几个概念。...硬件上下文是进程执行上下文的一个子集,进程执行上下文包含进程执行所需要的所有信息。在Linux中,进程的硬件上下文一部分存储在进程描述符中,而其它部分存储在内核态的栈中。...在Linux的设计中,每个CPU就只有一个TSS,所以,Busy位总是设为1。换句话说,Linux中Type域一般为11。...2 执行进程切换 进程切换的时机: 中断处理程序中直接调用schedule()函数,实现进程调度。 内核线程,是一个特殊的进程,只有内核态没有用户态。...内核进程没法直接主动调度,因为schedule()是一个内核函数,不是系统调用。所以只能在中断处理程序进行调度。

1.8K20

驱动开发:内核监控进程与线程创建

监控进程的启动与退出可以使用 PsSetCreateProcessNotifyRoutineEx 来创建回调,当新进程产生时,回调函数会被率先执行,然后执行我们自己的MyCreateProcessNotifyEx...= NULL){strcpy(ProcName, PsGetProcessImageFileName(Process));DbgPrint("父进程ID: %ld --->父进程名: %s --->进程名...: %s---->进程路径:%wZ", CreateInfo->ParentProcessId,GetProcessNameByProcessId(CreateInfo->ParentProcessId...Process),CreateInfo->ImageFileName);}else{strcpy(ProcName, PsGetProcessImageFileName(Process));DbgPrint("进程...图片而检测线程操作与检测进程差不多,检测线程需要调用PsSetCreateThreadNotifyRoutine 创建回调函数,然后就可以检测线程的创建了,具体代码如下:#include <ntddk.h

86030

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

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

8.4K20

Linux创建进程

Linux的下是由父进程来完成的,创建完成的新进程是子进程对于子进程它有两种执行顺序的可能性: 父进程和子进程并发执行; 子进程先执行,父进程等待子进程执行完毕。...在Linux下的fork函数用于创建一个新的进程,使用fork()的函数来创建一个进程时,子进程只是完全复制父进程的资源。这样得到的子进程和父进程是独立的,具有良好的并发性。...Linux的采用了copy-on-write技术(COW),即:只有在子进程中发生写入操作的时候,才真正的去复制父进程的资源,否则不进行复制操作,比如在fork的子进程中只是调用exec函数来执行另外一个可执行文件...此处使用的的if-else语句才能真正使得创建一个进程有意义,否则父子进程将会执行一模一样的代码,这没有意义。...除了fork之外,Linux的系统还提供了vfork的函数来建立一个进程.vfork建立的新进程和fork的不同之处在于: vfork创建的子进程和父进程是共享地址空间的,而不是复制,因此子进程中的数据和父进程中的数据是共享的

2.1K10

Linux内核进程的负载均衡

简介 Linux内核进程调度的核心是选择哪个任务在哪个CPU上运行,解决各个进程之间能够公平的共享CPU资源,同时需要确认进程需要占用CPU时间,确定下一个需要运行的进程。...每个CPU上会运行一个进程的调度队列,在系统运行过程中可能会出现一个CPU上的任务多,另外一个CPU上的任务少的情况,这就需要将繁忙的CPU将任务转移到空间处理器上从而避免某些CPU负载不够的情况....进程在同一个物理Core上的逻辑Core之前迁移开销最小;如果在不同的物理Core之间迁移,如果每个物理Core拥有私有的L1 Cache,共享L2 Cache,进程迁移后就无法使用原来的L1 Cache...内核采用调度域解决现代多CPU多核的问题,调度域是具有相同属性和调度策略的处理器集合,任务进程可以在它们内部按照某种策略进行调度迁移。...目前内核进程调度按照如下的原则进行,这些原则都是按照cpu架构以及通信路径来进行的。

96420

Linux内核进程负载均衡机制

Cache基本视图如下图: [0k4d2tngtz.jpg] 从Cache和内存访问的视角,如果进程负载均衡需要把进程A迁移到另一个CPU上, 如果目标CPU和进程A之前所在CPU正好是同一个物理CPU...如果目标CPU和进程A之前所在CPU正好是同一个物理CPU但不同核心上(多核),那么Cache利用率次之,L3中还有'热'数据。...如果目标CPU和进程A之前所在CPU正好是同一个NUMA但是不同物理CPU上(多NUMA结构),虽然Cache已经是'冷'了,但至少内存访问还是在本NUMA中。...SMP组织 为了更好地利用Cache,内核将CPU(如果开启了超线程,那么以逻辑CPU为单位,否则以物理CPU核心为单位)组织成了调度域。...[y6rt4xcbla.jpg] 每个CPU的进程运行队列有一个成员指向其所在调度域。从最低层到最高层。

12.1K220

聊聊Linux内核进程调度上篇

基本介绍 Linux进程调度器是内核中最重要的核心组件,它决定了一个进程合适获取CPU的时间以及占用CPU的时间。...Linux进程调度器采用类似于vfs的设计采用简单的两层结构模式,第一层是通用调度器,定义作为进程调度器的入口抽象层;第二层是调度器的具体实现,根据调度策略实现进程的调度的器的具体实现。...,每个CPU都有一个运行队列,各自的进程运行队列都会在各自的CPU队列争夺CPU的运行时间。...; unsigned long next_balance; }; 进程调度实现 进程调度是调用进程第一层的通用调度器,内核是从__schedule()函数开始,该函数是挑选下一个最佳的可运行的进程任务...如果其他实际调度器没有更高的优先级可运行的进程任务,则pick_next_task()会选择完全公平调度器中寻找下一个进程任务。

63620
领券