linux内核分析笔记----进程管理

进程隐藏之从tasks与pid链表摘除 何为tasks链表 何为PID 链,很容易理解和上手操作 阅读详情

      进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。

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

      linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。在2.6以前的内核中,各个进程的task_struct存放在它们内核栈的尾端。由于现在用slab分配器动态生成task_struct,所以只需在栈底或栈顶创建一个新的结构(struct thread_info),他在asm/thread_info.h中定义,需要的请具体参考。每个任务中的thread_info结构在它的内核栈中的尾端分配,结构中task域存放的是指向该任务实际task_struct指针。

      在内核中,访问任务通常需要获得指向其task_struct指针。实际上,内核中大部分处理进程的代码都是通过task_struct进行的。通过current宏查找到当前正在执行的进程的进程描述符就显得尤为重要。在x86系统上,current把栈指针的后13个有效位屏蔽掉,用来计算thread_info的偏移,该操作通过current_thread_info函数完成,汇编代码如下:

movl $-8192, %eax

andl  %esp, %eax

    最后,current再从thread_info的task域中提取并返回task_struct的值:current_thread_info()->task;

     进程描述符中的state域描述了进程的当前状态。系统中的每个进程都必然处于五种进程状态中的一种,什么运行态啦,阻塞态啦,它们之间转化的条件啦等等,这一点我也不细说了,为啥?随便一本操作系统的书里,讲得都比我好,要讲就要讲别人讲不好的,是不?现在我关心的问题是:当内核需要调整某个进程的状态时,该怎么做?这时最好使用set_task_state(task, state)函数,该函数将指定的进程设置为指定的状态,必要的时候,它会设置内存屏蔽来强制其他处理器作重新排序。(一般只有在SMP系统中有此必要)否则,它等价于:task->state = state; 另外set_current_state(state)和set_task_state(current, state)含义是等价的。

     一般程序在用户空间执行。当一个程序执行了系统调用或者触发了某个异常,它就陷入内核空间。系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行----对内核的所有访问都必须通过这些接口。

     linux进程之间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。

     系统中的每个进程必有一个父进程,每个进程也可以拥有一个或多个子进程。进程既然有父子之称,当然就有兄弟之意了。每个task_struct都包含一个指向其父进程task_struct且叫做parent的指针,同时包含一个称为children的子进程链表。所以访问父进程:struct task_struct *task = current->parent;按照如下方式访问子进程:

struct task_struct *task;
struct list_head *list;
list_for_each(list, &current->children){
           task = list_entry(list, struct task_struct, sibling);
}

      其中init进程描述符是作为init_task静态分配的。通过上面的init进程,父子进程关系,兄弟进程关系以及进程描述符的结构,我们可以得到一个惊人的事实:可以通过这种关系从系统的任何一个进程出发查找到任意指定的其他进程。而且方式还挺多的,这个就看书了,内容挺多我就不说了,只是最后需要指出的是,在一个拥有大量进程的系统中通过重复来遍历所有的进程是非常耗费时间的,因此,如果没有充足的理由千万别这样做。爱要一万个理由,这么做呢,没看出来.

      许多的操作系统都提供了产生进程的机制,linux这优秀的系统也不例外。Unix很简单:首先fork()通过拷贝当前进程创建一个子进程。子父进程的区别仅仅在于PID,PPID和某些资源和统计量。然后exec()函数负责读取可执行文件并将其载入地址空间并执行。从上面分析可以看出,传统的fork()系统调用直接把所有的资源复制给心创建的进程。这种方式过于简单但效率底下。在Linux下使用了一种叫做写时拷贝(copy-on-write)页实现。这种技术原理是:内存并不复制整个进程地址空间,而是让父进程和子进程共享同一拷贝,只有在需要写入的时候,数据才会被复制。不懂?简单点,就是资源的复制只是发生在需要写入的时候才进行,在此之前,都是以只读的方式共享。

      linux通过clone()系统调用实现fork(),通过参数标志来说父子进程共享的资源。无论是fork(),还是vfork(),__clone()最后都根据各自需要的参数标志去调用clone().然后有clone()去调用do_fork().这样一说,我想大家明白我的意思了,问题的关键纠结于do_fork(),它定义在kernel/fork.c中,完成了大部分工作,该函数调用copy_process()函数,然后让进城开始运行,copy_precess()函数完成的工作很有意思:

