zoukankan      html  css  js  c++  java
  • 2.16.9.内核启动的C语言阶段6

    本节重点讲解了rest_init函数中创建三个内核线程以及对这三个内核线程的介绍,本节课听完后就明白了操作系统最终的走向和归宿。

    2.16.9.内核启动的C语言阶段6
    2.16.9.1、操作系统去哪了
    (1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthread
    (2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了。
    (3)rest_init最终调用cpu_idle函数结束了整个内核的启动。也就是说linux内核最终结束了一个函数cpu_idle。这个函数里面肯定是死循环。
    (4)简单来说,linux内核最终的状态是:有事干的时候去执行有意义的工作(执行各个进程任务),实在没活干的时候就去死循环(实际上死循环也可以看成是一个任务)。
    (5)之前已经启动了内核调度系统,调度系统会负责考评系统中所有的进程,这些进程里面只有有哪个需要被运行,调度系统就会终止cpu_idle死循环进程(空闲进程)转而去执行有意义的干活的进程。这样操作系统就转起来了。

    2.16.9.2、什么是内核线程
    (1)进程和线程。简单来理解,一个运行的程序就是一个进程。所以进程就是任务、进程就是一个独立的程序。独立的意思就是这个程序和别的程序是分开的,这个程序可以被内核单独调用执行或者暂停。
    (2)在linux系统中,线程和进程非常相似,几乎可以看成是一样的。实际上我们当前讲课用到的进程和线程的概念就是一样的。
    (3)进程/线程就是一个独立的程序。应用层运行一个程序就构成一个用户进程/线程,那么内核中运行一个函数(函数其实就是一个程序)就构成了一个内核进程/线程。
    (4)所以我们kernel_thead函数运行一个函数,其实就是把这个函数变成了一个内核线程去运行起来,然后他可以被内核调度系统去调度。说白了就是去调度器注册了一下,以后人家调度的时候会考虑你。

    2.16.9.3、进程0、进程1、进程2
    (1)截至目前为止,我们一共涉及到3个内核进程/线程。
    (2)操作系统是用一个数字来表示/记录一个进程/线程的,这个数字就被称为这个进程的进程号。这个号码是从0开始分配的。因此这里涉及到的三个进程分别是linux系统的进程0、进程1、进程2.
    (3)在linux命令行下,使用ps命令可以查看当前linux系统中运行的进程情况。
    (4)我们在ubuntu下ps -aux可以看到当前系统运行的所有进程,可以看出进程号是从1开始的。为什么不从0开始,因为进程0不是一个用户进程,而属于内核进程。
    (5)三个进程
    进程0:进程0其实就是刚才讲过的idle进程,叫空闲进程,也就是死循环。
    进程1:kernel_init函数就是进程1,这个进程被称为init进程。
    进程2:kthreadd函数就是进程2,这个进程是linux内核的守护进程。这个进程是用来保证linux内核自己本身能正常工作的。

    总结1:本节课的重点在于理解linux内核启动后达到的一个稳定状态。注意去对比内核启动后的稳定状态和uboot启动后的稳定状态的区别。
    总结2:本节课的第二个重点就是初步理解进程/线程的概念。
    总结3:你得明白每个进程有个进程号,进程号从0开始依次分配的。明白进程0是idle进程(idle进程是干嘛的);进程2是ktheadd进程(基本明白干嘛的就行)
    总结4:分析到此,发现后续的料都在进程1.所以后面课程会重点从进程1出发,分析之后发生的事情。

  • 相关阅读:
    day5-装饰器的正确打开方式------------->懒
    python_day5--->递归函数,二分法查找
    day4_生成器yield
    day4_迭代器
    day4_装饰器
    day4_函数嵌套和闭包以及作用域
    this作用域,改变作用域的方法
    $.ajax传数据.php
    ul标签的引用
    URL
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9236125.html
Copyright © 2011-2022 走看看