OS part1
- 问题
-
- 1. 查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数(后面部分有详细介绍)
- 2. ==修改文件权限==
- 3. 常用的Linux命令
- 4. ==如何以root权限运行某个程序==
- 5. ==软链接与硬链接的区别==
- 6. 静态库和动态库怎么制作及使用,它们的区别
- 7. GDB常见的调试命令,什么是条件断点,多进程下如何调试
- 8. 什么是大端小端,如何判断大小端
- 9. 进程调度算法有哪些
- 10. ==简述操作系统如何申请以及管理内存==
- 11. 简述Linux系统态与用户态,什么时候会进入系统态
- 12. 简述LRU(最近最久未使用)置换算法及其实现方式
- 13. 一个线程占多大的内存
- 14. 什么是页表,以及为什么要有页表
- 15. 简述操作系统中的缺页中断
- 16. 简述虚拟内存分布,什么时候会由用户态陷入内核态
- 17. 简述以下虚拟内存和物理内存,为什么要用虚拟内存,虚拟内存的优缺点
- 18. ==虚拟内存到物理内存的映射==
- 19. 说说堆栈溢出是什么,会怎么样
- 20. 简述操作系统中malloc的实现原理
- 补充
- 基础指令
问题
1. 查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数(后面部分有详细介绍)
①
ps -l | grep PID
用来查看某PID进程的状态
②free -m
查看内存使用情况
③以下五个命令中必选一个:
-c
: 建立压缩档案-x
:解压-t
:查看内容-r
:向压缩归档文件末尾追加文件-u
:更新原压缩包中的文件
以下几个参数是可选的:
-z
:有gzip属性的-j
:有bz2属性的-Z
:有compress属性的-v
:显示所有过程-O
:将文件解开到标准输出
补充:查看进程运行状态、查看内存使用情况的指令均可以使用top
指令
2. 修改文件权限
Linux是多用户系统,文件权限是防止系统被恶意篡改的途径之一。
Linux文件的基本权限有9个,分别是owner/group/others三种身份各自有自己的read/write/execute权限(读、写与执行)。
可以用ls -l 文件
来查看该文件所属情况,例:-rw-r--r-- 1 root root 73 Mar 3 20:11 hello.c
给出了hello.c文件的创建者,创建者归属的用户组,相应的还列出了文件大小、创建日期和时间、文件名。
修改权限的指令:chmod
每一个权限设置都可以用数值表示:r = 4, w = 2, x = 1,当这些值加在一起,总数就是用于指定的权限。例:设置用户可以读写,用户组只读,其他只读,则权限设置就是644。
root@ubuntu:~# ls -l hello.c
-rw-r--r-- 1 root root 73 Mar 3 20:11 hello.c
root@ubuntu:~# chmod 644 hello.c
root@ubuntu:~# ls -l hello.c
-rw-r--r-- 1 root root 73 Mar 3 20:11 hello.c
可以看到同组的用户被限制掉写的权限。
补充:若使用chmod -R xyz
,-R会进行递归的持续变更,即同此目录下的所有文件都会变更
3. 常用的Linux命令
cd
命令:用于切换当前目录ls
命令:查看当前文件与目录grep
命令:常用于分析一行的信息,若当中有我们需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。cp
命令:复制命令(后面部分有详细介绍)mv
命令:移动文件或文件夹命令rm命令
:删除文件或文件夹命令ps命令
:查看进程情况kill命令
:向进程发送终止信号tar命令
:对文件进行打包,调用gzip或bzip对文件进行压缩或解压cat命令
:查看文件内容,与less、more功能相似top命令
:查看操作系统的信息,如进程、CPU占有率、内存信息等pwd命令
:用于显示工作目录
4. 如何以root权限运行某个程序
sudo chown root app(文件名)
输入密码
sudo chmod u+s app(文件名)
输入上面两条指令后即可。
5. 软链接与硬链接的区别
从几个方面作答。
- 定义不同
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件链接,这些文件名可以在同一目录或者不同目录。 - 限制不同
硬链接只对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建;
软链接可对不存在的文件或目录创建软链接,可交叉文件系统; - 创建方式不同
硬链接不能对目录进行创建,只可对文件创建;
软链接可对文件或目录创建; - 影响不同
删除一个硬链接并不影响其他有相同inode的文件。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软链接被称为死链接(即dangling link,若被指向路径文件被重新创建,死链接可恢复成正常的软链接)。
6. 静态库和动态库怎么制作及使用,它们的区别
-
静态库的生成:
gcc -c hello.c
先 生成.o文件
ar -cr libhello.a hello.o
创建libhello.a静态库静态库的使用:
gcc main.c -lhello -o sttaticLibrary
main.c和libhello.a静态库链接,生成target执行文件;
-lhello
是我们生成的.a文件砍头去尾的写法,-L是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/或者/usr/local/lib/去找;
staticLibrary是最后想生成的文件名 -
生成动态库的指令:
gcc -shared -fPIC -o libhello.so hello.o
-shared
:制定生成动态库
-fPIC
:该选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关代码动态库的使用:
gcc main.c -lhello -L ./ -o dynamicDepot
-lhello
是我们生成的.so文件砍头去尾的写法,-L是指告诉gcc编译器先从-L指定的路径去找动态库,默认是从/usr/lib/或者/usr/local/lib/去找;
./ 是当前路径的意思
dynamicDepot是最后想生成的文件名 -
区别
1. 速度:静态库代码装载的速度快,执行速度略比动态库快
2. 内存:动态库更加节省内存,可执行文件体积比静态库小很多
3. 加载时期:静态库在编译时加载,动态库在运行时加载
4. 后缀名:生成的静态库链接,在Windows下以.lib为后缀,Linux下以.a为后缀;生成的动态库链接,在Windows下以.dll为后缀,Linux下以.so为后缀。
7. GDB常见的调试命令,什么是条件断点,多进程下如何调试
-
GDB调试:gdb调试的是可执行文件,在gcc编译时加入如-g,告诉gcc在编译时加入调试信息,这样 gdb 才能调试这个被编译的文件
gcc -g test.c -o test
(后面部分有详细介绍)
gdb test.out
进入gdb调试
GDB命令格式:quit
:退出gdb,结束调试list
/l
:查看程序源代码
list 5, 10
:显示5-10行代码
list test.c:5, 10
:显示源文件5-10行的代码,在调试多个文件时使用
list get_sum
:显示get_sum函数周围的代码
list test.c gei_sum
:显示源文件test.c的get_sum函数周围的代码,调试多个文件时使用reverse-search
:字符串用来从当前行向前查找第一个匹配的字符串run
/start
:程序开始执行help list/all
:查看帮助信息break
/b 行号
:设置断点,一开始进入调试,初始只有一个断点在main函数watch条件表达式
:条件表达式发生改变时程序就会停下来next
/n
:继续执行下一条语句,会把函数当做一条语句执行step
:继续执行下一条语句,会跟踪进入函数,一次一条地执行函数内代码
linux下gdb调试常用命令汇总
-
条件断点:break if条件,以条件表达式设置断点
-
多进程下如何调试:用set follow-fork-mode child调试子进程
或者set follow-fork-mode parent父进程
8. 什么是大端小端,如何判断大小端
数据在内存中存放,有大端模式和小端模式。
小端模式(little-endian):低的有效字节存储在低的存储器地址。小端一般为主机字节序,常用的x86结构是小端模式,很多架构如ARM、DSP都为小端模式。
大端模式(big-endian):高的有效字节存储在低的存储器地址。大端为网络字节序,KEIL C51就是大端模式。
补充:有些ARM处理器可由硬件决定选择大端模式还是小端模式。
判断的话,之前的一篇文章里有整理过三种。
-
使用联合体进行判断
①联合体的各个成员都是公用内存
②联合体的成员不管是在哪个架构上默认都是从低地址存储的,这点非常重要。union endian{ char a; int b; }test; int main() { test.b = 0x87654321; printf("0x%p\n", test.a ); return 0