Linux
/bin 常用命令
/home 主目录,每个用户一个主目录,以用户名命名
/root超级管理员
/boot 启动核心文件
/media 识别设备
/user/local 安装软件的目录
/var 不断扩充
- 帮助:man ls
- 列文件 ls -l hello
- man -a sleep相关文档
- 终端切换Alt+Ctrl+F1 、2/3
- $exit退出当前终端账户
- shutdown关机
- ls -a,ls -d*
- rmdir a,mkdir a
- cd -返回上次访问文件夹,cd 进入根目录;
- touch test。cpp创建不进入;vim t.cpp进入编辑;
- gcc hello。c;
- ctri+z进程挂起,jobs看到后台挂起进程;fg %1后台挂起的切换到前台运行;

实验2
文件系统直接输入下面的/bin即可
-
SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9
find ./ -name demo **。**表示当前文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vdS1IJL-1630569484202)(…/…/…/pictures-md/image-20210405110518716.png)]
vi编辑器
esc切换模式;
i插入
:命令 w 文件名; r文件名将文件内容缓冲出来;:wq保存退出;:wq!不保存退出;
- 文件属性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cL9h3TtE-1630569484204)(…/…/…/pictures-md/image-20210405110853405.png)]
1-三
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GY5Gk431-1630569484205)(…/…/…/pictures-md/image-20210329125321057.png)]
^c强制停止当前进程
grep word file 在某个文件中查找
<<追加,》输出到目标文件,
- shell可以编程序,常见控制符
*一串字符匹配,?一个字符,【0-9】属于该范围的一组字符串
- 输入输出重定向
输入重定向符<,表示输入来自其右边说明的文件或设备。例如:
$read < mytext
不是从键盘而是从 mytext 文件读入内容。
输出重定向符―>‖, 表示输出将创建并发向其右边说明的目标,例如:
$ls > filelist
将创建文件 filelist,并将列出的当前目录的文件名存入其中。
输出重定向符>>, 表示将追加输出到其右边说明的目标,例如:
$ls >> filelist
将列出的当前目录文件名追加存入 filelist 中。
管道操作符―|‖, 表示连接一个命令的输出到另一个命令的输入,例如:
$ls | sort | lp
将列出的当前目录的文件名排序后送入打印队列。
I/O 重定向和管道可以组合使用。例如:
$ls >filelist | sort
ls 列出的当前目录的文件名存入文件 filelist 后,再通过 sort 命令排序显示
- 命令控制符
命令连接符 ; 可以在一行上连发多个命令
ls;ls-l;
&启动命令后台执行
- shell环境变量
引用 Shell 变量的值时需要前导一个―$‖符号一般为大写字母;命令 echo 显示变量的值
显示命令搜索路径:
echo $PATH
赋值号为 =
set 命令察看当前设定的 shell 变量
用户主目录:HOME
用户名:USER
计算机名:HOSTNAME
计算机类型:HOSTTYPE
终端类型:TERM
命令搜索路径:PATH
当前使用的 shell 的路径:SHELL
shell 一级提示符:PS
gcc
gcc 能够支持多种 C 语言的变体,g++是构建于 gcc 基础上的 C++语言编译器
- make 不知
编译 生成可执行文件 gcc -g file.c -o file
执行 ./file
gdb追踪 gdb ./file
list 7 列出代码
run
step
next(行)
continue
quit
print a变量
实验三
#include "pctl.h"
char *args[] = {"/bin/ps", NULL, NULL};//列出进程
char *args2[] = {"/bin/ls", NULL, NULL};//列出文件
int main(int argc, char *argv[])
{
int pid1,pid2;
int status;
signal(SIGINT, (sighandler_t)sigcat);
while (1)//控制循环
{
pid1=fork();//进入进程1
if(pid1<0){
printf("pid1 wrong");
}
if(pid1==0){//对1,pid1=0;
pause();//先挂起返回主进程,pid1=+n;
sigcat(SIGINT,execve(args2[0],args2,NULL));//有输入的话执行
}
else//进入这里
{
pid2=fork();//进入pid2,为0
if(pid2<0){
printf("pid1 wrong");
}
else if (pid2==0)
{
execve(args[0],args,NULL);//执行完成后为+n
}
else
{
wait(NULL);
kill(pid1,SIGINT);//传中断信号
}
wait(NULL);//上面全部完成后,再开始下一轮。
sleep(3);
}
}
return EXIT_SUCCESS;
}
fork 对父进程返回进程号正数,对子进程返回零;每次fork进入新进程;wait(null)等待子进程全部执行完毕,然后返回上一级进程;
kill传中断信号
**wait()**控制保证进程顺序
- 信号
实验5进程同步
- 同步意思:使用信号量表明某一个资源的允许的进程数有几个,正数表示允许几个进程使用;用来控制进程顺序关系;
(设置为1,实现进程先后关系的控制。)
- 互斥:某一个资源不允许与其他进程干扰,
- p()挂起;v()继续运行;
信号灯:互斥信号灯
信号量大于0,进程资源还有,可以进行;
使用进程时,使用down对信号量控制,表示占用资源;
up释放信号量。
4.出现问题:
代码书写错误,每次需要对全部的互斥信号和同步信号进行set获取;
段错误:去除缓存区读取的可能的越界错误;
代码冗长期中很大部分重复内容,多个代码块之间的信号量是否可以互相使用,是否存在重复申请信号量?
先测试进程后,之后测试不能阻塞:
原因:先前使用的信号量未释放,使用的是原来的信号量,信号量保持不变,不能阻塞,持续运行;解决:通过ipcrms -a 删除所有的信号量(原来的consumer进程没有销毁?)。
-
共享内存是 OS 内核为并发进程间交换数据而提供的一块内存区(段)。如果段
的权限设置恰当,每个要访问该段内存的进程都可以把它映射到自己私有的地址空
间中。如果一进程更新了段中数据,那么其他进程立即会看到这一更新。进程创建
的段也可由另一进程读写。
ipcs 观察共享内存消息队列,信号量情况。linux 的 proc 文件系统中有 3 个虚拟文件动态记录了由以上 ipcs 命令显示的
当前 IPC 对象的信息;
- 进程同步的意义:多个进程访问一段内存时,可能出现一个读映射到自己的内存,一个写,映射到自己的内存然后写回,这样会导致不一致,需要控制写时不允许读写,读时不允许写,也就是进程之间的顺序,将进程之间的顺序称之为同步;
-
信号灯(信号量)是整数变量,只能通过原子操作访问(一次一个),一个进程操作信号量,不能有其他进程操作信号量;分为计数信号量,用于同步,表示可用资源的数量,为0时进程阻塞;二进制信号量,表示临界问题,初始化为1,为0时,进程阻塞;
信号量变化对应计算机内资源的分配;
- 通过测试,均能够满足要求。
ex9
无调度;
现象error;
ecloc:
如果used和dirty bit都是0,那么替换掉;如果其中一个是1,那么把这一位设置为0,指针往下走;如果都是1,那先把used换为0,说明有2次机会。
LFU(Least Frequently Used),表示最近使用次数最少来进行淘汰,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。其相关也有好几种不同的LFU算法,主要有 LFU*、LFU- Aging、LFU*-Aging、 Window-LFU等。
LFU中的每条数据都需要记录一个访问次数,所有的数据按照访问次数排序,当缓存存满时在插入数据满,删除数据则删除访问次数最少的那一条。
其主要思路:
① 新加入数据加入队尾,引用计数记为1
②队列中的数据被访问后,引用计数加1,重新排序
sed),表示最近使用次数最少来进行淘汰,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。其相关也有好几种不同的LFU算法,主要有 LFU*、LFU- Aging、LFU*-Aging、 Window-LFU等。
LFU中的每条数据都需要记录一个访问次数,所有的数据按照访问次数排序,当缓存存满时在插入数据满,删除数据则删除访问次数最少的那一条。
其主要思路:
① 新加入数据加入队尾,引用计数记为1
②队列中的数据被访问后,引用计数加1,重新排序
③当需要淘汰数据时,淘汰队列最末端数据