嵌入式第二十八天(程序与进程)
一.
<进程是操作系统资源分配的最小单位>
二.CPU调度
CPU调度的主要目标
- 提高CPU利用率:让CPU尽可能处于忙碌状态。
- 提升系统吞吐量:单位时间内完成的进程数量更多。
- 缩短周转时间:进程从提交到完成的总时间更短。
- 减少等待时间:进程在就绪队列中等待的时间更短。
- 保证响应时间:交互式进程(如键盘输入)得到快速响应。
常见调度算法
- 先来先服务(FCFS):按进程到达顺序分配CPU,简单但可能导致“短进程等待长进程”。
- 短作业优先(SJF):优先选择估计运行时间最短的进程,能缩短平均周转时间,但可能导致长进程饥饿。
- 时间片轮转(RR):为每个进程分配固定时间片,时间片用完则切换到下一个进程,适合交互式系统。
- 优先级调度:为进程分配优先级,高优先级进程优先获得CPU,可分为抢占式(高优先级进程可打断低优先级进程)和非抢占式。
三.操作系统基本进程
四.Linux操作系统的进程状态
五.查看进程的相关命令:
补充:
前台进程依赖于终端,而后台进程不依赖于终端.
六.进程相关编程
1.
fork() 是 Unix/Linux 系统中用于创建新进程的系统调用,它会复制当前进程(称为“父进程”),生成一个新进程(称为“子进程”)。
主要特点
- 调用一次,返回两次:父进程中返回子进程的 PID(进程 ID,非负整数),子进程中返回 0。若创建失败,父进程返回 -1。
- 子进程复制父进程的地址空间(包括代码、数据、栈等),但后续修改互不影响.
- 子进程与父进程并发执行,调度顺序由操作系统决定,无法预知。
简单示例:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程执行
printf("这是子进程,PID:%d\n", getpid());
} else if (pid > 0) {
// 父进程执行
printf("这是父进程,子进程PID:%d\n", pid);
} else {
// 出错处理
perror("fork failed");
}
return 0;
}
图示:
2.进程退出
3.回收资源空间:
4.简单示例