深入Unix操作系统:从基础到实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:【深入学习Unix】是一份详尽的Unix学习手册,涵盖了Unix的核心概念、命令行操作及系统管理知识。Unix是服务器、科学计算和软件开发领域的重要操作系统,其设计理念和功能性对计算机科学影响深远。本指南深入讲解了Unix的历史、设计哲学、Shell脚本编程、文件系统与权限、进程管理、网络编程、文本处理工具、系统管理、编译与链接、调试技巧、标准与版本兼容性以及开源文化等多个方面,使读者从初学者成长为熟练掌握Unix系统的专家。 深入学习unix

1. Unix核心概念与哲学

Unix作为一种经典的操作系统,其设计理念和哲学深深影响了现代计算机的许多方面。从其诞生至今,Unix的核心概念一直是高效、简洁和模块化。

1.1 Unix的设计哲学

Unix的设计哲学强调“做一件事并做好”,即每个程序只做一件事情,但要做到极致。这使得Unix工具通常小巧而高效,易于理解和使用。同时,通过管道和过滤器的设计,各个程序可以组合在一起,形成复杂的数据处理流程。

1.2 Unix的简洁性

Unix系统的简洁性体现在其命令行接口(CLI)的直观性和命令的简洁性上。这些命令通常只需要几个字符,就可以执行复杂的任务。例如,使用 grep 进行文本搜索, awk 进行文本处理等。

1.3 Unix的模块化

模块化是Unix另一个核心概念,系统中的每个组件都是独立的模块,可以通过简单的接口进行交互。这种设计方式简化了系统的维护和扩展,也使得Unix系统更容易适应各种不同的计算环境。

在后续章节中,我们将深入探讨Unix系统的各种操作技巧、管理技能以及编程实践,而这些都将围绕着Unix的核心概念和哲学展开。

2. Unix命令行操作技巧

2.1 基础命令解析

2.1.1 文件和目录操作命令

文件和目录管理是操作系统中最为基础也是最为重要的部分。在Unix系统中,一系列的命令行工具提供了一个强大、灵活的方式来处理文件和目录。

  • ls :列出目录内容。
  • cd :改变当前目录。
  • mkdir :创建新目录。
  • rmdir :删除空目录。
  • touch :创建空文件或修改文件时间戳。
  • rm :删除文件或目录。

ls 命令是最常用的命令之一,它提供了多个选项来定制输出,例如:

ls -l # 长格式列出文件详细信息
ls -a # 列出所有文件,包括隐藏文件

cd 命令用于改变工作目录,相对路径和绝对路径是常用概念。例如, cd /path/to/directory 为绝对路径,而 cd ../anotherdirectory 则是相对路径使用。

mkdir rmdir 命令用于创建和删除目录。而 touch rm 命令分别用于创建和删除文件。

2.1.2 文本处理和搜索命令

文本处理和搜索是命令行操作中不可或缺的部分。Unix提供了一系列的命令来处理文本文件。

  • cat :显示、创建和合并文件内容。
  • more / less :分页显示文件内容。
  • head / tail :显示文件内容的开头或结尾部分。
  • grep :文本搜索工具。

例如,使用 grep 命令可以执行复杂的文本搜索,支持正则表达式:

grep "pattern" filename # 在文件中搜索文本模式
grep -r "pattern" /path/to/directory # 递归搜索目录下所有文件

2.2 高级命令行工具

2.2.1 管道、重定向和过滤器

Unix命令行的强大之处在于管道和重定向的使用。管道( | )允许将一个命令的输出直接传递给另一个命令作为输入,而重定向( > >> )则用于将命令输出写入文件或从文件读取输入。

  • | :管道,将前一个命令的输出作为后一个命令的输入。
  • > :覆盖式重定向,将输出写入文件。
  • >> :追加重定向,将输出追加到文件。

例如,将 ls 命令的输出通过管道传递给 grep 进行过滤,然后重定向到文件:

ls -l | grep "^d" > directory_list.txt # 仅列出目录并保存到文件

2.2.2 别名、函数和脚本

  • 别名:为经常使用的长命令设置简称。
  • 函数:定义命令行上的自定义命令。
  • 脚本:创建自动化任务。

在命令行中设置别名和函数可以简化复杂命令的使用。例如,设置一个别名:

alias ll='ls -l' # 定义ll为ls -l的别名

函数则更为强大,可以组合多个命令并添加参数:

