Linux、Unix编程手册笔记--2.基本概念

综述

本章综述了Linux环境的各种基本概念,理解这些概念将为后续Linux编程提供深厚的背景基础,因此记录较详细。

2.基本概念

内核
  1. 操作系统
    在这里插入图片描述
  2. 内核的作用及职责

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 内核态与用户态
    • 执行硬件指令可使CPU在用户态和内核态自由切换,与之对应会将虚拟内存区分为用户空间和内核空间两部分,内核态可以自由访问两个空间;用户态只能访问用户内存空间(访问内核空间会引发异常)。
    • 如内存管理,设备IO,关机等核心操作只有在内核态才能操作,以保护系统正常运行。
  4. 以进程、内核视角检视整个系统
    • 进程的CPU使用及期限,IO,内存存放布局,甚至生死(无法自我了断)均有内核控制。
    • 进程间的通信,输入输出设备均有内核控制。
    • 内核维护了进程相关的所有信息的数据结构
    • 进程的通信,创建,交互,需通过内核的通信机制发起请求,交由内核响应

    内核即为上帝,以上所有动作均有内核居中“调停”

shell

在这里插入图片描述
目前主要有以下几大shell:

  1. sh ;由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
  2. csh; C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。
  3. ksh;Korn shell 的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh,ksh 有42条内部命令,与bash相比有一定的限制性。
  4. bash;大多数Linux系统默认使用的shell,bash shell是Bourne shell 的一个免费版本,它是最早的Unix shell,bash还有一个特点,可以通过help命令。功能强大
  5. dash GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。

目前通常使用的有两种:bash (centos/redhat);dash(debian/ubuntu)可通过配置改为bash,已期获得更加强大的功能。

用户与组

主要体现在对文件的访问控制权限上,针对文件和目录,针对owner,group,other 各划分了读写执行三个权限。

lrwxrwxrwx 1 root root 0 12月 12 20:09 root -> /
-rw-r--r-- 1 root root 0 12月 12 20:09 sched
-r--r--r-- 1 root root 0 12月 12 20:09 schedstat
-r--r--r-- 1 root root 0 12月 12 20:09 sessionid
-rw-r--r-- 1 root root 0 12月 12 20:09 setgroups
-r--r--r-- 1 root root 0 12月 12 20:09 smaps
-r--r--r-- 1 root root 0 12月 12 20:09 stack
-r--r--r-- 1 root root 0 12月  2 11:36 stat
-r--r--r-- 1 root root 0 12月  7 11:44 statm
-r--r--r-- 1 root root 0 12月 12 20:09 status
-r--r--r-- 1 root root 0 12月 12 20:09 syscall
dr-xr-xr-x 7 root root 0 12月 12 20:09 task

超级用户(root,id=0的用户,以id区分);可以自由更改以上所有权限。

单根目录层级、目录、及文件

内核维护着一套单根目录结构,以放置系统上所有文件。根基为“/”,所有的文件和目录均是根目录的子孙。(参照见下图)

  1. 文件类型
    文件系统会对文件类型进行标记,以表明文件的种类。除普通文件外,还有以下几种几种类型。** 设备、管道、套接字、目录、符号链接**
  2. 路径及链接
    在这里插入图片描述
    在这里插入图片描述
  3. 符号链接
    在这里插入图片描述
    4 文件名(命名规范及规则)
    在这里插入图片描述
  4. 路径名
    访问一个文件时,可依据相对路径或绝对路径两种方式来找到目标文件。
    1. 绝对路径;以根目录“/”为起始,直至文件的实际路径。如:/home/test/a.txt
    2. 当前工作目录;每个进程都有个当前目录,标记工作的所在位置;如shell登录root用户,工作目录默认则为: /root
    3. 相对路径. 相对当前目录找到目的文件。如:上述当前目录,找第一条目中的文件,则为 …/home/test/a.log.
      5.文件的所有权及权限
      权限分为:rwx 对应8进制为:421;例如6则为读写
      在这里插入图片描述
文件I/O模型
  1. 文件描述符
    在这里插入图片描述
  2. 文件操作
    通常有 open、read、write、close、seek等操作;
程序

由程序员利用编程语言(如C语言)编写的一系列语句操作,是人类可以阅读的文本文件,系统执行时会将其转换为二进制机器码。

进程

在这里插入图片描述

  1. 进程的内存布局
    在这里插入图片描述
  2. 创建进程和执行程序
    进程(父进程)可调用fork()创建子进程。内核会复制父进程的上述段信息给子进程,之后两者可以自由修改各类信息,互不影响。
    子进程可以执行父进程共享代码段里的一段函数,或者调用execve()执行一个全新的程序,execve()会消除现有的文本,数据,堆,栈段,并根据新程序创建新段以替换他们。
  3. 进程ID和父进程ID
    每个进程会有一个PID及父进程ID(PPID),用以标识请求内核创建自己的进程。
  4. 进程终止和终止状态
    进程调用exit()函数,请求退出;
    向进程传递信号,将其“杀死”。 可能是诸如ctrl+c,kill等信号

进程终止时,产生终止状态(一个非负小整数,通常标记0为无错误),可供父进程的wait()函数捕获

  1. 进程的用户ID和组标识(凭证)
    每个进程均有一个UID和GID。通常分为以下几类:

    • 真实用户ID和组ID。
    • 有效用户ID和组ID。 进程可改变用户和组ID,并配合补充组ID获得特定组权限的文件操作。
    • 补充组ID。用以标识进程所诉的额外组。此处可能是类似一个用户多个组的情况

    新进程从父进程处继承,登录shell时,从用户密码文件中获得(补充组从系统组文件获得,因此由以上理解)。

  2. 特权进程
    传统意义上: 指有效用户ID为0(超级用户)的进程。内核所施加的各种权限限制对此类进程无效。与之相反,其他的进程,必须遵守内核所强加的各种权限限制。
    特强进程获得的两种方式:

  • 由特权进程创建的进程,也可以是特权进程。(root用户登录shell)
  • 利用set-user-ID机制,改变权限ID
  1. 能力(Capabilities)
    始于内核2.2版本,LInux将赋予超级用户的权限划分为了一组相互独立的单元(称之为能力)。仅当进程拥有想用能力,才能执行相应操作。root用户则开启了所有能力。

组权限划分功能,后文应该可以看到具体实现。

  1. init进程
    系统引导时,内核会创建一个名为init的特殊进程,被称为“所有进程之父”。程序文件为/sbin/init。
    init程序具有以下几种特性:
    • 系统上所有的进程不是由init(使用fork())“亲自”创建的,就是由其后代创建的。
    • init进程的进程号宗伟1,且总是以超级用户权限运行。
    • 谁(哪怕是超级用户)也无法“杀死”init进程,只有关闭系统才能终止该进程。
    • init进程的作用是创建并监控系统运行所需的一系列进程。
  2. 守护进程
    一类具有特殊用途的进程,具有其他进程同样的特性,又有一些独有之处:
  • 长生不老。系统启动时引导,直至系统关闭前,会一直健在。(可传递信号杀死)
  • 后台运行,且无终端供其读取或写入数据。

如syslogd(系统日志记录服务),httpd

  1. 环境列表
    每个进程都有一份环境变量列表,由键值对组成。fork创建的子进程会继承父进程的环境。 exec()调用可指定新环境并加以接收。
  2. 资源限制
    每个进程均会消耗CPU时间、内存、文件等资源。ulimt命令可设置shell各类资源限制。
    soft limit 软限制。限制进程实际可消耗的资源总量。
    hard limit 硬限制。限制进程可消耗的资源总量上限。(非特权进程无法调高,只能调低该值)。
    子进程会继承父进程的各项资源限制值。
内存映射

在这里插入图片描述
进程间可以达成映射共享具体有以下两个方式:

  1. 多个进程针对同一文件的相同部分加以映射
  2. fork()自父进程处继承映射。

映射共享之间的修改操作,取决于创建映射时的标志参数,若为私有,则其改动其他程序无法获知,且不会写入实际文件。 若为共享,则反之。
内存映射的作用: 初始化程序文本段、内存分配、文件IO、进程通信。

静态库和共享库(动态库)

前者为静态依赖,相关引用的程序均需要重新引入编译
后者则只需编译好共享库,重新启动相关引用的程序即可。同时多个程序,只需一份共享库即可

进程间的通信及同步

在这里插入图片描述

信号量

在这里插入图片描述

信号从产生到送达进程期间一直处于挂起状态。信号会在进程下次被调度时同时送达,如果程序正在运行,则为直接送达。
程序可以将信号纳入信号屏蔽,则在解除屏蔽前,信号会被一直挂起。

线程

在这里插入图片描述

进程组和shell任务控制

如shell中的管道任务,每个命令都会新起一个进程,形成进程组

ls |sort -r| less
会话、控制终端和控制进程

在这里插入图片描述
在这里插入图片描述

伪终端

如 ssh 、telnet 对应软件如 xshell putty等。

日期和时间
  • 真实时间。 以现实时间为标准标识进程的运行时间。 Unix元年为1970年1月1日0时。
  • CPU时间。进程运行所占用的CPU时间总量。又细分为系统(内核)CPU时间<内核态>和用户CPU时间<用户态>

time 可显示出进程的真实时间、系统CPU时间和用户CPU时间。

客户端/服务端架构(CS)/BS(浏览器、服务端架构)

参考引用

实时性
(非严格意义上的实时性)相关支持有:异步IO,共享内存,内存映射文件,内存苏定,实时性时钟和定时器,备选调度策略,实时性信号,消息队列,信号量等
/proc文件系统

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值