系统调用

2019-2020-1 20175311 学习pwd实现mypwd

别说谁变了你拦得住时间么 提交于 2019-12-16 13:37:20
2019-2020-1 20175311 学习pwd实现mypwd 实现要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k | grep ),写出伪代码 3 实现mypwd 4 测试mypwd 学习pwd命令 pwd的意思是Print Working Directory,也就是打印工作目录,意如其名,就是说打印出用户当前所在目录,它会打印出从根目录(/)开始到当前所在目录的完整路径。这条命令是一条shell的内置命令,并且在大多数shell中都可以使用,如bash、Bourne shell,ksh、zsh等等。 1.命令格式: pwd [选项] -L –logical 当目录为连接路径时,显示连接路径 -P –physical 显示实际物理路径,而非使用连接(link)路径 --help display this help and exit --version output version information and exit 根据上述要求在终端中输入 pwd 、 pwd -L 、 pwd -P pwd命令 pwd是print working directory的缩写,即打印当前路径的意思。打开终端,一定会在执行命令的$号之前看见当前的工作目录,不过一定会出现~在前面或是/etc在后面。此时输入pwd命令就是可以将工作目录完全展开。 输入 man pwd

《Linux系统调用:setvbuf,setbuf,setbuffer,setlinebuf,fflush》

╄→гoц情女王★ 提交于 2019-12-16 04:10:59
一、介绍 // stdio 库函数 当操作磁盘文件时,缓冲大块数据以减少系统调用,C语言库函数I/O函数fprintf,fscanf(),fgets(),fputs(),fputc(),fgetc()等都是这么做的,stdio库函数可以使编程者免于自行处理对数据的缓冲。 运行在用户空间! , 下一篇说到运行在内核空间 二、接口定义 // 下列函数都是设置stdio流的缓冲模式 #include <stdio.h> // 一般使用这个函数,可以设置参数替代下面的3个函数 int setvbuf(FILE *stream, char *buf, int mode, size_t size); 参数: stream : fopen 打开的流句柄 buf,size: 如果不为空,那么其指向buf区域size大小的内存块作为流的缓冲区 所以应该是动态或者静态分配的一块空间 如果为空,stdio库会为stream自动分配一个缓冲区,就好像我们程序中 并没有执行这个系统调用,为什么会有行缓冲区 mode: #define _IOFBF 0 /* Fully buffered. */ #define _IOLBF 1 /* Line buffered. */ #define _IONBF 2 /* No buffering. */ _IONBF // 不对I/O进行缓冲, 忽略buf和size参数

共享内存

核能气质少年 提交于 2019-12-16 01:59:12
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。linux发行版本如Redhat 8.0支持mmap()系统调用及系统V共享内存,但还没实现Posix共享内存,本文将主要介绍mmap()系统调用及系统V共享内存API的原理及应用。 一、内核怎样保证各个进程寻址到同一个共享内存区域的内存页面 1、page cache及swap cache中页面的区分:一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述。struct page中有一个域为指针mapping ,它指向一个struct address

什么是原语?

隐身守侯 提交于 2019-12-15 21:40:37
“原语 操作系统或计算机网络用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程。primitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。”——来自百度百科 第一次看到“原语”这种提法还是在学习操作系统的时候,而且要么不碰到,一碰就是一双,“PV操作”这对原语就是我最先接触到的操作系统原语。当年 Alan Turing 在定义图灵机六个基本操作的时候也用了 primitive 这个词。当时觉得“原语”这个词很陌生,于是上网查了一下,大部分的解释都包含了“原子操作”的概念,事实上知道原语英文(primitives)的朋友应该知道它和“atomic”并没有多大关联,这说明“原语”和“原子”都姓“原”仅仅是一个巧合,尽管所有的“原语”看上去都是原子操作,但是它的定义绝对不仅限于此。 后来我在一个外国的论坛上找到了答案,具体的说法我已经忘了,简单地讲就是“石头、剪刀、布”这三样东西,除了“石头”是原语,而“剪刀”和“布头”不算,为什么呢?因为剪刀和布头都是人工合成的,而石头是浑然天成的。因此“原语”这个单词的定义还是要从它的英文原词 primitive 出发,也就是“原始”的意思。 我们知道物质的最小组成单位绝非原子,比原子小的是质子,比质子小的还有夸克

