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

Linux System Programming 学习笔记(一) 介绍的更多相关文章

  1. Linux System Programming 学习笔记(十一) 时间

    1. 内核提供三种不同的方式来记录时间 Wall time (or real time):actual time and date in the real world Process time:the ...

  2. Linux System Programming 学习笔记(七) 线程

    1. Threading is the creation and management of multiple units of execution within a single process 二 ...

  3. Linux System Programming 学习笔记(六) 进程调度

    1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进 ...

  4. Linux System Programming 学习笔记(四) 高级I/O

    1. Scatter/Gather I/O a single system call  to  read or write data between single data stream and mu ...

  5. Linux System Programming 学习笔记(二) 文件I/O

    1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情 ...

  6. Linux System Programming 学习笔记(十) 信号

    1. 信号是软中断,提供处理异步事件的机制 异步事件可以是来源于系统外部(例如用户输入Ctrl-C)也可以来源于系统内(例如除0)   内核使用以下三种方法之一来处理信号: (1) 忽略该信号.SIG ...

  7. Linux System Programming 学习笔记(九) 内存管理

    1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系 ...

  8. Linux System Programming 学习笔记(八) 文件和目录管理

    1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...

  9. Linux System Programming 学习笔记(五) 进程管理

    1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...

随机推荐

  1. typescript设置全屏

    fullScreen() { document.getElementById("fullScreen").style.display = "none"; doc ...

  2. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  3. word中在空白处加下划线不显示解决

    终极解决:Ctrl + Shift + Space Alt + 选择,竖向选择.和VS,其他一些编辑器一样

  4. javascript自定义一个迭代器

    js中对象分为可迭代和不可迭代 如果是可迭代哪它就会有一个[Symbol.iterator] 函数 这个函数就是对象的迭代器函数,如用for of 如果遍历的对象没有这个迭代方法那么就会报错 for ...

  5. I/O理解

    I/O是什么 我的理解I/O就是用于读写的一个流 官方解释:I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出. node中的io ...

  6. mysql中的的按小数位截取

    format()函数返回类型是字符串,满三位会加一个逗号. 针对数字类型转换建议使用 convert或者cast函数,用法如下: format(param, 2) (不建议) convert(para ...

  7. 02 Django框架基础(APP的创建访问)

    一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...

  8. Ubuntu下kaldi安装

    该文章为博主原创,如若转载请注明出处:https://www.cnblogs.com/fengleixue/p/9482202.html 因公司业务需要需使用kaldi语音识别工具,现将kaldi环境 ...

  9. 如何用纯 CSS 创作一副国际象棋

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/WyXrjz 可交互视频 ...

  10. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...