目录

Linux系统编程初识系统编程

【Linux系统编程】初识系统编程

一、什么是系统编程

系统编程(System Programming)是计算机科学中的一个重要领域,专注于开发与计算机硬件和操作系统直接交互的软件。它涉及底层操作、资源管理、系统服务的实现,以及对硬件资源的直接控制。

系统编程(System Programming)是计算机科学中的一个重要领域,专注于开发与计算机硬件和操作系统直接交互的软件。它涉及底层操作、资源管理、系统服务的实现,以及对硬件资源的直接控制。以下是系统编程的详细介绍:

1. 系统编程的定义

系统编程是指编写与操作系统内核、硬件设备、系统资源(如内存、CPU、I/O设备)直接交互的软件。它的主要目标是提供高效、可靠的基础设施,以支持上层应用程序的运行。

  • 与应用程序编程的区别
    • 应用程序编程:关注用户功能(如Web开发、移动应用开发)。
    • 系统编程:关注底层功能(如内存管理、进程调度、设备驱动)。

2. 系统编程的特点

  1. 与硬件和操作系统紧密相关

    • 直接调用操作系统提供的API(如Linux的系统调用)。
    • 直接操作硬件资源(如内存、寄存器、设备控制器)。
  2. 高效性和性能优化

    • 系统软件是其他应用程序运行的基础,因此对性能要求极高。
    • 需要优化代码以减少资源占用和提高执行效率。
  3. 低级别语言

    • 通常使用C、C++、汇编语言等低级语言,因为它们提供了对硬件的直接控制能力。
    • 高级语言(如Python、Java)通常不适合系统编程,因为它们的抽象层次较高。
  4. 复杂性和难度

    • 涉及复杂的底层逻辑,如并发控制、内存管理、错误处理等。
    • 调试和测试系统程序比普通应用程序更具挑战性。

3. 系统编程的应用领域

  1. 操作系统开发

    • 编写操作系统内核、文件系统、进程调度器等。
    • 例如,Linux、Windows、macOS等操作系统的开发。
  2. 设备驱动程序

    • 编写硬件设备的驱动程序,使操作系统能够与硬件通信。
    • 例如,显卡驱动、网络适配器驱动等。
  3. 嵌入式系统

    • 为嵌入式设备(如智能家居、工业控制器)编写固件和底层软件。
    • 例如,物联网设备的开发。
  4. 系统工具和实用程序

    • 编写系统管理工具,如编译器、调试器、网络协议栈等。
    • 例如,GCC编译器、Wireshark网络分析工具。
  5. 虚拟化和容器技术

    • 实现虚拟机管理程序(如KVM、Xen)和容器引擎(如Docker)。
    • 例如,云计算平台的基础设施开发。

4. 系统编程的核心概念

  1. 系统调用(System Call)

    • 应用程序通过系统调用请求操作系统提供服务,如文件操作、进程管理、网络通信等。
    • 例如,在Linux中, open()read()write() 等函数都是系统调用。
  2. 内存管理

    • 管理物理内存和虚拟内存,包括内存分配、释放、分页、分段等。
    • 例如,C语言中的 malloc()free() 函数。
  3. 进程和线程

    • 管理进程的创建、调度、同步和通信。
    • 例如,Linux中的 fork()exec()pthread_create() 等函数。
  4. 文件系统

    • 实现文件的存储、检索和管理。
    • 例如,Linux中的 ext4NTFS 等文件系统。
  5. 网络编程

    • 实现网络协议的栈和通信机制。
    • 例如,TCP/IP协议栈、Socket编程。
  6. 中断处理

    • 处理硬件中断,以响应外部事件(如键盘输入、网络数据到达)。
    • 例如,Linux中的中断处理程序(ISR)。
  7. 并发和同步

    • 管理多个进程或线程的并发执行,确保数据一致性和资源竞争的正确处理。
    • 例如,使用互斥锁(Mutex)、信号量(Semaphore)等同步机制。

