操作系统(2)


操作系统(2)


操作系统(2)

17.进程、线程的中断切换的过程是怎样的?

参考回答
上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。
进程上下文切换:
①保护被中断进程的处理器现场信息
②修改被中断进程的进程控制块有关信息,如进程状态等
③把被中断进程的进程控制块加入有关队列
④选择下一个占有处理器运行的进程
⑤根据被选中进程设置操作系统用到的地址转换和存储保护信息
(切换页目录以使用新的地址空间
切换内核栈和硬件上下文(包括分配的内存,数据段,堆栈段等))
⑥根据被选中进程恢复处理器现场
线程上下文切换:
①保护被中断线程的处理器现场信息
②修改被中断线程的线程控制块有关信息,如线程状态等
③把被中断线程的线程控制块加入有关队列
④选择下一个占有处理器运行的线程
⑤根据被选中线程设置操作系统用到的存储保护信息
(切换内核栈和硬件上下文(切换堆栈,以及各寄存器))
⑥根据被选中线程恢复处理器现场

18.简述自旋锁和互斥锁的使用场景

参考回答
互斥锁:
互斥锁用于临界区持锁时间比较长的操作。如:
①CPU单核
②临界区有 IO 操作
③临界区代码复杂或者循环量大
④临界区竞争非常激烈
自旋锁:
自旋锁主要用于临界区持锁时间非常短且 CPU 资源不紧张的情况下。
区别:当请求资源被占用,互斥锁会处于睡眠状态,而自旋锁会不断申请。

19.多线程和单线程有什么区别,多线程编程要注意什么,多线程加锁需要注意什么?

参考回答
区别:
①多线程从属于一个进程,单线程也从属于一个进程;一个线程挂掉都会导致从属的进程挂掉。
②多线程可以并发执行多个任务,而单线程只执行一个任务,多线程要考虑同步问题,而单线程不需要考虑同步。
③线程有切换的开销;单线程不需要切换。
多线程编程需要考虑同步的问题。线程间的同步方式包括互斥锁、信号量、条件变量、读写锁。多线程加锁,主要需要注意死锁的问题。破坏死锁的必要条件从而避免死锁。
如何解决:
①资源一次性分配,从而解决请求保持的问题
②可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;
③资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反。

20.说sleep和wait的区别?

参考回答
sleep:
sleep是一个延时函数,让进程或线程进入休眠,休眠完毕后继续运行。
在linux下面,sleep函数的参数是秒,而windows下面Sleep的函数参数是毫秒。
#include <windows.h>// 首先应该先导入头文件
Sleep (500) ; //注意第一个字母是大写。 //就是到这里停半秒,然后继续向下执行。
#include <unistd.h>// 首先应该先导入头文件
sleep(5); //停5秒 //就是到这里停5秒,然后继续向下执行。
wait:
wait是父进程回收子进程PCB资源的一个系统调用。
进程一旦调用了wait函数,就立即阻塞自己本身,然后由wait函数自动分析当前进程的某个子进程是否已经退出,当找到一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞,直到有一个出现为止。函数原型如下:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);

21.线程池?

21.1设计思路

①设置一个生产者消费者队列,作为临界资源。
②初始化n个线程,并让其运行起来,加锁去队列里取任务运行
③当任务队列为空时,所有线程阻塞。
④当生产者队列来了一个任务后,先对队列加锁,把任务挂到队列上,然后使用条件变量去通知阻塞中的一个线程来处理。

21.2线程数量

线程数量和哪些因素有关:CPU,IO、并行、并发

21.3为什么要创建线程池/作用

①当有大量任务涌入时,频繁的创建与销毁线程会消耗系统资源,引入线程池可以提高系统效率。
②由于线程数量的确定,我们可以控制内存容量。

21.4核心线程与普通线程

任务队列可以存放100个任务,此时为空,线程池里有10个核心线程。
若突然来了10个任务,那么刚好10个核心线程直接处理;
若突然来了90个任务,么80个任务先入队列,10个任务核心线程处理;
若突然来了120个任务,此时任务队列已满,不得已,就得创建20个普通线程来处理多余的任务。
以上是线程池的工作流程。

