1 进程管理
- 进程:一组有序指令+数据+资源的集合(运行中的程序)
- 操作系统,通过PCB(进程控制块)记录,进程的相关属性(PID、PPID、优先级、程序计数器EIP、程序上下文等)
1.2 进程的创建
- 先分配PCB结构,再生成进程主体
1.3 进程的结束
- 先释放进程主体,再释放PCB结构
(僵死进程:进程主体释放,PCB未释放)
1.4 进程的状态
- 运行:CPU正在执行进程中的指令
- 就绪:等待CPU执行
- 阻塞:等待I/O事件的发生
运行中的进程时间片用完–>转为就绪态
2 进程加载
- 简单分页(充分利用内存)
- 将内存分为区块,即一个页4K,称为页帧。
- 进程加载时,将磁盘上的程序分别按页面加载到内存上(页面可连续可不连续)
- 操作系统,通过进程的页表,记录程序和内存之间页面的映射。
- 通过程序中存储的逻辑地址及偏移量,计算数据的真实物理地址(偏移量不变)
3 操作系统的发展
- 串行处理:按顺序依次提交处理
- 批处理:统一提交处理
- 多道程序设计:统一提交同时处理,按状态交替
- 分时:分时间片同时处理
- 实时:即时响应,快速处理
4 主函数传参
int main(int argc, char* argv[], char* envp[]);
//argc: 参数列表中参数的个数
//argv: 参数列表
//envp: 环境变量
主函数默认传递一个参数:执行命令
4.1 查看传递的参数
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char* argv[], char* envp[])
{
int i = 0;
for(;i < argc ;i++)
{
printf("%s\n", argv[i]);
}
i = 0;
while(envp[i]!=NULL)//环境变量参数以空位结尾
{
printf("%s\n", envp[i]);
i++;
}
exit(0);
}
4.2 输出缓冲区刷新
- 1 程序结束
- 2 遇到 " \n "
- 3 缓冲区满(默认1024字节)
- 4 主动刷新:fflush(stdout);
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("hello");//写入缓冲区
sleep(5);//睡眠
printf("world\n");//写入缓冲区,然后输出
exit(0);
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("hello\n");//写入缓冲区,然后输出
sleep(5);//睡眠
printf("world\n");//写入缓冲区,然后输出
exit(0);
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("hello");//写入缓冲区
sleep(5);//睡眠
printf("world");//写入缓冲区
exit(0);//程序结束,刷新缓冲区,输出
//_exit(0);//程序结束,不会刷新缓冲区
}
4.3 atexit函数
atexit(void(*)());//程序退出时,注册一个退出函数
#include<stdio.h>
#include<stdlib.h>
void fun1()
{
printf("fun1\n");
}
void fun2()
{
printf("fun2\n");
}
int main()
{
atexit(fun1);
atexit(fun2);
printf("hello world\n");
exit(0);//输出顺序:hello world,fun2,fun1
}