【深圳大学操作系统】实验一 并发程序设计 | 您所在的位置:网站首页 › Echo的意义是什么 › 【深圳大学操作系统】实验一 并发程序设计 |
实验目的
(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 归忆) |
CopyRight 2018-2019 实验室设备网 版权所有 |