1.调用dup_task_struct()为新进程创建一个内核栈,它的定义在kernel/fork.c文件中。该函数调用copy_process()函
   数。然后让进程开始运行。从函数的名字dup就可知,此时,子进程和父进程的描述符是完全相同的。
2.检查这个新创建的的子进程后,当前用户所拥有的进程数目没有超过给他分配的资源的限制。
3.现在,子进程开始使自己与父进程区别开来。进程描述符内的许多成员都要被清0或设为初始值。
4.接下来,子进程的状态被设置为TASK_UNINTERRUPTIBLE以保证它不会投入运行。
5.调用copy_flags()以更新task_struct的flags成员,表明进程是否拥有超级用户权限的PF_SUPERPRIV标志被清0。表
   明进程还没有调用exec函数的PF_FORKNOEXEC标志。
6.调用get_pid()为新进程获取一个有效的PID.
7.根据传递给clone()的参数标志,拷贝或共享打开的文件,文件系统信息,信号处理函数。进程地址空间和命名空间等。
  一般情况下,这些资源会被给定进程的所有线程共享;否则,这些资源对每个进程是不同的,因此被拷贝到这里.
8.让父进程和子进程平分剩余的时间片
9.最后,作扫尾工作并返回一个指向子进程的指针。

      经过上面的操作,再回到do_fork()函数,如果copy_process()函数成功返回。新创建的子进程被唤醒并让其投入运行。内核有意选择子进程先运行。因为一般子进程都会马上调用exec()函数,这样可以避免写时拷贝的额外开销。如果父进程首先执行的话,有可能会开始向地址空间写入。

      说完了fork,接下来说说他的兄弟---vfork(),兄弟就是兄弟,这像!两者功能相同,不同点在于vfork()不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec(),子进程不能向地址空间写入。按照刚才的方法,分析一下vfork(),它是通过向clone()系统调用传递一个特殊标志来进行的,过程如下:

1.在调用copy_process时,task_struct的vfor_done成员被设置为NULL
2.在执行do_fork()时,如果给定特别标志,则vfork_done会指向一个特殊地址。
3.子进程开始执行后,父进程不是马上恢复执行,而是一直等待,直到子进程通过vfork_done指针向它发送信号。
4.在调用mm_release()时,该函数用于进程退出内存地址空间,如果vfork_done不为空,会向父进程发送信号。
5.回到do_fork(),父进程醒来并返回。

     上面步骤的顺利完成就意味着父子进程将会在各自的地址空间里运行。说句真的,通过研究发现这样的开销是降低了,但技术上不算咋优良。

      如果说进程是80年代早上初升的太阳, 那不得不说的线程就是当前正午的烈日。线程机制提供了在同一程序内共享内存地址空间运行的一组线程。线程机制支持并发程序设计技术,可以共享打开的文件和其他资源。如果你的系统是多核心的,那多线程技术可保证系统的真正并行。然而,有一件令人奇怪的事情,在linux中,并没有线程这个概念,linux中所有的线程都当作进程来处理,换句话说就是在内核中并没有什么特殊的结构和算法来表示线程。那么,说了这多,到底在linux中啥是线程,我们说在linux中,线程仅仅是一个使用共享资源的进程。每个线程都拥有一个隶属于自己的task_struct.所以说线程本质上还是进程,只不过该进程可以和其他一些进程共享某些资源信息。

      这样一说,后面就明白了也好解决了,两者既然属于同一类,那创建的方式也是一样的,但总要有不同啊,这个不同咋体现呢,这个好办,我们在调用clone()的时候传递一些参数标志来指明需要共享的资源就可以了:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);这段代码产生的结果和调用fork()差不多,只是父子俩共享地址空间,文件系统资源,文件描述符和信号处理程序。换个说法就是这里的父进程和子进程都叫做线程。也就是说clone()的参数决定了clone的行为,具体有哪些参数,我是个懒人,也不想说了。

      前边说的主要是用户级线程,现在我们接着来说说内核级线程。内核线程和用户级线程的区别在于内核线程没有独立的地址空间(实际上它的mm指针被设置为NULL).它也可以被调度也可以被抢占。内核线程也只能由其他内核线程创建。方法如下:int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags).新的任务也是通过像普通的clone()系统调用传递特定的flags参数而创建的。上面函数返回时,父进程退出,并返回一个子线程task_struct的指针。子进程开始运行fn指向的函数,arg是运行时需要用到的参数。一个特殊的clone标志CLONE_KERNEL定义了内核线程常用到参数标志:CLONE_FS, CLONE_FILES, CLONE_SIGHAND.大部分的内核线程把这个标志传递给它们的flags参数。

      我虽有才,还是不如书上说的好啊,讲了那么多的创建,出生,突然来点终结的的话, 多少有点感伤啊。但感伤归感伤,进程终归是要终结的。一个进程终结时必须释放它所占用的资源并把这一消息告诉其父进程。进程终止的方式有很多种,进程的析构发生在它调用exit()之后,即可能显示地调用这个系统调用,也可能隐式地从某个程序的主函数返回。当进程接受到它即不能处理也不能忽略的信号或异常时,它还可能被动地终结。但话说回来,不管进程怎么终结,该任务大部分都要靠do_exit()来完成,它定义在kernel/exit.c中,具体的工作如下所示:

1.将tast_struct中的标志成员设置为PF_EXITING.
2.如果BSD的进程记账功能是开启的,要调用acct_process来输出记账信息。
3.调用__exit_mm()函数放弃进程占用的mm_struct,如果没有别的进程使用它们即没被共享,就彻底释放它们。
4.调用sem_exit()函数。如果进程排队等候IPC信号,它则离开队列。
5.调用__exit_files(), __exit_fs(), __exit_namespace()和exit_sighand()以分别递减文件描述符,文件系统数据,进程
  名字空间和信号处理函数的引用计数。当引用计数的值为0时,就代表没有进程在使用这些资源,此时就释放。
6.把存放在task_struct的exit_code成员中的任务退出代码置为exit()提供的代码中,或者去完成任何其他由内核机制
  制定的退出动作。
7.调用exit_notify()向父进程发送信号,将子进程的父进程重新设置为线程组中的其他线程或init进程,并把进程状态
  设为TASK_ZOMBIE.
8.最后,调用schedule()切换到其他进程。

      经过上面的步骤,与进程相关的资源都被释放掉了,它以不能够再运行且处于TASK_ZOMBLE状态。现在它占用的所有资源就是保存threadk_info的内核栈和保存tast_struct结构的那一小片slab。此时进程存在的唯一目的就是向它的父进程提供信息。

      僵死的进程是不能再运行的。但系统仍然保留它的进程描述符,这样就有办法在子进程终结时仍可以获得它的信息。在父进程获得已终结的子进程的信息后,子进程的task_struct结构才被释放。

      熟悉linux系统中子进程相关知识的我们都知道在linux中有一系列wait()函数,这些函数都是基于系统调用wait4()实现的。它的动作就是挂起调用它的进程直到其中的一个子进程退出,此时函数会返回该退出子进程的PID.调用该函数时提供的指针会包含子函数退出时的退出代码。最终释放进程描述符时,会调用release_task(),完成的工作如下:

1.调用free_uid()来减少该进程拥有者的进程使用计数。
2.调用unhash_process()从pidhash上删除该进程,同时也要从task_list中删除该进程。
3.如果这个进程正在被ptrace追踪,将追踪进程的父进程重设为其最初的父进程并将它从ptrace_list上删除。
4.最后,调用put_task_struct释放进程内核栈和thread_info结构所占的页,并释放task_struct所占的slab高速缓存.

       至此,进程描述符和所有进程独享的资源就全部释放掉了。

       最后,我们讨论进程相关的最后一个问题:前边的一切看似很完美,很美好,美好让人还怕,不是么?哪里出问题了,父进程创建子进程,然后子进程退出处释放占用的资源并告诉父进程自己的PID以及退出状态。问题就出在这里,子进程一定能保证在父进程前边退出么,这是没办法保证的,所以必须要有机制来保证子进程在这种情况下能找到一个新的父进程。否则的话,这些成为孤儿的进程就会在退出时永远处于僵死状态,白白的耗费内存。解决这个问题的办法,就是给子进程在当前线程组内找一个线程作为父亲,如果这样也不行(运气太背了,不是)。在do_exit()会调用notify_present(),该函数会通过forget_original_parent来执行寻父过程,具体我就不讲了,讲到这个详细的地步,还不自己看看,我没办法了.

       一旦系统给进程成功地找到和设置了新的父进程,就不会再有出现驻留僵死进程的危险了,init进程会例行调用wait()来等待子进程,清除所有与其相关的僵死进程。

Linux内核框架之内核进程 前言 内核主要架构由五部分构成:内存管理,进程调度和管理,文件系统、设备管理和驱动,网络驱动。本系列文希望通过代码实践和参考文章的方式力争对这几个部分做出深入的了解。 目录 前言 一、Linux的进程介绍 1.进程 线程和轻量级进程 2.进程调度的结构组成 二、进程的静态描述 1.进程描述符 2.进程链表的维护 2.1运行队列 2.2 等待队列 3.进程间关系 4.进程切换 一、Linux的进程介绍 1.进程 线程和轻量级进程 进............. 阅读详情

相关推荐

网易公开课《Linux内核分析》学习心得-Linux内核学习总结

杨怡泽 原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000博客作业目录列表·第一周-通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 ·第二周-mykernel实验的实践和分析 ·第三周-跟踪分析Linux内核的启动过程 ·第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用

galaxy_21的博客 3528

LINUX进程管理-2

进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。       内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是类型为task_struct,名称叫做进程描述

Phoenix_FuliMa 1157

Linux内核源代码情景分析笔记

Linux内核源代码情景分析笔记好吧,首先我承认我要是读者的话,这篇文章我看着也头疼,因为写的太长太泛(其主要部分集中在内存管理,进程管理,文件系统)!原本是想按自己理解的精简精简的,按照操作系统中两个核心的抽象概念“进程”和“文件”开始介绍的,可以说操作系统引入这两个概念是系统的核心,其中进程的管理可以说是对内存和cpu的抽象管理,当然基础内存管理是必须的。而文件可以说是对设备的一层抽象(不仅仅是

myazi 1万+

linux 2.6源代码情景分析笔记之进程4

散列(hash)函数并不总能确保pid与表索引一一对应。两个不同的pid散列到相同的表索引称为冲突(colliding),linux利用链表来处理冲突的pid,每一个表项是由冲突的进程描述符组成的双向链表。pid散列表的数据结构解决了所有这些难题,他们可以为包含在一个散列表中的任何pid号定义进程链表。最主要的数据结构是四个pid结构的数组,它在进程描述符的pid字段中。struc

superkiss2的专栏 1089

Linux内核分析学习路线总结(内核人员必看)

1、Linux体系架构(文末附上学习思维导图) 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态。   内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。   用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。 用户态的应用程序可以通过三种方式来访问内核态的资源: 1)系统调用 2)库函数 3)Shell脚本 这三种方式也在上图中有所体现。 二、Linux内核的启动过

Linuxhus的博客 5286

模仿学习与强化学习结合(IL+RL)有没有代表性论文?未来发展趋势如何?

IL与RL的结合正成为AI研究热点,尤其在机器人控制、复杂博弈等需要边学边练的场景。经典方法如Dagger(2010)和GAIL(2016)开创了先用模仿学习预热、再用强化学习微调的模式。近期工作如IN-RIL(2024)提出交替训练策略,显著提升样本效率。开源项目RoboSchool和StableBaselines3为相关研究提供支持。未来趋势包括:1)混合式智能体结合人类经验与自主探索;2)突破小样本学习、自然语言交互等方向;3)提升安全性、样本效率和可解释性。

CyberSoma的博客 2248

进程管理API之get_task_pid