function show磁盘空间() {
    df -h | grep '/dev/sd'
}

2.3 命令行效率提升

2.3.1 快捷键和历史命令使用

Unix命令行界面提供了许多快捷键以提升操作效率。

  • Ctrl + a :移动到行首。
  • Ctrl + e :移动到行尾。
  • Ctrl + w :删除前一个单词。
  • Ctrl + k :删除到行尾。

历史命令( history )是另一个重要的效率工具。它记录了用户在命令行中输入的命令,并且可以重新调用:

history # 显示历史命令列表
!123 # 执行历史列表中的第123条命令

2.3.2 自动补全和提示技巧

自动补全功能可以通过按 Tab 键来触发,它会尝试自动填充当前命令行的命令或参数。如果存在多个选项,再次按下 Tab 键会显示所有选项。

提示技巧包括了使用 Esc 键来显示命令的参数列表,这对于记忆命令参数非常有用。此外,许多终端模拟器提供了自定义提示的功能,用户可以根据需要调整提示符的内容。

set提示符("%P %F{green}%~%f %B%F{blue}%n@%m%b %F{yellow}%#%f") # 定制提示符

在下一章节中,我们将深入了解Unix系统管理技能,涵盖用户与权限管理、系统服务与守护进程,以及系统监控与性能分析。

3. Unix系统管理技能

随着系统管理员角色的日益重要,Unix系统管理技能已经成为了IT专业人员的必备知识。本章将深入探讨Unix系统管理的核心技能,涵盖用户与权限管理、系统服务与守护进程以及系统监控与性能分析。通过深入理解这些技能,IT专业人员不仅能够更有效地管理Unix系统,还可以确保系统的稳定性和安全性。

3.1 用户与权限管理

Unix系统采用了严格的用户和权限管理机制,以保证不同用户能够在系统中拥有恰当的访问权限。这包括创建和管理用户账号、设置文件权限、以及保证系统的整体安全。

3.1.1 用户账号创建与管理

Unix系统中用户账号的创建和管理是基础操作之一。系统管理员通常需要为不同用户创建账号,同时管理用户的登录信息,包括密码设置、用户组分配等。

# 添加新用户
sudo useradd -m newuser

# 设置用户密码
sudo passwd newuser

# 修改用户所属的用户组
sudo usermod -aG groupname newuser

# 删除用户
sudo userdel newuser

上述命令展示了如何使用 useradd passwd usermod 等命令来创建、修改和删除用户账号。参数 -m 用于创建用户的主目录; -aG 用于添加用户到附加组。

3.1.2 权限设置与文件安全

Unix系统中每个文件都有所有者、所属用户组和其他用户的概念,而这些用户对文件拥有不同的读(r)、写(w)和执行(x)权限。权限设置对于系统的文件安全至关重要。

# 更改文件所有者
sudo chown username filename

# 更改文件所属组
sudo chgrp groupname filename

# 更改文件权限
sudo chmod 755 filename

在上述示例中, chown 命令用于更改文件所有者; chgrp 命令用于更改文件的用户组; chmod 命令用于更改文件权限。权限数字 755 表示所有者拥有读、写和执行权限,所属用户组和其他用户拥有读和执行权限。

3.2 系统服务与守护进程

Unix系统中,守护进程负责在后台运行并为系统提供各种服务。正确地启动、停止和监控这些服务对于确保系统稳定运行至关重要。

3.2.1 启动、停止和监控服务

系统管理员经常需要控制服务的启动和停止,并监控其运行状态。这通常涉及到服务管理工具如 systemctl service

# 启动服务
sudo systemctl start service_name

# 停止服务
sudo systemctl stop service_name

# 重启服务
sudo systemctl restart service_name

# 查看服务状态
sudo systemctl status service_name

每个 systemctl 命令都有对应的参数用于执行特定操作,如 start stop restart status 。管理员可以使用这些命令来管理和监控服务。

3.2.2 守护进程的理解与管理

守护进程通常是无交互的后台进程,它在系统启动时自动启动,并持续运行。对于系统管理员而言,理解守护进程的工作原理及如何管理它们,对于维护系统稳定运行至关重要。

# 查看正在运行的进程
ps aux | grep service_name

# 杀死进程
sudo kill -9 process_id

通过 ps 命令结合 grep 可以搜索特定的运行进程,而 kill 命令则用于结束进程, -9 参数表示强制杀死进程。

