1.进程和线程的区别
-
进程抽象来说 内存空间+逻辑控制流
-
线程依附于进程上,拥有相同的内存空间,不同的逻辑控制流,带来很多竞争问题
-
特别的进程和线程拥有相同的堆,但是不同的用户栈
-
僵尸进程和孤儿进程
2.线程同步的方式
linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。
互斥锁
条件变量
线程A阻塞并等待某个条件的达成才继续执行,基于共享变量实现的
信号量
互斥锁可以看为特殊情况的信号量
信号阻塞,嵌套
3.进程间通信的方式
1.管道pipe匿名管道
- 管道是半双工的,只能一个方向流动
- 且只能用于有血缘关系的进程之间(父子或者兄弟进程之间)
- 单独构成一种文件系统,对于进程而言就是一个文件,但不属于文件系统,是存在于内存中
管道的实质:
- 实质就是一个内核缓冲区,采用先进先出的方式对数据进行读取和写入,一旦读空或者写满的情况,则会相应的进程等待
局限性:
- 只能在亲缘关系进程之间
- 没有名字
- 缓冲区域是有限的,一般是一页
- 管道内所传送的是无格式的字节流,所以需要读写双方预定好数据格式
- Pipe必须确定对方存在,否则将直接退出
- 如果写入大于管道的容量,写入将阻塞
2.有名管道FIFO
- 有名管道为了克服pipe的只能在亲缘进程之间的局限而提出的
- 有名管道提供了一个路径名与之关联,存在于文件系统中,这样,不同亲缘关系的进程之间也可以借助FIFO进行通信
- 特别的,有名管道名字存在于文件系统中,但是内容存放在内存中
- 当对方不在连接时,则会阻塞
3.信号
- 信号是软件层次上的
- 对中断机制的一种模拟,是一种异步通信方式
- ?????常见信号SIGKILL SIGSTOP SIGTERM SIGHUP 信号的类型
4.消息队列
- 消息队列是存放在内存中的消息链表
- 消息队列存放在内核中,只有内核重启或者显示的删除,消息才会被删除
- 与管道不同的是,消息对列并不需要等待目标进程就绪
5.共享内存
- 多个进程可直接读写同一块内存区域,是最快的IPC方式
- 同时由于多个进程同时共享一块内存区域,则需要信号量来保证同步&互斥
6.信号量
信号量与互斥量的区别
1.信号量用于同步,而互斥量用于互斥
- 互斥值的是,同一时间只能有一个访问者访问资源,但是无法约束顺序
- 信号量可以在互斥的前提下,约束访问者的访问顺序
2.互斥量只能为01,信号量可以为非负整数
- ????解决哲学家就餐,读写互斥,消息队列生产消费
7.套接字
-
套接字有三个属性确定:
- 域,端口号,协议类型
-
域:指的是在通信过程中使用的网络介质,最常用的是
- AF_INET 即是网络
- AF_UNIX 即是unix文件系统,地址就是文件名
-
端口号
- 每一个基于TCP/IP的网络通信进程都被赋予一个端口号和端口,端口其实是一个缓冲区,用于保存输入输出内容
- 端口号是一个16位无符号证书
-
套接字协议类型
- 流套接字,TCP&UNIX域中常用,双工,可靠有序
- 数据报套接字 UDP 无序不可靠
- 原始套接字 允许对底层的协议直接访问
什么是缓冲区溢出
- 按照一个进程的内存结构来讲,代码段,数据段,用户栈和堆,都能看成是缓冲区
- 而缓冲区溢出就是说,利用程序的一些漏洞,将写入的数据大于缓冲区,则会覆盖其他的段,这为程序运行攻击者蓄意的程序提供了可能
- 可能导致的问题:
- 1.数据段损坏,停止服务
- 2.跳转并执行一段恶意代码
什么是死锁,产生的条件是什么
-
在两个或多个进程之间,如果每个进程都持有某种资源但是等待其他的进程释放资源,在未改变这种情况下不能推进,则称这一组资源产生了死锁,通俗讲就是两个或多个进程无限期阻塞,相互等待的状态
-
死锁产生的条件
- 互斥条件:一个资源同一时间只能被一个进程占用
- 请求与阻塞条件:一个进程对请求资源得不到而阻塞时,对已持有资源保持不放
- 不剥夺条件:进程获得的资源,未完全使用完,不能强行剥夺
- 循环等待条件:进行间形成了一种头尾相接的循环等待资源的关系
进程的状态
-
1.运行 正在cpu执行,或者在等待被执行且最终会被执行
-
2.停止 进程执行被挂起,且不会被调度。
-
3.终止 进程永远的停止了 三种终止原因:1.收到一个信号 2.从主程序返回 3.exit函数退出
-
或者:
-
运行 正在运行
-
就绪 具备了除了cpu之外的所有的资源
-
阻塞 等待外部事件发生,否则无法就绪
-
就绪队列,等待队列
分页和分段有什么区别
-
段是信息的逻辑单位,是根据用户需要划分的,对用户是可见的。
-
而页是信息的物理单位,是操作系统划分的,对用户不可见
-
段的大小是可变的,页的大小是固定不变的
-
段提供的地址是二维的,而页的地址是一维的
- (段是独立编地址的,所以需要段号)
进程调度算法
-
先来先服务方法
- 即是在就绪队列中,优先执行首先进入队列的进程,等待进程执行完毕或者因为某种原因阻塞则调度下一个进程
-
短作业优先算法
- 预估出进程的作业时间,将其执行,并直到执行完毕
-
优先权调度算法
- 非抢占式进程调度算法:
- 一旦把资源调度给了高权的进程,会一直等到该进程执行完毕之后,才会去调度其他的进程
-
抢占式进程调度算法:
- 在执行期间,一旦出现比正在运行的进程更高优先级的进程,则停止当前进程,执行最高进程
-
高响应比优先算法
- 优先权 = 等待时间+要求执行时间/要求执行时间
- 该算法可以照顾到了短时任务,还照顾到了等待时间很长的长时间任务
-
时间片轮转算法
- 为每个进程分配一段时间片,当时间到达时,由计时器发出中断,调度下一个进程
-
多级反馈调度算法
- 多级反馈调度算法不需事先知道进程的要求时间,而且满足多种类型进程的需要
- 1.初始多个就绪队列,权重依次降低,且执行的时间片且依次翻倍
- 2.一个进程进来时,先放在第一个队列,按照先来先服务的策略调度,如果在时间片结束时,还未执行完毕时,就将他放入下一个队列执行,以此类推
- 3.当上一个队列里没有空闲时,再去调用下一个队列里的进程
- 多级反馈调度算法不需事先知道进程的要求时间,而且满足多种类型进程的需要
多级页表怎么节约内存
互斥和同步
- 互斥的PV操作是在同一个线程
- 同步的PV操作分布在不同的线程
栈帧?? 缓冲区溢出??
五层协议
应用层 实现用于程序的传输协议 传输层 提供可靠地字节流服务 两个节点之间的可靠连接 端口到端口的通信 网络层 ip寻址和路由 链路层 将数据分割为帧,通过mac地址广播 互联设备之间的传播 物理层 01 -》 光电信号的转换
粘包拆包
粘包、拆包发生原因 发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充, 1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。 2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。 3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。 4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包