当前位置: 首页 > news >正文

免费网站重生九零做商女自适应企业网站源码

免费网站重生九零做商女,自适应企业网站源码,新野网站建设,手机优化系统文章目录 1、进程优先级1.1 Linux下查看进程优先级1.2 Linux 进程优先级的修改PRI and NItop命令配合操作更改优先级 1.3 竞争 独立 并行 并发 2、进程间切换3、Linux2.6内核进程调度队列3.1 活跃进程3.2 过期进程 4 main函数参数 — 命令行参数4.1 利用main函数的参数实现一个… 文章目录 1、进程优先级1.1 Linux下查看进程优先级1.2 Linux 进程优先级的修改PRI and NItop命令配合操作更改优先级 1.3 竞争 独立 并行 并发 2、进程间切换3、Linux2.6内核进程调度队列3.1 活跃进程3.2 过期进程 4 main函数参数 — 命令行参数4.1 利用main函数的参数实现一个计算器4.2 模拟实现touch命令 5、环境变量5.1 PATH的认识5.2 修改环境变量PATH5.3 HOME的认识5.4 如何获取环境变量 1、进程优先级 排队的本质就是确认优先级。 优先级是什么它也是PCB中的一个整型字段数值越小优先级越高。是得到某种资源的先后顺序。 Linux进程的优先级数值范围60~99。 Linux中默认进程的优先级都是80。 为什么要有优先级本质是资源不足。 谈到优先级就不得不说我们以前学的权限它两区别是什么呢 权限是能不能得到某种资源。优先级是保证能申请到某种资源只不过需要等一等。就如现实中我们去吃饭人很多但是做饭师傅只有那么几个看到能给你做好端上来只不过是有顺序的讲究先来后到。 Linux下进程的优先级概念 cpu资源分配的先后顺序就是指进程的优先权priority。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用可以改善系统性能。还可以把进程运行到指定的CPU上这样一来把不重要的进程安排到某个CPU可以大大改善系统整体性能。 1.1 Linux下查看进程优先级 首先我们先写一份C语言代码 #include stdio.h #include unistd.hint main() {while(1){printf(I am process, pid: %d\n, getpid());sleep(1);}return 0; }编译运行我们查看一下该进程的优先级 ps -laLinux下进程的优先级是由两部分组成的PRI(priority) NI(nice) 那么优先级可不可以改呢 可以下面我们就学习一下怎么改。 1.2 Linux 进程优先级的修改 修改进程的优先级并不是直接修改 PRI 而是修改NI值从而达到修改PRI值的。 PRI and NI PRI也还是比较好理解的即进程的优先级或者通俗点说就是程序被CPU执行的先后顺序此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了其表示进程可被执行的优先级的修正数。 这里修改PRI值的公式PRI(new) PRI(old) nice top命令配合操作更改优先级 输入top命令 - 输入r - 输入PID - 输入nice值 就完成了进程优先级的修改我们来试一下 我们输入top后回车来到此界面再输入r后就提示我们输入PID 接下来我们输入PID 输入完PID它提示我们输入nice值我们输入10 完成后按q退出。 我们来查看一下13312进程的优先级有没有被改 我们可以看到进程的优先级已经被改并且nice值确实也变了。修改后PRI值变大了意味着进程优先级顺序变小了。 我们在此基础上来修改一下nice值这次我们输入-10看看优先级会如何变化 这里显示将PID为13312的进程nice值设置成-10是不被允许的操作这是怎么回事 进程的优先级修改时如果我们只是将优先级调小普通用户身份就可以完成。但是如果我们想要调大就需要以管理员身份/普通用户身份提权来操作因此我们 top前加sudo 来操作。 这下确实能修改了但是我们是在之前的基础上修改的呀为什么nice值改为-10后PRI值却是70呢 因为每次修改PRI值的时候PRI(old)值都是以80为基础加上设置的nice值得出的数值再赋给PRI(new)的。 我们再来试试直接将nice设置为100再看看PRI值会被改为多少。 这里我们发现nice值并不是-100而是-20这又是为什么呢 因为我们优先级最高是60不管我们怎么去调整最高60就限制了nice最小只能到-20只要我们输入的nice值小于等于-20都会被当-20来处理。 那么PRI的值最大是99由此我们可以推测出nice值最大被限制在19了输入nice值大于等于19都会被当作19来处理。 我们来测试一下 确实不出我们所料呀。 我们看到有疑惑为什么要把优先级限定在一定的范围内呢 os调度的时候要做到公平较为均衡的让每一个进程都要得到调度。因为优先级可以改用户恶意让自己的进程不断在最前面执行那么容易导致优先级较低的进程长时间得不到CPU资源导致进程饥饿。 总结 PRI值越小越快被执行那么加入nice值后将会使得PRI变为 PRI(new)PRI(old)nice。这样当nice值为负值的时候那么该程序将会优先级值将变小即其优先级会变高则其越快被执行。所以调整进程优先级在Linux下就是调整进程nice值。nice其取值范围是-20至19一共40个级别。需要强调一点的是进程的nice值不是进程的优先级他们不是一个概念但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据。 1.3 竞争 独立 并行 并发 竞争性: 系统进程数目众多而CPU资源只有少量甚至1个所以进程之间是具有竞争属性的。为了高效完成任务更合理竞争相关资源便具有了优先级。独立性: 多进程运行需要独享各种资源多进程运行期间互不干扰。并行: 多个进程在多个CPU下分别同时进行运行这称之为并行。并发: 多个进程在一个CPU下采用进程切换的方式在一段时间之内让多个进程都得以推进称之为并发。 调整系统优先级有很多方法这里我们只说了这一种方式我们学习了本质有了底层的打底操作再去学习就会变的简单了并且轻易我们是不需要去改优先级的。 2、进程间切换 我们要知道一个进程并不是占有CPU就一直运行每隔一段时间自动被从CPU上剥离下来所以这就会存在进程切换的过程。 Linux内核支持进程之间进行CPU资源抢占的。 如果一个进程的PRI值是80它正在CPU上运行但是又来一个进程它的PRI是60意味着它需要被运行这时就把PRI为80的进程拿下来先让PRI为60的进程跑可能此时时间还没到。 所以Linux调度的原则全程基于时间片的轮转式抢占式内核。 CPU运行的时间特别快我们感知不到在一段时间内进程是高速的的不断的切换我们所感知到的进程是并发的。 问题 进程切换的时候可能一份代码并没有跑完但是需要切换另外一个进程了那下一次再运行此进程的时候CPU怎么知道是从哪开始呢 CPU中有寄存器eip就是专门记录程序运行到哪一行的。 由此我们也可以知道一个CPU虽然只有一套寄存器硬件但是寄存器的数据不仅仅是一套。寄存器 寄存器内容。并且进程切换后进程的数据存在CPU的寄存器中。 问题 CPU内的寄存器数据保存在哪呢 CPU内的寄存器数据保存在进程PCB中简单理解本质CPU寄存器的内容保存在内存中。 保存完之后寄存器中的数据不会清空下个进程被调度运行时直接覆盖即可。 3、Linux2.6内核进程调度队列 这部分是选学读者看自己情况来决定。 下图就是CPU维护的运行队列我们主要盯着蓝色框和红色框来看 3.1 活跃进程 首先我们要知道Linux下进程优先级范围为60~99共计40个等级其次运行队列是分活跃队列和过期队列他们两个的功能后面我们就知道了。 CPU在运行时会从上到下去扫描队列优先级为n的位置不为空就会去运行它指向的PCB为空就往后走去找不为空的位置直到遍历完队列。 3.2 过期进程 问题 如果CPU正在运行队列中运行优先级为99的进程而现在一个优先级为70的进程加载进来会直接放入活跃进程队列中与正在运行的队列抢占资源吗 肯定是不会的如果我们不断加载进来进程原本优先级低的进程迟迟得不到CPU资源导致进程饥饿 所以新加载进来的进程会先去过期进程数组按照优先级顺序排队。 在活跃进程数组没有被全部运行完时CPU不会去调度过期进程的数组这就保证了公平性。 当活跃队列的进程全部运行完后CPU不是去过期进程数组调度而是swap(active, expired)改变指向后依然运行活跃进程数组。 由此我们也就知道在进程间切换的时候我们就是把换出的进程放入了过期进程的数组中等待CPU下一次的调度。 4 main函数参数 — 命令行参数 main函数是有两个参数的int argcchar* argv[]。 我们来介绍一下 int main(int argc, char* argv[]); // 这两个参数叫做命令行参数 // argv是一个数组类型是char*也就是指针数组 // argc表示这个数组的元素个数我们现在还不知道这个数组中存放的是什么内容我们在Linux下写一个main函数打印一下数组内容看看 #include stdio.hint main(int argc, char* argv[]) {int i 0;for( ; i argc; i){printf(argv[%d]: %s\n, i, argv[i]);}return 0; }我们发现它把我们的命令打印出来了我们多写点看看如何。 这里原来是把我们的命令以空格分割开存入到字符串指针数组中的 问题 那是谁把命令放入到数组中的 将命令行输入的字符串放入数组是os干的。 4.1 利用main函数的参数实现一个计算器 既然main函数可以拿到命令行输入的字符串那我们可以用其写出一个简易的计算器代码如下 #include stdio.h #include string.h #include stdlib.hint main(int argc, char* argv[]) // argc代表参数个数argv是字符串数组参数 {// 简易版计算器if(argc ! 4){printf(Use Error!\nUsage %s op[-add|-sub|-mul|-div] d1 d2\n, argv[0]);return 0;}// 将字符数字转为int x atoi(argv[2]);int y atoi(argv[3]);int result 0;// 你的程序一定有4个命令行参数第一个是程序名if(strcmp(-add, argv[1]) 0){result x y;printf(%d %d %d\n, x, y, result);}else if(strcmp(-sub, argv[1]) 0){result x - y;printf(%d - %d %d\n, x, y, result);}else if(strcmp(-mul, argv[1]) 0){ result x * y;printf(%d * %d %d\n, x, y, result);}else if(strcmp(-div, argv[1]) 0){if(y 0) printf(%d / %d error! div zero\n, x, y);else {result x / y;printf(%d / %d %d\n, x, y, result);}}else {printf(Use Error!\nThe second parameter should is [-add|-sub|-mul|-div] !\n);return 0;}return 0; }使用方法 1、先输入可执行程序 2、第二个字符串输入 -add/-sub/-mul/-div 3、第三个第四个输入操作数 4.2 模拟实现touch命令 在使用完我们写的计算器后有没有感觉到跟我们的Linux下指令很类似。 比如ls命令我们可以配选项ls -l -a。 这些指令就是用C语言写的加上一些选项在显示器上显示不同结果它们的本质不就是用到了命令行参数么。 下面我们自己在实现一份touch指令代码 #include stdio.hint main(int argc, char* argv[]) {if(argc ! 2) // 输入的字符串不规范{printf(touch missing file operand!\n);return 1;}FILE* fp fopen(argv[1], w); // 以w方式打开当文件不存在时会自动创建 if(fp ! NULL) fclose(fp); return 0; } 我们使用自己写的touch来创建文件试一下 5、环境变量 系统中有很多的环境变量我们可以使用 env 命令来查看一下 其他我们不知道今天我们挑着来学几个。 5.1 PATH的认识 我们命令行参数算是学明白了但是大家有没有想过这样几个问题。 问题 为什么我们写出来的程序在执行的时候需要加 ./为什么在执行系统的指令的时候不需要加 ./ 执行一个程序的前提是先找到这个可执行程序我们写的程序在执行的时候加上 ./ 本质是告诉bash在当前目录下找该程序。 系统指令也是 C/C 写出来的程序那为什么系统指令不需要加呢 一般的系统指令我们可以直接用也可以加上它的路径执行 这里系统指令不用加 ./ 就得提一下一个概念了环境变量。 记录系统当中默认搜索路径的环境变量叫做PATH一般环境变量名是全大写的。 在执行系统指令时系统会去PATH中找当前的可执行程序在不在这些路径中如果在正常执行不在就报错。 查看环境变量内容指令 echo $xxx // 例如查看PATHecho $PATH这些路径按 : 分割开 先在/usr/local/bin找没有去下一个路径找找到执行没找到继续下一个找完都没有就返回错误信息。 因为我们自己的可执行程序并不在这些路径中所以我们的可执行程序在执行的时候需要加上 ./ 来执行。 5.2 修改环境变量PATH 想要我们自己的程序像系统指令一样运行我们可以将可执行程序的路径追加到环境变量PATH中去 命令如下 PATH $PATH:要添加的路径注意 这里不能直接等于要添加的路径直接等于就会覆盖掉原本的PATH因为我们要按照上面追加的形式的来写。 此时我们再去运行我们自己的mytouch程序就不用再带 ./ 了。我们来试试 注意 默认更改环境变量只限于本次登录重新登陆环境变量自动被恢复。想要一劳永逸可以将自己的可执行程序放入到默认的路径中这个过程就做程序安装。 5.3 HOME的认识 问题 大家有没有疑惑过我们在登录xshell的时候我们以不同身份登录进入的是不同的目录呢 问题 凭什么普通用户登录后默认所处的目录是/home/XXX ?凭什么root登录后默认所处的目录是/root ? 因为系统中有一个环境变量HOME在我们输入用户名与密码的时候识别出登录者身份初始化HOME它能识别出登录者是普通用户还是root并完成正确的初始化。 系统在登录的最后一刻cd HOME所记录的路径因此就实现了不同身份进入不同的目录。 总结 1、输入用户名 密码 2、认证 3、形成环境变量不止一个  3.1 根据用户名初始化 H O M E / r o o t HOME/root HOME/rootHOME/home/XXX 4、最后cd $HOME。 5.4 如何获取环境变量 我们知道了环境变量以及查看环境变量命令加之对HOME这个环境变量的学习后 我们明白了系统中会存在大量的环境变量每一个环境变量都有自己的特殊用途用来完成特定的系统功能 问题 那么如何获取环境变量呢 我们这里讲一个函数getenv()并配合一个场景来讲。 这里讲了getenv()函数是以变量名来查找的返回相应的字符串指针。 我们是不是可以按照用户名来对用户做甄别不同用户去执行不同的代码。 假如我们写一段代码只想让root来执行普通用户不能执行 #include stdio.h #include string.h #include stdlib.hint main() {char* user getenv(USER); // 获取环境变量USER的内容if(strcmp(user, root) 0){printf(myself command!\n);}else{printf(%s是一个非法用户\n, user);}return 0; }编译后我们以普通用户身份运行 我们再切换到root身份运行 在这里插入代码片
http://www.zqtcl.cn/news/872608/

