进程初识实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
通过本次实验,使学生了解进程的基本概念,掌握进程的创建、调度、同步与互斥等基本操作,加深对操作系统进程管理的理解。
二、实验环境
操作系统:Linux
编程语言:C
开发工具:gcc
三、实验内容
本次实验主要包含以下内容:
1. 进程的创建与终止
2. 进程的调度
3. 进程的同步与互斥
4. 守护进程的创建
四、实验步骤
1. 进程的创建与终止
(1)使用 `fork()` 函数创建进程。
`fork()` 函数返回值:
- 在父进程中,返回新创建子进程的进程ID;
- 在子进程中,返回0。
(2)使用 `wait()` 或 `waitpid()` 函数等待子进程结束。
`wait()` 函数返回子进程的终止状态。
(3)使用 `exit()` 函数终止进程。
2. 进程的调度
(1)进程调度算法:时间片轮转算法(RR)、优先级调度算法。
(2)使用 `sleep()` 函数模拟进程运行时间。
3. 进程的同步与互斥
(1)使用信号量(semaphore)实现进程同步。
(2)使用互斥锁(mutex)实现进程互斥。
4. 守护进程的创建
(1)使用 `fork()` 函数创建子进程。
(2)在子进程中,使用 `setsid()` 函数创建新的会话,使子进程成为守护进程。
(3)父进程退出,守护进程继续运行。
五、实验代码示例
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
#define SEM_NAME "/sem"
int main() {
pid_t pid;
int semid, semnum;
struct sembuf sem_op;
// 创建信号量集
semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
if (semid == -1) {
perror("semget");
exit(1);
}
// 初始化信号量
semnum = 0;
sem_op.sem_num = semnum;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
if (semctl(semid, semnum, SETVAL, sem_op) == -1) { perror("semctl");
exit(1);
}
// 创建子进程
pid = fork();
if (pid == 0) {
// 子进程
printf("Child process: %d\n", getpid());
sem_op.sem_op = -1; // P操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(1);
}
printf("Child process: acquired semaphore\n");
sleep(5); // 模拟子进程运行时间
sem_op.sem_op = 1; // V操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(1);
}
printf("Child process: released semaphore\n"); exit(0);
} else if (pid > 0) {
// 父进程
printf("Parent process: %d\n", getpid());
sem_op.sem_op = -1; // P操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(1);
}
printf("Parent process: acquired semaphore\n"); sleep(5); // 模拟父进程运行时间
sem_op.sem_op = 1; // V操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(1);
}
printf("Parent process: released semaphore\n");
wait(NULL); // 等待子进程结束
} else {
perror("fork");
exit(1);
}
// 删除信号量集
if (semctl(semid, 0, IPC_RMID) == -1) {
perror("semctl");
exit(1);
}
return 0;
}
```
六、实验结果与分析
1. 通过实验,加深了对进程的基本概念和操作的理解。
2. 学会了使用 `fork()`、`wait()`、`waitpid()` 等系统调用创建和终止进程。
3. 掌握了进程调度算法和时间片轮转算法的实现。
4. 学会了使用信号量实现进程同步和互斥。
5. 理解了守护进程的创建过程。
七、实验总结
本次实验使我对操作系统进程管理有了更深入的了解,为后续学习操作系统课程打下了基础。
在实验过程中,我遇到了一些问题,通过查阅资料和与同学讨论,最终解决了问题。
这次实验让我明白了理论与实践相结合的重要性。