3.3 系统监控与性能分析

Unix系统管理员必须定期监控系统资源使用情况,分析性能瓶颈,并采取相应的优化措施。

3.3.1 系统资源监控工具

系统资源监控工具如 top htop vmstat iostat free 能够提供系统资源的实时使用情况。

# 查看进程和资源使用情况
top

# 查看更详细的系统资源使用情况
htop

# 查看虚拟内存统计信息
vmstat

# 查看I/O统计信息
iostat

# 查看内存使用情况
free -m

top htop 提供了实时的进程监控和资源使用情况, vmstat iostat 提供了内存和I/O的详细统计信息,而 free 则展示了内存的总量、使用量和剩余量。

3.3.2 性能瓶颈分析与优化

性能瓶颈的分析和优化是一个复杂的过程,涉及到对CPU、内存、磁盘和网络的全面分析。

graph LR
    A[开始分析] --> B[检查CPU使用情况]
    B --> C[检查内存使用情况]
    C --> D[检查磁盘I/O]
    D --> E[检查网络活动]
    E --> F[确定瓶颈]
    F --> G[采取优化措施]
    G --> H[监控效果]

使用流程图可以更好地理解性能瓶颈分析的步骤。从检查CPU开始,逐步到内存、磁盘I/O和网络,最终确定瓶颈并采取相应的优化措施。优化可能包括升级硬件、调整配置参数或修改应用程序。

系统监控和性能分析是一个持续的过程,管理员需要定期进行这些活动,以确保系统稳定高效地运行。

通过本章节的介绍,我们了解了Unix系统管理技能的核心组成部分。在下一章节中,我们将探索Shell脚本编写与实践,这将是提升Unix系统自动化和效率的关键技能。

4. Shell脚本编写与实践

4.1 Shell脚本基础语法

4.1.1 变量、参数和特殊字符

在Shell脚本中,变量、参数和特殊字符是构成脚本基础框架的重要组成部分。变量用于存储临时数据,参数用于传递命令行输入,而特殊字符则有特定的含义和用途,如循环、条件判断等。

Shell脚本中的变量不需要声明数据类型,直接使用即可。变量名通常大写,便于区分。赋值时等号两侧不应有空格。例如,定义变量 MESSAGE 并赋值:

MESSAGE="Hello, World!"

脚本运行时,可以使用 $ 符号来引用变量:

echo $MESSAGE

输出将是 Hello, World!

参数是传递给Shell脚本的输入,通常由位置参数 $1 $2 等表示。如脚本 script.sh

#!/bin/bash
echo "First argument is: $1"

当运行 ./script.sh Testing 时,输出将是 First argument is: Testing

特殊字符包括 && (逻辑与)、 || (逻辑或)、 > (重定向输出)、 $() (命令替换)等。例如:

# 输出当前日期,并写入到文件date.txt
echo "Current date is $(date)" > date.txt

Shell脚本中的特殊字符非常丰富,不同的字符代表不同的功能和控制流程。

4.1.2 控制结构与逻辑判断

Shell脚本中的控制结构和逻辑判断是实现复杂逻辑的基础,包括条件判断(if语句)、循环结构(for循环、while循环等)。

条件判断使用 if 语句。基本结构为:

if [ condition ]; then
  # 逻辑成立时执行的命令
else
  # 逻辑不成立时执行的命令
fi

示例:检查文件是否存在:

FILE="/etc/passwd"

if [ -f "$FILE" ]; then
    echo "$FILE exists."
else
    echo "$FILE does not exist."
fi

循环结构用于重复执行命令。常见的有 for while until 循环。 for 循环通常用于遍历列表:

for i in {1..5}; do
    echo "Welcome $i times"
done

while until 循环通常用于执行直到条件成立或不成立时结束。 while 循环:

COUNTER=0

while [ $COUNTER -lt 5 ]; do
    echo "Counter is $COUNTER"
    ((COUNTER++))
done

每个控制结构和逻辑判断都为脚本增加了动态处理逻辑的能力,使得Shell脚本不仅能够处理静态命令,还能够根据不同的条件执行相应的逻辑处理。

5. 文件系统与权限管理

5.1 Unix文件系统架构

5.1.1 文件系统层次结构标准

Unix文件系统的层次结构是根据文件系统层次标准(Filesystem Hierarchy Standard, FHS)来组织的。FHS定义了不同目录中应该存放什么类型的数据,以确保用户和程序在各种Unix系统间的一致性和可移植性。例如, /bin 目录存放用户命令, /etc 目录存放系统配置文件,而 /var 目录则用于存放系统运行过程中会改变的文件,如日志文件。

理解FHS对于系统管理员至关重要,因为它涉及到文件的安全、备份和恢复。例如,备份时应该包含哪些目录,哪些目录的数据是不常变动的,这样可以有效提高备份效率。而恢复时,我们也会根据FHS来决定从哪个目录开始恢复。

5.1.2 磁盘分区、挂载与卸载

Unix系统中,磁盘分区是将一个物理磁盘分割成多个部分,每个部分可以被格式化为不同的文件系统,并且可以单独被挂载和访问。挂载操作将磁盘分区附加到文件系统的某个目录下,这样分区上的文件就可以被访问了。卸载则是断开磁盘分区和挂载点之间的连接,防止对分区的数据进行访问。

在进行磁盘分区时,使用 fdisk parted 工具可以帮助我们查看、创建和删除分区。而 mount 命令用于挂载分区, umount 则用于卸载分区。例如, mount /dev/sda1 /mnt/point /dev/sda1 分区挂载到 /mnt/point 目录。

磁盘分区和挂载的使用

磁盘分区和挂载的使用示例:

  1. 使用 lsblk 查看当前系统磁盘分区情况。
  2. 使用 fdisk /dev/sda 对磁盘 /dev/sda 进行分区。
  3. 创建一个新的目录作为挂载点,例如 mkdir /mnt/newdisk
  4. 使用 mount /dev/sda1 /mnt/newdisk 命令挂载分区到新目录。
  5. 确认挂载成功后,可以通过访问 /mnt/newdisk 来查看和使用分区内容。
  6. 当不再需要访问该分区时,可以使用 umount /mnt/newdisk 命令卸载。

5.2 权限与所有权管理

5.2.1 权限位和所有权更改

在Unix系统中,每个文件和目录都有相关的权限位和所有者信息。权限位定义了文件的访问权限,如读(r)、写(w)和执行(x),分别对应所有者(user)、组(group)和其他(others)。

修改文件权限的命令是 chmod ,可以指定权限值或者用加号(+)添加权限,减号(-)删除权限,等号(=)设置特定权限。例如, chmod u+x filename 为文件所有者添加执行权限。

更改文件所有者和组的命令是 chown 。可以将文件的所有者更改为另一个用户,或者将所有者和组同时更改。例如, chown user:group filename 将文件的所有者和组更改为 user group

权限位的修改和所有者更改

权限位修改和所有者更改的使用示例:

  1. 使用 ls -l filename 查看文件的详细权限信息。
  2. 更改文件权限以添加所有者的读写执行权限: chmod u+rwx filename
  3. 如果需要给所有用户添加读权限: chmod a+r filename
  4. 更改文件的所有者为用户 newuser chown newuser filename
  5. 同时更改所有者和组为 newuser newgroup chown newuser:newgroup filename

5.2.2 特殊权限位与访问控制列表

Unix系统还提供了特殊权限位,如setuid(设置用户ID)、setgid(设置组ID)和sticky bit。setuid和setgid允许用户以文件所有者或组的身份执行程序,而sticky bit用于目录时,防止非所有者删除或重命名目录中的文件。

除了特殊权限位,访问控制列表(ACL)允许我们为单个用户或组指定更细粒度的权限。通过使用 setfacl getfacl 命令可以设置和获取ACL。

特殊权限位和ACL的使用

特殊权限位和ACL的使用示例:

  1. 为可执行文件设置setuid位,使所有用户都能以文件所有者身份运行它: chmod u+s executable
  2. 为目录设置sticky bit,如 /tmp 目录: chmod +t /tmp
  3. 设置ACL,使得特定用户有权限读取目录中的文件: setfacl -m u:specificuser:r directory
  4. 查看设置的ACL: getfacl directory

5.3 高级文件系统特性

5.3.1 软硬链接与文件系统属性

在Unix中,硬链接和软链接(也称为符号链接)是链接到文件的两种方式。硬链接指向文件的inode,而软链接则是一个特殊的文件,包含了另一个文件的路径名。硬链接不能跨文件系统,而软链接可以。

ln 命令用于创建链接。创建硬链接时,使用 ln source_file target硬链接 ;创建软链接时,使用 ln -s source_file target软链接

文件系统属性允许我们为文件设置额外的属性,如只读(readonly)、隐藏(hidden)等。这些属性可以使用 chattr 命令设置,而 lsattr 用于查看。

软硬链接和文件系统属性的使用

软硬链接和文件系统属性的使用示例:

  1. 创建一个硬链接: ln file1 file1_hardlink
  2. 创建一个软链接: ln -s file1 file1_softlink
  3. 查看硬链接和软链接的区别: ls -li
  4. 设置文件为只读属性: chattr +i file1
  5. 查看文件属性: lsattr file1

5.3.2 磁盘配额与文件系统检查

磁盘配额是一种限制用户或组使用存储空间的方法。使用 quotacheck quotaon 命令可以管理磁盘配额。 quotacheck 检查并创建配额文件, quotaon 启用配额限制。

文件系统检查可以确保文件系统的完整性和一致性。 fsck 命令用于检查和修复文件系统错误。例如, fsck /dev/sda1 检查并修复 /dev/sda1 分区的错误。

磁盘配额和文件系统检查的使用

磁盘配额和文件系统检查的使用示例:

  1. 创建用户磁盘配额文件: quotacheck -cum /home
  2. 启动用户磁盘配额: quotaon -v /home
  3. 检查文件系统的完整性: fsck /dev/sda1
  4. 自动修复可修复的错误: fsck -y /dev/sda1

使用这些高级文件系统特性,Unix系统管理员能够更有效地管理存储资源,同时保障系统的稳定运行。

6. 进程管理与网络编程基础

6.1 进程管理与监控

在Unix系统中,进程是执行中的程序实例,是系统资源分配和调度的单位。管理进程是系统管理员和开发者日常任务的一部分。监控进程活动,可以确保系统的健康运行和资源的合理利用。

6.1.1 进程的创建与终止

进程的创建通常是通过 fork() 系统调用实现的,它会创建一个新的进程,即子进程,它是父进程的一个副本。子进程使用 exec() 系列函数来执行新的程序。当进程结束时,它通过调用 exit() 函数来终止自己,并返回一个状态码给父进程。

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork(); // 创建子进程
    if (pid == -1) {
        // fork失败
        perror("fork failed");
        return 1;
    } else if (pid == 0) {
        // 子进程执行
        printf("Child process with PID %d\n", getpid());
        execl("/bin/ls", "ls", NULL); // 执行ls命令
        // 如果execl执行失败,子进程将返回
        perror("exec failed");
        return 1;
    } else {
        // 父进程等待子进程结束
        int status;
        waitpid(pid, &status, 0); // 等待子进程结束并获取状态
        printf("Child process %d terminated with status %d\n", pid, WEXITSTATUS(status));
    }
    return 0;
}

6.1.2 进程状态与优先级调整

Unix进程具有不同的状态,包括运行、就绪、阻塞和终止状态。系统通过进程调度器管理这些状态,确保多个进程能够合理地共享CPU时间。

ps 命令可以用来查看当前进程的状态和其它信息,而 nice renice 命令则用来设置进程的优先级。默认情况下,进程的优先级称为“niceness”,范围是-20到19,数值越低优先级越高。

6.2 网络基础知识

Unix系统以其在网络应用上的成熟和稳定性而闻名,是构建稳定网络应用和服务的理想平台。

6.2.1 网络接口与路由配置

网络接口是连接计算机与物理网络的硬件或虚拟通道。 ifconfig ip 命令可以配置和查询网络接口的状态。

路由是指网络中的数据包如何从源头移动到目的地的过程。 route 命令用于显示和修改IP路由表。

# 查看路由表
$ route -n

# 添加一条路由规则
$ route add -net ***.***.*.* netmask ***.***.***.* gw ***.***.*.*

6.2.2 套接字编程与网络服务

套接字(Socket)是Unix网络编程中的核心概念,提供了进程间通信的接口。它支持不同的传输层协议,包括TCP和UDP。

网络服务通常是通过套接字编程实现的。TCP套接字保证了数据的顺序和可靠性,适用于需要保证数据完整性的服务(如HTTP)。UDP套接字不保证可靠性,适用于对实时性要求高的服务(如DNS)。

6.3 进程间通信与同步

Unix系统支持多种进程间通信(IPC)机制,它们允许进程之间共享数据、同步执行和协调操作。

