第三章学习笔记
第三章学习笔记
Unix/Linux进程管理
知识点总结
多任务处理:
- Unix和Linux支持多任务处理,这意味着它们能够同时运行多个进程。
- 多任务处理的优点包括更高的系统利用率和更好的响应时间。
- 进程之间是相互独立的,它们不会干扰彼此的执行。
进程:
- 进程是一个正在执行的程序实例。它包括程序的代码、数据、寄存器状态和系统资源的信息。
- 每个进程都有一个唯一的进程标识符(PID),用于操作和跟踪该进程。
- 进程可以通过fork系统调用创建新的进程,这些新进程通常称为子进程。
多任务处理系统:
- 多任务处理系统使用调度器来决定哪个进程在给定时间片内运行。
- 调度器使用不同的调度算法,如时间片轮转或优先级调度,以确定进程的执行顺序。
- 进程可以在运行、就绪、或休眠状态之间切换,这取决于它们的状态和优先级。
进程同步:
- 进程同步是确保多个进程能够协调工作的关键问题。
- 互斥锁用于确保只有一个进程可以访问共享资源,避免竞争条件。
- 信号量可以用于控制并发访问,以避免资源争夺问题。
- 条件变量可用于在进程之间进行通信和协调。
进程终止:
- 进程可以正常终止,这通常是通过执行完其主要任务或调用exit系统调用来实现的。
- 进程还可以由操作系统强制终止,例如在出现错误或资源不足时。
- 父进程可以通过wait或waitpid系统调用等待子进程终止,并获取子进程的退出状态码。
苏格拉底挑战
问题及解决方案
1.竞争条件(Race Conditions)问题:
- 问题描述:多个进程或线程尝试同时访问共享资源,导致不可预测的结果。
- 解决方案:使用互斥锁、信号量、条件变量等机制来同步进程,确保资源的互斥访问。
2.死锁问题:
- 问题描述:多个进程相互等待对方释放资源,导致所有进程都无法继续执行。
- 解决方案:实施适当的死锁检测和解除策略,或者避免循环等待。
3.进程间通信问题:
- 问题描述:进程需要在不同地址空间的情况下进行通信,例如,父子进程或不相关进程之间的通信。
- 解决方案:使用进程间通信(IPC)机制,如管道、消息队列、共享内存、套接字等,以安全地进行数据传递。
4.资源泄漏问题:
- 问题描述:进程在终止时未释放已分配的资源,如内存、文件描述符,导致系统资源泄漏。
- 解决方案:编写良好的代码以确保资源在不再需要时被正确释放,或使用自动资源管理工具如RAII(资源获取即初始化)。
5.性能问题:
- 问题描述:系统负载高,响应时间慢,或者进程之间的竞争导致性能下降。
- 解决方案:优化代码、使用多线程或进程池,采用更高效的算法,以提高系统性能。
6.进程崩溃问题:
- 问题描述:进程崩溃可能导致数据损坏或系统不稳定。
- 解决方案:实施进程监控和自动重启机制,以便在进程崩溃时快速恢复。
7.资源争夺问题:
- 问题描述:多个进程竞争有限的资源,如锁、内存或文件句柄。
- 解决方案:实施资源管理策略,以防止资源争夺,或通过限制资源使用来避免资源过度使用。
实践
多任务处理
#include <stdio.h>
#include <unistd.h>
int main() {
int pid = fork(); // 创建子进程
if (pid == 0) {
// 子进程代码
printf("Child process is running\n");
} else if (pid > 0) {
// 父进程代码
printf("Parent process is running\n");
} else {
// 创建进程失败
perror("fork");
}
return 0;
}
创建多进程
进程同步:
#include <stdio.h>
#include <pthread.h>
int shared_variable = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *increment(void *arg) {
for (int i = 0; i < 100000; i++) {
pthread_mutex_lock(&mutex);
shared_variable++;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, increment, NULL);
pthread_create(&thread2, NULL, increment, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
printf("Shared variable: %d\n", shared_variable);
return 0;
}
在这个示例中,两个线程通过互斥锁(pthread_mutex_t)同步地增加shared_variable的值,以避免竞争条件。
进程终止:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pid = fork();
if (pid == 0) {
// 子进程
printf("Child process is running\n");
exit(0); // 正常终止子进程
} else if (pid > 0) {
// 父进程
sleep(2); // 等待2秒
printf("Parent process is running\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)