《Linux内核源码分析》(2)进程原理及系统调用

这篇具有很好参考价值的文章主要介绍了《Linux内核源码分析》(2)进程原理及系统调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux内核源码分析 (A.2)进程原理及系统调用

一、进程

  • 操作系统的作用:作为硬件的使用层,提供使用硬件资源的能力,

  • 进程的作用:作为操作系统使用层,提供使用操作系统抽象出的资源层的能力

  • 进程、线程和程序的区别:进程指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。
    程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行
    实例

  • Linux内核中的进程:Linux内核把进程叫做任务(task),进程的虚拟地址空间可分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程都有独立的用户虚拟空间

  • Linux内核进程的特殊形式:没有用户虚拟地址空间的进程叫内核线程,共享用户虚拟地址空间的进程叫用户线程,共享同一个用户虚拟地址空间的所有用户线程叫线程组

  • C语言标准库进程&Linux内核进程

    C语言标准库进程 Linux内核进程
    包括多个线程的进程 线程组
    只有一个线程的进程 任务或进程
    线程 共享用户虚拟地址空间的进程
  • 查询进程状态文章来源地址https://www.toymoban.com/news/detail-470671.html

    • ps -aux查询内存中的瞬时进程信息
      《Linux内核源码分析》(2)进程原理及系统调用
      • USER :进程的所属用户,
      • PID :进程的进程ID号,
      • %CPU :进程占用的 CPU资源 百分比,
      • %MEM :进程占用的 物理内存 百分比,
      • VSZ :进程使用掉的虚拟内存量 (Kbytes) ,
      • RSS :进程占用的固定的内存量 (Kbytes) ,
      • TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序。
      • STAT :进程的状态;R->运行->Runnable;S->可中断睡眠->Sleeping;D->不可中断睡眠->Uninterruptible sleep;I->空闲->Idle;Z->僵死->Zombie(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放);T->终止->Terminate;s->进程的领导者;等等…
      • START :进程开始创建的时间 。
      • TIME :进程使用的总cpu时间,
      • COMMAND : 进程对应的实际程序。
    • top动态显示内存中的进程信息
      《Linux内核源码分析》(2)进程原理及系统调用
      • PR : 进程优先级
      • NI : nice 值, 负值表示最高优先级,正值表示 低级优先级
      • VIRT : 进程使用的虚拟内存总量,单位为 KB
      • SHR : 共享内存大小,单位 KB
      • 其他参数在上面已重复提到。

二、进程的生命周期

  • 进程的状态
    • 创建状态:创建新进程
    • 就绪状态:进程获取可以运作所有资源及准备相关条件
    • 执行状态:进程正在CPU中执行操作
    • 阻塞状态:进程因等待某些资源而被跳出CPU
    • 终止状态:进程消亡
  • 进程状态之间的转换
    《Linux内核源码分析》(2)进程原理及系统调用
  • Linux内核通过提供API函数来设置进程的状态
    • TASK_RUNNING:可运行状态或者就绪状态
    • TASK_INTERRUPTIBLE:可中断睡眠状态,又叫浅睡眠状态
    • TASK_UNINTERRUPTIBLE:不可中断状态,又叫深睡眠状态
    • __TASK_STOPPED:终止状态
    • EXIT_ZOMBIE:僵尸状态
  • 通过API表示进程状态转化
    《Linux内核源码分析》(2)进程原理及系统调用

三、task_struct数据结构

  • Linux内核涉及进程和程序的所有算法都围绕一个名为task_struct的数据结构建立,该结构定义在include/linux/sched.h中。task_struct包含很多成员,将进程与各个内核子系统联系起来。下面是Linux5.6.18中关于task_struct结构体的注释。
    《Linux内核源码分析》(2)进程原理及系统调用

四、进程优先级

  • 限期进程的优先级比实时进程高。实时进程的优先级比普通进程高。
    • 限期进程的优先级是-1
    • 实时进程的优先级是1-99,优先级数字越大,表示优先级越高
    • 普通进程的静态优先级为:100-139,优先级数值越小,表示优先级越高,可通过修改nice值改变普通进程的优先级,优先级等于120+nice,很显然:nice值的取值范围是-20~19
  • 各种优先级与进程之间的关系
    • 四种优先级
      《Linux内核源码分析》(2)进程原理及系统调用
    • 关系对比
      《Linux内核源码分析》(2)进程原理及系统调用

五、系统调用

  • 当运行应用程序的时候,调用fork()vfork()clone()函数就是系统调用。系统调用就是应用程序如何进入内核空间执行任务,程序使用系统调用执行一系列操作:比如创建进程、文件IO等等。具体如下图所示:
    《Linux内核源码分析》(2)进程原理及系统调用

六、内核线程

  • 内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程并发地执行(实际上,也并行于内核自身执行)。内核线程经常称之为(内核)守护进程。他们用于执行下列任务。
    • 周期性地将修改的内存页与页来源块设备同步(例如:使用mmap的文件映射)
    • 如果内存页很少使用,则写入交换区。
    • 管理延时动作(deferred action)。
    • 实现文件系统的事务日志。
  • 内核线程中,task_struct数据结构里面有一个成员指针mm的值为NULL,它只能运行在内核空间。下面是内核创建函数(位于kernel/fork.c):
    /*
     * Create a kernel thread.
     */
    pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
    {
    	struct kernel_clone_args args = {
    		.flags		= ((lower_32_bits(flags) | CLONE_VM |
    				    CLONE_UNTRACED) & ~CSIGNAL),
    		.exit_signal	= (lower_32_bits(flags) & CSIGNAL),
    		.stack		= (unsigned long)fn,
    		.stack_size	= (unsigned long)arg,
    	};
    
    	return _do_fork(&args);
    }
    