6.3.1 管道、消息队列与共享内存

管道(Pipe)是一种最基本的IPC机制,允许一个进程将输出作为另一个进程的输入。

消息队列是存储在内核中的消息链表,允许不同进程间通信。

共享内存是最快的IPC机制,允许两个或多个进程共享一个给定的存储区。

6.3.2 信号量与进程同步机制

信号量是一种同步机制,用于控制对共享资源的访问。它是一个计数器,用于为多个进程提供对共享数据对象的互斥访问。

进程同步是协调多个进程的工作流程,确保它们之间能够按照预定的顺序执行。在Unix中,可以使用互斥锁、条件变量和读写锁等工具来实现同步。

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define N 5

sem_t sem;

void* philosopher(void* num) {
    int i = *((int*)num);

    while (1) {
        sem_wait(&sem); // 请求资源,计数减1
        printf("Philosopher %d is thinking.\n", i+1);
        sleep(1);

        printf("Philosopher %d is hungry.\n", i+1);
        sleep(1);

        printf("Philosopher %d takes the fork.\n", i+1);
        sleep(1);

        printf("Philosopher %d is eating.\n", i+1);
        sleep(1);

        sem_post(&sem); // 释放资源,计数加1
    }

    pthread_exit(NULL);
}

int main() {
    pthread_t thread_id[N];
    int thread_no[N];

    sem_init(&sem, 0, 4); // 初始化信号量

    for (int i = 0; i < N; i++) {
        thread_no[i] = i;
        pthread_create(&thread_id[i], NULL, philosopher, (void*)&thread_no[i]);
    }

    for (int i = 0; i < N; i++) {
        pthread_join(thread_id[i], NULL);
    }

    sem_destroy(&sem); // 销毁信号量

    return 0;
}

在本章中,我们深入探讨了Unix系统中进程管理的多个关键方面,包括进程的创建和终止、网络基础知识以及进程间通信和同步。这些知识点对于系统管理员和开发者来说至关重要,能够帮助他们更有效地管理系统资源,优化应用性能,以及确保系统的稳定运行。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:【深入学习Unix】是一份详尽的Unix学习手册,涵盖了Unix的核心概念、命令行操作及系统管理知识。Unix是服务器、科学计算和软件开发领域的重要操作系统,其设计理念和功能性对计算机科学影响深远。本指南深入讲解了Unix的历史、设计哲学、Shell脚本编程、文件系统与权限、进程管理、网络编程、文本处理工具、系统管理、编译与链接、调试技巧、标准与版本兼容性以及开源文化等多个方面,使读者从初学者成长为熟练掌握Unix系统的专家。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

