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. 关于"动态语言" "静态语言" "静态类型语言" "动态类型语言"的区别

    参考链接:关于“编译型”“解释型”“动态语言”“静态语言”“动态类型语言”“静态类型语言”的区分以及优缺点(汇总整理) 很多人把这两类混为一谈,但是这是完全不同的两个概念!!! 动态和静态语言主要看的 ...

  2. iOS与JS相互传值与交互

    JavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境.iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作.我们可以脱离webview直接运行 ...

  3. Flash as3.0 保存MovieClip运动轨迹到json文件

    //放在第一帧调用 import flash.events.Event; import flash.display.MovieClip; stage.addEventListener(Event.EN ...

  4. #ifdef #else #endif #fi #ifndef 的用法

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  5. 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图

    进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 之前一直都是零零散散的看了些JVM的知识,心想这样不行啊!于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更 ...

  6. debian安装中文字体

    debian刚安装完成之后,因为没有中文字体,会出现方框. 安装中文字体: $ su # apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi ...

  7. 15年多校第一场七题hdu5294

    要做这题,先要明白图的割,说白了就是 为了让原点无法到汇点要删几条边(之所以叫割,就是在图面上切一刀,减掉最小的边是原点和汇点成为两个集合),想到了割先放着一会用. 题中说只有沿最短路走才有可能追上, ...

  8. 【Netty】Netty入门之WebSocket小例子

    服务端: 引入Netty依赖 <!-- netty --> <dependency> <groupId>io.netty</groupId> <a ...

  9. Python 实战一

    列表ID的显示 起初ID显示的是数据库中的id,因为数据库中的id是自增长的,所以删除一条后,这里显示就叉开了,这里使用索引的方式来显示. 这个功能实现的逻辑: 第一:定义一个表格的架构,用id=‘i ...

  10. 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析

    1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenc ...