关于知识点
知识点归纳
第三章
Unix/Linux进程管理
- 3.1 多任务处理
一般来说,多任务处理指的是同时进行几项独立活动的能力。
计算机科学中的多任务处理:- 操作系统:多任务处理是操作系统的核心功能之一,它允许多个程序在同一台计算机上并行运行,提高了资源利用率。
- 多线程:多线程是在同一程序内并行执行多个线程的技术,有助于充分利用多核处理器和提高应用程序性能。
- 多进程:多进程是通过创建多个独立进程来实现多任务处理,各个进程相互独立,可以在不同的进程中运行不同的任务。
人类的多任务处理: - 人类大脑可以同时处理多个任务,但通常不能真正同时执行多个认知任务。而是通过快速切换注意力来处理多个任务。
- 多任务处理能力因个体和任务类型而异。一些人更擅长同时处理多个任务,而另一些人更适合专注于单一任务。
机器学习和人工智能中的多任务学习: - 多任务学习是机器学习的一个分支,它旨在使一个模型能够同时解决多个相关任务,从而提高模型的泛化性能。
- 多任务学习可以通过共享模型的层来实现,使模型能够学习不同任务之间的共同特征,提高数据利用效率。
项目管理中的多任务处理: - 在项目管理中,多任务处理是指同时处理和协调多个项目或任务,以确保它们按计划完成。
- 使用项目管理工具和方法,如甘特图、看板和Scrum等,有助于组织和优化多任务处理。
心理学中的多任务效应: - 多任务效应是指在同时执行多个任务时,每个任务的执行效率可能会降低,因为注意力分散。
- 注意力分配和任务优先级管理在多任务效应中起着关键作用。
总体来说,它也是并行编程的基础。
- 3.2 进程的概念
进程的正式定义:进程是对映像的执行。
进程的定义:- 进程是计算机系统中的一个独立执行单元,它包含了程序代码、数据和系统资源的副本。每个进程都有自己的内存空间和执行上下文,可以独立运行。
进程的特征: - 独立性:每个进程是相互独立的,它们不会直接干扰或访问其他进程的数据。
- 并发执行:多个进程可以同时执行,充分利用多核处理器和系统资源。
- 资源隔离:操作系统为每个进程分配独立的内存空间和资源,防止进程之间的冲突。
- 通信机制:进程之间可以通过进程间通信(IPC)机制进行数据交换和协作。
进程状态: - 进程在其生命周期中可以处于不同的状态,包括就绪、运行、阻塞等。操作系统通过调度算法来管理进程状态的转换,以提高系统效率。
进程调度: - 进程调度是操作系统的核心功能,它决定了哪个进程在什么时候执行。调度算法可以根据优先级、时间片轮转等策略来选择下一个要运行的进程。
进程控制块(PCB): - PCB是操作系统中用于维护进程信息的数据结构,包含了进程的状态、寄存器状态、进程标识符等信息。
多进程应用: - 许多应用程序和服务都是多进程的,这包括操作系统本身、Web服务器、数据库管理系统等。多进程应用可以提高系统的稳定性和性能。
进程间通信(IPC): - IPC是多个进程之间进行数据交换和通信的机制,包括管道、消息队列、共享内存、信号等。它们用于协调不同进程的操作。
进程同步和互斥: - 进程间的并发执行可能会导致竞态条件和数据冲突。进程同步和互斥机制,如互斥锁和信号量,用于确保进程之间的合作和协调。
进程间的父子关系: - 进程可以派生出子进程,形成父子进程关系。这种关系在一些应用中很有用,例如在操作系统中,父进程可以派生子进程以执行不同的任务。
- 进程是计算机系统中的一个独立执行单元,它包含了程序代码、数据和系统资源的副本。每个进程都有自己的内存空间和执行上下文,可以独立运行。
- 3.3 多任务处理系统
- 3.3.1 type.h文件
type.h
文件通常不是一种标准文件,它的内容和作用可以因编程语言、库或项目而异。然而,在一些编程上下文中,通常会涉及到一些基本类型的定义和声明。
基本数据类型:type.h
文件可能包含基本数据类型的定义,如整数类型(int、long、short)、浮点数类型(float、double)、字符类型(char)、布尔类型等。
数据结构:有时,type.h
文件可能包含用户自定义的数据结构的定义,这些数据结构可以用于组织和存储数据,例如链表、树、队列等。
宏定义:type.h
文件可能包含一些宏定义,用于简化代码或提高代码的可读性,这些宏定义可以包括常量、函数宏等。
枚举类型:枚举类型的定义也可以出现在type.h
文件中。枚举类型用于创建一组有限的命名值,通常用于表示状态、选项或标志。
指针类型:type.h
文件可能包含指针类型的定义,这些定义可以用于指示指向不同类型数据的指针,如整数指针、字符指针等。
依赖关系:type.h
文件可能包含其他头文件的包含指令,以便在其他源代码文件中使用type.h
文件中定义的类型和数据结构。 - 3.3.2 ts.s文件
ts.s
文件通常表示一个汇编语言文件,其中包含汇编代码,用于编写底层系统程序或与硬件进行交互。
汇编语言:ts.s
文件通常包含汇编语言代码,这是一种低级编程语言,与机器语言密切相关。汇编语言允许程序员直接操作计算机的寄存器、内存和其他硬件资源,通常用于编写系统级程序或驱动程序。
汇编程序:为了将ts.s
文件转换为可执行的二进制文件,需要使用汇编程序(如GNU汇编器,gas)将汇编代码汇编成机器代码。这个过程通常会生成一个目标文件(.o
文件),然后可以将多个目标文件链接在一起以创建可执行程序。
硬件交互:ts.s
文件通常包含与计算机硬件进行交互的代码,例如访问寄存器、操作内存、控制设备等。这对于编写操作系统内核、驱动程序或嵌入式系统的底层代码非常重要。
平台相关性:汇编语言和ts.s
文件通常高度依赖于硬件和操作系统平台。因此,编写的汇编代码可能不可移植,需要适应特定的硬件架构和操作系统。
系统启动:在一些情况下,ts.s
文件可能包含系统的启动代码,用于引导计算机并初始化硬件,这是操作系统内核开发中的关键部分。
调试:由于汇编语言的复杂性,调试ts.s
文件可能会比高级语言更具挑战性。开发人员通常使用汇编级别的调试工具来分析和修复问题。
注释:ts.s
文件通常包含大量注释,用于解释代码的功能、目的和操作,以帮助其他开发人员理解代码。 - 3.3.3 queue.c文件
queue.c
文件通常表示一个C语言源代码文件,其中包含与队列数据结构相关的代码。
队列数据结构:queue.c
文件通常包含用于实现队列数据结构的代码。队列是一种线性数据结构,具有先进先出(FIFO)的特性,用于存储和管理一组元素。
队列操作:queue.c
文件中的代码通常包括队列的基本操作,如入队(enqueue)、出队(dequeue)、判空(isEmpty)、判满(isFull)等。这些操作用于向队列中添加元素或移除元素。
数据类型:queue.c
文件中会定义队列所存储的元素类型,可以是整数、字符、自定义结构体等,具体取决于应用需求。
实现方式:队列可以通过不同的实现方式来编写,包括使用数组或链表。queue.c
文件可能会包含相应的代码来定义和操作队列的数据结构。
队列的应用:队列数据结构在计算机科学中有广泛的应用,例如在操作系统中用于管理进程调度、在数据结构算法中用于解决各种问题(如广度优先搜索)、在网络通信中用于消息传递等。
线程安全性:如果queue.c
文件用于多线程或并发编程,可能包含线程安全性的考虑,以确保队列操作在多线程环境中正确执行。
错误处理:queue.c
文件可能包含错误处理和边界情况的代码,以确保队列操作不会导致内存泄漏或其他问题。
测试和示例代码:queue.c
文件中可能包含用于测试队列数据结构的代码,以确保其正确性。还可以包含示例代码,以演示如何在应用程序中使用队列。 - 3.3.4 t.c文件
C语言代码:t.c
文件通常包含C语言代码,用于实现特定功能或解决问题。它可能涉及变量定义、函数定义和调用、控制语句(如条件语句和循环语句)、数据类型、指针操作等。
库函数调用:t.c
文件可能包含对各种库函数的调用,这些库函数提供了许多功能和服务(如输入输出、字符串处理、数学计算等)。
自定义函数:t.c
文件中可能包含自定义的函数定义和实现,这些函数通常用于封装常用的操作或执行特定的功能任务。
变量和数据类型:t.c
文件中会涉及变量的声明和使用,以及不同的数据类型,如整数类型、字符类型、浮点数类型等。
目标平台:t.c
文件的代码可能与特定的目标平台相关,可能会涉及与硬件交互的操作或与底层系统调用相关的代码。
程序执行入口:t.c
文件可能包含程序的入口点(main()
函数),它是程序的起始执行点,程序从这里开始执行。
错误处理:t.c
文件可能会包含错误处理的代码,例如检查返回值、抛出异常或打印错误信息等。
注释:t.c
文件中可能包含注释,用于解释代码的功能、意图和实现思路,以提高代码的可读性和维护性。 - 3.3.5 多任务处理系统代码介绍
- 3.3.1 type.h文件
- 3.4 进程同步
- 3.4.1 睡眠模式
概念:睡眠模式是指在进程中主动调用一个休眠函数(如sleep())来暂停当前进程的执行一段时间。在休眠期间,进程将不会占用处理器时间,从而让其他进程有机会运行。
多任务环境:睡眠模式通常在多任务环境中使用,其中多个进程或线程共享一个处理器。通过合理地使用睡眠操作,可以平衡系统中各个进程之间的执行时间,提高系统的性能和公平性。
资源访问控制:睡眠模式也可以用作资源访问控制的一种方式。如果多个进程需要共享某个资源(如打印机),但一次只能由一个进程访问,其他进程可以进入睡眠模式,并在资源可用时被唤醒。
互斥锁:在并发编程中,睡眠模式常与互斥锁(Mutex)组合使用。当一个进程想要访问被互斥锁保护的临界区时,如果锁已经被其他进程持有,该进程可以进入睡眠模式,等待锁的释放。
调度策略:睡眠模式对调度策略有一定影响。一些睡眠模式会导致进程进入阻塞状态,调度器将在此期间选择另一个可运行的进程来执行。具体的调度策略取决于操作系统内核的实现。
唤醒机制:当满足特定条件时(如等待的事件发生),睡眠中的进程可以被唤醒并重新进入可运行状态。唤醒通常由事件触发器或其他进程发送的信号实现。
死锁风险:使用睡眠模式时,必须小心避免死锁风险。如果进程在临界区外等待某个资源而另一个进程在临界区内持有了该资源,并处于睡眠模式,可能会导致死锁。 - 3.4.2 唤醒操作
概念:唤醒操作是指一个进程或线程被主动或被其他进程唤醒,以便其能够继续执行。这通常发生在进程等待某个条件得以满足的情况下。
等待和条件:唤醒操作通常与等待某个条件相关。一个进程可以进入睡眠状态,等待某个条件的成立,而其他进程或事件可以满足这个条件,触发唤醒操作。
信号和通知:唤醒操作通常通过信号、通知或事件触发。其他进程或线程可以向等待进程发送信号或通知,以通知它可以继续执行。
条件变量:在多线程编程中,条件变量是一种常见的实现唤醒操作的机制。等待线程会在条件变量上等待,而其他线程可以通过激活条件变量来唤醒等待线程。
互斥锁:唤醒操作通常与互斥锁结合使用。等待线程可能会在获取互斥锁之前进入睡眠状态,而唤醒线程通常会在释放互斥锁后唤醒等待线程。
调度器:唤醒操作通常涉及操作系统内核的调度器。内核需要决定哪个进程被唤醒并获得执行时间,通常基于调度算法来选择。
死锁风险:唤醒操作需要小心管理,以避免死锁风险。如果多个进程之间的唤醒操作循环等待,可能导致死锁。
实时系统:在实时系统中,唤醒操作通常需要满足严格的时间要求。进程必须在规定时间内被唤醒,以确保实时性能。
- 3.4.1 睡眠模式
- 3.5 进程终止
- 3.5.1 kexit()的算法
- 3.5.2 进程家族树
进程家族树(Process Family Tree)是一个用于描述进程之间父子关系的概念,通常用于操作系统和进程管理的领域。
进程:进程是计算机中正在运行的程序的实例。每个进程都有一个唯一的进程标识符(PID),它用于标识和管理进程。
父子关系:在操作系统中,进程之间可以形成父子关系。通常,每个进程都有一个父进程,它是创建该进程的进程。新创建的进程是父进程的子进程。
树状结构:进程家族树是一个树状结构,其中根节点是操作系统内核进程。树中的节点表示不同的进程,而边表示进程之间的父子关系。
进程层次结构:进程家族树形成了一种进程的层次结构。父进程通常可以创建多个子进程,每个子进程又可以创建自己的子进程,以此类推,形成层次结构。
PID分配:在大多数操作系统中,新创建的子进程通常会继承其父进程的PID,并在此基础上进行递增分配。这样,PID可以用于快速识别父子关系。
进程管理:进程家族树对于操作系统的进程管理非常重要。父进程通常具有一定的控制权,可以监视和管理其子进程,如等待子进程的退出、传递信号等。
进程终止:当一个父进程终止时,通常会通知其子进程,或者操作系统会将子进程重新分配给另一个父进程。这有助于确保没有"孤儿进程",即没有父进程的进程。
资源继承:子进程通常会继承一些资源和属性,如文件描述符、环境变量等,从其父进程中继承下来。
POSIX标准:POSIX(可移植操作系统接口)定义了一些函数和标准,用于处理进程家族树,如fork()
和wait()
等。 - 3.5.3 等待子进程终止
- 3.6 MT系统中的进程管理
- 3.7 Unix/Linux中的进程
- 3.7.1 进程来源
- 3.7.2 INIT和守护进程
- 3.7.3 登陆进程
- 3.7.4 sh进程
- 3.7.5 进程的执行形式
- 3.8 进程管理的系统调用
- 3.8.1 fork()
- 3.8.2 进程执行顺序
- 3.8.3 进程终止
- 3.8.4 等待子进程终止
- 3.8.5 Linux中的subreaper进程
- 3.8.6 exec():更改进程执行映像
- 3.8.7 环境变量
- 3.9 I/O重定向
- 3.9.1 文件流和文件描述符
- 3.9.2 文件流I/O和系统调用
- 3.9.3 重定向标准输入
- 3.9.4 重定向标准输出
- 3.10 管道
- 3.10.1 Unix/Linux中的管道编程
- 3.10.2 管道命令处理
- 3.10.3 将管道写进程与管道读进程连接起来
- 3.10.4 命名管道
苏格拉底挑战
问题1:进程同步
问题2:
遇到问题以及实践过程截图
实践截图
man ls
ls -i
ls -l
mywho
查找属性
问题1: