| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2741 人关注过本帖
标题:系统调用的问题
只看楼主 加入收藏
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:12 
系统调用的问题
《操作系统》教材:“在输入输出操作中直接使用底层的系统调用会产生这样一个问题,即它们的效率可能非常低,原因如下:系统调用会降低计算机的执行性能。……”

问题:为什么说效率非常低?
搜索更多相关主题的帖子: 执行 调用 系统 原因 效率 
2020-06-09 22:21
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
库函数最终也得使用系统调用,相比之下,不应该是库函数效率更低吗?要说功能完备,库函数赢;要说执行特定功能,增加了一堆代码后怎么效率反而高呢?

梦想拥有一台龙芯3A-4000
2020-06-09 22:29
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:100 
因为降低了调用次数?
2020-06-09 22:43
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
反正书上有幅图,用户程序那儿画了根线意思是通过系统调用进入核心态执行,应该跟次数没关系吧

这门课有点蒙圈啊……

梦想拥有一台龙芯3A-4000
2020-06-09 22:50
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
我是这么理解的,比如文件写入,因为库函数有了缓冲区所以不用每次都使用系统调用,所以少了调用次数。
下面这个是我从网上找到的:


现在我们看一下,在没有缓冲区的情况下,利用gcc编译程序并运行,从文件读入一个字符的过程:

   用户态程序调用 getc(FILE* stream)  --->  GNU C库 getc  ---->系统调用 -----> GNU C返回代码 ---->用户态getc返回 --->读入成功

   其中红色文字部分表示比较耗时,代价比较高。试想如果我们读入10000个字符,那么这样一个耗时操作就要执行1000次。

   所以,C中引入了缓冲区,缓冲区实际上是一块内存空间,这样当进行系统调用的时候,就不只读一个字符了,C标准库中stdio.h中定义了BUFSIZE就是缓冲区的大小,即每次读入数据的大小。这样结构就发生了变化:

  用户态程序调用 getc(FILE* stream)  --->  GNU C库 getc  ---->系统调用 ----->读入缓冲区----> GNU C返回代码 ---->用户态getc返回 --->读入成功

  遮样当时图读取第二个字符的时候,就免去了红色的部分,而是用缓冲区取代了原来的系统调用部分,大大减少了系统调用的次数。提高程序的效率。
2020-06-10 07:09
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
网上这个实在是不敢苟同……

read函数也在用户空间申请缓冲区(参数里就明确了),然后根据i节点文件类型再调用不同的读写函数,最后应该是利用类似put_fs_byte把获取的字节一个字节一个字节写进缓冲区,空间剩余部分填0。

getc参数FILE里有两项cha *__bufp和char *buf用于标识缓冲区,如果只在固定BUFSIZ=8192相当于2页连续空间里进行类似操作;那read函数就算再差,在缓冲区中申请4页连续空间应该还不难,实在分配不了就等着缓冲区解锁直到分配成功,再怎么说4页的效率也比getc的2页高吧

梦想拥有一台龙芯3A-4000
2020-06-10 09:34
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
是不是应该同“类型”的比较, 比如:read 和fread对比      
2020-06-10 10:57
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
库函数里倒是有一大堆,这个get那个get的

刚查了一份有221个系统调用的,跟读操作相关只有三个,read、readv-读缓冲组、pread-随机读(后面两个基本可以不考虑),对应写操作也只有类似的三个

梦想拥有一台龙芯3A-4000
2020-06-10 12:00
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
程序代码:
#include <stdio.h>

void hello(void)
{
    printf("hello, world\n");
}

void main(void)
{
    __asm__("cli; call hello");
}


试了一下关中断

梦想拥有一台龙芯3A-4000
2020-06-10 12:36
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
个人感觉还有各种连接池、pool应该也是同样的目的,提高复用以降低连接的次数
2020-06-10 21:03
快速回复:系统调用的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016361 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved