SHU操作系统

SHU操作系统

考试

考试题型

五道大题

单选题20,一个一分,后4题是linux相关,两个系统工作调用和命令,存储管理4个,进程好多9个,第三章1小题,第一章1小题

相关状态,核心态用户态,特权指令和非特权指令,系统调用和库函数(CPU状态不变),必考内容

处理机上下文是context,所有寄存器。PSW,处理机状态搞错了。

2.3,现代操作系统,模糊处理,古代操作系统也是分成多个层次,核心态下运行的叫内核

处理机上下文切换,把所有寄存器腾出来

进程状态,进程抽象都没有问题

临界区

三种指令,实现临界区互斥

管程

sychronized同步,其实非同步

volatile易变的,说明一个变量等于0,x=0,if x==0,可能进行了进程切换所以改了。

存储管理

TLB,快表,translation Looksside Buffer,有一题

分配算法,伙伴系统

存储扩充,对换,虚拟内存

判断题20,20题

出了一道Unix,估计都不会,文件目录,unlink

存储管理考了好多

微内核

进程和程序的关系,进程和程序没什么一对一关系,fork,exec

算法?

装入和链接,动态链接,不需要把程序装入内存,load on reference,copy on write。

虚实分离,地址重定位,地址映射,地址变换,页表,快表,多级页表,反置页表,挖坑,从物理地址变虚地址?不是!

请求分页中的请求页表机制,图,错的,没有外存地址,存在位访问位修改位,缺页中断图。6次缺页中断

丹宁的悲催结论,内存条不足神仙没办法。

设备管理

驱动程序有关,硬件公司写的,不同操作系统有在核内有在核外,不知道。虽然主流在核内。

磁盘调度,读写调度。电梯调度,判断题,前无古人?

填空题5大题20,4文件相关,5Unix,文件链接怎么换名,link和unlink。符号链接。创建和删除文件和符号链接的关系。

8个空,unix,第九章

文件系统

简答题10

核心态

调度算法scan

五个大题30

系统工作调用和函数

程序在干嘛

6分,肯定写过

这是第五题

第四题,地址变换,画了一张图,386,

第三题,页表结构。

第二题,死锁

第一题,PV操作实现同步互斥,猴子过桥读写问题改进

注意事项:答题纸,别作弊。

考试范围

操作系统是个平台,你不知道app用操作系统干什么,界面怎么设计,Unix里没有删除文(文件换名)件的系统调用,Unlink,link=0文件就没了。加一个文件名,减一个文件名。

界面设计。

课程内容

每次最后一排的人坐到最前面。

操作系统是什么?

上机实验

提前一天装好Ubuntu虚拟机,我用VMware16 pro装的最新版本,自己上网找办法破解一下,不像机组的时候装了个centos7还要自己配置网络,直接可以上浏览器。

linux

一些简单命令

whoami

who am i,参数-m也一样

用户分权,安全组策略。

who

所有命令都是可执行文件。

date,原子操作

ls,参数-a显示隐藏文件

  • -A 同 -a ,但不列出 “.” (目前目录) 及 “..” (父目录)
  • -F 在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/“
  • -R 若目录下有文件,则以下之文件亦皆依序列出
  • -t将文件以相反次序显示(原定依英文字母次序)
  • -l除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出

-rw——-. 1 root root 1.3K Dec 14 01:38 anaconda-ks.cfg

从上面可以看到,每一行都有7列,分别是:

  1. 第一列共10位,第1位表示文档类型,d表示目录,-表示文件,l表示链接文件,d表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限
  2. 第二列表示链接数,表示有多少个文件链接到inode号码。
  3. 第三列表示拥有者
  4. 第四列表示所属群组
  5. 第五列表示文档容量大小,单位字节
  6. 第六列表示文档最后修改时间,注意不是文档的创建时间哦
  7. 第七列表示文档名称。以点(.)开头的是隐藏文档

ps进程

pwd当前路径

clear

什么是文件?什么都是文件。

mkdir

touch用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。

rm,rmdir

cp从前到后

rm -rf /

vim

se nu行号

:/ 查找

1,23

VIM 的正常模式(Normal-model)

VIM 正常模式下,主要进行的操作有光标的移动,复制文本,删除文本,黏贴文本等。

快速移动光标

几个重要的快捷键

请记住这几个快捷键 h,j,k,l 这几个按键主要是用来快速移动光标的,h 是向左移动光标,l 是向右移动光标,j 是向下移动光标,k 是向上移动光标,h , j , k ,l 在主键盘区完全可以取代键盘上的 ↑ ,↓ ,← , → 的功能。

在当前行上移动光标

0 移动到行头

^ 移动到本行的第一个不是 blank 字符

$ 移动到行尾

g_ 移动到本行最后一个不是 blank 字符的位置

w 光标移动到下一个单词的开头

e 光标移动到下一个单词的结尾

fa 移动到本行下一个为 a 的字符处,fb 移动到下一个为 b 的字符处

nfa 移动到本行光标处开始的第 n 个 字符为 a 的地方(n 是 1,2,3,4 … 数字)

Fafa 一样,光标移动方向同 fa 相反

nFanfa 类似,光标移动方向同 nfa相反

ta 移动光标至 a 字符的前一个字符

nta 移动到第二个 a 字符的前一个字符处

Tata 移动光标方向相反

nTanta 移动光标方向相反

;, 当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 可以快速跳转到写一个指定的字符,, 是跳到前一个指定的字符

跨行移动光标

