zoukankan      html  css  js  c++  java
  • linux 内核(系统)、函数的理解、宏的程序调试


    1、操作系统

    1.1、Linux 内核(系统)的组成的部分:

        内核主要有:进程调度、内存管理、虚拟文件系统、网络接口和进程通信五个部分组成。

                                                 e5fedcb3-dda0-485f-9959-fd9515998eb8

    (1)进程调度

        进程调度是CPU对多个进程对CPU访问的调度算法,使得进程宏观上并行执行。常用的调度算法有:先来先服务原则、高优先级别优先、短进程优先(谁执行的时间短,就上)、时间片轮训(每个进程都给点时间运行)。

        系统所有的进程,都必须使用进程调度算法,所以是处于中心的位置。

    (2)内存管理

        内存管理的主要作用是管理进程之间内存。

        一般对于 32位的 Linux 系统而言,Linux进程都拥有自己独立的4GB的内存空间,0~3GB的用户空间,3~4GB的内核空间。

                                       57a5dba2-7969-44af-9bb0-9bac08fbb2dd

    (3)虚拟文件系统

        Linux的虚拟文件系统(VFS)是实际文件系统的一种抽象,为所有的设备统一的接口。显示的文件系统:比如有 FAT16、FAT32、NTFS、YAFFS、JFFS2,ext,ext2,这么多的不同格式的系统,不同的格式有属于自己的一套文件操作数据据结构(file_operation)、那么写应用层代码的时候,难道要对这么多的文件系统做不同的处理操作么么,这个时候,虚拟文件系统就产生了,虚拟文件系统统一管理这些现实的的文件系统,然后提供统一的接口,这样应用层就可以使用统一的open read write 去访问了。

    (4)网络接口

        网络接口实现了对各种的网络标准的存取和各种网络硬件的支持。所以网络接口可以分为网络协议和网络驱动程序。

        网络协议实现的是每一种网络传输协议,比如说TCP/IP协议具体是怎么实现的,

        网络驱动:其实就是网络硬件设备的驱动,实现硬件的这部分驱动。

    (5)进程通信

        Linux进程间通信(IPC),包含:管道(无名管道和有名管道)、信号、消息队列、共享内存、套接字、信号量。

    1.2、C库函数与API

        对于向外提供的 API 而言,有操作系统的提供的 API 和C库提供的 API。比如对

    文件的操作而言: open、write、read、close。而C库提供的接口: fopen、fwrite、fread、fclose。本质上,fopen 就是使用 open 函数进行而二次封装。

        对于不同的系统而言,系统提供的 API 几乎都是不同的;而对于 C库 而言,不同的平台只要使用的是 C库,C库 的API 都是一样的,所以对于移植性的话,C库的移植性就高。


    2、函数的理解

        通常来说,不论大大小小的子函数都是会存在一个返回值,函数的返回值一般都是不会直接使用void 类型。之所以函数即使不会被调用也都是会执行一个返回值:

        (1)首先,在C语言中,一般是,返回值为零,一般是正常退出,而返回值为负一的情况的话,就是出现异常,而返回值是正直的话,那么一般就是自己定义的。

    return 0return -1;
        return 1;

        (2)return 语句的话,那么就表示函数的代码到这里就已经是全部结束了。

        (3)函数的返回值与输入的参数可以理解为原材料以及经过加工(函数体)之后的产品。

    3、NULL的理解

    (1)NULL 的定义

    #ifdef __cplusplus
    #define NULL    0
    #else  /* __cplusplus */
    #define NULL    ((void *)0)
    #endif  /* __cplusplus */
    #endif  /* NULL */

        当定义了 __cplusplus 宏的时候,则 NULL 为零,也就是当编译器为 C++ 的时候,则 NULL为零;而是 C 编译器的时候,则 NULL 为 (void *)0。这里的零可以理解为:数字零以及地址零,具体的环境具体分析。

    (2)NULL 的作用

    让野指针指向安全零地址

    一般指针定义的时候:

    int *p = NULL;

        其将 p 指向地址零,因为一般来说零地址都是不可以被随便访问的。

    (3)NULL 与 ''、'0'、0

    '' :是一个转义的字符,对应的 ASCII 是 0
    '0' : 是一个字符,对应的 ASCII 是 48
    0 : 是一个数字,本质就是零,对用的 ASCII 也是零。
    NULL :是一个表达式,NULL 的本质就是 0

    注意:

        '' : 是字符串的结束的标志。

        '0' : 对应零这个字符的 ASCII,一般用于获取零的 ASCII 值。

        0 : 数字,

        NULL : 一般用于指针。

    4、宏的调试

        宏的调试的方法是非常的方便,

    应用调试:

    #ifdef DEBUG
    #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
    #else
    #define DBG(...)
    #endif

        打印当前的文件、函数、行号。

    __VA_ARGS__ :是将 DBG 括号里面的转为实际的字符串。当取消了 DEBUG 的定义,则后面的调试信息doing不会被编译进去已经打印出信息。

    #if 0
    #define DBG(x...)  printk(x)
    #else
    #define DBG(x...) do{}while(0)
    #endif

     

    内核的调试:

    #define DEBUG(fmt, args...)     printk(fmt, ##args)
    #else
    #define DEBUG(fmt, args...)     do {} while (0)
    #endif

        ... : 三点表示的变参,也就是参数的个数是不定的。对于变参的理解在另外的帖子做详细的介绍。

  • 相关阅读:
    【特效】导航下拉菜单(二级三级都有)
    【特效】移入显示移出隐藏
    【特效】jquery选项卡插件,页面多个选项卡统一调用
    使用MR求解多个矩阵的乘积之后
    由SequenceFile.Writer(key,value)谈toString()方法
    自定义数据类型写入SequenceFile并读出
    hadoop中URI理解
    输入格式CombineFileInput
    分布式缓存DistributedCache的使用
    输入格式MultipleInput
  • 原文地址:https://www.cnblogs.com/qxj511/p/4944641.html
Copyright © 2011-2022 走看看