知识点归纳
多任务处理系统
多任务处理系统是一种计算机操作系统,可以同时执行多个任务或进程,从而提高计算机的效率和吞吐量。它允许用户在一个系统中运行多个程序,并且这些程序可以并行执行,互不干扰。
多任务处理系统有两种类型:协作型和抢占式。在协作型系统中,多个任务共享CPU的时间片,并且需要彼此合作以避免资源冲突。而在抢占式系统中,操作系统可以强制中断一个任务,并切换到另一个任务,以确保公平分配CPU时间。
多任务处理系统通过任务调度算法来确定执行哪个任务,并管理任务之间的切换。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、轮转法和优先级调度。
多任务处理系统可以提高计算机的效率和资源利用率。它可以同时处理多个用户请求或任务,并且可以在后台运行一些系统进程,如网络服务、文件管理和打印任务等。同时,多任务处理系统还可以提供用户界面,允许用户在同一时间对多个应用程序进行操作。
但是,多任务处理系统也存在一些挑战和限制。例如,任务之间的切换可能会引入延迟,影响系统响应时间。而且,如果任务过多或任务执行时间过长,也可能会导致系统资源耗尽或性能下降。
总之,多任务处理系统是一种重要的计算机操作系统,它可以同时执行多个任务,并提高计算机的效率和吞吐量。
进程同步
进程同步是指多个进程之间在执行过程中需要相互协调和合作的一种机制。在并发环境中,多个进程或线程可以同时访问共享资源,导致数据不一致的问题,因此需要通过进程同步来避免竞态条件和数据冲突。
进程同步机制的目标是确保进程按照某种规定的次序访问共享资源,以保证共享资源的一致性和正确性。常见的进程同步问题有互斥、同步、死锁和饥饿等。
互斥是指在同一时间只允许一个进程访问共享资源,其他进程需要等待。常见的互斥机制有使用互斥锁、信号量和临界区等。
同步是指多个进程需要在某个点上进行协调,例如等待其他进程的某个事件发生后再执行。常见的同步机制有使用条件变量、信号量和屏障等。
死锁是指两个或多个进程因为互相持有对方所需的资源而陷入无法继续执行的状态。常见的避免死锁的方法有资源有序分配法、银行家算法和死锁检测与恢复等。
饥饿是指某个进程一直无法获取所需的资源,导致一直等待无法执行。常见的避免饥饿的方法有公平的资源分配和优先级策略等。
进程同步是操作系统设计和并发编程中的重要问题,合理的进程同步机制可以保证共享资源的正确访问,提高系统的并发性和性能。同时,错误的进程同步机制可能导致数据不一致、死锁和性能下降等问题。因此,在多任务处理系统中,进程同步是一个需要仔细考虑和设计的关键问题。
I/O重定向
I/O重定向是指将进程的输入或输出从默认的标准输入(stdin)和标准输出(stdout)改变为其他的文件或设备。通过I/O重定向,可以将程序的输入和输出流与终端之外的其他文件、设备或进程连接起来。
在Unix/Linux和类Unix操作系统中,可以使用特定的符号来进行I/O重定向。常见的符号包括:
>
:将标准输出重定向到指定文件中。例如,command > output.txt
将命令command
的输出写入到output.txt
文件中,如果文件不存在则创建一个新文件,并清空原有内容。>>
:类似于>
,但是将输出追加到指定文件的末尾。例如,command >> output.txt
将命令command
的输出追加到output.txt
文件末尾。<
:将指定文件的内容作为标准输入。例如,command < input.txt
将input.txt
文件的内容作为command
的输入。2>
:将标准错误重定向到指定文件。例如,command 2> error.txt
将命令command
的错误输出写入到error.txt
文件中。|
:管道符号,将一个命令的输出连续传递给另一个命令的输入。例如,command1 | command2
将command1
的输出作为command2
的输入。
通过使用I/O重定向,可以实现很多功能,如将程序的输出写入文件、将程序的输入读取自文件、将多个命令串联起来实现复杂的操作等。同时,I/O重定向还可以用于进程间通信和重定向到网络套接字等。
总之,I/O重定向是一种重要的技术,用于改变程序的输入和输出,使之与文件、设备或其他进程连接起来,提供了更灵活和强大的操作能力。
实践过程
管道
点击查看代码
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
int pipefd[2];
pid_t pid;
char message[] = "Hello, child!";
// 创建管道
if (pipe(pipefd) == -1) {
perror("Pipe creation failed");
return 1;
}
// 创建子进程
pid = fork();
if (pid < 0) {
perror("Fork failed");
return 1;
}
if (pid == 0) {
// 子进程中,关闭写入端,并从管道读取数据
close(pipefd[1]);
char buffer[100];
read(pipefd[0], buffer, sizeof(buffer));
printf("Child received: %s\n", buffer);
close(pipefd[0]);
} else {
// 父进程中,关闭读取端,并向管道写入数据
close(pipefd[0]);
write(pipefd[1], message, sizeof(message));
close(pipefd[1]);
}
return 0;
}