实验目的
(1)、掌握计算机操作系统管理进程、处理机、存储器、文件系统的基本方法。
(2)、了解进程的创建、撤消和运行,进程并发执行;自行设计解决哲学家就餐问题的并发线程,了解线程(进程)调度方法;掌握内存空间的分配与回收的基本原理;通过模拟文件管理的工作过程,了解文件操作命令的实质。
(3)、了解现代计算机操作系统的工作原理,具有初步分析、设计操作系统的能力。
(4)、通过在计算机上编程实现操作系统中的各种管理功能,在系统程序设计能力方面得到提升。
实验要求
(1) 在xv6环境下开发应用程序
题目:仿照echo,写一个命令echo_reversal,实现以下功能:把输入的每个参数中的字符次序颠倒输出。
例如:$ echo_reversal Hello World!
则输出: olleH !dlroW
(2) 回答以下问题:
Xv6中并发进程有几种状态,在源码中分别以什么常量代表,试解释每种状态的意义。
Xv6中PCB是以什么方式存放的,链表还是数组?系统最多允许同时运行多少个进程?
Xv6是否支持多核cpu? 如果支持的话,是通过哪个数据结构支持的?
系统启动的第一个进程,其入口函数在哪个文件第几行?它主要实现什么功能?(提示:阅读《xv6中文文档》第1章“第一个进程”)
实验内容
(1). 在xv6环境下开发应用程序
题目:仿照echo,写一个命令echo_reversal,实现以下功能:把输入的每个参数中的字符次序颠倒输出。
例如:$ echo_reversal Hello World!
则输出: olleH !dlroW
我们先打开echo.c文件,查看里面的代码,代码如下:
int main(int argc, char *argv[])
{
int i, j;
for (i = 1; i < argc; i++)
{
j = 0;
while (j < strlen(argv[i]))
{
printf("%c", argv[i][j]);
j++;
}
if (i + 1 < argc)
{
printf(" ");
}
else
{
printf("\n");
}
}
exit(0);
}
我们首先先分析两个参数 argc 和 grgv
argv是二维数组,后面也printf 了argv里面的元素,因此,这个参数是用来存储字符串的
对于argc这个参数,我们可以在下面看到:
而且当i+1小于argc时会输出一个“ ”,否则输出“\n”,那么我们可以认为argv这个二维数组存储的时候会将输入的句子分割为单词,argc就是单词的数量。我们对此做以下验证,将argv[i] 全改为argv[0],如果猜想正确,那么应该只会输出句子的第一个单词,即将
改为:
输入make clean,再输入make qemu重新编译
得到如下,说明猜想正确,现恢复原状,编写echo_reversal的代码
以下部分时对每个单词的输出
我们只需要将j的开始置为单词的长度,当j>0时进入循环,先进行j—操作
再输出argv的值即可,如下:
输入make clean,然后make qemu,输入echo_reserval测试:
成功
(2). 回答以下问题:
Xv6中并发进程有几种状态,在源码中分别以什么常量代表,试解释每种状态的意义。
有六种状态,在源码中分别以UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE 表示。
状态的含义如下:
UNUSED: 进程未被创建时的状态,即进程控制块空闲时的状态。
EMBRYO: 当需要分配一个进程控制块,且找到一个处于UNUSED状态的进程控制块时,把此进程控制块状态设置为要使用的状态。
SLEEPING:即等待态,进程由于等待某资源等原因无法执行,进入睡眠状态。
RUNNABLE:即就绪态,进程获得了除CPU之外的所有资源,处于可运行状态。
RUNNING: 即执行态,进程获得CPU,正在运行的状态。
ZOMBIE: 进程结束的状态。
状态间的转换关系如下:
Xv6中PCB是以什么方式存放的,链表还是数组?系统最多允许同时运行多少个进程?
PCB即进程控制块,是进程管理的数据结构。
当前处于运行状态进程的PCB用指针数组来指出。
xv6的PCB就是proc.h中的proc结构体。
系统最多允许同时运行64个进程。
Xv6是否支持多核cpu? 如果支持的话,是通过哪个数据结构支持的?
xv6支持多核cpu。通过结构体数组来实现。
系统启动的第一个进程,其入口函数在哪个文件第几行?它主要实现什么功能?(提示:阅读《xv6中文文档》第1章“第一个进程”)
在main (kernel/main.c:11)函数初始化几个设备和子系统后,通过调用userinit (kernel/proc.c:233)创建第一个进程,第一个进程执行一个用 RISC-V 汇编编写的小程序 initcode.S(user/initcode.S:1),它通过调用 exec 系统调用重新进入内核。
实验小结
通过本次实验,了解了如何在xv6系统下编写自己的函数,并编译运行。阅读了xv6系统的代码,对xv6系统的工作原理有了基本的认识,了解了xv6是如何支持多核cpu,阅读了xv6中文文档,加深了对xv6系统的了解。
(by 归忆)