静态库和动态库
#include<stdio.h>
这里面存储了函数的声明,是系统封装的函数库文件
我们仅仅使用这一步是无法看到这个库文件中包含的参数等信息
相当于是对其中的函数起到一个加密信息的功能
那么在Linux中,所有的库文件都是存储在根目录下的usr中的lib中
我们就可以模仿#include<stdio.h>
来创建Linux中自己使用的静态库文件和动态文件
1.静态库
静态库的格式:lib***.a
1)首先将需要打包到静态库中的文件编译成
***.o的文件形式
2) ar crv创建静态库
3)使用静态库
我们使用静态库的目的就是可以通过一步编译让main程序调用add.c mul.c
这样我们就可以使用静态库一步生成调用了静态库中文件的可执行程序
2.动态库
那抹有了静态库为什么还要使用动态库呢,因为我们在使用静态库中,经过多次使用,静态库的文件会在每次使用时都复制一份,那么我们为了增加使用效率,我们使用动态库
动态库格式:lib***.so
1)第一步和静态库的第一步相同,将要打包的文件编译为.o形式
2)生成动态库
3)使用动态库
这里建议和静态库使用方法一致,在本路径有动态库的前提下
这个命令默认使用动态库
main程序内部
在之前的学习中,我们都默认main程序不包含参数
那么今天我们来学习main程序中的参数
实际上main函数中是有这几个参数的
可以看到编译是可以通过的
并且这里可以看到输出结果为1,说明包含了一个参数 这里是把./main解析为一个参数
其实我们在运行时是可以加几个参数的
这里可以看到我们就有4个参数了
那么我们可以改变一下main函数内部
将这些参数以及包含的环境变量输出到屏幕上
可以看到这里是将所有的环境变量输出了出来
我们可以对环境变量进行更改
可以看到这里环境变量就添加上去了
先查看 ,在删除即可
bash
bash是一种常用的shell
并行和并发
并行和并发是操作系统中关于进程的操作
并行:在同一时刻,能够执行多个进程,每核每个时刻可以执行一个进程
多核cpu就可以在一个时刻同时执行多个进程
并发:
可以依靠调度算法实现伪并行
这里使用的是时间片轮转法
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。
为了提高CPU效率,我们可以将时间片设为500毫秒。这时浪费的时间只有1%。但考虑在一个分时系统中,如果有十个交互用户几乎同时按下回车键,将发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。
结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折中。
当时间片足够小,就可以实现类似并行的现象
printf的缓存机制
printf在Windows中是没有缓存机制的
但是在Linux中有缓存机制的
这里就涉及了
return
关键字,用于结束当前程序
exit
函数调用,系统识别,栈开辟,进程退出
_exit
内核级别函数
这个程序直接执行会在屏幕上睡眠五秒
这个不会立即输出hello
而是睡眠五秒才会输出hello
实际上这就是Linux中printf的缓存机制
在未遇到 \n ff lush就会缓存在Linux的printf缓存空间中
刷新缓存区的方法有
1.程序结束前会刷新
2.遇到\n
3.遇到fflush
4.缓存区放满
刷新缓存区之后就会将hello输出到桌面上
fflush+_exit(0)==exit(0)
这个程序就不会睡眠五秒再输出
而是输出两个hello后等待五秒输出一个hello然后结束程序