1.内存管理:固定分区,动态分区,虚拟内存(页式,段式,段页式)
2.进程线程:
进程和线程的区别
多进程、并发(并发->进程同步互斥->进程间通信 读者写者问题,消费者生产者问题,死锁问题)
同步通信方式
死锁问题(产生条件,避免办法,银行家算法,哲学家问题)
僵尸进程(如何避免僵尸进程)
3.linux文件系统:内存中的形式,软连接和硬连接
4.linux常用命令:
系统相关(查看内存,查看cpu,查看磁盘,查看进程,查看网络状态)
正则表达式,文件查找
1.内存管理:
固定分区-》动态分区-》伙伴系统(重定位)-》虚拟内存
固定分区:提前划分好内存,分区数目长度固定,大小相等的划分方式导致要么放不下(进程太大)要么浪费空间(进程太小),改进使用大小不等的分区,那么怎么选择合适大小的分区给进程呢,这就涉及到放置算法(最佳适配,最坏适应,首次适配)
动态分区:分区长度和数目不固定,当程序装入内存是给他分配所需大小的空间(装入也涉及到放置算法),因此会产生外部碎片。
固定分区和动态分区的折中,伙伴系统,可以具有动态分区的优势同时防止内存碎片。
伙伴系统:把内存看成是2^k大小的一个块,内存分配,如果所需的内存大小满足(2^u-1<s<=2^u)则直接分配,如果不满足,则把该内存一分为2分成两个伙伴块,如果满足则分配,如果不满足继续把其中一个块分成两个伙伴,知道满足所需大小。内存回收,如果一个程序运行完毕,则规划其所占有的内存,然后检查该内存和他的伙伴是不是都处于空闲状态,如果是则合并这两个伙伴。
但是不管是固定分区还是动态分区还是伙伴系统都必须要求一次性装入整个程序,因此无法运行比内存大的程序。因此引入虚拟内存
虚拟内存:
分页:把内存分成大小相等的小块,同时把程序分成大小相等的小块,每次进行内存分配的时候只需要按块进行分配。物理块和程序块的映射需要用到页表。一个程序运行的时候不需要全部加载到内存,只需要加载部分当前可能会用到的,如果运行到的部分没有加载到内存,就触发缺页中断,需要进行重新加载或者页面置换
(页面置换算法:https://blog.csdn.net/wuxy720/article/details/78941721最优置换:最远的将来才会被用到的FIFO,LRU:最近最久未使用)
分段:程序分段,内存根据程序的段大小被分成大小不等的块,类似于动态分区。物理内存和程序段的映射需要用到段表。
段页:先把程序分段再把段分块,内存只需要分块。
内存管理的其他问题:所有的分区技术都涉及到一个问题,当需要将进程换出内存,再加载到内存的时候,可能会加载到和之前分区不同的分区,因此引入重定位技术可以将被换出的进程加载到内存中的不同区域。这就涉及到逻辑地址(相对地址)和物理地址了。
2.进程和线程
进程和线程的区别:
进程是资源分配的基本单位(每个进程拥有独立的资源,但是线程是共享同一个进程的资源的),线程是调度和执行的基本单位
应用于并发,进程是粗粒度,线程是细粒度
进程有自己独立的地址空间,线程没有,同一个进程的多个线程共享该进程的空间。因此线程的创建和切换比进程要花费的成本小。由于进程有自己的独立地址空间,一个进程死掉不会影响别的进程,但是一个线程死掉就会影响整个进程。
进程的同步(通信):
信号量:任意两个进程之间的通信
管道:父子进程之间的通信 pipe 半双工
利用pipe产生两个文件描述符,分别表示管道的写端和读端(fp[1]写 fp[0]读),fork产生子进程,子进程继承父进程 的文件描述符,要实现从父进程向子进程传递数据,就需要关闭父进程的读端和子进程的写端
具名管道FIFO:任意两个进程之间的通信
socket:任意两个进程之间的通信
共享内存:任意两个进程之间的通信
消息队列:任意两个进程之间的通信
同步互斥——生产者消费者问题:
单一生产者和单一消费者,需要三个信号量,一缓冲区为空empty(),表示缓冲区是否可写;二缓冲区是否为满full(表示是否可读),三互斥量保障每次只有一个进程操作缓冲区。生产者必须判断是否为可写,然后再申请缓冲区的互斥量;消费者必须判断是否可读,然后再申请缓冲区的互斥量
多生产者和多消费者,需要五个信号量,前三个同单一生产者,最后两个分别是对判断缓冲区为空的本身的互斥量,防止多个生产者同时判断缓冲区为空同时写导致缓冲区溢出;判断缓冲区为满的本身的互斥量,防止多个消费者同时判断缓冲区为满同时读,导致读空缓冲区
读者写者问题:
https://blog.csdn.net/c1194758555/article/details/52805918(感觉这个博客里面最后一个公平竞争对于写者不需要再加一个控制令牌资源的信号量。。。)
读者写者问题和生产者消费者不同,读者不会消费资源,读者本身不会对资源造成影响,且多个读者可以同时读。
多读者多写者问题
读者优先:
需要一个记录读者数量的变量
需要一个保护这个变量被互斥访问的信号量
需要一个对资源(文件)的互斥访问的信号量。
对于读者只需要首先获得读者数量的互斥信号量,然后修改读者数量,第一个读者需要申请文件资源的互斥访问信号量,后续读者只需要直接读即可。当读者数量变为0时,即最后一个读者读完之后才释放文件资源的互斥量。
对于写者每次写之前只需要申请文件资源的互斥量即可。由此 可以看到读者不停的到达时,会造成写者的饥饿
写者优先:
需要读者优先的三个变量再加
需要一个表示写者数量的变量
需要一个保护写者数量变量被互斥访问的信号量
需要一个表示是否可读的令牌,实则表示当前是否有写者存在的信号量,如果有则不可读,即达到写者优先
对于读者相比于读者优先程序,需要首先判断是否可读,即申请一个可读的令牌。
对于写者首先取得写者数量的信号量,可以修改写者数量,如果是第一个写者,则申请可读令牌(即不让增加新的读者),然后每个写者再申请文件资源信号量(注意是每个,因为写者不能同时写),当写者数量是0时再释放可读令牌(此时读者又可读了)有此,如果不停有写进程的话,读者就不可读,保障了写者优先
公平竞争:
相比于写者优先,只需要把可读令牌编程可读写令牌
并且不需要记录写者数量的变量和信号量了
对于读者同写者优先的情况。
对于写者首先也要申请读写令牌,然后再申请文件次元互斥量
死锁
死锁的原因即条件:
互斥访问的特性;不可剥夺;占有且等待;环路等待
死锁的解决:不可剥夺(检测到死锁之后剥夺所有进程的资源,然后重新竞争)占有且等待(一次性申请所有的资源)环路等待(限定资源的申请具有一定的顺序)
死锁的避免:银行家算法
https://blog.csdn.net/qq_34649947/article/details/70224868
数据结构:系统当前拥有的资源的数目(随着资源的分配和回收会发生变化);进程还需要资源的数量(随着资源的分配会不断减小);进程已经被分配的资源的数目
算法流程:如果一个进程发出资源请求,
则判断其是否大于它还需要的资源的数目,如果大于出错。
再判断其是否小于系统当前的资源数目,如果大于则等待。
如果小于则判断分配之后系统是否处于安全状态,如果是则分配,否则不分配
判断处于安全状态:至少存在一个进程序列,满足对每一个进程分配完资源之后,其剩余的资源数目(当前剩余资源+已分配的资源(回收的资源))都能满足下一个进程的需求。
哲学家问题:
https://www.cnblogs.com/douzujun/p/6676270.html
问题描述,有五个哲学家坐在餐桌上,左右两边各有一根筷子,如果所有同时拿起左边(右边)的筷子就会发生死锁,如何避免。解决:限定最多只有四个人同时进餐;必须左右两边的筷子同时可用才允许进餐,不允许先拿一边(设定一个信号量数组表示筷子是否可用,设定一个信号量保护筷子信号量数组互斥被访问);偶数哲学家先拿左再拿右,奇数相反。
僵尸进程:
一个子进程结束,内核中的进程表表项并不会被立刻销毁,以供父进程读取状态,但是父进程如果不读取,这个进程就是僵尸进程了。
如何避免僵尸进程:利用wait wait_pid ;利用sigchild信号,待子进程结束通知父进程调用wait ;fork两次,父进程产生子进程,子进程产生孙进程后立即退出,并由父进程回收,孙进程继续运行并过继给init进程,从而避免了僵尸进程
3.文件系统
Linux文件系统是索引式文件系统(与索引文件系统对应的是Fat文件系统,文件的一个block记录下一个block的地址,有点像链表)
三种数据记录区,superblock ,inode ,block
superblock:记录整个文件系统的信息,包括文件系统的格式,inode block的总量使用量剩余量
inode:记录文件的属性,文件数据所在的block号码,一个文件一个inode
block:记录文件的数据
如果文件很大,block就很多,一个inode节点无法记录,就会使用索引,有直接索引(直接存放文件数据的block号码),一级索引(存放一些block的号码,这些block中存放的是文件数据的block号码),二级索引,甚至三级索引
文件的读取过程:首先通过挂载点找到对应的目录的inode,然后找到目录文件的block,里面存放的是目录项(文件名和文件对应的inode),然后根据文件名找到文件的inode,然后再找到文件对应的block
软连接和硬连接文件的区别:软连接是一个新的文件,拥有独立的inode,文件内内容是文件名,也就是要连接的文件,因此要连接的文件删除之后或者改名之后软连接文件就失效了;硬连接是和原文件共享同一个inode,如果原文件删除,硬连接依然可以读取文件内容,但是因为共享同一个inode,因此不能跨越文件系统建立硬连接。
4.linux常用命令
https://www.cnblogs.com/kingdompeng/p/5450437.html
目录文件:
chmod grep wc awk vi tar gzip(gz)
查看日志文件(tail head cat tac sed grep vi)
查看系统信息:
查看内存,free top
查看cpu,top
查看磁盘,df
查看进程,ps top 查看具体的某一个进程 ps aux | grep ‘java’
网络操作:
查看网络状态,netstat
查看配置网络设备,ifconfig( windows是ipconfig)
查看网络通不通:ping
远程登录:telnet
抓包:tcpdump