5. 系统编程的工具和技术

  1. 编程语言

    • C、C++、汇编语言是系统编程的主要语言。
    • Rust也逐渐成为系统编程的热门选择,因为它提供了内存安全性。
  2. 开发工具

    • 编译器:GCC、Clang
    • 调试器:GDB、LLDB
    • 性能分析工具:Valgrind、Perf
  3. 操作系统API

    • Linux系统调用: syscallopenreadwrite
    • Windows API: CreateProcessReadFileWriteFile
  4. 虚拟化和容器技术

    • 虚拟机管理程序:KVM、Xen
    • 容器引擎:Docker、Kubernetes

二、操作系统四大基本功能

1. 进程管理(Process Management)

  • 操作系统负责创建、调度、终止进程,并管理进程之间的通信和同步。
  • 确保CPU资源的高效利用,通过进程调度算法(如先来先服务、短作业优先、时间片轮转等)分配CPU时间。

2. 内存管理(Memory Management)

  • 操作系统管理计算机的主存(RAM),负责分配和回收内存空间。
  • 实现虚拟内存技术,允许程序使用比物理内存更大的地址空间,并通过页面置换算法(如FIFO、LRU等)管理内存页面。

3. 文件系统管理(File System Management)

  • 操作系统提供文件存储、检索、组织和保护的功能。
  • 管理文件的创建、删除、读写和权限控制,确保数据的安全性和一致性。

4. 设备管理(Device Management)

  • 操作系统管理计算机的硬件设备,包括输入输出设备(如键盘、鼠标、打印机等)。
  • 通过设备驱动程序与硬件交互,提供设备的中断处理、缓冲和调度功能。

三、计算机系统分层

https://i-blog.csdnimg.cn/direct/b018d749105a475e871d2896d8ac5864.png#pic_center

计算机系统通常可以分为多个层次,每一层都有其特定的功能和职责。

1. 硬件层(Hardware Layer)

  • 这是计算机系统的最底层,包括物理硬件设备,如处理器(CPU)、内存(RAM)、硬盘、输入输出设备(键盘、鼠标、显示器等)。
  • 硬件层提供计算机系统运行所需的物理资源。

2. 操作系统层(Operating System Layer)

  • 操作系统层位于硬件层之上,负责管理硬件资源并提供基本的系统服务。
  • 主要功能包括进程管理、内存管理、文件系统管理、设备管理等。

3. 系统软件层(System Software Layer)

  • 这一层包括各种系统工具和库,如编译器、调试器、链接器、系统库等。
  • 系统软件层为应用程序提供运行环境和开发支持。

4. 应用软件层(Application Software Layer)

  • 这是最上层,包括各种应用程序,如办公软件、浏览器、游戏、数据库管理系统等。
  • 应用软件层直接为用户提供服务,满足用户的具体需求。

5. 用户层(User Layer)

  • 用户层包括最终用户,他们通过应用软件与计算机系统进行交互。
  • 用户层是计算机系统的最终服务对象。

这些层次之间通过接口进行交互,每一层都依赖于下层的服务,并为上层提供支持。这种分层结构使得计算机系统的设计、开发、维护和扩展更加模块化和高效。


四、我们如何使用呢

1.系统调用接口

操作系统提供的函数,我们称之为系统调用函数或系统调用接口,比如 ls 命令就是一个封装好的程序(和我们知道的 a.out 本质上没区别),会调用内核接口, fopen() 也会调用系统库中的 open()

应用程序不能直接访问内核代码和数据,只能通过系统调用接口

2.函数库

1)标准C库下的 printf()scanf() 等,可以跨平台使用。windows和linux都可以使用。

绝大多数标准C库的函数会调用操作系统的提供的函数,比如 printf() 会调用系统库中的 write() ,再比如 fopen() 调用系统库中的 open()

2)但是linux系统库下的函数不能跨平台使用,我们这里使用linux提供的。

3.shell

俗称壳, shell 是用户和系统交互的媒介,终端窗口不等于 shell ,只是打开终端会运行 shell 。我们敲的命令比如 ls ,借助shell就可以执行。 shell 是个统称,不同的Linux发行版运行shell不同,比如我们进程在Ubuntu运行的shell就是 bash