struct pid *get_task_pid(struct task_struct *task, enum pid_type type) 用于根据task和pid type找到对应的struct pid,并增加pid的引用计数. 其使用的例程如下: struct inode *proc_pid_make_inode(struct super_block * sb, struct t

jason的笔记 1395

3D-IC测试挑战与Tessent解决方案解析

3D-IC技术通过硅通孔(TSV)实现芯片垂直堆叠,是延续摩尔定律的关键路径。该技术面临三大核心挑战:KGD标准严苛化要求测试覆盖率达99.5%以上,存储器测试需兼容LPDDR/HBM等多种协议,逻辑堆叠需解决TSV互连的电气特性和时序验证问题。Mentor Tessent平台采用混合测试架构,结合压缩扫描测试(ATPG)和内建自测试(BIST)技术,实现100x测试数据压缩比和99.97%的TSV缺陷检出率。这些创新方案在移动SoC和高性能计算芯片中已获验证,测试时间缩短73%,缺陷逃逸率降低77%。随着

weixin_30621711的博客 376

linux内核对孤儿进程寻父,linux内核分析笔记------进程管理

进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是类型为task_struct,名称叫做进程描述符(proces...

weixin_35772595的博客 211

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 304

《Linux内核分析》 学习总结

摘要: 黄胤凯 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习笔记汇总: 《Linux内核分析》 第一节 计算机是如何工作的:http://www.cnblogs.com/20132109HKK/p/5225027.html 《Linux内核分析》 第二节 操作系统是如何工...

weixin_30723433的博客 82

NLP高频面试题(三十一)——多模态预训练模型的主要结构、特征对齐与融合方法及对比损失函数详解

多模态预训练模型通过创新的架构设计和训练策略,在跨模态理解和表示学习上取得了显著进展。从单塔到双塔,从编码器-解码器混合到图结构模型,研究者们探索了不同的模态融合途径;配合显式与隐式对齐手段以及有效的对比学习损失,当前的多模态模型已经能够在图文检索、视觉问答、图像描述生成等任务上接近甚至超越专门的有监督模型。可以说,多模态预训练成为了继NLP和CV单模态预训练之后的又一个AI热点领域。模型规模与泛化:与单模态的大型预训练模型类似,多模态模型的参数规模和训练数据规模在迅速增长。

WeLearnNLP 2924

Linux内核分析课程总结

Linux内核分析课程总结 By 20135203齐岳 知识梳理 (思维导图地址http://mindmap.4ye.me/mkxM0cFh/1) 从start _ kernel构造一个新的Linux内核开始,0号进程rest _ init创建了1号进程kernel _ init从而启动Linux内核,这个过程的中心思想其实一直贯穿在Linux内核操作系统之中。1号进程通过复制PCB创建出更多的...

weixin_34106122的博客 130

DICOM医学影像开发者必备工具清单

PyDicom 是一个纯 Python 实现的 DICOM 文件解析库,允许开发者读取、修改和写入 DICOM 文件。它无需依赖外部库,易于集成到现有的 Python 项目中,非常适合快速开发和原型设计。DCMTK(DICOM Toolkit)是一个由OFFIS开发的开源C++库,提供了一整套DICOM标准的实现,包括文件操作、网络通信和图像处理等功能。它是开发高性能DICOM应用的理想选择。MicroDICOM 是一款免费的DICOM查看器,适用于Windows平台。

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 577

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

Linux内核学习计划

前一阵儿开始学习Linux内核,开始之后逐渐发现这是一个庞大的计划,需要极大恒心。因此开通这个博客,记录学习笔记,督促自己坚持下去。学习资料主要来源于两本书:《深入理解Linux内核》、《Linux内核源代码情景分析》,以第一本为主。还参考了一些其他资料,在具体遇到时再一一标注。

li_boxue的博客 878

SAP 联产品测试

最近领导一直要求研究一下SAP联产品的使用场景,之前只是自己摸索过一次,这个重新对联产品进行一个测试。 1、首先准备好物料主数据 注意主数据中需要勾选联产品标识。 设置好物料的分摊的百分比。 2、检查BOM 在BOM中也需要维护联产品的标识 只有当组件数量未负数时,才能勾选联产品的标识。如果组件数量正值,勾选联产品的标识时会报错。 3、我们创建生产订单 可以看到按正常的生产订单下达时,系统就报错了,问题点在于离散制造的生产订单基本是结算到物料的。但是联产品是按订单结算的, 所以需要对订单类型中的结算参

我小时候很黑的博客 2110

599_linux内核学习_sys.c中sys_setpgid函数分析

全部学习汇总: https://github.com/GreyZhang/little_bits_of_linux 趁热打铁,再补一次拉下的课程。简单分析一个函数sys_setpgid。 其实,看这种大神段子般的注释有时候比看代码更加过瘾。能够看得出,早期的这个内核也并不是一个完美的存在。 有点给自己的懒惰找借口的感觉了,看着大神不懂这么多的概念直接放弃,我也有点想直接放弃了!(捂脸哭) ...

小灰笔记 483

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入Linux内核架构笔记-进程管理与调度1

概述 进程是可执行程序的一个运行实例,主要包括当前的程序计数器,寄存器和变量等,从概念上讲,每个进程都有自己的虚拟CPU,但实际上,CPU在各个进程上快速切换。 对于进程,内核必须解决的几个问题: 应用程序彼此不能互相干扰,除非有明确要求要这么做 CPU时间要在各个应用程序之间尽可能公平的共享 其中第二个问题是进程管理与调度要解决的问题,内核必须决定为各个进程分配多长时间,何时切换到下一个进...

snoopyljc的专栏 173

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

什么是Linux内核,如何搞懂Linux内核?(Linux内核学习笔记合集来了!)

操作系统(简称为OS)是一中软件平台,可创建一个环境,用户可以再该环境中再计算设备上运行不同的应用程序。它被移动设备,标签,台式机,web服务器,视频游戏机等不同的设备所利用。如果你有这些技能,你可以试试给暴雪发简历,给他们写服务器后台,以为全世界的魔兽都运行在你的服务器软件上。当然,一般的网络公司,哪怕是百度级别的,都应该毫不犹豫的录用你。每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。内核负责处理低级任务,例如任务管理,内存管理,风险管理等。内核是操作系统的关键组件。

weixin_44909451的博客 5880

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux 内核(Kernel)组成分析

一、Linux内核简介 Linux 内核采用宏内核架构,即 Linux 大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及网络管理等功能,它们是运行在内核空间中(也可以称之为特权模式下运行)。 而微内核,它仅仅是将内核的基本功能放入内核中,如进程管理、进程调度等,而其他的设备管理、文件管理等功能都放在内核空间之外(即运行在非特权模式下)。 Linux 内核组成 : L...

丨晋丨 1万+

《Linux内核精通》笔记

了解Linux内核由哪些组成?须知Linux内核源码(下载的链接👆👆👆)组织结构?重点需要学习地知识点有哪些?Linux内核架构和工作原理Linux内核Makefile系统文件详解计算机Intel CPU体系结构分析QEMU调试Linux内核环境搭建Linux Kernel内核整体架构(图文详解)Linux内核看socket底层的本质(IO)Linux用户空间与内核空间通信(Netlink通信机制)最后依据我为大家提供的的学习资料,开启我们的Linux学习之旅。

qq_34738754的博客 894

Linux内核分析及内核编程

倪继利著2005年8月出版ISBN 7-121-01518-5900页88.00元(估价)倪 倪继利著2005年8月出版ISBN 7-121-01518-5900页88.00元(估价)倪 内 容 简 介   本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例向读者详细地讲述了内核源代码的各部分结构、原理及组成框架,主要分析了Linux最新版本(2.6.11)的内核源代码,帮助读者深入

cndeer的专栏 4686

Linux 内核中的进程管理:从创建到终止

Linux 内核中的进程管理是一个核心组件,它负责进程的创建、调度、同步和终止等操作。进程管理的设计思路与企业管理中的团队管理有着密切的联系,它通过资源分配、任务调度、团队协作和生命周期管理等机制,为系统的高效运行提供了保障。工作也要流程化,进程管理就像是系统中的团队管理工具,它确保了进程的有序运行。在实际应用中,我们需要根据应用的需求,合理创建和管理进程,并优化进程调度和进程间通信,以实现系统的最佳性能。

jiang_style的博客 1017
上一篇: linux内核分析笔记----系统调用
下一篇: linux内核分析笔记----调度
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值