• linux内核分析 第3章读书笔记


    第三章 进程管理

    一、进程

    1.进程

    进程就是处于执行期的程序。
    进程就是正在执行的程序代码的实时结果。
    进程是处于执行期的程序以及相关的资源的总称。
    进程包括代码段和其他资源。
    

    2.线程

    执行线程,简称线程,是在进程中活动的对象。
    内核调度的对象是线程而不是进程。
    Linux对线程并不特别区分,视其为特殊的进程。
    

    3.虚拟处理器和虚拟内存

    在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。
    包含在同一个进程中的线程可以共享虚拟内存,但是每个都拥有各自的虚拟处理器。
    

    4.几个函数

    fork():创建新进程
    exec():创建新的地址空间并把新的程序载入其中
    clone():fork实际由clone实现
    exit():退出执行
    wait4():父进程查询子进程是否终结
    wait()、waitpid():程序退出执行后变为僵死状态,调用这两个消灭掉。
    

    二、进程描述符及任务结构

    内核把进程的列表存放在叫做任务队列的双向循环链表中。
    链表中的每一项都是进程描述符。
    进程描述符的类型为task_struct。
    

    1.分配进程描述符

    Linux通过slab分配器分配task_struct结构——能达到对象复用和缓存着色的目的。
    slab分配器——动态生成,只需在栈底或者栈顶创建一个新的结构struct thread_info。
    每个任务的thread_info结构在它的内核栈的尾端分配。
    结构中task域中存放的是指向该任务实际task_struct的指针。
    

    2.进程描述符的存放

    内核通过一个唯一的进程标识值PID来标识每个进程。
    pid类型为pid_t,实际上就是一个int类型,最大值默认设置为32768,上限私改/proc/sys/kernel/pid_max。
    pid存放在各自进程描述符中。
    

    3.进程状态

    进程描述符中的state域是用来描述进程当前状态的。共有五种状态,标志如下:
    
    TASK_RUNNING(运行):进程是可执行的,或者正在执行,或者在运行队列中等待执行
    TASK_INTERRUPTIBLE(可中断):进程正在睡眠/被阻塞
    TASK_UNINTERRUPTIBLE(不可中断):睡眠/被阻塞进程不被信号唤醒
    TASK_TRACED:被其他进程跟踪的进程
    TASK_STOPPED(停止):进程停止执行;进程没有投入运行也不能投入运行。
    接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,或者调试时收到任何信号,都可以进入这种状态。
    

    4.设置当前进程状态

    用set_task_state(task,state)函数。
    

    5.进程上下文

    程序执行系统调用或者触发异常后,会陷入内核空间,这时候内核代表进程执行,并且处于进程上下文中。
    进程对内核的访问必须通过接口:系统调用和异常处理程序
    

    6.进程家族树

    所有的进程都是pid为1的init进程的后代。
    内核在系统启动的最后阶段启动init进程。
    
    系统中的每一个进程必有一个父进程,可以拥有0个或多个子进程,拥有同一个父进程的进程叫做兄弟。
    这种关系存放在进程描述符中,parent指针指向父进程task_struct,children是子进程链表。
    

    三、进程创建

    1.一般操作系统产生进程的机制:

    在新的地址空间创建进程
    
    读入可执行文件
    
    执行
    

    2.Unix的机制:

    fork()和exec()。
    
    fork():通过拷贝当前进程创建一个子进程。
    
    exec():读取可执行文件并将其载入地址空间开始运行。
  • 相关阅读:
    现在连Linux都搞不懂,当初我要是这么学习操作系统就好了!
    一时技痒,撸了个动态线程池,源码放Github了
    Java线程池ThreadPoolExecutor使用和分析(一)
    canch----1.对缓存的思考
    1.java 内存数据库--H2数据库使用指南
    What’s the difference between persist, save, merge and update? Which one should you use?
    primary key's generator in JPA entity
    STM32F103驱动M24256 256k存储芯片进行读写
    【Proteus+51单片机学习笔记】-51/52系列单片机简介
    【STM32项目笔记】STM32CubeMX+Keil+Proteus联合实现LED闪烁
  • 原文地址:https://www.cnblogs.com/whyfarrell/p/5339426.html
Copyright © 2020-2023  润新知