Linux复习1

基础指令:
目录:ls,pwd,mkdir,rm,cp,cd
文件:cat,more,less,head,tail,ln
压缩:zip/unzip,gzip/gunzip, bzip2/bunzip,tar
匹配: grep,find
权限: su,sudo,umask,chmod,chown,chgrp
进程:ps,kill
网络:ifconfig,traceroute,route,netstat
系统:shutdown,reboot,free,top,df,

常用工具:
yum list search install remove
vim 操作模式 分类 普通 插入 底行
互换 iao, : /, esc
操作指令 底行 :w :q :wq :q!
底行:光标 hjkl, wb,ctrl+f/b,gg/G
内容 nyy/ndd,x,dw/p,
其他 u/ctrl+r
gcc/g++ 编译过程:预处理 编译 汇编 链接 静态链接 动态链接
常见选项 -E,-S,-c,-o,-O,–share,-fPIC,-g,-l,-L,-I

gdb 调试前提 gcc -g生成debug程序
调试操作 start,run,next,step,until,continue,list,
break file:line/funcname;info break;delete
watch,print,backtrace
makefile makefile编写 格式 目标对象:依赖对象
指令
要点 预定义变量 $^ $< $@
伪对象:无论如何都要执行对应指令的对象
.PHONY:
make解释执行 只生成第一个目标对象
为了生成目标对象会分析依赖关系,递归生成依赖对象
git add/commit/push/clone

进程概念
冯诺依曼 五大硬件单元 输入 输出 存储 运算 控制
重点 所有设备都是围绕内存工作的
操作系统 定位 搞管理的软件
管理 先描述,再组织
进程 概念 运行的程序 在操作系统角度 进程是程序运行的动态描述 叫PCB,通过这个描述
操作系统实现对于程序运行的管理
描述 标识符 内存指针 ,上下文数据,程序计数器 状态信息 IO 信号
进程状态 种类 运行 ,可中断休眠,不可中断休眠 停止 僵尸
僵尸进程 概念:僵尸状态的进程 程序运行退出了,但是资源没有完全被释放
产生:子进程先于父进程退出 子进程会成为僵尸进程
目的是为了保存退出返回值,资源没有完全被释放
解决:进程等待 wait/waitpid
孤儿进程 概念:父进程先于子进程退出,子进程成为孤儿进程
特性 运行在后台,父进程成为1号进程
守护进程 概念:与终端和登录会话断绝关系特殊的孤儿进程
环境变量:概念 shell中的变量但是拥有一些特别的特性-父子进程传递
保存用户运行环境参数的变量
操作 命令 env,set,echo,export,unset
接口 getenv()/putenv()/setenv()
main第三个参数,extern char **environ
地址空间 概念 进程的虚拟地址空间
本质 mm_struct为进程虚拟一个完整的线性的地址空间
作用 实现数据在物理内存中的离散式存储,提高内存利用率
通过页表进行内存访问控制,提高内存访问安全性
虚拟地址与物理地址映射关系 分段式 将内存进行分段
地址组成 段号+段内偏移
便于编译器进行地址管理
分页式 将内存进行分页管理
地址组成 页号+页内偏移
实现数据离散式存储提高内存利用率
页表实现内存访问控制
段页式 对内存空间进行分段,段内进行分页管理
缺页中断 数据不在物理内存中存储,在访问时所产生的的中断
物理内存不够用时将物理内存中的指定数据交换到交换分区上
内存置换算法 最久、最少…

进程控制:
创建 方式 fork 父子进程代码共享,数据独有
写时拷贝 初始子进程拷贝父进程,与父进程指向的物理内存相同,
当物理内存素具发生改变时,则给子进程重新开辟
vfork 父子进程共用虚拟地址空间
父进程需要阻塞直到子进程程序替换或退出
终止
vfork
终止 方式 main中return
调用exit
调用_exit
等待 作用 解决僵尸进程问题,等待子进程退出,获取返回值,释放资源
操作 wait/waitpid
替换 本质 替换一个进程正在调度运行的程序
加载新的程序到内存中,重新建立进程的映射

基础IO
回顾标准库IO fopen fclose fread,fseek,fclose
学习系统调用IO open,write,read,lseek,close
文件描述符 概念 内核中进程打开的文件描述符信息数组的下标
延伸 重定向 概念 改变数据的流向-改变描述符所操作的文件
本质 将文件描述符这个下标对应的文件描述信息改变成为另一个文件
操作 dup2
动态库与静态库的生成与使用 生成 生成目标文件 gcc -fPIC -c child.c -o child.o
gcc --shared child.o -o libchild.so 动态库
ar -cr libchild.a child .o 静态库
使用 链接 gcc main.c -o main -lchild -L.lib
运行 将库文件放到指定路径 -/lib64

