本篇主要介绍了Linux系统编程的基础概念,为后续深入打好基础,还有助于回顾操作系统的知识。
内核
通常来说,操作系统的内核是整个os的核心所在,是指管理和分配计算机资源(CPU、RAM和设备)的核心软件层。
内核的主要任务:
- 进程调度:Linux属于抢占式多任务操作系统,多任务是指多个进程可以同时驻留在内存中,而且每个进程都可以获得CPU的使用权,抢占式是指运用进程调度算法来控制哪些进程能获得CPU的使用,以及每个进程能使用多长时间。
- 内存管理:主要是指虚拟内存管理机制。
- 提供文件系统:内核在磁盘上提供了文件系统。允许对文件进行创建、删除等操作。
- 对设备的访问:内核可以为程序访问设备提供多个接口。
- 创建和终止进程。
- 提供系统调用应用编程接口
现代处理器架构一般允许CPU在两种不同状态下允许,即用户态和核心态,与之对应,也可以将虚拟内存区域划分为用户空间部分和内核空间部分。
用户和组
系统会对每个用户的身份做唯一标识,用户可隶属于多个组。每个用户拥有唯一的用户名和对应的用户ID,系统密码文件/etc/passwd为每个用户都有一行记录,处了包括用户名和UID之外,还有组ID,主目录,登陆shell。用户密码存于shadow文件中。
组是出于管理的目的,尤其式为了对控制文件和其他资源的访问,将多个用户分组。
进程
进程是正在执行的程序实例,进程是一个个实体,内核须在进程之间共享各种计算机资源。逻辑上将一个进程分成以下几个部分(也成为段)
- 文本段:程序的指令
- 数据段:程序使用的静态变量
- 堆:程序可从该区域动态分配额外内存(new、delete)
- 栈:随着函数调用、返回而增减的一片内存,用于为局部变量、和函数调用链接信息分配存储空间。
每个进程都有一组与之相关的用户ID和组ID。
- 真实用户ID和组ID:用来标识进程所属的用户和组,新进程从父进程中继承这些ID
- 有效用户ID和组ID:进程在访问受保护资源时候,会使用这两个ID来确定访问权限,一般情况下,真实ID和有效ID相同。
守护进程是指具有特殊用途的进程。典型的守护进程有syslogd(系统日志中记录消息)、httpd(利用HTTP分发页面)系统创建和处理此类进程的方式与其他进程相同,但是守护进程有以下独有特点:
- 守护进程通常在系统引导时启动,知道系统关闭前,一直都健在。
- 守护进程在后台运行,且无控制终端供其读取或写入数据。
系统调用和库函数
系统调用是受控的内核接口,进程可以请求内核去执行相应的操作,需要注意的是:
- 系统调用将树立起从用户态切换到核心态。
- 系统调用的组成是固定的,每个系统调用都有一个唯一的数字标识。
- 每个系统调用有一套参数,对用户空间与内核空间之间相互转换的信息加以规范。
库函数则是标准C语言的构成函数。
参考 《LINUX/UNIX系统编程手册》