nG 光标定位到第 n 行的行首

gg 光标定位到第一行的行首

G 光标定位到最后一行的行首

H 光标定位到当前屏幕的第一行行首

M 光标移动到当前屏幕的中间

L 光标移动到当前屏幕的尾部

zt 把当前行移动到当前屏幕的最上方,也就是第一行

zz 把当前行移动到当前屏幕的中间

zb 把当前行移动到当前屏幕的尾部

% 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上

*# 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( * 是下一个,# 是上一个)

翻页操作

ctrl+f 查看下一页内容

ctrl+b 查看上一页内容

VIM 的复制,黏贴 ,删除

三个重要的快捷键 d , y , p

d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:

dw 删除一个单词

dnw 删除 n 个单词,

dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )

dnfa 删除光标处到第 n 个 a 的字符处

dd 删除一整行

ndd 删除光标处开始的 n 行

d$ 删除光标到本行的结尾

dH 删除屏幕显示的第一行文本到光标所在的行

dG 删除光标所在行到文本的结束

y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:

yw` 复制一个单词,还有 `ynw
yfa` 复制光标到下一个 a 的字符处,还有`ynfa
yy` 复制一行,还有 `nyy

y$ 复制光标到本号的结尾

yH 复制屏幕显示的第一行文本到光标所在的行

yG 复制光标所在行到文本的结束

pP是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。

p 在光标后开始复制

P 大写的 P 光标前开始复制

撤销操作和恢复

u 撤销刚才的操作

ctrl + r 恢复撤销操作

删除字符操作和替换

x 删除光标当前所在的字符

r 替换掉光标当前所在的字符

R 替换掉从光标开始以后的所有字符,除非 <ESC > 退出,或者 jj (代替 上文有提到)退出。

shell


另见博客


实验一Hello world

#include 
#include 

main()
{
printf("Hello World!\n");
}
#include 
#include 

int main()
{
printf("Hello World!\n");
return 123;
}
#include 
#include 

int main(int argc,char* argv[])
{
    int i;
    for(i=0;i
#include 
#include 

int main(int argc,char* argv[],char **envp)
{
    int i;
    for(i=0;;i++){
        if (envp[i]==NULL) break;
        printf("%d:%s\n",i,envp[i]);
    }
    return 123;
}
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
    int i;
    for(i=1;i<argc;i++){
        printf("%d:%s\n",i,getenv[argv[i]]);
    }
    return 123;
}

MY_V=123456

export MY_V

./a.out MY_V

实验二fork

fork
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main ()
{
    int pid;
    if((pid=fork())==0){
        printf("I am parent ,child PID is %d.\n",pid);
    }
    else
        printf ("I am child.\n");
}


#include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>

   main ()
 {
     int pid;
     if((pid=fork())!=0)
        printf("I am parent ,child PID is %d, my pid is %d.\n",pid,getpid());

     else{
         printf ("I am child,my pid is %d, my parent pid is %d.\n",getpid(),getppid());}
       //sleep(1);
}

p2.c

if else{} 并发性,父进程结束,1号进程成为父进程。进程duplicate自己创建子进程。

p3.c

sleep(1)

p4.c

pid_t wait(int *status);//父进程等待子进程结束
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main ()
{
    printf("Begin\n");
    exit(123);
    printf("End\n");
}

echo $?

p5.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h> 

int main ()
 {
     int pid,status;
     if((pid=fork())!=0){
        printf("I am parent ,child PID is %d, my pid is %d.\n",pid,getpid());
        wait(&status);
        /*if (WIFEXITED(status))
            printf("Child return code is %d\n",WEXITSTATUS(status));
        else
            printf("Child exit abnormally\n");
    */
        printf("Child return code is %d\n",WEXITSTATUS(status));
        return 200;}
     else{
        printf ("I am child,my pid is %d, my parent pid is %d.\n",getpid(),getppid());}
        //exit(123); 
        //for (;;);
        return 100;
}

p6.c

exit(123)

p7.c

死循环,kill -1 2219,返回“Child return code is 0”

异常返回

实验三execve

SYNOPSIS

#include 
#include 
#include 

main()
{
    execl("/bin/ls","ls","-al",NULL);
    //printf("hello world!\n");
    //无输出
    // The exec() family of functions replaces the current process image with
    // a new process image. 
}

实验四pipe

ls|sort

ls|sort -r

#include
#include
#include

main(){
    int fd[2];
    pipe(fd);//创建一个管道

    if(fork()!=0){
        close(1);//关闭标准输出
        dup(fd[1]);//标准输出描述符接上管道输出fd
        close(fd[0]);
        close(fd[1]);
        //execl("/bin/ls","ls",NULL);
    }else{
        close(0);
        dup(fd[0]);
        close(fd[0]);
        close(fd[1]);
        //execl("/bin/sort","sort","-r",NULL);
    //execlp(“sort”,"sort",NULL);
    }

}

tee连接多个管道

grep搜索

sort文件位置找不到,whereis找一下

实验五


资料

CSDN的Linux中编写Shell脚本

菜鸟教程shell

Shell 在线工具

资料

知乎

看完这篇Linux基本的操作就会了 - Java3y的文章 - 知乎

CSDN

ubuntu 16.04 更改系统语言为简体中文

linux教程

linux菜鸟教程

做个简单的OS

清华学堂在线

【清华大学操作系统课】虚拟机实验环境搭建-手把手图文教程


   转载规则


《SHU操作系统》 Henry-Avery 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录