进程间通信
概念:进程间具有独立性,无法直接通信,操作系统为上层提供的用于进程间通信的方式
通信方式:管道
本质 内核中的一块缓冲区
作用 实现进程间的数据传输
分类 匿名 概念 没有标识的管道,只能用于具有亲缘关系的进程间通信
接口 pipe
命名 概念 具有标识符(管道文件),可用于同一主机任意进程间通信
接口 mkfifo
特性 半双工通信
字节流传输 传输比较灵活 ,但是会存在粘包问题
所有读端关闭,则继续写会触发异常
所有写端关闭,则读完数据继续读会返回0
同步与互斥 读写大小不超过PIPE_BUF大小保证原子操作
管道满了继续写会阻塞
管道空的继续读会阻塞
生命周期随进程
共享内存
本质 一块物理内存,经过各个进程页表映射到各个进程的虚拟地址空间中实现数据共享
操作 shmget/shmat/shmdt/shmctl
特性 生命周期随内核 最快的进程间通信方式
注意 操作存在进程/线程安全问题
消息队列
本质 内核中的一个优先级队列
作用 通过添加或获取节点实现数据传输
特性:同步与互斥
生命周期随内核
信号量
本质 内核中的计数器
作用 实现进程间的同步与互斥 互斥 通过同一时间只有一个进程能够访问资源实现安全访问
同步 通过条件判断实现进程对资源进行合理获取
实现 互斥 初始计数为1,表示资源只有一个 访问资源前计数-1,访问后计数+1
同步 通过计数器对资源进行计数即可

进程信号 概念 软件中断 通知进程发生了某个事件 ,打断进程当前的操作,去处理这个事情
作用 事件通知
种类
查看 kill -l
分类 1~31非可靠
34~64 可靠
生命周期 产生 硬件 ctrl+c/z/
软件 kill/kill()/raise()/alarm()/abort()
注册 本质 在进程pcb中标记某个信号的到来
分类 非可靠 如果已有相同信号注册,则丢弃
可靠 不管是否已经注册都会添加信号节点
注销 本质 从pcb中消除信号的痕迹
分类 可靠 删除一个节点,没有相同节点才会位图置0
非可靠 位图置0;删除节点
处理 调用信号的处理回调函数
操作 signal
方式 默认 SIG_DFL
忽略 SIG_IGN
自定义 void(*sighandler_t)(int)
自定义处理方式信号的捕捉流程
阻塞 本质 在pcb中标记哪些信号到来后暂时不被处理
操作 sigprocmask
sigemptyset
sigfillset
sigaddset
sigdelset
sigismember
额外 voltile关键字 保持内存可见性
cpu每次从内存中获取数据防止编译器过度优化
可重入与不可重入函数
函数的重入 在多个执行流中同时进入某个函数执行
不可重入 一旦函数重入有可能会造成数据以及逻辑混乱
可重入 函数重入之后无影响,不会造成预期之外的结果
是否可重入的基准
生命周期

多线程
线程概念 概念 线程是CPU执行的基本单元,是进程中的一条执行流,在Linux下执行流是通过pcb实现的,并且一个进程
中可以包含多个pcb,这些pcb相较于传统的pcb较为轻量化,因此也被称作轻量级进程
独有与共享 独有 标识符、栈、寄存器、信号屏蔽字,errno…
共享 虚拟地址空间,IO信息,信号处理方式,工作路径…
多任务处理 多线程 线程间通信更加灵活
线程的创建与销毁成本较低
线程间的切换成本较低
多进程 稳定 、可靠

线程控制 创建 pthread_create
终止 入口函数中return
pthread_exit
pthread_cancel
等待 概念 线程退出后默认不会主动释放资源,需要被等待
操作 pthread_join
分离 概念 设置线程分离属性,让线程退出后自动释放资源 ,不需要被等待
操作 pthread_detach
线程安全 概念 在多线程中对临界资源的访问是安全的
实现 同步 时序合理
概念 对资源获取的条件进行判断是否合理,以阻塞或唤醒线程的方式实现对资源获取的合理性
操作 pthread_cond_t
pthread_cond_init
pthread_cond_wait/trwait/timedwait
pthread_cond_signal/broadcast
pthread_cond_destroy
注意 条件变量需要搭配互斥锁一起使用
资源获取条件的判断需要循环进行
若具有多种线程资源需要使用多个条件变量
互斥 安全访问
实现 互斥锁 本质 0 /1的计数器,标记资源访问状态
访问资源前加锁,访问完毕解锁
操作 pthread_mutex_t
pthread_mutex_init
pthread_mutex_lock/trylock
pthread_mutex_unlock
pthread_mutex_destroy
死锁 概念 程序流程卡死无法继续推进的状态
产生 互斥条件
不可剥夺条件
请求与保持条件
环路等待条件
预防 保证多线程加解锁顺序一致-避免环路
非阻塞加锁,若加锁失败则将已有的锁释放
避免 银行家算法
信号量 操作 sem_t sem_init sem_wait/trywait/timedwait sem_post sem_destroy
与条件变量的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值