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列,分别是:
- 第一列共10位,第1位表示文档类型,
d
表示目录,-
表示文件,l
表示链接文件,d
表示可随机存取的设备,如U盘等,c
表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---
的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限。 - 第二列表示链接数,表示有多少个文件链接到inode号码。
- 第三列表示拥有者
- 第四列表示所属群组
- 第五列表示文档容量大小,单位字节
- 第六列表示文档最后修改时间,注意不是文档的创建时间哦
- 第七列表示文档名称。以点(.)开头的是隐藏文档
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 … 数字)
Fa
同 fa
一样,光标移动方向同 fa
相反
nFa
同 nfa
类似,光标移动方向同 nfa
相反
ta
移动光标至 a 字符的前一个字符
nta
移动到第二个 a 字符的前一个字符处
Ta
同 ta
移动光标方向相反
nTa
同 nta
移动光标方向相反
;
和,
当使用 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
复制光标所在行到文本的结束
p
,P
是黏贴的意思,当执行完复制或者黏贴的命令以后,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找一下
实验五
资料
资料
知乎
看完这篇Linux基本的操作就会了 - Java3y的文章 - 知乎