七、退出进程

  • 退出进程有两种方式:
    • 进程主动终止:从main()函数返回,链接程序会自动添加到exit()系统调用;或者主动调用exit()系统调用。
    • 进程被动终止:进程收到一个自己不能处理的信号;或者进程收到SIGKILL等终止信息。
  • 下面是退出进程的系统调用,函数位于kernel/exit.c
    SYSCALL_DEFINE1(exit, int, error_code)
    {
    	do_exit((error_code&0xff)<<8);
    }
    

到了这里,关于《Linux内核源码分析》(2)进程原理及系统调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux源码解读系列是一套深入剖析Linux内核源码的教程,旨在帮助读者理解Linux操作系统的底层原理和工作机制

    Linux源码解读系列是一套深入剖析Linux内核源码的教程,旨在帮助读者理解Linux操作系统的底层原理和工作机制。该系列教程从Linux内核的各个模块入手,逐一分析其源码实现,并结合实际应用场景进行讲解。通过学习本系列,读者可以深入了解Linux操作系统的底层机制,掌握

    2024年01月21日
    浏览(39)
  • 【看表情包学Linux】IPC 进程间通信 | PIPE 管道 | 匿名管道 | 管道通信的原理 | 系统调用: pipe 接口

       🤣  爆笑 教程  👉 《看表情包学Linux》 🔥 CSDN 累计订阅量破千的火爆 C/C++ 教程的 2023 重制版,C 语言入门到实践的精品级趣味教程。 了解更多: 👉  \\\"不太正经\\\" 的专栏介绍  ← 试读第一章 订阅链接: 🔗 《C语言趣味教程》 ← 猛戳订阅! 目录 Ⅰ. 进程间通信(I

    2024年02月14日
    浏览(28)
  • Linux内核学习(四)—— 系统调用(基于Linux 2.6内核)

    在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色。这些接口保证了系统的稳定可靠,避免应用程序肆意妄行。 系统调用在用户空间进程和硬件设备之间添加了一个中间层。有三个作用: 第一,它为用户

    2024年02月12日
    浏览(33)
  • 操作系统实验3.3 版本1.2内核的进程调度过程分析 && 两个进程的严格交替输出

    1. mygdb 侧调试命令: 2. 第三关.txt : 1.概述:0号进程和1号进程间进程调度过程 (1)从 system_call 函数进入相应的系统调用函数 在两个进程运行 alarm 和 pause 函数时,到执行 alarm 和 pause 系统调用时,都会进入到system_call函数,在下图第一处划线位置根据系统调用号,调用相应的

    2024年02月11日
    浏览(154)
  • Linux内核源码分析 1:Linux内核体系架构和学习路线

    好久没有动笔写文章了,这段时间经历了蛮多事情的。这段时间自己写了一两个基于不同指令集的 Linux 内核, x86 和 RISC-V 。期间也去做了一些嵌入式相关的工作,研究了一下 ARM 指令集架构。 虽然今年九月份我就要申请了,具体申请 AI 方向还是机器人、嵌入式、操作系统、

    2024年02月07日
    浏览(42)
  • Linux内核源码分析 (A)常见内核面试题

    系统调用 do_fork() : copy_process() 定时中断 do_timer() 唤醒进程 wake_up_process() :进程由睡眠状态转为 RUNNING 状态 系统调用 sys_sched_yield() 改变进程的调度策略 sched_setscheduler() : 什么情况下会发生调度时机:阻塞操作、中断返回之前(系统调用返回用户空间时)、被唤醒的进程会

    2024年02月10日
    浏览(46)
  • 《ARM Linux内核源码剖析》读书笔记——0号进程(init_task)的创建时机

    最近在读《ARM Linux内核源码剖析》,一直没有看到0号进程(init_task进程)在哪里创建的。直到看到下面这篇文章才发现书中漏掉了set_task_stack_end_magic(init_task)这行代码。 下面这篇文章提到:start_kernel()上来就会运行 set_task_stack_end_magic(init_task)创建初始进程。init_task是静态定义的

    2024年01月17日
    浏览(50)
  • 【Linux 内核源码分析】RCU机制

    Linux内核的RCU(Read-Copy-Update)机制是一种用于实现高效读取和并发更新数据结构的同步机制。它在保证读操作不被阻塞的同时,也能够保证数据的一致性。 RCU的核心思想是通过延迟资源释放来实现无锁读取,并且避免了传统锁带来的争用和开销。具体而言,RCU维护了一个“回

    2024年01月15日
    浏览(65)
  • 【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

    本节说的空间主要是指内存空间,即程序如何分配和使用内存。 可执行程序,而不是源代码。 C语言程序的存储空间包括以下几个主要部分: 代码段(Text Segment): 也称 正文段 , 代码段是存储C程序的机器代码的区域。它包含了程序的指令集,这些指令由编译器生成,并且

    2024年02月08日
    浏览(32)
  • 【Linux 内核源码分析】物理内存组织结构

    多处理器系统两种体系结构: 非一致内存访问(Non-Uniform Memory Access,NUMA):这种体系结构下,内存被划分成多个内存节点,每个节点由不同的处理器访问。访问一个内存节点所需的时间取决于处理器和内存节点之间的距离,因此处理器与内存节点之间的距离会影响内存访问

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包