操作系统八股

进程和线程区别

进程是资源分配的最小单位,线程是CPU调度的最小单位
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
进程在执行过程中拥有独立的地址空间,而多个线程共享进程的地址空间。
由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现,也变得比较容易。进程间通信需要借助IPC

进程通信方法

管道(匿名管道,有名管道),系统IPC(消息队列,共享内存,信号量),套接字SOCKET

线程通信方法

共享变量(不是线程安全的操作)
声明一个全局变量,将这个全局变量在各个线程中使用 ,需要加锁
使用queue模块,可在线程间进行通信,并保证了线程安全。

进程同步的方法

信号量、互斥量、事件

线程同步方法

信号量、互斥、临界区、事件

进程和线程的应用场景

进程适用于计算密集型的执行任务中,多机分布,可以充分利用多核优势
线程适用于IO密集型的执行任务中
原因:因为I/O阻塞导致频繁切换,线程只占用栈,程序计数器,一组寄存器等少量资源,切换效率高

python os模块常用命令

os.getcwd()——得到当前工作的目录。
os.rmdir()——删除指定目录
os.mkdir()——创建目录
os.remove()——删除指定文件

调用fork()

fork()函数其实是调用发起_fork()系统调用,控制权由用户态转为内核态,内核会分配新的内存块和内核数据结构给子进程(也就是PCB task_struct结构体),然后内核会将父进程的部分数据内容以二进制形式拷贝到子进程,接下来再将所谓的子进程PCB加入到管理链表中(操作系统管理进程就是将程序用PCB描述,用链式结构进行管理),然后从内核态返回用户态(父进程fork返回进程pid,子进程返回0),之后开始调度器调度。

fork时子进程获得父进程代码和数据段、共享库、堆和栈的复制,所以变量的地址(当然是虚拟地址)也是一样的。

如何实现内核态和用户态的切换?

处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。
系统调用是操作系统的最小功能单位,是操作系统提供的用户接口,系统调用本身是一种软中断。
异常,也叫做内中断,是由错误引起的,如文件损坏、缺页故障等。
外部中断,是通过两根信号线来通知处理器外设的状态变化,是硬中断。

什么是内核态和用户态?

为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。
内核态是操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间。
用户态是用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间。
用户程序运行在用户态,操作系统内核运行在内核态。

写时复制

写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下—举例来说,fork()后立即调用exec()—它们就无需复制了。fork()的实际开销就是复制父进程的页表以及给子进程创建惟一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)。

Linux启动过程

BIOS自检、系统引导、启动内核、初始化系统

死锁产生的原因

1、多个进程竞争资源
2、多个进程的推进顺序不恰当

死锁产生的条件

互斥使用
不可抢占
循环等待
请求和保持

死锁的处理方法

死锁预防
破环死锁产生的条件
在进程执行前,一次性分配所有分配的资源,这样就不会再占有资源去申请其他资源了。
对资源类型排序,资源申请必须按序进行,不会出现循环等待
死锁避免
判断下一个请求是否会造成死锁,如果造成就拒绝
银行家算法
死锁检测+恢复
发现死锁了,让一些进程回滚,让出资源
死锁忽略

常见的页面置换算法

当访问的页不存在或者内存满了,需要从内存中淘汰一页换到磁盘中,这种现象叫做缺页置换。常用的缺页置换算法:
FIFO
置换最先调入内存的页面
实现:
其基本思想是形成一个队列,最先入队的页面最先被逐出
OPT
被替换掉的页是以后再也不会使用的
LRU
选择最近最长一段时间没有使用的页淘汰
实现:
实现一个链表(双向链表),每次要缓冲新的页面时,遍历链表,选择最近最少使用的页面进行逐出操作。
Clock
一种最近未使用算法,即逐出的页面都是最近没有使用的那个
实现:
给每一个页面设置一个标记位u,u=1表示最近有使用u=0则表示该页面最近没有被使用,如果要进行换页了,最初要经过一轮遍历,每次遍历到一个节点发现u=1的,将该标记位置为0,然后遍历下一个页面,一轮遍历完后,发现没有可以被逐出的页面,则进行下一轮遍历,这次遍历之后发现原先1号页面的标记位u=0,则将该页面逐出,置换为页面5,并将指针指向下一个页面。
缺点:
如果缺页比较少,所有的U=1,直接退化为FIFO算法
改进:
再来一个扫描指针,用来清除U位,移动速度快,用来淘汰页的移动速度慢。

windows常用命令

ping命令

测试是否联通
在这里插入图片描述

ipconfig

查主机的命令
在这里插入图片描述

tracert

跟踪路由
在这里插入图片描述
应用tracert命令,原理链接: link.

nslookup

域名查询
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值