天天看点

SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

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后台挂起的切换到前台运行;
SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

实验2

文件系统直接输入下面的/bin即可

SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9
  • SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

find ./ -name demo **。**表示当前文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vdS1IJL-1630569484202)(…/…/…/pictures-md/image-20210405110518716.png)]

vi编辑器

esc切换模式;

i插入

:命令 w 文件名; r文件名将文件内容缓冲出来;:wq保存退出;:wq!不保存退出;

  • 文件属性:
SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cL9h3TtE-1630569484204)(…/…/…/pictures-md/image-20210405110853405.png)]

1-三

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GY5Gk431-1630569484205)(…/…/…/pictures-md/image-20210329125321057.png)]

^c强制停止当前进程

SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

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()**控制保证进程顺序

  • 信号
SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

实验5进程同步

  1. 同步意思:使用信号量表明某一个资源的允许的进程数有几个,正数表示允许几个进程使用;用来控制进程顺序关系;

(设置为1,实现进程先后关系的控制。)

  1. 互斥:某一个资源不允许与其他进程干扰,
  2. p()挂起;v()继续运行;

信号灯:互斥信号灯

信号量大于0,进程资源还有,可以进行;

使用进程时,使用down对信号量控制,表示占用资源;

up释放信号量。

4.出现问题:

SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

代码书写错误,每次需要对全部的互斥信号和同步信号进行set获取;

段错误:去除缓存区读取的可能的越界错误;

代码冗长期中很大部分重复内容,多个代码块之间的信号量是否可以互相使用,是否存在重复申请信号量?

先测试进程后,之后测试不能阻塞:

原因:先前使用的信号量未释放,使用的是原来的信号量,信号量保持不变,不能阻塞,持续运行;解决:通过ipcrms -a 删除所有的信号量(原来的consumer进程没有销毁?)。

  1. 共享内存是 OS 内核为并发进程间交换数据而提供的一块内存区(段)。如果段

    的权限设置恰当,每个要访问该段内存的进程都可以把它映射到自己私有的地址空

    间中。如果一进程更新了段中数据,那么其他进程立即会看到这一更新。进程创建

    的段也可由另一进程读写。

    ipcs 观察共享内存消息队列,信号量情况。linux 的 proc 文件系统中有 3 个虚拟文件动态记录了由以上 ipcs 命令显示的

    当前 IPC 对象的信息;

    1. 进程同步的意义:多个进程访问一段内存时,可能出现一个读映射到自己的内存,一个写,映射到自己的内存然后写回,这样会导致不一致,需要控制写时不允许读写,读时不允许写,也就是进程之间的顺序,将进程之间的顺序称之为同步;
    互斥为某一个资源只能被一个进程使用,为特殊的同步,成为互斥。
    1. 信号灯(信号量)是整数变量,只能通过原子操作访问(一次一个),一个进程操作信号量,不能有其他进程操作信号量;分为计数信号量,用于同步,表示可用资源的数量,为0时进程阻塞;二进制信号量,表示临界问题,初始化为1,为0时,进程阻塞;

      信号量变化对应计算机内资源的分配;

    2. 通过测试,均能够满足要求。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfdC1ILB-1630569484210)(…/…/…/pictures-md/{6CF788E3-DA0D-4EB1-ACB9-5B21F5315D80}.png-1620204506847.jpg)]

ex9

SDU操作系统实验记录Linux实验2实验三实验5进程同步ex9

无调度;

SDU操作系统实验记录Linux实验2实验三实验5进程同步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,重新排序

   ③当需要淘汰数据时,淘汰队列最末端数据
           

继续阅读