第1章 系统概貌 1.1 历史 1.2 系统结构 1.3 用户看法 1.3.1 文件系统 1.3.2 处理环境 1.3.3 构件原语 1.4 操作系统服务 1.5 关于硬件的假设 1.5.1 中断与例外 1.5.2 处理机执行级 1.5.3 存储管理 1.6 本章小结 第2章 内核导言 2.1 UNIX操作系统的体系结构 2.2 系统概念介绍 2.2.1 文件子系统概貌 .2.2.2 进程 2.3 内核数据结构 2.4 系统管理 2.5 本章小结 2.6 习题 第3章 数据缓冲区高速缓冲 3.1 缓冲头部 3.2 缓冲池的结构 3.3 缓冲区的检索 3.4 读磁盘块与写磁盘块 3.5 高速缓冲的优点与缺点 3.6 本章小结 3.7 习题 第4章 文件的内部表示 4.1 索引节点 4.1.1 定义 4.1.2 对索引节点的存取 4.1.3 释放索引节点 4.2 正规文件的结构 4.3 目录 4.4 路径名到索引节点的转换 4.5 超级块 4.6 为新文件分配索引节点 4.7 磁盘块的分配 4.8 其他文件类型 4.9 本章小结 4.10 习题 第5章 文件系统的系统调用 5.1 系统调用open 5.2 系统调用read 5.3 系统调用write 5.4 文件和记录的上锁 5.5 文件的输入/输出位置的调整—lseek 5.6 系统调用close 5.7 文件的建立 5.8 特殊文件的建立 5.9 改变目录及根 5.10 改变所有者及许可权方式 5.11 系统调用stat和fstat 5.12 管道 5.12.1 系统调用pipe 5.12.2 有名管道的打开 5.12.3 管道的读和写 5.12.4 管道的关闭 5.12.5 例 5.13 系统调用dup 5.14 文件系统的安装和拆卸 5.14.1 在文件路径名中跨越安装点 5.14.2 文件系统的拆卸 5.15 系统调用link 5.16 系统调用unlink 5.16.1 文件系统的一致性 5.16.2 竞争条件 5.17 文件系统的抽象 5.18 文件系统维护 5.19 本章小结 5.20 习题 第6章 进程结构 6.1 进程的状态和状态的转换 6.2 系统存储方案 6.2.1 区 6.2.2 页和页表 6.2.3 内核的安排 6.2.4 u区 6.3 进程的上下文 6.4 进程上下文的保存 6.4.1 中断和例外 6.4.2 系统调用的接口 6.4.3 上下文切换 6.4.4 为废弃返回(abortive return)而保存上下文 6.4.5 在系统和用户地址空间之间拷贝数据 6.5 进程地址空间的管理 6.5.1 区的上锁和解锁 6.5.2 区的分配 6.5.3 区附接到进程 6.5.4 区大小的改变 6.5.5 区的装入 6.5.6 区的释放 6.5.7 区与进程的断接 6.5.8 区的复制 6.6 睡眠 6.6.1 睡眠事件及地址 6.6.2 算法sleep和wakeup 6.7 本章小结 6.8 习题 第7章 进程控制 7.1 进程的创建 7.2 软中断信号 7.2.1 软中断信号的处理 7.2.2 进程组 7.2.3 从进程发送软中断信号 7.3 进程的终止 7.4 等待进程的终止 7.5 对其他程序的引用 7.6 进程的用户标识号 7.7 改变进程的大小 7.8 shell程序 7.9 系统自举和进程init 7.10 本章小结 7.11 习题 第8章 进程调度和时间 8.1 进程调度 8.1.1 算法 8.1.2 调度参数 8.1.3 进程调度的例子 8.1.4 进程优先权的控制 8.1.5 公平共享调度 8.1.6 实时处理 8.2 有关时间的系统调用 8.3 时钟 8.3.1 重新启动时钟 8.3.2 系统的内部定时 8.3.3 直方图分析 8.3.4 记帐和统计 8.3.5 计时 8.4 本章小结 第9章 存储管理策略 9.1 对换 9.1.1 对换空间的分配 9.1.2 进程的换出 9.1.3 进程的换入 9.2 请求调页 9.2.1 请求调页的数据结构 9.2.2 偷页进程 9.2.3 页面错 9.2.4 在简单硬件支持下的请示调页系统 9.3 对换和请示调页的混合系统 9.4 本章小结 9.5 习题 第10章 输入/输出子系统 10.1 驱动程序接口 10.1.1 系统配置 10.1.2 系统调用与驱动程序接口 10.1.3 中断处理程序
译者序 前言 第1章 系统概貌 1.1 历史 1.2 系统结构 1.3 用户看法 1.3.1 文件系统 1.3.2 处理环境 1.3.3 构件原语 1.4 操作系统服务 1.5 关于硬件的假设 1.5.1 中断与例外 1.5.2 处理机执行级 1.5.3 存储管理 1.6 本章小结 第2章 内核导言 2.1 UNIX操作系统的体系结构 2.2 系统概念介绍 2.2.1 文件子系统概貌 2.2.2 进程 2.3 内核数据结构 2.4 系统管理 2.5 本章小结 2.6 习题 第3章 数据缓冲区高速缓冲 3.1 缓冲头部 3.2 缓冲池的结构 3.3 缓冲区的检索 3.4 读磁盘块与写磁盘块 3.5 高速缓冲的优点与缺点 3.6 本章小结 3.7 习题 第4章 文件的内部表示 4.1 索引节点 4.1.1 定义 4.1.2 对索引节点的存取 4.1.3 释放索引节点 4.2 正规文件的结构 4.3 目录 4.4 路径名到索引节点的转换 4.5 超级块 4.6 为新文件分配索引节点 4.7 磁盘块的分配 4.8 其他文件类型 4.9 本章小结 4.10 习题 第5章 文件系统的系统调用 5.1 系统调用Open 5.2 系统调用read 5.3 系统调用write 5.4 文件和记录的上锁 5.5 文件的输入/输出位置的调整lseek 5.6 系统调用close 5.7 文件的建立 5.8 特殊文件的建立 5.9 改变目录及根 5.10 改变所有者及许可权方式 5.11 系统调用stat和fstat 5.12 管道 5.12.1 系统调用pipe 5.12.2 有名管道的打开 5.12.3 管道的读和写 5.12.4 管道的关闭 5.12.5 例 5.13 系统调用dup 5.14 文件系统的安装和拆卸 5.14.1 在文件路径名中跨越安装点 5.14.2 文件系统的拆卸 5.15 系统调用link 5.16 系统调用unlink 5.16.1 文件系统的一致性 5.16.2 竟争条件 5.17 文件系统的抽象 5.18 文件系统维护 5.19 本章小结 5.20 习题 第6章 进程结构 6.1 进程的状态和状态的转换 6.2 系统存储方案 6.2.1 区 6.2.2 页和页表 6.2.3 内核的安排 6.2.4 u区 6.3 进程的上下文 6.4 进程上下文的保存 6.4.1 中断和例外 6.4.2 系统调用的接口 6.4.3 上下文切换 6.4.4 为废弃返回(abortive return)而保存上下文 6.4.5 在系统和用户地址空间之间拷贝数据 6.5 进程地址空间的管理 6.5.1 区的上锁和解锁 6.5.2 区的分配 6.5.3 区附接到进程 6.5.4 区大小的改变 6.5.5 区的装入 6.5.6 区的释放 6.5.7 区与进程的断接 6.5.8 区的复制 6.6 睡眠 6.6.1 睡眠事件及其地址 6.6.2 算法sleep和wakeup 6.7 本章小结 6.8 习题 第7章 进程控制 7.1 进程的创建 7.2 软中断信号 7.2.1 软中断信号的处理 7.2.2 进程组 7.2.3 从进程发送软中断信号 7.3 进程的终止 7.4 等待进程的终止 7.5 对其他程序的引用 7.6 进程的用户标识号 7.7 改变进程的大小 7.8 Shell程序 7.9 系统自举和进程init 7.10 本章小结 7.11 习题 第8章 进程调度和时间 8.1 进程调度 8.1.1 算法 8.1.2 调度参数 8.1.3 进程调度的例子 8.1.4 进程优先权的控制 8.1.5 公平共享调度 8.1.6 实时处理 8.2 有关时间的系统调用 8.3 时钟 8.3.1 重新启动时钟 8.3.2 系统的内部定时 8.3.3 直方图分析 8.3.4 记帐和统计 8.3.5 计时 8.4 本章小结 8.5 习题 第9章 存储管理策略 9.1 对换 9.1.1 对换空间的分配 9.1.2 进程的换出 9.1.3 进程的换入 9.2 请求调页 9.2.1 请求调页的数据结构 9.2.2 偷页进程 9.2.3 页面错 9.2.4 在简单硬件支持下的请求调页系统 9.3 对换和请求调页的混合系统 9.4 本章小结 9.5 习题 第10章 输入输出子系统 10.1 驱动程序接口 10.1.1 系统配置 10.1.2 系统调用与驱动程序接口 10.1.3 中断处理程序 10.2 磁盘驱动程序 10.3 终端驱动程序 10.3.1 字符表Clist 10.3.2 标准方式下的终端驱动程序 10.3.3 原始方式下的终端驱动程序 10.3.4 终端探询 10.3.5 建立控制终端 10.3.6 间接终端驱动程序 10.3.7 注册到系统 10.4 流 10.4.1 流的详细的示例 10.4.2 对流的分析 10.5 本章小结 10.6 习题 第11章 进程间通信 11.1 进程跟踪 11.2 系统V IPC 11.2.1 消息 11.2.2 共享存储区 11.2.3 信号量 11.2.4 总的评价 11.3 网络通信 11.4 套接字 11.5 本章小结 11.6 习题 第12章 多处理机系统 12.1 多处理机系统的问题 12.2 主从处理机解决方法 12.3 信号量解决方法 12.3.1 信号量定义 12.3.2 信号量实现 12.3.3 几个算法 12.4 Tunis系统 12.5 性能局限性 12.6 习题 第13章 分布式UNIX系统 13.1 卫星处理机系统 13.2 纽卡斯尔连接 13.3 透明型分布式文件系统 13.4 无存根进程的透明分布式模型 13.5 本章小结 13.6 习题 附录A 系统调用 参考文献 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值