相关文章:

  • 做进行网站推广赚钱互联网企业信息服务平台
  • 微信公众号做视频网站吗百度账号登录入口网页版
  • 北京建设银行纪念钞预定官方网站撤销网站备案申请书
  • 网站平台策划书安丘市建设局网站
  • 图片类网站建设seol英文啥意思
  • 网站编辑工作好做吗WordPress的图片存在哪
  • 你的网站尚未进行备案为什么网站百度搜不到了
  • 沙洋网站开发网站建设方案免费
  • iis建设网站教程单页面推广网站
  • 东莞网站建设效果郑州企业自助建站系统
  • php做的购物网站系统下载宜州做网站需要多少钱
  • 昆明网上商城网站建设怎么做网站教程视频
  • 网站开发都需要什么移动公司网络维护待遇
  • 计算机网络技术网站建设方向wordpress虚拟货币
  • 小江网站建设公司紧急页面通知升级中访问大通知
  • 那个公司做的网站详情页好看做动态图片的网站吗
  • 旅游网站模板文章wordpress 删除
  • 沛县专业做网站wordpress id重置密码
  • 湖南邵阳建设局网站做外贸一般用什么网站
  • html网站开发主要涉及哪些技术越秀金融大厦地址
  • 北京建设银行网站田村广州室内设计公司排行榜
  • 安徽金路建设集团有限公司网站平面设计班培训入门
  • 小型电子商务网站开发php mysql网站开发教程
  • 网站建设常州麦策电商2 网站建设的一般步骤包含哪些
  • cn免费域名注册网站企业推广的渠道有哪些
  • 关于网站建设心得体会网站的功能包括哪些
  • 番禺网站制作技术网站建设与管理pdf
  • 毕业设计做网站选题营销型网站功能模块
  • 西部数码网站管理助手安装建工教育网
  • wordpress 网站logowordpress文本编辑器插件