22.简述Linux零拷贝的原理?

参考回答
零拷贝概念:
就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。(可以延申 C++ 种的 push_back 和 emplace_back)
零拷贝的好处:
①节省了 CPU 周期,空出的 CPU 可以完成更多其他的任务。
②减少了内存区域之间数据拷贝,节省内存带宽
③减少用户态和内核态之间数据拷贝,提升数据传输效率

23.讲讲select,epoll,LT,ET

select/poll:
每轮循环都需要将描述符拷贝到内核空间;
轮询方式;
IO函数返回后用户想要得到就绪描述符必须遍历所有描述符。
epoll:
整个过程中每个描述符只需要往内核空间拷贝一次;
注册回调函数;
IO方法返回后,用户可以直接得到就绪描述符。
LT:
水平触发
当缓冲区有数据时会不断地提醒用户去操作。
ET:
边沿触发
每当有一串数据传来时只会提醒一次,直至下一个数据到来。
缺点:
如果本身就仅有一个数据传来,由于循环读取,系统会一直等待下一次数据从而阻塞掉,因此我们需要将描述符设置成非阻塞fcntl,提醒一次后设置内循环直到把这次数据读完。

24.同步与异步,阻塞与非阻塞?

参考回答
IO操作主要分为两个阶段:数据就绪和数据读写。
同步异步针对数据读写,阻塞非阻塞针对数据就绪。
同步异步:
同步:是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步:不用等所有操作都做完,就响应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。
区别:异步是内核将数据拷贝到用户区,用户直接使用;同步是内核通知用户数据到了,然后用户自己调用相应函数去接收数据。
阻塞非阻塞:
阻塞IO:调用者调用了某个函数并等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。
非阻塞IO:非阻塞等待,每隔一段时间就去检查 IO 事件是否就绪。没有就绪就可以做其他事情。

25.说说IO模型的类型

参考回答
①阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。
②非阻塞IO:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。
③信号驱动IO:Linux使用套接口,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件。
④IO多路复用:select,poll,epoll。
⑤异步IO:Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。用户可以直接去使用数据。
前四种模型–阻塞IO、非阻塞IO、多路复用IO和信号驱动IO都属于同步模式,因为其中真正的IO操作(函数)都将会阻塞进程,只有异步IO模型真正实现了IO操作的异步性。

26.BIO、NIO有什么区别?

参考回答
BIO(Blocking I/O):阻塞IO。调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。
NIO(New I/O):同时支持阻塞与非阻塞模式,NIO的做法是叫一个线程不断的轮询每个IO的状态,看看是否有IO的状态发生了改变,从而进行下一步的操作。

27.socket网络编程中客户端和服务端用到哪些函数?

参考回答
service:
①socket创建一个套接字
②bind绑定ip和port
③listen监听套接字
④accept接收客户端的连接
⑤recv,send收发数据
⑥close关闭连接
client:
①socket创建一个套接字
②connect申请链接
③send,recv发收数据
④close关闭连接
在这里插入图片描述

28.寄存器与内存的区别?速度比较?

寄存器:
寄存器通常由触发器组成,寄存器拥有非常高的读写速度,所以在寄存器之间传递数据非常快。
内存:
内存就是存储器,由半导体器件构成。
计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。

为什么寄存器比内存快呢?
①距离不同。
内存离CPU比较远,所以消费更长的时间储存。相比之下,寄存器在CPU内部,当然读起来会快一点。
②工作方式不同
寄存器工作方式只有两步:找到相关位;读取这些位。
而内存的工作方式复杂得多。先找到数据的指针,而数据的指针就可能存在寄存器中,所以第一步就可能包含了寄存器的全部工作。
而后面还需要查找内存单元、将逻辑地址映射到物理地址等,流程比较复杂。

【补充】OSI网络七层模型

说明:
传输层数据称作段(Segments)
网络层数据称作报(Packages)
数据链路层数据称作帧(Frames)
物理层数据称作比特流(Bits)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值