操作系统常识

操作系统常识包括零拷贝技术,如Mmap、sendfile和splice,它们减少了数据在内存中的传递,提高效率。同时介绍了操作系统调度策略,如先来先服务、短作业优先、高响应比优先等。还探讨了进程与线程的区别,线程同步的互斥锁、读写锁等方法,以及进程间通信的各种方式。文章深入浅出地阐述了操作系统中的关键概念和技术。
摘要由CSDN通过智能技术生成

操作系统常识

零拷贝
传统linux的io接口操作是基于数据拷贝的,即io操作会造成数据在内核空间缓冲区与应用程序空间之间传输,这样可以减少磁盘操作,但同时也会造成cpu大幅开销.
如下例子:
Read(fd1,buffer,size) //fd1为文件标识
Write(fd2,buffer,size) //fd2为socket
代码完成了从本地文件向socket写入的功能,但实际完成过程为:
数据从 磁盘 -> 内核缓存
内核缓存-> 用户空间
用户空间-> socket缓存
Socket缓存-> 网络
共计四次数据拷贝,可见从磁盘根本不用到用户空间,直接从磁盘->socket缓冲即可;所以,防止数据从一块储存(磁盘)运送到另一块储存(用户空间)的技术就是零拷贝
Mmap:
Buffer = mmap(fd1,size);
Write(fd2,buffer,size)
Mmap相当于将fd1中的内容拷贝到了内核缓冲区,但操作系统会把这段缓冲区会与用户空间共用,当使用write向socket缓冲区写入时,只需要在内核中进行内核态的拷贝即可.最后再将拷贝到socket缓冲区中的数据发送到网络上即可.
磁盘 -> 内核缓存—socket缓存 ->网络
实际上这种传输很危险:当程序mmap了一个文件之后,如果其他进程使用(删除),那么write时就会因为非法访问而中断
常用方案:
1设置sigbus信号处理,当访问非法时中断写入
2上锁
fcntl(fd1,F_SETSIG,flock) //上锁
fcntl(fd1,F_F_SETLEASE ,flock) //下锁

sendfile() 使用sendfile函数完成拷贝
#include”sys/sendfile”
ssize_t sendfile( out_fd(socket_fd) , in_fd(磁盘fd),off_t* offset , size_t size)
out_fd必须是socketfd,即只能从磁盘写向socket
sendfile过程中如果发生中断,则返回已读取的字节数

splice
sendfile只适合从文件到socket,而splice可以完成双向传输
#include <fcntl.h>
ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);

以上几种方式都是在减少数据转移上取巧,但是如果一定要将数据写入用户空间,那么就要在写入时机上下功夫了COW 写时复制 就是通过这种方式减少系统开销
当多个程序同时对一块数据有读取需要时,只为程序配备指针,并不将数据读到内存中,只有需要写到其他地方时,才对数据进行读取,如果一直没有要求,就一直不读取
例如 string str1 = “hello” string str2 = st1

操作系统调度策略
1,先来先服务
2,短作业优先
3,高优先权优先调度算法(上述三种皆有极大缺点)
4,高响应比优先调度
5,多级反馈队列调度

作者:华中大守门员
链接:https://www.nowcoder.com/discuss/637559?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网

操作系统(1个月)
1、进程与线程区别
答:
进程:(线程+内存+文件/网络句柄)
内存是逻辑内存,每个进程都是相互独立的
文件句柄则是公用的,一个句柄所有进程都能够使用
线程:(栈+PC程序计数器+TLS线程本地储存)
栈就是堆栈;
PC(program coun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值