计算机基础篇之二

梦想的初衷 提交于 2019-12-15 14:13:41
目录    1.1 编程语言     1)低级语言     2)高级语言    1.2 内核kernel    1.3 程序    1.4 进程    1.5 cpu内存空间 1.1 编程语言 1)低级语言 #离机器越近语言 #二进制机器指令 #汇编语言 #ADD,R0,R1,ST... 2)高级语言 #离近人类越近的自然语言 #编译型语言 #c,c++,go... #解释型语言 #c#,python,java,swift,basic... 1.2 内核 kernel #是一个通用软件,运行在硬件上,不负责具体的工作,只是协调各个程序,将硬件资源所提供的硬件能力抽象成一个个系统调用(#system call),系统调用过于底层(由上层的程序员决定它的表现形式) #将底层系统调用再次封装成更高级的接口,这个高级接口就是库(library),库没有程序的执行入口,只能被调用(API #Application Program Interface) #在面向库的编程时,应用程序写出来的程序接口叫API,如果编译成二进制格式,这个接口叫ABI(应用二进制接口) #执行用户代码的机制叫"用户空间",用户空间发起的系统调用,执行内核代码的机制叫"内核空间" (cpu运行在用户空间) 1.3 程序 #程序可以通过系统调用直接运行在内核上(执行效率更高,权限更大)也可以通过库调用来完成

库函数与系统调用

百般思念 提交于 2019-12-14 21:46:18
系统调用可以解释为操作系统为用户提供的一些接口,这些接口提供了对系统硬件功能的操作。这样说大家可能还有点抽象,我再举一个更具体的例子:比如我要写一个程序,这个程序的功能就是在屏幕上显示一个字符串“hello,world!”。那么实现这么一个在屏幕上显示一个字符串的操作就是系统调用write()的功能。 那么系统调用的意义在哪里呢? 你想想看,你写一个程序还需要自己去实现在屏幕上打印字符串的代码,这也太累人了吧,,因此系统调用把我们从底层的硬件编程中解放了出来。再者,系统调用是内核代码,内核代码能访问系统上的所有地址空间,而我们执行的代码是用户空间的代码,用户空间的代码在对系统进行操作时是有限制的,(作为一个菜鸟程序员,系统如果不对你写的代码进行限制,,万一把系统搞蹦了呢。。)。因此系统调用的另一个功能就是维护了系统的安全性,,你要用就直接调用我这个接口就行了,,不用你自己写。系统调用还有一个功能就是为了方便程序的移植性。。 总之,你就把系统调用当做一个接口,什么时候你需要使用它了,调用一下它就行了,既方便又安全。。 你可能会有疑问,我们平时在写C语言时打印一个字符串不是用printf()函数吗?这个printf()跟前面提到的那个系统调用write()有什么区别呢?问对了。 其实你可以把库函数当做是对系统调用的又一次封装。。什么意思呢?系统调用作为内核提供给我们的接口

zz温故知新:Tomcat调优&JVM内存性能调优

泪湿孤枕 提交于 2019-12-14 09:16:11
Java 性能优化原则: 代码运算性能、内存回收、应用配置(影响Java程序主要原因是垃圾回收,下面会重点介绍这方面) 代码层优化: 避免过多循环嵌套、调用和复杂逻辑。 Tomcat 调优主要内容如下: 1 、增加最大连接数 2 、调整工作模式 3 、启用gzip压缩 4 、调整JVM内存大小 5 、作为Web服务器时,与Apache整合或Nginx 6 、合理选择垃圾回收算法 7 、尽量使用较新JDK版本 生产配置实例: <Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript"/>