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

潍坊专业网站建设怎么收费深圳优化网站排名软件

潍坊专业网站建设怎么收费,深圳优化网站排名软件,网站建设管理制度实施方案,wordpress分类咋弄Linux进程概念 1.冯诺依曼体系结构2.操作系统#xff08;先描述#xff0c;再组织#xff09;3.进程3.1查看进程的方式3.2通过系统调用获取进程标识符3.4查看进程中常见字段状态的指令3.3fork创建子进程3.3.1fork的原理 3.4进程状态3.5进程优先级3.5.1Linux内核的调度队列与… Linux进程概念 1.冯诺依曼体系结构2.操作系统先描述再组织3.进程3.1查看进程的方式3.2通过系统调用获取进程标识符3.4查看进程中常见字段状态的指令3.3fork创建子进程3.3.1fork的原理 3.4进程状态3.5进程优先级3.5.1Linux内核的调度队列与调度原理 3.6环境变量3.6.1常见的环境变量3.6.2查看环境变量的方法3.6.3和环境变量相关的命令3.6.4环境变量的组织方式3.6.5通过代码获取环境变量3.6.6通过系统调用获取或设置环境变量3.6.7环境变量通常是具有全局属性的3.6.8Linux的命令分类 4.进程地址空间4.1地址空间与区域划分 1.冯诺依曼体系结构 输入设备包括键盘鼠标话筒摄像头usb磁盘等 中央处理器CPU含运算器和控制器 输出设备显示器等 存储器内存 注意 cpu能且只能对内存进行读写不能访问外设 外设要输入或者输出数据也只能写入内存或者从内存中读取 原因可以用木桶原理来解释cpu的计算和读取速率是纳秒级别的内存的读取速率是微妙到纳秒级别的而输入输出单元读取速率是毫秒到微妙级别的如果说cpu直接和输入输出单元打交道二者速率相差甚远也就会大量出现cpu等输入输出单元会拉低cpu的效率所以cpu在设置上不会直接和输入输出单元打交道 在程序运行之前必须先加载到内存程序代码数据最终都要CPU来处理CPU需要先读取到这些代码和数据而CPU和内存有“数据二进制层面”层面的交互也就是exe可执行程序本质上还是一个文件只能在磁盘中保存 2.操作系统先描述再组织 操作系统是一款进行软硬件管理的软件也就是第一个加载的程序 操作系统存在的意义是为了将软硬件管理好给用户提供良好稳定高效安全使用环境 操作系统包括 内核进程管理内存管理文件管理驱动管理 其他程序函数库shell外壳程序等等 操作系统管理硬件用struct结构体描述要管理的硬件然后用双向链表其他更加适用的数据结构来组织 操作系统不会去相信任何人但又要为人提供服务所以操作系统会暴露自己的部分接口供上层开发使用也叫做系统调用 库就是系统调用的函数封装的结合体 3.进程 程序vs进程 程序是在磁盘上的exe可执行程序 而进程是可执行程序从磁盘上拷贝到内存中操作系统为了管理进程会生成相应的PCB结构体来管理内存中的程序 所以进程内存中运行的可执行程序PCB结构体 所以操作系统管理进程其实是对PCB结构体形成各种数据结构进行管理 PCB在Liunx里是task_struct task_struct {//标示符: 描述本进程的唯一标示符用来区别其他进程//状态: 任务状态退出代码退出信号等//优先级: 相对于其他进程的优先级。//程序计数器: 程序中即将被执行的下一条指令的地址//内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针//上下文数据: 进程执行时处理器的寄存器中的数据//IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表//其他信息 }需要注意的是进程PCB不是只在一个数据结构里而是同时存在多个数据结构里 struct task_struct {struct task_struct* next;struct task_struct* prev;struct dlist list;//系统所有程序所在的列表struct dlist queue;//同时这个进程还可以在队列中//也可以在各种其他结构中 } struct dlist {struct dlist* next;struct dlist* prev; }//这里是取task_struct里的各种字段的一种方式 #define curr(list) (struct task_struct*)((int)list-(int)(task_struct*)0-list) curr(list)-pid;3.1查看进程的方式 ls /proc/ top ps3.2通过系统调用获取进程标识符 #includestdio.h #includesys.types.h #includeunistd.h int main() {printf(pid:%d\n,getpid());printf(ppid:%d\n,getppid());return 0; }3.4查看进程中常见字段状态的指令 while :; do ps ajx | head -1 ps ajx | grep mytest | grep -v grep;sleep 1;echo -----------------------;done3.3fork创建子进程 创建一个进程就是系统中要申请内存保存当前进程的可执行程序task_struct对象并将task_struct对象添加到进程列表中。 fork有两个返回值,给子进程返回0给父进程返回子进程的pid 父子进程代码共享数据各自开辟空间私有一份采用写时拷贝 fork之后通常要用if进行分流 3.3.1fork的原理 fork创建子进程系统中会多一个子进程它会以父进程为模板为子进程创建PCB父子的代码是共享的但数据是各自私有一份。 fork之后如果没有if-else分流的话会执行一样的代码fork之前的代码是只有父进程在执行那为什么子进程不执行fork之前的代码呢其原因是pc/eip执行fork完毕eip指向fork后序的代码eip在pcb内部保存所以eip也会被子进程继承。 fork之后父子进程谁先运行这个问题其实是不确定的因为创建完成之后与系统的其他进程都要被调度执行PCB都在运行队列中排队这要看哪个进程的PCB先被选择调度哪个进程就先运行而运行的先后由各自PCB中调度信息时间片优先级等调度器算法共同决定。 进程的独立性体现在各自有自己的PCB进行之间不会相互影响而共享的代码本身是只读无法修改代码共享数据各自私有一份。 fork有两个返回值的原因在于fork就是一个函数函数有返回值fork之后代码共享return也要被共享父进程被调度要执行return子进程也是如此所以有两个返回值 但更准确的讲法真实情况是操作系统通过一些寄存器做到返回值返回两次 3.4进程状态 R运行状态running: 并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里 S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠interruptible sleep D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的进程通常会等待IO的结束 T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行 X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态 Z(zombie)-僵尸进程:是一个比较特殊的状态。当进程退出并且父进程使用wait()系统调用没有读取到子进程退出的返回代码时就会产生僵死(尸)进程,僵死进程会以终止状态保持在进程表中并且会一直在等待父进程读取退出状态代码。所以只要子进程退出父进程还在运行但父进程没有读取子进程状态子进程进入Z状态 维护退出状态本身就是要用数据维护也属于进程基本信息所以保存在task_struct(PCB)中换句话说Z状态一直不退出PCB一直都要维护,一直会占用内存而没有去释放掉久而久之内存占满一连串的崩溃。 孤儿进程父进程先退出子进程就称之为“孤儿进程”孤儿进程被1号init进程领养之后会被init进程回收 3.5进程优先级 排队的本质就是在确认优先级 基本概念cpu资源分配的先后顺序就是指进程的优先权priority 进程会有优先级的原因本质是资源不足 进程的优先级其实是PCB中的PRI字段确认数值越小优先级越大 Linux进程的优先级数值范围60~99 Linux中默认进程的优先级都是80 Linux是支持动态优先级调整的 Linux进程pcb中存在一个nice值进程优先级的修正数据 pri新prioldnice priold都是从80开始的 nice调整最小是-20超过部分统一当成-20 nice调整最大是19超过部分统一当成19 把优先级限定在一定的范围内其原因是OS调度的时候较为均衡的让每个进程都要得到调度如果不控制在一定范围容易导致优先级较低的进程长时间得不到CPU资源也就是进程饥饿 修改nice值的方法 top #进入后按r-输入进程PID-输入nice值3.5.1Linux内核的调度队列与调度原理 运行队列会有两个字段一个是活动队列另一个是过期队列 nr_active:总共有多少个运行状态的进程 queue[140]:一个元素就是一个进程队列优先级相同的进程按照FIFO规则进行排队调度数组下标就是优先级 bitmap[5]:一共140个优先级一共140个进程队列而bitmap有160个bit位这里的比特位是用来判断队列是否为空提高查找效率 本质上os当前运行的队列是活动队列另一个队列就是过期队列然而你所添加的进程会纳入过期队列中等到当前活动队列的进程执行完os就会调度到过期队列也就是过期队列成了活动队列 值的注意的是Linux进程的优先级数值范围60~99也就是40个等级其实总共有140个等级前100个等级叫实时优先级后40个叫普通优先级我们能操作的时后40个nice值也只与后四十个有关。 3.6环境变量 基本概念环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 3.6.1常见的环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) SHELL : 当前Shell,它的值通常是/bin/bash。 3.6.2查看环境变量的方法 echo $NAME #NAME:你的环境变量名称3.6.3和环境变量相关的命令 echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量set: 显示本地定义的shell变量和环境变量 3.6.4环境变量的组织方式 每个程序都会收到一张环境表环境表是一个字符指针数组每个指针指向一个以’\0’结尾的环境字符串 3.6.5通过代码获取环境变量 命令行第三个参数 #include stdio.h int main(int argc, char *argv[], char *env[]) {int i 0;for(; env[i]; i){printf(%s\n, env[i]);}return 0; }通过第三方变量environ获取 #include stdio.h int main(int argc, char *argv[]) {extern char **environ;//environ是全局变量里面存储的是int i 0;for(; environ[i]; i){printf(%s\n, environ[i]);}return 0; }3.6.6通过系统调用获取或设置环境变量 #include stdio.h #include stdlib.h int main() {printf(%s\n, getenv(PATH));return 0; }3.6.7环境变量通常是具有全局属性的 环境变量通常具有全局属性可以被子进程继承下去 #include stdio.h #include stdlib.h int main() {char * env getenv(MYENV);if(env){printf(%s\n, env);}return 0; }直接查看发现没有结果说明该环境变量根本不存在 其实是没有导入该环境变量 export MYENVhello world再次运行程序发现结果有了说明环境变量是可以被子进程继承下去 命令行启动的进程都是shell/bash的子进程子进程的命令行参数和环境变量是父进程bash给我们传递的。 我们直接更改的是bash进程内部的环境变量信息 每一次重新登陆都会给我们形成新的bush解释器并且新的bash解释器自动从读取形成自己的环境变量表信息 环境变量信息是以脚本配置文件的形式存在的 每一次登录的时候bash进程都会读取 vim .bash_profile 配置文件的内容为我们bash进程形成一张环境变量表信息 本地变量只在bash进程内部有效不会被子进程继承下去环境变量是通过让所有的子进程继承的方式实现自身的全局性 3.6.8Linux的命令分类 常规命令shell fork让子进程执行的内建命令shell命令行的一个函数当然可以直接读取shell内部定义的本地变量 4.进程地址空间 语言层面 系统层面 这里是fork后子进程与父进程的代码共享数据各自私有一份子进程会拷贝父进程的task_struct,task_struct里的mm_struct所指向的进程地址空间也会拷贝一份进程地址空间与物理地址所链接的页表也要拷贝一份当子进程对其数据进行修改时会进行写时拷贝本拷贝下来父子进程代码和数据共享的因为修改了数据os会在内存中另开辟一块空间数据进行私有让子进程页表中虚拟地址所对应的物理地址进行重新指向新的地址但其虚拟地址并未进行修改所以造成在语言层面同一个地址出现两个不同值的情况。 关于页表不止只有虚拟地址和物理地址还有访问权限字段和是否分配是否有内容。 访问权限字段实现了代码段只能读不能写的功能 而内存是否分配和是否有内容体现在Linux的进程挂起状态 4.1地址空间与区域划分 地址空间也要被OS管理起来每一个进程都要有地址空间系统中一定要对地址空间做管理先描述再组织地址空间最终一定是一个内核的数据结构对象就是一个内核结构体。 让进程以统一的视角看待内存所以任意一个进程可以通过地址空间页表可以将乱序的内存数据变成有序分门别类的规划好。 存在虚拟地址空间可以有效的进行进程访问内存的安全检查。 将进程管理和内存空间管理进行解耦 通过页表让进程映射到不同的物理内存中从而实现进程的独立性 父进程创建子进程的时候首先将自己的读写权限改成只读然后再创建子进程。 当父进程形成子进程之后子进程写入会发生写实拷贝重新申请内存进行拷贝修改页表,页表转换会因为权限问题出错 真的出错了不是出错触发我们进行重新申请内存 这里是操作系统介入
http://www.zqtcl.cn/news/416495/

