Linux复习(1)
1.策略
Linux复习的策略和C++类似,先过一遍知识点,把不会的列出来,进行重点复习。
2.Linux知识点
1.基础指令
先把知识点全列出来:
目录相关:Linux目录结构,树结构。
Linux下绝对路径相对路径,绝对路径就是有完整的磁盘路径,相对路径是相对于当前路径而言。
不熟悉:Linux下磁盘分区。Linux所有指令
文件和压缩,Linux的设计哲学是一切皆文件。
进程相关的ps,ps是查看进程的状态
kill命令一般可以杀死进程,,而且kill -9 无法被捕获,防止的是出现不死不灭的进程。
Linux网络相关的netstat,netstat
是一个功能强大的网络工具,用于显示网络连接、路由表、接口统计等信息,-t代表TCP,-u代表查UDP,-l代表监视端口,-p显示进程信息,-n数字格式信息。
ipc指令是查看进程间通信的命令,ipcs是查看进程间通信-m查共享内存,-s查信号量,-q查消息队列,-a(all)代表详细的信息
ipcsrm是删除,-m代表删除共享内存,信号量是-s,-q代表消息队列
系统调用资源相关的,top是实时系统监控,free是内存的使用情况,df磁盘空间检查,du目录空间分析,fdisk磁盘分区管理
文件权限:
文件权限中的用户分类有三种,所有者,文件的创建者,对文件拥有最高权限。
所属组,对多个用户设置相同的权限。
其他人,既不是所有者也不是所属组的用户。
文件权限有读写执行,r代表读,w代表写,x代表执行
文件权限的计算如下:
分别是3个二进制位,从高位到低位分别代表rwx
权限的表示,当ls查看的时候会出现9个,分别代表所有者,所属组和其他人。
数字表示一个数字代表一个组的权限,比如754,7代表的就是所有者的权限,5代表的是所属组的权限,4代表的是其他人的权限。
权限命令,umask是默认的文件和目录创建权限,权限进行计算要用写入的权限-umask的值。
chmod修改文件或目录的权限。
chown是修改文件或目录的所有者。
chgrp用于修改文件或目录的所属组。
粘滞位是一种特殊的权限,通常设置在目录上,作用是只有目录的所有者和root用户可以删除该目录下的文件,防止用户误删他人的文件。
2.常用工具
yum,gdb,gcc/g++,make,git
重点就是文件执行的流程,预处理,编译,汇编,链接
链接是重点,链接分为动态链接和静态链接, 静态链接是编译的时候把库文件的全部代码复制到可执行文件中,工作阶段是编译阶段,动态链接是运行的时候才将库文件的代码加载到内存中,多个程序可以共享内存的一个共同的库文件,工作阶段是加载、运行状态。
根据它们的特性就知道,如果需要可执行文件独立运行,不依赖外部库,就用静态链接无加载库的开销,但是静态链接的代码体积会变大,库更新后需要重新。
gcc的-E是预处理之后,-S是编译之后,-o是指定输出文件的名称
3.Linux进程理解
冯若依曼五大硬件分别是,输入设备,内存,输出设备,中央处理器运算器,其中以内存为核心,CPU只和内存打交道。设备的速度往往取决于内存的速度。
一句话冯若依曼结构即使所有硬件都是围绕内存工作的。
操作系统:操作系统就是一个软件和硬件的管理者,它是躺在中断上的一个死循环。
管理方式的核心是先描述,在组织。
库函数和系统调用接口的关系是,库函数是操作系统提供的接口,库函数底层一定封装了系统调用的接口,因为只有通过系统调用接口才能进行一些高权限操作。比如用户往往无法直接使用物理内存,需要内核去申请。
进程概念,课本概念,进程是一个运行起来的程序,在我看来进程就是一个PCB和资源,创建一个PCB,底层就是创建一个PCB的结构体来保存进程的相关信息,指向相关的资源。先描述再组织,操作系统管理进程就是用PCB来描述一个进程,再用一个双链表对他们进行管理。理论和实践相统一!
进程控制,进程创建用fork(),当fork之后就会创建出一个子进程,对于父进程它的返回值是子进程的pid,对于子进程它的返回值是0.
除了fork还有一个vfork,它的创建目的是为了快速创建子进程并执行exec函数,进行替换,所以OS不会为它创建新的虚拟地址空间。程序替换后会有全新的虚拟地址空间,但是还是属于原来父进程的子进程。
进程终止分为运行完毕终止了,异常终止,被其他信号强制终止。
进程等待就是进程终止后需要的过程了,一个进程创建出来是为了完成任务的,为了知道它任务完成的怎么样,就需要父进程来拿到它的退出信息了。在父进程未拿到子进程的退出信息之前,子进程处于僵尸进程的状态。
进程终止后内核会对进程释放内存资源,关闭文件描述符表,发送信号,通知它的父进程你的子进程终止了。保留退出状态。
僵尸进程是进程已经终止,但父进程还未调用wait来回收,内核仍保留它的PID和状态信息,僵尸进程无法被杀死,包括kill -9因为你无法杀死一个已经死掉的进程。
孤儿进程就是子进程还没退出呢?父进程先退出了,这样操作系统就需要领养这个进程,避免这个进程成为孤儿进程,从而导致僵尸进程,导致内存泄漏。
如果出现大量的僵尸进程,会导致内存资源被打满,崩掉。
进程等待的具体方式一个是wait(),一个是waitpid(),给一段代码看一下吧
wait变量就一个参数,它是一个输入输出的。带出来的就是退出信息
#include <sys/wait.h>
pid_t wait(int *status);
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程:执行后退出printf("Child PID: %d\n", getpid());exit(10); // 退出码为10} else if (pid > 0) {// 父进程:等待子进程终止int status;pid_t exited_pid = wait(&status);printf("Waited child PID: %d\n", exited_pid);if (WIFEXITED(status)) { // 判断是否正常退出printf("Child exited with code: %d\n", WEXITSTATUS(status)); // 输出10}}return 0;
}
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程:休眠3秒后退出sleep(3);exit(20);} else if (pid > 0) {// 父进程:非阻塞等待子进程int status;while (1) {pid_t ret = waitpid(pid, &status, WNOHANG); // 非阻塞if (ret == 0) {// 子进程未终止,继续等待printf("Child not exited yet...\n");sleep(1);} else if (ret == pid) {// 子进程已终止printf("Child exited, code: %d\n", WEXITSTATUS(status)); // 输出20break;}}}return 0;
}
waitpid()有三个参数,分别是要等待的进程,退出信息,和等待方式是阻塞还是非阻塞。
4.环境变量
环境变量是系统级别的全局参数,供所有进程访问和共享。
5.虚拟地址空间
虚拟地址空间是什么?虚拟地址空间就是task_struct里的mm_struct的一个结构体。
用于操作系统向进程描述一个完整的连续的地址。
虚拟地址的管理有分段,分页,分段页。
虚拟地址就是操作系统给每个进程画的一个饼,让每个进程都以为自己拥有4GB的内存。
这样的好处是:让进程之间天然隔离,不同虚拟内存和物理内存的映射关系不同。
增强内存访问的独立性,增强安全性,虚拟转物理进行检查。提高内存的利用率,只有当你实际用到的时候才会去分配实际的物理内存(通过缺页中断)。