2022 Linux 笔试主要内容
看前须知道 带【】的都是老师复习课上提到的内容,但不代表说一定会考哦!
选择题(20分)
填空题(20分)
判断题(10分)【侧重 前面4个章节,偏理论的】
简答题6道(30分)【侧重在第四章 进程部分】
综合题(20分):
- shell编程、
- 进程PV编程
- C语言编程【附录里有,但会结合PV操作】
- Makefile编写【实验里的】
文章目录
- 2022 Linux 笔试主要内容
- 一、Linux常用命令(选择、填空、判断)
- 1、文件操作命令
- 2、目录操作命令Linux 操作系统中常用的目录操作命令包括:
- 3、文件的权限信息
- 4、联机帮助
- 5、输入/输出重定向(> / >> / < / |)
- 6、vi基本用法
- 7、GCC编译命令【要掌握分步到位 下面那4个】
- 8、Makefile【复习一下之前的实验】-【书本P311 题目可能会给一张依赖树的图,让我们写出Makefile 或者是 给Makefile 来画依赖书(就是考它们的转换嘛)】
- 9、操作系统的主要功能【书本P3】
- 10、进程的概念【重要】【书本P70】
- 11、引入进程的意义【书本P68】
- 12、进程管理的功能
- 13、程序顺序执行的特点【书本P68】
- 14、程序并发执行的特点【书本P68】
- 15、进程的基本状态及转换
- 16、进程控制块(PCB)的概念、作用【P71】
- 17、PCB主要包括4方面的内容【书本P72】
- 18、Linux查看进程、关闭进程的命令【P74】
- 19、Linux系统的内核主要由4部分构成【书本P76】
- 20、fork()、exec() 系统函数的作用【书本P82、P83】
- 21、Linux系统的内核主要构成
- 22、CPU的执行模式【书本P77】
- 23、原语与普通函数的区别【老师给的pdf P86】
- 24、进程调度的功能【不只是功能,还要关注调度的时机,复习的时候要与前面讲的“进程的状态转换”联系起来】
- 25、常用的进程调度算法及其特点【书本P90】
- 26、临界资源、临界区的概念【书本P99】
- 27、进程互斥、进程同步的概念【书本4.6节】
- 28、信号量与P、V操作【主要是针对信号量、考试会考,让我们选择对哪个信号量进行P、V操作(进出公园做登记的例子)】
- 29、进程的通信方式【书本P104】
- 30、生产者和消费者-进程同步【书本P101(读写缓冲区)】
- 31、停车场-进程的互斥(这不还是进出公园登记嘛)
- 32、死锁产出的原因及解决措施【书本P103】
- 二、简答题
- 1、什么是操作系统?
- 2、进程调度的功能是什么,调度工作包含哪些内容?
- 3、操作系统为什么要引入进程概念,进程管理的功能是什么?
- 4、目前操作系统采用的目录结构是什么?它具有什么优点?
- 5、CPU两种工作状态, 为何要区分CPU的两种工作状态?
- 6、简述Linux系统支持的5种进程通信机制
- 7、什么是绝对路径与相对路径,若要由/usr/share/doc进入到/usr/share/man写出相对路径与绝对路径所用的命令
- 8、简述常用的4种进程调度算法,并说明它们各自的优缺点
- 9、画Linux系统的进程状态转换图,并注明各种状态转换的条件【画图的时候要注明清楚 状态 和 转换时间】
- 10、简述引发进程调度的4种时机
- 11、进程间的制约关系
- 12、进程与程序是两个完全不同的概念,但又有密切的联系,试写出两者的联系与区别。【书本P70】
- 13、PCB的作用??为什么说PCB是进程存在的唯一标志?【书本P71】
- 14、什么是临界区?进程进入临界区的调度原则是什么?
- 15、简述使用信号量进行进程间通信
- 16、在单处理机环境下,进程间有哪几种通信方式,是如何实现的
- 三、应用题
- 四、Shell(包括课后习题)
- 复习一下 怎么生成和执行脚本
- 1.编写个一个shell脚本,用来累加用户输入的多个数字,并在屏幕上输出累加的结果
- 2.求100内的质数
- 3.编写一个Shell脚本,它能计算用户通过命令行参数形式提供的多个整数的平均数
- 4.编写个shell程序来判断用户所输入的参数是否是一个数字
- 5.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下
- 6.编写shell脚本,实现如下功能:(1)从命令行读入2个整数;(2)对两个数进行大小比较;(3)在屏幕上输出比较结果。
- 7.编写shell程序,实现自动删除50个账号的功能。账号名为user1至user50
- 8.编写一个Shell脚本,它能够显示下面序列的前10个数字:0,1,1,2,3,5,8,13,…....
- 9.编写一个Shell脚本,它能将用户提供的二进制数转化为十进制数
- 结束,在这也预祝大家能考出理想的成绩,过个开心年!新年快乐呀!!
一、Linux常用命令(选择、填空、判断)
1、文件操作命令
Linux 操作系统中常用的文件操作命令包括:
ls:用于显示文件列表。
cd:用于切换当前工作目录。
cp:用于复制文件。
mv:用于移动或重命名文件。
rm:用于删除文件。
touch:用于创建新文件或更新文件的时间戳。
mkdir:用于创建新的目录。
rmdir:用于删除空的目录。
find:用于查找文件。
grep:用于在文件中搜索指定的字符串。
这些命令均可以在 Linux 终端中使用,方便进行文件的管理操作。
此外,还有一些其他的文件操作命令,如 chmod、chown 等,它们可以用于修改文件的权限或所有者信息。
2、目录操作命令Linux 操作系统中常用的目录操作命令包括:
Linux 操作系统中常用的目录操作命令包括:
ls:用于显示目录的内容。
cd:用于切换当前工作目录。
mkdir:用于创建新的目录。
rmdir:用于删除空的目录。
pwd:用于显示当前工作目录的路径。
tree:用于显示目录结构。
这些命令均可以在 Linux 终端中使用,方便进行目录的管理操作。
此外,还有一些其他的目录操作命令,如 mv、cp 等,它们可以用于移动或复制目录。
3、文件的权限信息
文件的权限信息指的是文件所有者及其他用户对文件的操作权限。
Linux 系统中,文件的权限信息可以用数字和字母的组合来表示,一般由 3 个部分组成。
!!!还不如一道题目来的干脆!!!
4、联机帮助
( man help who date pwd cd cp ls mkdir rmdir cat more less rm mv wc sort chmod touch find grep chown ps kill )
这些命令均为 Linux 系统中常用的命令。
1.【 man:用于显示命令的手册页。】
使用方法:
man command
例如:
man ls # 显示 ls 命令的手册页
2. 【help:用于显示命令的帮助信息。】
使用方法:
help [command]
例如:
help ls # 显示 ls 命令的帮助信息
如果省略 command 参数,则会显示当前 shell 的帮助信息。
3. 【who:用于显示当前登录的用户信息。】
使用方法:
who [options]
常用选项:
-a:显示所有信息,包括用户登录时间、进程 ID 等。
例如:
who # 显示当前登录的用户信息
who -a # 显示所有信息
输出信息中,第一列表示用户名,第二列表示登录的设备名称,第三列表示登录时间,第四列表示进程 ID
(只有在使用 -a 选项时才会显示)
4. 【date:用于显示或设置系统时间。】
使用方法:
date [options] [+format]
常用选项:
-d:显示指定日期。
-s:设置系统时间。
例如:
date # 显示当前系统时间
date -d "2022-12-23 12:34:56" # 显示指定日期 2022-12-23 12:34:56 的时间
date -s "2022-12-23 12:34:56" # 设置系统时间为 2022-12-23 12:34:56
注意:使用 -s 选项设置系统时间时,需要超级用户权限。
5. 【pwd:用于显示当前工作目录的路径。】
使用方法:
pwd
例如:
pwd # 显示当前工作目录的路径
注意:pwd 命令不带任何参数。
6. 【cd:用于切换当前工作目录。】
使用方法:
cd [directory]
例如:
cd /home/user # 切换到 /home/user 目录
cd .. # 切换到上一级目录
cd ~ # 切换到当前用户的主目录
注意:
如果省略 directory 参数,cd 命令将会切换到当前用户的主目录。
7.【 cp:用于复制文件或目录。】
使用方法:
cp [options] source destination
常用选项:
-r:复制目录时,递归复制其子目录。
-p:复制文件时,保留其原有的权限、时间戳等属性。
例如:
cp file1.txt file2.txt # 复制文件 file1.txt 到文件 file2.txt
cp -r dir1 dir2 # 复制目录 dir1 到目录 dir2,并递归复制其子目录
cp -p file1.txt file2.txt # 复制文件 file1.txt 到文件 file2.txt,并保留其原有的权限、时间戳等属性
注意:
如果目标文件已存在,使用 cp 命令将会覆盖该文件。
如果希望在复制时保留原有文件,可以使用 cp -i 选项,在覆盖文件时会提示用户确认。
8. 【ls:用于显示目录的内容。】
使用方法:
ls [options] [file...]
常用选项:
【-l:以长格式显示文件信息。】
-a:显示所有文件,包括以 . 开头的隐藏文件。
-h:以人类可读的方式显示文件大小。
-r:逆序显示文件。
例如:
ls # 显示当前目录的内容
ls -l # 以长格式显示当前目录的内容
ls -a # 显示当前目录的所有文件
ls -h # 以人类可读的方式显示当前目录的文件大小
ls -r # 逆序显示当前目录的内容
ls dir # 显示目录 dir 的内容
9. 【mkdir:用于创建新的目录。】
使用方法:
mkdir [options] directory
常用选项:
【-p:如果指定的目录的父目录不存在,则同时创建父目录。】
-m:设置目录的权限。
例如:
mkdir dir # 创建名为 dir 的目录
mkdir -p dir/subdir # 创建名为 dir/subdir 的目录,如果父目录 dir 不存在,则同时创建
mkdir -m 755 dir # 创建名为 dir 的目录,并设置权限为 755
10. 【rmdir:用于删除空的目录。】
rmdir [options] directory
常用选项:
-p:删除目录时,连同其父目录一起删除。
例如:
rmdir dir # 删除空的目录 dir
rmdir -p dir/subdir # 删除空的目录 subdir,并同时删除其父目录 dir
注意:
使用 rmdir 命令删除目录时,该目录必须是空的,否则将会报错。
如果要删除非空的目录,可以使用 rm -r 命令。
11. 【cat:用于显示文件内容。】
使用方法:
cat [options] file
常用选项:
-n:在每行开头显示行号。
-E:在行末出现超过一个屏幕宽度的内容时,在行末显示 $。
例如:
cat file.txt # 显示文件 file.txt 的内容
cat -n file.txt # 显示文件 file.txt 的内容,并在每行开头显示行号
12.【more:用于分页显示文件内容。】
使用方法:
more [options] file
常用选项:
-d:在输出底部显示提示信息。
-l:将所有行显示为一行。
例如:
more file.txt # 分页显示文件 file.txt 的内容
more -d file.txt # 分页显示文件 file.txt 的内容,并在输出底部显示提示信息
注意:more 命令相对于 less 命令来说功能较弱,不支持查找等功能。
13. 【less:用于分页显示文件内容。】
使用方法:
less [options] file
常用选项:
-E:在行末出现超过一个屏幕宽度的内容时,在行末显示 $。
-N:在每行开头显示行号。
-S:将连续多个空行压缩为一行。
例如:
less file.txt # 分页显示文件 file.txt 的内容
less -E file.txt # 分页显示文件 file.txt 的内容,并在行末显示 $
14. 【rm:用于删除文件。】
使用方法:
rm [options] file...
常用选项:
-f:强制删除,即不做任何询问就直接删除。
-i:在删除文件时询问用户确认。
-r:递归删除,即删除目录时将其中的所有文件和子目录一起删除。
例如:
rm file.txt # 删除文件 file.txt
rm -f file.txt # 强制删除文件 file.txt
rm -i file.txt # 删除文件 file.txt,并在删除时询问用户确认
rm -r dir # 递归删除目录 dir 及其中的文件和子目录
注意:rm 命令删除的文件不会进入回收站,删除后文件将无法恢复,请慎用。
需要注意的是,rm 命令默认不会删除目录,如果希望删除目录,需要使用 -r 或 -R 选项。
15. 【mv:用于移动或重命名文件或目录。】
使用方法:
mv [options] source destination
常用选项:
-f:强制覆盖已存在的文件。
-i:在覆盖文件时询问用户确认。
例如:
mv file.txt dir/ # 将文件 file.txt 移动到目录 dir 中
mv dir1 dir2 # 将目录 dir1 重命名为 dir2
mv -i file1.txt file2.txt # 将文件 file1.txt 覆盖为 file2.txt,并在覆盖时询问用户确认
注意:
使用 mv 命令移动或重命名文件或目录时,如果目标文件或目录已存在,默认情况下会覆盖已存在的文件或目录。
如果希望在覆盖文件时询问用户确认,可以使用 -i 选项。如果希望强制覆盖已存在的文件,可以使用 -f 选项。
16. 【wc:用于统计文件的字符数、单词数和行数。】
使用方法:
wc [options] file...
常用选项:
-c:统计字符数。
-w:统计单词数。
-l:统计行数。
例如:
wc file.txt # 统计文件 file.txt 的字符数、单词数和行数
wc -c file.txt # 统计文件 file.txt 的字符数
wc -w file.txt # 统计文件 file.txt 的单词数
wc -l file.txt # 统计文件 file.txt 的行数
注意:
在使用 wc 命令时,可以同时指定多个文件,wc 命令会对每个文件分别统计信息。
若不指定文件,则默认使用标准输入作为输入文件,在该情况下,可使用管道符(|)将其他命令的输出作为 wc 命令的输入
例如:
cat file.txt | wc # 统计文件 file.txt 的字符数、单词数和行数
17. 【sort:用于对文件中的行进行排序。】
使用方法:
sort [options] file...
常用选项:
-n:按照数值大小排序。
-r:倒序排列。
-k:指定排序的字段。
例如:
sort file.txt # 对文件 file.txt 中的行进行升序排序
sort -r file.txt # 对文件 file.txt 中的行进行倒序排序
sort -k 2 file.txt # 对文件 file.txt 中的行按照第 2 列进行排序
注意:
使用 sort 命令时,可以同时指定多个文件,sort 命令会将所有文件的行合并排序。
若不指定文件,则默认使用标准输入作为输入文件,在该情况下,可使用管道符(|)将其他命令的输出作为 sort 命令的输入
例如:
还有一些其他的选项,如 -f 表示忽略大小写,-t 表示指定分隔符,-u 表示去除重复行等。
sort 命令默认情况下按照字典序排序,如果希望按照数值大小排序,可以使用 -n 选项。
cat file.txt | sort # 对文件 file.txt 中的行进行升序排序
18. 【chmod:用于修改文件的权限信息。】
使用方法:
chmod [options] mode file...
其中,mode 指定新的权限信息,可以使用符号或数字表示。
常用选项:
-R:递归修改,即对文件或目录的子目录中的文件也进行修改。
例如:【10个字符的意义】
chmod 755 file.txt # 修改文件 file.txt 的权限为rwxr-xr-x
chmod -R 755 dir # 递归修改目录dir 及其子目录中的文件的权限为rwxr-xr-x
chmod 777 file.txt # 给文件 file.txt 所有者、用户组、其他用户都赋予读、写、执行权限
chmod 755 file.txt # 给文件 file.txt 所有者赋予读、写、执行权限,用户组和其他用户赋予读、执行权限
chmod 644 file.txt # 给文件 file.txt 所有者赋予读、写权限,用户组和其他用户赋予读权限
注意:
在 Linux 系统中,文件的权限信息由 3 个部分组成,分别表示文件所有者、用户组、其他用户的权限。
每个部分分别包含 3 个权限位,分别表示读、写、执行权限。rwx
# r:读权限,代表 4。
# w:写权限,代表 2。
# x:执行权限,代表 1。
在修改权限时,可以使用符号或数字表示。
19. 【touch:用于修改文件的时间戳或创建新文件。】
touch 命令可以用于修改文件的时间戳,也可以用于创建新文件。
使用方法:
touch [options] file...
常用选项:
-a:修改文件的访问时间。
-m:修改文件的修改时间。
-c:不创建新文件,仅修改时间戳。
例如:
touch file.txt # 修改文件 file.txt 的时间戳
touch -c file.txt # 不创建新文件,仅修改文件 file.txt 的时间戳
touch newfile.txt # 创建一个名为 newfile.txt 的新文件
注意:
使用 touch 命令时,如果指定的文件不存在,则会创建新文件。如果文件已存在,则会修改其时间戳。
20. 【find:用于查找文件。】
find 命令是一个用于查找文件的命令,可以查找指定目录下的文件,并按照指定的规则进行过滤。
使用方法:
find path [options] [expression]
其中,path 指定要搜索的目录,options 指定搜索的规则,expression 指定过滤条件。
常用选项:
-name:按照文件名查找。
-type:按照文件类型查找。
-size:按照文件大小查找。
例如:
find . -name "*.txt" # 查找当前目录下所有名称以 ".txt" 结尾的文件
find / -type f -size +100M # 查找根目录下大小超过 100MB 的文件
注意:
find 命令可以通过使用表达式(expression)来进行精确的文件查找。
21. 【grep:用于在文件中查找指定的字符串。】
grep 命令是一个强大的文本搜索工具,可以在文件中查找指定的字符串。
使用方法:
grep [options] pattern [file...]
其中,pattern 指定要查找的字符串,file 指定要搜索的文件。
常用选项:
-i:忽略大小写。
-n:在输出结果中显示行号。
-v:反转查找结果,输出不包含指定字符串的行。
-c:仅输出包含指定字符串的行数。
例如:
grep "hello" file.txt # 在文件 file.txt 中查找包含 "hello" 的行
grep -i "hello" file.txt # 忽略大小写,在文件 file.txt 中查找包含 "hello" 的行
grep -v "hello" file.txt # 在文件 file.txt 中查找不包含 "hello" 的行
注意:
使用 grep 命令时,可以同时指定多个文件,grep 命令会在所有文件中查找指定的字符串。
如果不指定文件,则默认使用标准输入作为输入文件,在这种情况下,可以使用管道符(|)将其他命令的输出作为 grep 命令的输入,例如:
cat file.txt | grep "hello" # 在文件 file.txt 中查找包含 "hello" 的行
22. 【chown:用于修改文件所有者。】
chown 命令用于修改文件或目录的所有者。
使用方法:
chown [-R] owner[:group] file...
其中,-R 选项表示递归修改,即对文件或目录的子目录中的文件也进行修改。
例如:
chown user file.txt # 修改文件 file.txt 的所有者为 user
chown -R user dir # 递归修改目录 dir 及其子目录中的文件的所有者为 user
注意:
在修改文件所有者时,必须具有足够的权限才能执行操作。
通常情况下,只有文件的所有者或者超级用户(root)才能修改文件的所有者。
23. 【ps:用于显示当前系统的进程信息】
ps 命令是用于显示当前系统的进程信息的命令,其中进程信息包括进程的 PID(进程 ID)、进程的名称、进程的所有者、进程的状态等。
使用方法:
ps [options]
常用选项:
-e:显示所有进程的信息。
-f:显示完整信息,包括进程的父进程、进程所在组等。
-u:显示指定用户的进程信息。
-p:显示指定进程的信息。
例如:
ps -ef # 显示所有进程的信息
ps -u user # 显示指定用户的进程信息
ps -p 12345 # 显示 PID 为 12345 的进程信息
此外,ps 命令还有许多其他选项,可以根据需要使用。
例如
可以使用 -l 选项显示详细的进程信息,包括进程的虚拟内存使用情况、进程的 CPU 使用时间等。
还可以使用 -o 选项指定输出的信息格式,以便精确定位需要的信息。
24. 【kill:用于终止进程。】
kill 命令可以终止指定的进程,其中,参数 -9 强制终止进程,而不管进程的状态。
使用方法:
kill [-s signal | -p] [-a] [-q] [-l] [-v] [-signal] pid...
例如:
kill -9 12345 # 终止 PID 为 12345 的进程
注意:
使用 kill 命令终止进程时,应谨慎操作。
如果强制终止的进程是系统的关键进程,可能会导致系统不稳定甚至崩溃。
此外,使用 kill 命令时,需要注意进程的权限问题,只有进程的所有者或 root 用户才能终止进程。
5、输入/输出重定向(> / >> / < / |)
1. 输出重定向(>):用于将命令的输出结果重定向到文件中。
使用方法:
command > file
例如:
ls > file.txt # 将 ls 命令的输出结果重定向到文件 file.txt 中
注意:
如果文件已经存在,使用 > 重定向将会覆盖该文件的原有内容。
2. 输出重定向(>>):用于将命令的输出结果追加(≠覆盖)到文件的末尾。
使用方法:
command >> file
例如:
ls >> file.txt # 将 ls 命令的输出结果追加到文件 file.txt 的末尾
注意:
如果文件不存在,使用 >> 重定向将会创建该文件。
3. 输入重定向(<):用于将文件的内容作为命令的输入。
使用方法:
command < file
例如:
sort < file.txt # 将文件 file.txt 的内容作为 sort 命令的输入
注意:
输入重定向不能与管道符结合使用。
4. 管道符(|):用于将一个命令的输出结果作为另一个命令的输入。
使用方法:
command1 | command2
例如:
ls | grep "pattern" # 将 ls 命令的输出结果作为 grep 命令的输入,查找包含 "pattern" 的行
注意:
管道符可以连接多个命令,形成命令链。
例如:
ls | grep "pattern" | sort
#将 ls 命令的输出结果作为 grep 命令的输入,查找包含 "pattern" 的行,
#再将 grep 命令的输出结果作为 sort 命令的输入,对结果进行排序。
6、vi基本用法
vi 是一种功能强大的文本编辑器,在 Linux 系统中广泛使用。vi 命令可以在命令行下使用,也可以作为其他命令的编辑器使用。
vi 的常用命令如下:
进入 vi 编辑器:vi [filename]
保存文件::w
退出 vi 编辑器::q
退出并保存::wq
强制退出::q!
撤销上一次操作:u
删除一个字符:x
删除一行:dd
复制一行:yy
粘贴一行:p
查找字符串:/pattern
vi 主要有两种模式:命令模式
和输入模式
。
- 进入 vi 编辑器后,默认处于命令模式。在命令模式下,你可以输入
各种命令
来操作文本。 - 如果要输入文本,需要先按下
i
键进入输入模式,然后输入文本。输入完文本后,按下Esc 键
退回命令模式。
7、GCC编译命令【要掌握分步到位 下面那4个】
GCC(GNU Compiler Collection)是一组开源的编译器,用于编译 C、C++、Objective-C、Fortran、Ada 等语言。GCC 可以在 Linux 系统中通过命令行使用,也可以作为其他开发工具的编译器使用。
GCC 编译命令的基本格式如下:
gcc [options] source_files -o output_file
其中,source_files 指定要编译的源文件,output_file 指定编译后生成的目标文件的名称。options 指定编译选项,常用的编译选项如下:
-c:仅编译源文件,不链接。
-o:指定编译后生成的目标文件的名称。
-I:指定头文件的搜索目录。
-L:指定库文件的搜索目录。
-l:指定需要链接的库文件。
例如,要编译文件 main.c 并生成可执行文件 main,可以使用如下命令:(一步到位
)
gcc main.c -o main
例如,分步到位
gcc 编译过程 想看更详细的 参考这个链接
从hello.c
到 hello(或 a.out)
文件, 必须历经 hello.i
、 hello.s
、 hello.o
,最后才得到 hello(或a.out)
文件,分别对应着预处理
、编译
、汇编
和链接
4 个步骤,
这 4 步大致的工作内容如下:
- 预处理, C 编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩展、条件编译的选择等;
gcc -E hello.c -o hello.i
- 编译,将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件;
gcc -S hello.i -o hello.s
- 汇编,将汇编代码翻译成了机器码,但是还不可以运行;
gcc -C hello.s -o hello.o
- 链接,处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中
的合适信息,通常是虚拟地址。
gcc hello.o -o hello(或 a.out)
a.out 是 gcc 默认输出文件名称,可以通过-o 参数指定新的文件名。例如加上“-o hello”
8、Makefile【复习一下之前的实验】-【书本P311 题目可能会给一张依赖树的图,让我们写出Makefile 或者是 给Makefile 来画依赖书(就是考它们的转换嘛)】
Makefile 是一种描述如何编译和链接源文件的文本文件。
使用 Makefile 可以自动管理编译过程中的依赖关系,只有当源文件发生变化时才会重新编译
。
Makefile 的常见语法如下:
目标文件:依赖文件
命令
其中,目标文件
是要生成的文件,依赖文件
是用来生成目标文件的文件,命令是用来生成目标文件的命令。
举个例子:
Makefile test for exam program
#written by Emdoor
matexam mat.o exam.o main.o
gcc mat.o exam.o main.o -o matexam
mat.o mat.h mat.c
gcc -c mat.c -o mat.o
exam.o mat.h exam.h exam.c
gcc -c exam.c -o exam.o
main.o mat.h exam.h main.c
gcc -c main.c -o main.o
在这个例子中,matexam 是目标文件, mat.o exam.o main.o 是依赖文件,gcc 命令是用来生成目标文件的命令。
要使用 Makefile 编译程序,需要使用 make 命令。
例如:
make matexam
这条命令会检查 matexam 目标文件的依赖文件,如果有文件发生了变化,就会重新编译并生成新的目标文件。
Makefile 还有一些其他的常见用法:
-
变量定义:在 Makefile 中可以定义变量,例如 CC=gcc 表示定义了一个 CC 变量,值为 gcc。在命令中可以使用 $(CC) 来代替变量的值。
-
隐含规则:Makefile 中可以使用一些预定义的隐含规则,例如 .c.o 表示所有 .c 文件可以通过编译成 .o 文件。
-
模式规则:Makefile 中可以使用模式规则来匹配多个文件,例如 %.o: %.c 表示所有 .c 文件可以通过编译成 .o 文件。
Makefile 可以让我们更方便地管理编译过程,避免手动执行多条命令的麻烦。它是许多软件项目中常用的工具之一。
9、操作系统的主要功能【书本P3】
操作系统的主要功能包括:
- CPU管理、 存储管理、 文件管理、设备管理、 用户接口
10、进程的概念【重要】【书本P70】
进程是一个可并发执行的程序在一个数据集上的一次运行。简单地说,进程就是程序的一次运行过程。
进程是计算机中的程序的一次执行过程。在Linux系统中,每个进程都有一个唯一的进程 ID,每个进程都占用一定的系统资源,包括内存、文件描述符、信号处理程序等。进程可以通过系统调用 fork() 创建子进程,也可以通过 exec() 函数执行新的程序。进程可以通过信号互相通信,也可以通过管道或共享内存进行通信。
11、引入进程的意义【书本P68】
进程是现代操作系统的核心概念,它用来描述程序的执行过程,是实现多任务操作系统的基础。
12、进程管理的功能
进程管理是操作系统的一个重要功能,它负责创建、销毁、调度和管理进程。
具体功能包括:
- 创建进程:操作系统负责创建新的进程,包括分配进程所需的资源、设置进程的状态、分配进程的优先级等。
- 销毁进程:操作系统负责销毁不再需要的进程,释放进程占用的资源。
- 调度进程:操作系统负责决定哪个进程能够获得处理器的使用权,以便尽快完成任务。
- 管理进程:操作系统负责管理进程的资源,包括分配内存、分配输入/输出设备等。
进程管理的功能使得计算机能够有效地执行多个任务,同时还可以保证资源的合理利用,提高计算机的效率。
13、程序顺序执行的特点【书本P68】
14、程序并发执行的特点【书本P68】
15、进程的基本状态及转换
有两种 分别是 经典的3种
和 Linux下的5种
经典的3种【书本P71】
Linux下的5种【书本P72】
16、进程控制块(PCB)的概念、作用【P71】
17、PCB主要包括4方面的内容【书本P72】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RCEdrp9W-1672584903430)(null)]
——————
18、Linux查看进程、关闭进程的命令【P74】
查看进程:
ps
命令 — 查看当前运行的进程
例如:
ps aux #这条命令会列出当前系统中所有进程的信息。
关闭进程:
要关闭进程,可以使用 kill 命令。例如,要关闭进程 ID 为 12345 的进程,可以使用:
kill 12345 #这条命令会向进程发送信号,要求进程终止。
注意,如果进程不响应信号或者不能被终止,可以使用 kill -9 强制
终止进程。
19、Linux系统的内核主要由4部分构成【书本P76】
- 系统调用接口
- 进程管理子系统
- 文件与I/O子系统
- 硬件控制接口
20、fork()、exec() 系统函数的作用【书本P82、P83】
fork()
系统函数的作用是创建一个新的进程。
这个新的进程会拷贝调用 fork() 函数的进程的状态,然后从 fork() 函数的调用处开始执行。
fork() 函数会返回两次,一次在父进程中,一次在子进程中。(调用1次,返回2次)
在父进程中,fork() 函数返回子进程的进程号;在子进程中,fork() 函数返回0。
exec()
系统函数的作用是将参数中指定的程序代替当前进程执行。
这意味着,原来的进程会被销毁,替换成新的进程。
这个新的进程会从 exec() 函数的调用处开始执行。
在常用的操作系统中,fork() 和 exec() 经常被结合使用
,以创建一个新的进程并加载新的程序执行。
21、Linux系统的内核主要构成
Linux系统的内核主要由四部分
构成:
- 内核核心(Kernel Core):提供了系统调用、内存管理、进程管理、文件系统等基本功能。
- 核心态服务(Core Services):提供了驱动程序框架、网络协议栈、安全模块等服务。
- 内核态服务(Kernel Services):提供了常用的库函数、调试工具、系统信息获取等服务。
- 用户态服务(User Services):提供了应用程序所需的接口,如 C 库函数、图形界面库等。
22、CPU的执行模式【书本P77】
CPU执行模式是指 CPU 在执行程序时的工作方式。
23、原语与普通函数的区别【老师给的pdf P86】
什么是原语?
原语
是操作系统内核提供的特殊函数,它们是操作系统的基本功能,是操作系统的核心。原语通常在内核态运行,用于完成底层的操作,如内存管理、进程管理、文件系统等。
什么是普通函数?
普通函数
是用户程序中定义的函数,它们是用户程序的基本功能,是用户程序的核心。普通函数通常在用户态运行,用于完成应用程序的功能,如计算、输入输出等。
区别
原语与普通函数的区别
主要在于它们的运行环境和功能范围不同。原语是操作系统的核心,在内核态运行,用于完成底层的操作。而普通函数是用户程序的核心,在用户态运行,用于完成应用程序的功能。
书本上写的是
24、进程调度的功能【不只是功能,还要关注调度的时机,复习的时候要与前面讲的“进程的状态转换”联系起来】
书本上的内容【老师给的PDF P94】
25、常用的进程调度算法及其特点【书本P90】
特点:
-
先来先出法(First-Come, First-Served,FCFS)
优点:简单,易于实现。
缺点:不能有效地利用处理器的时间,对于长作业会带来较长的等待时间。 -
短进程优先(Shortest Job First,SJF)
优点:能够提高处理器的利用率。
缺点:需要对每个进程的执行时间进行预估,实际运行时间可能会与预估值有差异。 -
优先级调度法(Priority Scheduling)
优点:能够支持优先级的设置,提高重要进程的执行效率。
缺点:可能会导致高优先级的进程无法执行。 -
时机片轮转法(Round Robin)
优点:能够公平地分配处理器的使用权。
缺点:会导致系统的开销增加,因为每个进程都需要保存自己的运行状态。
26、临界资源、临界区的概念【书本P99】
27、进程互斥、进程同步的概念【书本4.6节】
进程互斥
(Mutual Exclusion,简称 Mutex)是指在多个进程之间,同一时间只有一个进程能够访问共享资源。这种机制可以保证在多进程环境下,共享资源不会被多个进程同时访问。
进程同步
(Synchronization)是指在多个进程之间,通过一些机制来协调进程的执行,使得进程的执行满足特定的关系。进程同步可以帮助解决进程之间的协作问题,如协作进程之间的数据传递、信号量的管理等。
28、信号量与P、V操作【主要是针对信号量、考试会考,让我们选择对哪个信号量进行P、V操作(进出公园做登记的例子)】
什么是信号量?
信号量(Semaphore)
是一种用于进程间同步的数据结构,可以在多个进程之间共享。信号量有一个计数器,表示当前可用的资源数量。
什么是P和V操作?
P(Proberen)操作
:进程请求一个资源。如果当前有足够的资源,则计数器减一,进程可以访问资源;如果当前没有足够的资源,则进程进入等待状态,直到有足够的资源为止。
V(Verhogen)操作
:进程释放一个资源。计数器加一,如果有进程正在等待该资源,则从等待队列中取出一个进程,让它访问资源。
信号量的P、V操作可以用于进程间的同步和互斥,保证在多个进程之间共享资源时的正确性。
29、进程的通信方式【书本P104】
30、生产者和消费者-进程同步【书本P101(读写缓冲区)】
生产者和消费者是一种常见的进程同步模型,表示有一个生产者进程生产物品,有一个消费者进程消费物品。这两个进程之间的同步是为了保证物品的生产和消费的正确性。
常见的解决方案
是使用缓冲区(Buffer)来存储物品。
生产者进程生产的物品放入缓冲区,消费者进程从缓冲区中取出物品消费。
当缓冲区为空时,消费者进程需要等待;当缓冲区满时,生产者进程需要等待。
为了保证同步的正确性
,可以使用信号量或互斥锁(Mutex)进行控制。
例如:
可以使用一个信号量表示缓冲区的可用空间,在生产者进程生产物品时进行P操作,在消费者进程消费物品时进行V操作;
或者使用互斥锁保护缓冲区的访问,在生产者进程和消费者进程访问缓冲区时进行加锁和解锁操作。
这种方案可以保证缓冲区在生产者进程和消费者进程之间的正确访问,从而保证物品的生产和消费的正确性。
但是,这种方案的缺点
是存在等待的情况,如果生产者进程生产速度较慢
或消费者进程消费速度较慢
,会导致其他进程的等待,降低
系统的效率
。
为了提高系统的效率,可以使用其他的解决方案,例如条件变量(Condition Variable)或消息队列。
31、停车场-进程的互斥(这不还是进出公园登记嘛)
停车场是一种常见的进程同步模型,表示有多辆车需要停放在停车场内,每辆车对应一个进程。停车场的容量有限,只能容纳一定数量的车辆。因此,当停车场满时,新的车辆进程需要等待;当停车场空时,车辆进程需要等待。
停车场进程的互斥是指在多个车辆进入和离开停车场时,需要保证车辆的正确性和安全性。
一种常见的方案是使用互斥锁
(Mutex)进行控制。
当车辆进入停车场时,需要加锁;当车辆离开停车场时,需要解锁。这样可以保证在任意时刻,只有一辆车可以进入或离开停车场。
此外,还可以使用信号量
(Semaphore)进行控制。
可以使用一个信号量表示停车场的剩余车位数量,在车辆进入停车场时进行P操作,在车辆离开停车场时进行V操作。这样可以保证在任意时刻,停车场的车位数量是正确的。
需要注意的是,在使用信号量或互斥锁时,需要考虑同步的正确性和效率,避免出现死锁或活锁的情况。
32、死锁产出的原因及解决措施【书本P103】
死锁产生的原因通常有以下几个方面:
解决死锁的常见方法有:
二、简答题
1、什么是操作系统?
操作系统(Operating System,简称 OS)
是计算机系统的核心部分,负责管理和控制计算机系统的硬件资源(如 CPU、内存、磁盘等)和软件资源(如程序、数据等),同时提供用户与计算机系统之间的接口。
2、进程调度的功能是什么,调度工作包含哪些内容?
进程调度是操作系统的一项核心功能,负责管理和调度计算机系统中的进程,以确保系统的有效运行。
具体来说,进程调度的功能包括:
- 调度进程的执行:进程调度负责决定哪个进程应该获得 CPU 的使用权,以便运行。
- 切换进程的执行:当进程获得 CPU 的使用权后,它会一直运行直到执行完毕或者被挂起。进程调度负责切换进程的执行,使得系统能够同时执行多个进程。
- 管理进程的状态:进程可以处于不同的状态,如就绪、运行、挂程。
- 管理进程的状态:进程可以处于不同的状态,如就绪、运行、挂起等。进程调度负责管理进程的状态,并决定下一个要调度的进程。
- 维护进程的优先级:进程可以有不同的优先级,优先级越高的进程越有可能获得 CPU 的使用权。进程调度负责维护进程的优先级,以决定下一个要调度的进程。
调度工作包括以上几项内容,主要是负责确定哪些进程应该获得 CPU 的使用权,以及如何切换进程的执行。
3、操作系统为什么要引入进程概念,进程管理的功能是什么?
操作系统引入进程概念是为了更好地管理和控制计算机系统的资源。进程是操作系统中资源分配和调度的基本单位,它把计算机系统中的程序和数据封装起来,方便进行调度和管理。
进程管理的功能包括:
- 创建和销毁进程:操作系统要能够创建和销毁进程,以满足用户的需求。管理进程的状态:操作系统要能够维护进程的状态,并能够根据进程的状态决定下一步的操作。
- 切换进程的执行:操作系统要能够切换进程的执行,使得系统能够同时执行多个进程。
- 维护进程的优先级:操作系统要能够维护进程的优先级,以便根据优先级决定调度的顺序。
此外,进程管理还包括其他功能,如进程通信、同步和互斥等。
4、目前操作系统采用的目录结构是什么?它具有什么优点?
**目前操作系统中常用的目录结构是树形目录结构。**树形目录结构是把目录组织成一个树状结构,根目录是树的根节点,其他目录是根目录的子目录,每个目录可以有若干子目录,形成一个多层的树状结构。
树形目录结构具有如下优点:
- 方便文件组织和管理:树形目录结构把文件和目录组织成一个多层的树状结构,方便用户组织和管理文件。
- 方便文件查找:树形目录结构把文件和目录组织成一个层次关系,可以通过层次关系来快速查找文件。
- 有利于跨平台兼容:树形目录结构是目前比较流行的目录结构,跨平台兼容性好,可以在不同的操作系统中使用。
5、CPU两种工作状态, 为何要区分CPU的两种工作状态?
CPU有两种工作状态,分别是用户态和内核态。
- 用户态:用户态是 CPU 为应用程序服务的状态。在用户态下,CPU 可以执行用户程序的指令,但是不能直接访问系统的硬件资源,必须通过系统调用来访问。
- 内核态:内核态是 CPU 为操作系统服务的状态。在内核态下,CPU 可以直接访问系统的硬件资源,也可以执行操作系统的指令。
为什么要区分 CPU 的两种工作状态呢?
这是因为,在用户态下,CPU 只能访问用户程序的指令,不能访问系统的硬件资源,这样可以防止应用程序直接访问系统的硬件资源,从而保证系统的安全性。而在内核态下,CPU 可以访问系统的硬件资源,因此可以执行操作系统的指令,比如访问硬盘、执行中断处理等。通过这种方式,操作系统可以控制系统的资源,保证系统的正常运行。
6、简述Linux系统支持的5种进程通信机制
Linux系统支持五种进程间通信机制,分别是:
- 管道(Pipe):管道是一种半双工通信机制,可以在两个相互关联的进程之间进行通信。管道分为有名管道和无名管道。有名管道是在文件系统中的一个文件,可以被所有进程访问,可以实现跨进程间的通信。无名管道是在内存中的一个缓冲区,只能被进程组内的进程访问,只能实现同进程组内进程间的通信。
- 信号量(Semaphore):信号量是一种整型变量,用于控制多个进程对共享资源的访问。信号量可以用于实现互斥和同步。
- 共享内存(Shared Memory):共享内存是一段内存区域,可以被多个进程共同访问。共享内存可以用于实现高效的进程间通信。
- 消息队列(Message Queue):消息队列是一种异步通信机制,可以在不同进程之间传递消息。消息队列由消息发送进程和消息接收进程组成,消息发送进程向消息队列中写入消息,消息接收进程从消息队列中读取消息。
- 套接字(Socket):套接字是一种通信机制,可以在不同计算机之间进行通信。套接字可以用于实现跨计算机的进程间通信。
7、什么是绝对路径与相对路径,若要由/usr/share/doc进入到/usr/share/man写出相对路径与绝对路径所用的命令
-
绝对路径(Absolute Path)是一种描述文件在文件系统中的位置的路径,从文件系统的根目录开始描述,一直到文件或目录所在的位置。例如:/usr/share/doc。
-
相对路径(Relative Path)是一种描述文件在文件系统中的位置的路径,相对于当前目录描述文件或目录的位置。例如,在/usr/share/doc目录下,要访问/usr/share/man目录,可以使用相对路径 …/man。
若要由/usr/share/doc进入到/usr/share/man 可以使用两种方式
使用绝对路径:cd /usr/share/man
使用相对路径:cd ../man
注意:在 Linux 系统中,路径分隔符是"/“,不要和 Windows 系统中的”"混淆。【嘻嘻可以这么记,Linux和Windows两个在爬滑题,Linux从左往上爬
,所以是/
,Windows从右往上爬
,所以就 \
】
此外,"."
表示当前目录,".."
表示上一级目录。"~"
表示用户目录下。例如,在/usr/share/doc目录下,要访问/usr/share/doc目录中的文件file.txt,可以使用相对路径 .(当前目录)/file.txt。
8、简述常用的4种进程调度算法,并说明它们各自的优缺点
常用的进程调度算法有四种,分别是先来先服务调度算法(FCFS)、最短进程优先调度算法(SJF)、高响应比优先调度算法(HRRN)和时间片轮转调度算法(RR)。
- 先来先服务调度算法(FCFS):最简单的进程调度算法之一,它的原则是按照进程到达的先后顺序,依次调度进程的执行。
优点:实现简单
缺点:不能有效利用 CPU,可能会导致等待时间长的进程饥饿
- 最短进程优先调度算法(SJF):根据进程的服务时间(即进程所需的 CPU 时间)来调度进程的执行,优先调度服务时间短的进程。
优点:能有效利用 CPU,减少等待时间,
缺点:不能充分考虑进程的等待时间,可能会导致长期等待的进程被忽略。
- 高响应比优先调度算法(HRRN):是一种兼顾进程的等待时间和服务时间的调度算法,它计算每个进程的响应比(Response Ratio),将响应比最高的进程优先调度。响应比 = (当前时间 - 进程到达时间 + 进程服务时间) / 进程服务时间。
优点:能有效利用 CPU,减少等待时间,同时也能充分考虑进程的等待时间
缺点:需要计算每个进程的响应比,实现较为复杂。
- 时间片轮转调度算法(RR):是一种多级反馈调度算法,它将所有就绪进程放在一个等待队列中,每个进程按照轮转的方式依次调度执行。
优点:是能有效利用 CPU,减少等待时间,同时也能充分考虑进程的等待时间,
缺点:需要设置时间片,如果时间片过小,会导致调度次数增加,影响系统效率;如果时间片过大,会导致短作业等待时间增加,影响系统公平性。
9、画Linux系统的进程状态转换图,并注明各种状态转换的条件【画图的时候要注明清楚 状态 和 转换时间】
(也可以看书上的,比较少,但它实际上是有这么多状态的)
图中的状态如下:
- 创建(Creating):进程刚刚被创建,正在准备执行的状态。
- 就绪(Ready):进程已经准备好执行,等待获得 CPU 资源的状态。
- 运行(Running):进程正在运行,正在占用 CPU 执行任务的状态。
- 暂停(Stopped):进程被暂停执行,等待获得信号后恢复运行的状态。
- 僵尸(Zombie):进程已经结束执行,但是其父进程还未回收其资源的状态。
- 等待(Waiting):进程处于等待状态,等待其他资源(如 I/O 设备)或事件(如信号)的状态。
- 终止(Terminated):进程已经结束执行,其所有资源已经被回收的状态。
状态转换的条件如下:
- 创建 转 就绪:当一个新的进程被创建时,它会进入就绪态。
- 运行 转 等待:进程执行 I/O 操作或等待信号时会进入 等待状态。
- 等待 转 就绪:进程等待的资源或事件已经就绪,进入 就绪状态 等待调度。
- 就绪 转 运行:进程被调度器选中,获得 CPU 资源执行任务。
- 运行 转 就绪:当前运行的进程的时间片到了。
- 运行 转 僵尸:当进程的执行完成时,或者遇到某些异常情况导致进程退出时。(资源未被收回)
- 运行 转 终止:进程收到 STOP 信号时会进入 停止状态(资源被收回)
- 运行 转 暂停:暂停态是指进程被暂停执行,等待获得信号后恢复 运行状态。
- 暂停 转 运行:进程的输入输出设备完成操作、其它进程(正在运行的且优先级较高的进程)操作完成、互斥锁可用。
10、简述引发进程调度的4种时机
进程调度的时机通常有以下四种:
- 进程执行完毕:进程执行完毕后,系统需要调度其他进程执行。
- 进程申请 I/O 设备:当进程申请 I/O 设备时,系统会将其置为等待状态,并调度其他进程执行。
- 进程申请系统资源:当进程申请系统资源时,如果资源不足,则进程会被阻塞,系统需要调度其他进程执行。
- 进程收到信号:当进程收到信号时,系统可能需要调度其他进程执行
其实还有一个: - 时间片到期:在时间片轮转调度算法中,当进程使用完规定的时间片后,系统需要调度其他进程执行。
11、进程间的制约关系
12、进程与程序是两个完全不同的概念,但又有密切的联系,试写出两者的联系与区别。【书本P70】
13、PCB的作用??为什么说PCB是进程存在的唯一标志?【书本P71】
PCB 的作用包括:
- 管理进程:PCB 记录了进程的各种信息,操作系统可以通过 PCB 来管理进程的执行状态、优先级、资源占用情况等。
- 调度进程:PCB 中记录了进程的优先级等信息,操作系统可以根据这些信息来调度进程。
- 维护进程的上下文:PCB 中记录了进程的上下文信息,包括进程的寄存器、堆栈、内存映像等。当进程被挂起或恢复时,操作系统可以通过 PCB 中的信息来维护进程的上下文。
- PCB 是进程在操作系统内部存在的唯一标志,因为它记录了进程的各种信息,并且操作系统只能通过 PCB 来管理和调度进程。如果没有 PCB,操作系统就无法区分不同的进程,也无法管理和调度进程。
此外,PCB 还可以用于进程间通信和同步,例如操作系统可以通过 PCB 中的信号量、信号处理函数等机制来实现进程间的通信和同步。
14、什么是临界区?进程进入临界区的调度原则是什么?
临界区(Critical Section)是指在多进程环境下,对共享资源进行访问时,为了保证数据的正确性和完整性,必须保证同时只能有一个进程进入的区域。临界区内的代码通常称为临界代码。
进程进入临界区的调度原则是:
- 互斥原则:同时只能有一个进程进入临界区。
- 请求与保持原则:当进程请求进入临界区时,必须先满足其他进程已经退出临界区的条件。
- 循环等待原则:进程在等待进入临界区时,不能占用 CPU,应该被挂起,以避免系统进入死锁状态。
15、简述使用信号量进行进程间通信
信号量是一种常用的进程间通信机制,可以用来实现进程间的同步和互斥。
简述:
- 在使用信号量进行进程间通信时,需要初始化一个信号量变量,并设置一个初始值。每个进程在访问共享资源前,都需要获取信号量,如果信号量的值大于 0,则进程可以访问共享资源,并将信号量的值减 1;如果信号量的值等于 0,则进程需要等待,直到信号量的值大于 0 为止。在访问完共享资源后,进程需要释放信号量,将信号量的值加 1。
- 信号量的值代表了共享资源的剩余数量,通过信号量的获取和释放来实现进程间的同步和互斥。信号量可以用于解决多进程间共享资源的竞争问题,避免出现数据不一致的现象。
- 此外,信号量还可以用来实现进程间的消息传递。一个进程可以在获取信号量之前向另一个进程发送消息,另一个进程在获取信号量时就可以收到消息。这种方式可以用来实现进程间的简单通信。
- 总之,信号量是一种常用的进程间通信机制,可以用来实现进程间的同步和互斥,也可以用来实现进程间的消息传递。
16、在单处理机环境下,进程间有哪几种通信方式,是如何实现的
在单处理机环境下,进程间通常有以下几种通信方式:
- 共享内存:多个进程共享一段内存区域,通过对内存区域的读写来实现通信。共享内存是一种快速的通信方式,但是需要使用互斥机制(如互斥锁)来保护共享内存区域,避免多个进程同时对内存进行修改,从而引起数据不一致的问题。
- 消息队列:进程间通过消息队列进行通信,消息队列是一个先进先出的数据结构,用于存储进程间发送的消息。进程可以通过读写消息队列来实现通信。消息队列通常使用互斥机制来保护,避免多个进程同时对消息队列进行读写。
- 信号量:进程间通过信号量进行通信,信号量是一种常用的进程间同步机制,可以用来实现进程间的互斥和同步。信号量的值代表了共享资源的剩余数量,进程在访问共享资源前,需要获取信号量;在访问完共享资源后,需要释放信号量。
- 管道:进程间通过管道进行通信,管道是一种半双工的通信方式,只能在一个进程写入管道时,另一个进程才能从管道中读取数据。管道通常用于进程间的父子关系,父进程可以通过管道向子进程传递数据,子进程可以通过管道向父进程返回数据。
- 信号:进程间通过信号进行通信,信号是一种异步的通信方式,可以用来在进程间传递简单的消息或者通知。进程可以通过向另一个进程发送信号来实现通信,也可以通过设置信号处理函数来响应信号。
三、应用题
以老师复习课上讲过的内容整理的
- shell编程
- 进程PV编程
- C语言编程【附录里有,但会结合PV操作】
停车场计数用到1个信号量
生产者消费者用到2个信号量
- Makefile编写【实验里的】
1、生产消费(P、V)(书上图4-16、4-17)
本次考试的P、V操作不会展开写,只要在需要的地方写上P、或V 就行了(比较简单)
若是要写,体会是会给出详细的代码【关键是 要清楚 实际上是要对哪个信号量进行P、V操作
(重点关注)】
参考代码:
int full = 0;
int empy = 100;
int mutex = 1;
(2)游客进入公园的程序片段
void *visitor_enter(void *arg)
{
while (1)
{
P(empy); // 等待信号量empy,表示公园有空位
P(mutex);// 使用互斥锁保护登记表
// 登记游客
// ...
V(mutex);// 登记完成,释放互斥锁
V(full);// 增加信号量full,表示公园的人数增加
}
}
(3)游客离开公园的程序片段
void *visitor_leave(void *arg)
{
while (1)
{
P(full);// 等待信号量full,表示公园有人
P(mutex);// 使用互斥锁保护登记表
// 去掉游客的登记
// ...
V(mutex);// 去掉登记完成,释放互斥锁
V(empy);// 增加信号量empy,表示公园的空位数增加
}
}
其中
P(sem)
和V(sem)
分别表示获取信号量sem
和释放信号量sem
的操作。
- 上述程序片段中,使用
信号量empy
和full
控制游客进入和离开的次数,使用互斥信号量mutex
保护登记表的访问,避免多个游客同时对登记表进行操作。 - 在游客
进入公园
时,使用P(empy)操作,将empy信号量的值减1,表示公园中少了一个空位。如果empy信号量的值为0,则表示公园已经满员,游客需要等待。 - 在游客
离开公园
时,使用V(full)操作,将full信号量的值加1,表示公园中多了一个空位。如果有游客在等待进入公园,则会恢复执行。 - 使用
互斥信号量mutex
保护登记表的访问,避免多个游客同时对登记表进行操作。在访问登记表前,需要使用P(mutex)操作获取互斥信号量,在访问结束后,使用V(mutex)进行释放。这样可以保证同一时刻只有一个游客能够访问登记表,避免产生冲突。
此外,这段程序片段还使用了条件变量来控制游客的进出。
当公园已满时,游客需要等待,直到有空位才能进入。同样的,当公园空余位置为0时,游客也需要等待,直到有空位才能离开。
总之,这段程序片段使用了信号量和互斥信号量来控制游客的进出和对登记表的访问,使用条件变量来控制游客的等待和唤醒。这些机制的作用是保证在多线程环境下,登记表的访问和公园的进出是安全的。
2、停车场计数器(P、V)(书上图4-14、4-15)
【其实就是进出公园做登记那个 一样的】
3、Fork()编程(书上图4-10,4-11,4-12)【书本上的例题要再复习一下】
书上的4-10
书上的4-11
书上的4-12
作业题
【子进程执行命令ls -l】用的是shell命令,不是C命令。execl("bin/ls","ls",NULL);
int main()
{
int rid;
rid = fork();
if( rid < 0 )
{
printf("fork failed\n");
exit(1);
}
if( rid == 0 )
{
execl("bin/ls","ls",NULL);
perror("execl failed");
exit(1);
}
if( rid > 0 )
{
wait(NULL);
printf("child pid=%d\n",rid);
exit(0);
}
return 0;
}
4、编写C语言程序,并用Makefile进行编译。【复习实验】
5、单道程序与多道程序CPU时间计算
单道程序的 CPU 时间就是该程序运行的时间,多道程序的 CPU 时间则是多个程序运行时间的总和。在多道程序情况下,一个程序可能会因为其他程序在 CPU 上占用时间而被挂起,这样就会影响到该程序的 CPU 时间。在计算 CPU 时间时,需要考虑每个程序的实际运行时间,以及每个程序被挂起的时间。
四、Shell(包括课后习题)
复习一下 怎么生成和执行脚本
- 使用文本编辑器打开一个新文件,在文件中编写脚本内容。
vi script.sh
- 给脚本文件设置可执行权限。
chmod +x script.sh
- 运行脚本文件。
./script.sh
注意:在windows中则是.exe,在 Linux 系统中,脚本文件通常以 .sh 为后缀名。
1.编写个一个shell脚本,用来累加用户输入的多个数字,并在屏幕上输出累加的结果
#!/bin/bash
# 初始化结果为 0
result=0
# 循环处理用户输入的每个数字
while true
do
# 读取一个数字
read -p "请输入一个数字(输入 Q 结束):" num
# 如果输入的是 Q,则退出循环
if [[ "$num" == "Q" ]]; then
break
fi
# 累加结果
result=$((result + num))
done
# 输出结果
echo "累加结果:$result"
2.求100内的质数
#!/bin/bash
#检查每个数是否为质数
for i in {2..100}
do
#将 $i 赋值给变量 prime
prime=$i
#检查 $i 是否能被 2 到 sqrt(i) 之间的数整除
for j in $(seq 2 $(($(echo "sqrt($i)" | bc))))
do
# 如果 $i 能被 $j 整除,那么 $i 不是质数
if [ $(($i % $j)) -eq 0 ]; then
prime=0
break
fi
done
#如果 $prime 仍然是质数,则输出它
if [ $prime -ne 0 ]; then
echo $prime
fi
done
3.编写一个Shell脚本,它能计算用户通过命令行参数形式提供的多个整数的平均数
#!/bin/bash
read theseNums
length=0
sum=0
for i in $theseNums
do
length=$((length + 1))
sum=$((sum + i))
done
average=$((sum/length))
echo "the averge is:$average"
4.编写个shell程序来判断用户所输入的参数是否是一个数字
#!/bin/bash
#判断用户是否输入了参数
if [ $# -eq 0 ]
then
echo "错误:未输入参数"
exit 1
fi
#判断参数是否为数字
if [[ $1 =~ ^[0-9]+$ ]]; then
echo "$1 是一个数字"
else
echo "$1 不是一个数字"
fi
exit 0
5.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下
#!/bin/bash
# 获取用户输入的文件名
file=$1
# 判断文件是否存在
if [ ! -e $file ]
then
echo "文件 $file 不存在!"
exit 1
fi
# 判断文件是否是字符设备文件
if [ -c $file ]
then
# 拷贝文件到 /dev 目录
cp $file /dev
echo "已将文件 $file 拷贝到 /dev 目录下"
else
echo "文件 $file 不是字符设备文件!"
fi
使用方法:
- 使用文本编辑器(例如 vi、nano 等)打开一个新文件,将上面的代码复制粘贴进去。
- 保存文件,并将文件名设为 copyToDev.sh。
- 使用命令 chmod +x copyToDev.sh 将文件设为可执行文件。
- 使用命令 ./copyToDev.sh fileName 来运行脚本,其中 fileName 是你要判断的文件的名称。
例如,如果你想判断 /dev/tty 目录下的 tty0 文件,则可以使用以下命令运行脚本:
./copyToDev.sh /dev/tty/tty0
6.编写shell脚本,实现如下功能:(1)从命令行读入2个整数;(2)对两个数进行大小比较;(3)在屏幕上输出比较结果。
#!/bin/bash
#读入两个整数
echo "请输入两个整数:"
read num1 num2
#对两个数进行大小比较
if [ $num1 -gt $num2 ]
then echo "$num1 大于 $num2"
elif [ $num1 -eq $num2 ]
then echo "$num1 等于 $num2"
else
echo "$num1 小于 $num2"
fi
7.编写shell程序,实现自动删除50个账号的功能。账号名为user1至user50
#!/bin/bash
#循环删除50个账号
for i in {1..50}
do
# 删除账号
userdel user$i
done
#提示删除完成
echo "账号删除完成"
8.编写一个Shell脚本,它能够显示下面序列的前10个数字:0,1,1,2,3,5,8,13,……
#!/bin/bash
#定义输出的数字个数
count=10
#定义前两个数字
num1=0
num2=1
#循环输出数字
for i in $(seq 1 $count)
do
#输出当前数字
echo $num1
#将当前数字保存起来,用于下次循环
temp=$num1
#计算下一个数字
num1=$num2
num2=$((num1 + temp))
done
9.编写一个Shell脚本,它能将用户提供的二进制数转化为十进制数
#!/bin/bash
#读入二进制数
echo "请输入一个二进制数:"
read binary
#定义转化后的十进制数
decimal=0
#定义二进制数的位数
length=${#binary}
#循环转化
for i in $(seq 1 $length)
do
#取出第 $i 位的数字
num=${binary:$i-1:1}
#如果当前位数字是1,则将其加入到十进制数中
if [ $num -eq 1 ]
then decimal=$((decimal + 2**$((length-i)) ))
fi
done
#输出十进制数
echo "十进制数为:$decimal"