相关文章:

  • 盐城网站开发教育建设网站
  • 目前网站开发有什么缺点广东品牌网站建设968
  • 东营做网站优化哪家好简单网站的制作
  • c可以做网站么网站为何不显示百度商桥对话框
  • 音乐网站用dw怎么做怎么做自己的网站教程
  • 网站换域名后需要多长时间才能收录恢复正常做文案公众号策划兼职网站
  • 丹阳做网站的公司重庆建设医院网站
  • 罗湖网站设计费用在线设计平台行业环境
  • 舟山市普陀区建设局网站淘宝怎样优化关键词
  • 网页上做ppt的网站好花西子网络营销案例分析
  • 网站设计说明书主要有什么成都企业网站seo
  • 免费素材下载网站网站建设进度时间表
  • 网站做关键词首页什么是网络营销?如何理解它的产生和把握它的特点?
  • centos做网站扬州市邗江区城乡建设局网站
  • 宁波网站建设模板制作企业做网站的作用
  • 南通网站快速收录禁止wordpress自动更新
  • 济南做网站最好的公司做一电影网站怎么赚钱吗
  • 中国城市建设网站宿州网站建设零聚思放心
  • 佛山网站免费制作struts2 做的网站
  • 做网站需要了解什么软件电商网站建设方案道客巴巴
  • 网站开发语言用什么好网站好坏怎么分析
  • 镇江制作网站的dw新建站点
  • 如果将域名指向网站东营网站建设收益高
  • 沈阳seo网站推广优化c2c网站的功能
  • 网站设计深圳云南制作网站的公司
  • 广州的网站建设公司对网络平台的优化有哪些建议
  • 培训网站模板免费网站建设投标书
  • 常德市建设局网站用tornado做网站
  • 网站快速排名优化报价现在最流行的网站开发工具
  • 支付公司网站建设会计分录合肥房产信息网官网