zoukankan      html  css  js  c++  java
  • Linux System Programming 学习笔记(一) 介绍

    1. Linux系统编程的三大基石:系统调用、C语言库、C编译器

    系统调用:内核向用户级程序提供服务的唯一接口。在i386中,用户级程序执行软件中断指令 INT n 之后切换至内核空间
    用户程序通过寄存器告知内核执行系统调用的所需参数
     

    2. API 和 ABI

    API:application programming interface 定义源码级接口,必须确保源码级兼容
    ABI:application binary interface 定义二进制接口,必须确保二进制兼容
    ABI包括:调用约定、字节序、寄存器使用、系统调用、链接、二进制文件格式
    调用约定:定义了 函数如何调用、参数如何传递、寄存器使用、调用者恢复返回值
    ABI与机器体系结构密切相关,不同体系结构的机器具有不同的ABI
     

    3. 文件

    文件是在linux中最基本和最基本的抽象。
    内核在并发文件访问上没有任何限制条件,多个进程可以对同一个文件同时进行读写操作
    用户级程序必须相互协调以确保并发文件访问得到正确的同步
     
    每个文件在文件系统内都是通过唯一的inode编号来引用,inode节点包含了文件绝大部分信息,对应于系统调用stat
    通过inode编号来存取文件非常繁琐,因此 用户级程序都是通过文件名而不是文件的inode编号来访问
    目录就是用来将人类可读的文件名映射为 文件系统内相应的inode编号,目录项(dentry)就是存储诸对映射的哈希表
    目录仅仅包括文件名到inode编号的映射,内核使用这个映射来执行 finename-to-inode 决议
     
    例如打开 /home/blackbeard/concorde.png
    内核顺沿路径名的目录项(内核里称为 dentry) 来查找 下一个entry的inode
    内核首先从 / 开始,获取 home 的inode,然后从home的目录项获取 blackbeard 的inode,最后从blackbeard的目录项获取concorde.png的inode,通过最后得到的inode打开文件
    内核通常使用 dentry cache (目录项缓存) 来加速 目录决议
     
    硬链接:多个不同的文件名映射到同一inode
    硬链接允许我们多个路径名指向同一数据,每个inode记录一个指向它自己的链接数,只有当链接数减少至0时,才能从文件系统移除inode
    硬链接不能跨文件系统,因为在inode自身的文件系统之外,inode编号是没有意义的。
     
    符号链接:可以跨文件系统的链接
     
    字符设备:类似字节队列,按照队列顺序依次读取字符,键盘就是字符设备
    块设备:类似字节数组
    命名管道:进程间通信机制 
    套接字:提供不同机器之间的进程间通信
     
    文件系统是组织文件和目录形成的合理的层次体系。文件系统可以独自地从全局命名空间中添加或移除,称为 挂载 和 卸载
     

    4. 进程

    进程是正在执行的目标代码。
    进程开始于可执行目标代码,Linux最常用的格式为 ELF
    ELF中最重要的是 文本段、数据段 和 bss段:
    文本段包括 可执行代码和只读数据,比如 常量
    数据段包括 初始化数据
    bss段包括 未初始化的全局数据。当bss段加载进内存时,内核会对该段映射 zero page(a page of all zero)
     
    进程只能通过系统调用来请求和管理资源(包括计时器、信号、打开文件、网络连接、硬件、IPC机制)
    进程是虚拟化抽象,Linux内核通过 抢占式多任务 和 虚拟内存 来提供 处理器虚拟化 和 内存虚拟化
    从进程角度来看,进程独占cpu,每个进程都有单一的线性地址空间
     
    Linux中,进程遵循严格的层次体系,即 进程树
    进程树的根节点是 init 进程,新进程通过fork创建, 如果父进程在子进程之前结束,那么内核将该子进程挂在 init 父进程之下
    一个子进程终止时,并不立即从内核移除,而是等待其父进程通过wait查询其终止状态。只有父进程wait之后,该进程才完全消亡
    一个已经终止,但是仍未被父进程wait的进程称为 僵死进程
     

    5. 用户权限

     

    6. 信号

    信号是一种异步通知机制
    SIGKILL:always terminates the process
    SIGSTOP:always stops the process
  • 相关阅读:
    Jquery停止动画
    Jquery自定义动画与动画队列
    关系型数据库的常用概念
    三大范式审核
    数据库设计基本步骤
    'NoneType' object is not iterable
    三行神奇的代码
    url的解码方式
    [转]获取当前执行主脚本的方法
    非黑即白--谷歌OCR光学字符识别
  • 原文地址:https://www.cnblogs.com/wwwjieo0/p/3719676.html
Copyright © 2011-2022 走看看