请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 89|回复: 0

【学习笔记】linux进程

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

347

主题

12

听众

1万

积分

  • TA的每日心情
    奋斗
    2018-9-11 10:53
  • 签到天数: 69 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    发表于 2018-12-7 09:49 |显示全部楼层
    |招呼Ta 关注Ta |邮箱已经成功绑定
    文章目录
    进程的概念理解
    进程 的内部结构 与行为
    进程在内核中的组织形式:进程控制块(PCB)
    进程的状态
    文件管理结构
    内存管理结构
    进程之间的结构关系
    进程环境
    进程的用户空间布局
    命令行参数
    环境变量
    创建进程
    fork函数的工作流程
    fork函数执行后父子进程的主要异同
    父子进程共享文件
    fork用法
    vfork
    参考
    主要以linux进程为例
    进程的概念理解
    为何引入进程?
    世界可以看作是过程的集合体,进程这一概念很好的体现了这一点,每个进程相当于一个独立的过程。
    操作系统,需要控制它的子民,其中一个便是进程,它需要了解进程的基本状况,以便于宏观规划、调度。
    专业理解:
    程序是包含可执行代码以及执行代码需要的数据等信息的文件,存放在磁盘等介质上。
    当程序被操作系统装载到内存并分配给它一定资源后,此时可称为进程。
    程序是静态概念,进程是动态概念。
    进程 的内部结构 与行为
    通过查看进程相关的核心结构(PCB),我们能够从表明上了解、推测进程所具有的基本功能、行为。
    进程在内核中的组织形式:进程控制块(PCB)
    首先介绍进程的控制块,是因为后面的要讲的主要内容是围绕着PCB展开的。
    【进程状态】反映了进程生命周期的存在。
    【调度信息】为操作系统提供进程调度依据
    【文件管理】文件资源的相关使用
    …(更多内容将在后面展开)

    进程控制块(task_struct结构)在代码层次的体现:
    与上面的文字信息对比体会下面各个变量的含义
    pid_t pid;
    uid_t uid,euid;
    gid_t gid,egid;
    volatile long state;
    int exit_state;
    unsigned int rt_priority;
    unsigned int policy;
    struct list_head tasks;
    struct task_struct *real_parent;
    struct task_struct *parent;
    struct list_head children,sibling;
    struct fs_struct *fs;
    struct files_struct *files;
    struct mm_struct *mm;
    struct signal_struct *signal;
    struct sighand_struct *sighand;
    cputime_t utime, stime;
    struct timespec start_time;
    struct timespec real_start_time;tas
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    进程的状态
    其在进程控制块中体现为:
    volatile long state;
    1
    state成员的可能取值如下(意味着进程的生命周期状态):
    #define TASK_RUNNING 0
    #define TASK_INTERRUPTIBLE 1
    #define TASK_UNINTERRUPTIBLE 2
    #define TASK_ZOMBIE 4
    #define TASK_STOPPED 8
    1
    2
    3
    4
    5
    进程状态的转化图:

    文件管理结构
    文件管理相关的结构:
    【文件在操作系统中的表示】 通过下面的3张表:(1)文件描述表;(2)文件表;(3)索引结点表
    【文件描述表】 所有打开的文件 。
    【文件表】文件每一次打开所独有的状态,包括文件状态标识等。
    【索引结点表】 用来存储该文件在存储介质中相关的位置信息
    代码层级的文件管理结构:
    fs:
    【root】进程可执行文件对应的根目录
    【pwd】进程的当前工作目录(解释了为什么你在某个dir下,不用输入完整路径就能执行该路径下的文件)
    files:
    【files_struct】fd[0],fd[1] … fd[255]一个一个只想文件表的指针。
    【file】该进程打开的文件状态1) f_op表示当前访问的文件的位置;(2)f_inode表示文件在物理介质上的存储位置;(3)更多信息参考:Linux下的FILE*结构体
    内存管理结构
    vm_area_struct:
    它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。
    通常,进程所使用到的虚存空间不连续,且各部分虚存空间的访问属性也可能不同。所以一个进程的虚存空间需要多个vm_area_struct结构来描述。(参考:vm_area_struct)
    【示例】下图例子中,有的vm_area_struct指向了数据区,有的指向了代码区。

    进程之间的结构关系
    【物理组织结构】 示例:等待队列,就绪队列,优先级队列等。
    【逻辑组织结构】 父子结构、树状结构。进程创建有先后次序、被其他进程创建。(linux 命令: pstree)

    进程环境
    进程的资源分为两部分:(1)内核空间资源;(2)用户空间资源。前面介绍了内核空间的资源PCB,接下来介绍用户空间的资源。

    进程的用户空间布局
    【正文】CPU执行的代码部分,正文段通常是共享、只读的
    【初始化数据】包含了程序中需明确赋初值的变量,如全局变量int maxcount=99;
    【未初始化数据】程序执行之前,将此段中的数据初始化为0,如全局变量long sum[1000];
    【堆】用于动态分配内存
    【栈】主要用于支撑函数调用存放参数、局部变量等
    命令行参数
    用户空间从外界接收参数
    举例:
    ls ./dir
    1
    环境变量
    环境变量表:
    【注意】每个进程都有自己的一个环境变量表
    【子进程】用fork方式创建子进程,会自动复制父进程的用户空间,故在子进程中可直接使用相应的环境变量。

    创建进程

    代码示例:
    int main(int argc,char **argv){
    pid_t pid;
    pid=fork();
    if(pid==-1)
    printf(“fork error\n”);
    else if(pid==0){
    printf(“the returned value is %d\n”,pid);
    printf(“in child process!!\n”);
    printf(“My PID is %d\n”,getpid();}
    else{
    printf(“the returned value is %d\n”,pid);
    printf(“in father process!!\n”);
    printf(“My PID is %d\n”,getpid();}
    return 0;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    结果:

    fork函数的工作流程

    fork函数执行后父子进程的主要异同

    父子进程共享文件
    上面提到的fork复制的方式,也容易导致父子共享文件时,重复处理的问题,这是因为他们共享了打开的文件,而文件中的f_pos可能会被父子进程共同处理。(如下图所示)

    对父子进程共享文件的常见处理方式:
    【等待】父进程等待子进程完成。当子进程终止后,文件当前位置已经得到了相应的更新
    【避免共享】父子进程各自执行不同的程序段,各自关闭不需要的文件
    fork用法

    vfork

    参考
    【中国大学mooc】linux操作系统编程
    ---------------------
    作者:TheSnowBoy_2
    来源:CSDN
    原文:https://blog.csdn.net/TheSnowBoy_2/article/details/84707130
    版权声明:本文为博主原创文章,转载请附上博文链接!

    zan
    踩过的脚印
    啦啦啦~~~我是默认签名(*^__^*)
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文   

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2019-3-22 04:32 , Processed in 0.458118 second(s), 64 queries .

    回顶部