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

做餐厅网站的需求分析报告一般网站用什么技术做的

做餐厅网站的需求分析报告,一般网站用什么技术做的,手机怎么开网站,网站搭建一般要多少钱冯诺依曼体系结构 一个计算机在工作的时候是怎样的呢#xff1f; 我们所认识的计算机都是由一个个的硬件组件组成#xff1a; 输入设备#xff1a;键盘、鼠标、摄像头、话筒、磁盘、网卡 中央处理器#xff08;CPU#xff09;#xff1a;运算器、控制器 输出设备#x…冯·诺依曼体系结构 一个计算机在工作的时候是怎样的呢 我们所认识的计算机都是由一个个的硬件组件组成 输入设备键盘、鼠标、摄像头、话筒、磁盘、网卡 中央处理器CPU运算器、控制器 输出设备显示器、声卡、磁盘、网卡 是不是大家通常会觉得计算机是这样设计的  但其实并不是计算机是遵循冯·诺依曼体系结构来设计的增加了个设备存储器内存 量化概念 CPU纳秒 内存微秒 设备毫秒 它们基本上的速度差别就是、这些 冯·诺依曼体系是一种架构构成设备是相互链接的数据的流动本质是从一个设备传输到另一个设备的过程数据是要在计算机的体系结构中进行流动的流动过程中进行数据的加工处理从一个设备到另一个设备的本质是一种拷贝数据在设备间拷贝的效率决定了计算机整机的基本效率主要矛盾 CPU计算的速度肯定很快 存储金字塔 存储结构距离CPU越近效率越高成本越高 比如寄存器速度很快离CPU近造价高 计算机的存储架构不是这样就很显而易见咯 根据木桶原理若是这种体系结构那太慢了能盛水取决于最短的木板 CPU大部分时间不是在算而是在等等输入设备把外部数据拷过来等着把数据拷给输出设备计算机的基本效率取决于输入和输出设备冯·诺依曼架构的设计将计算机从毫秒级别拔高到微秒级别 利用冯·诺依曼体系架构设计计算机快慢就取决于存储器了存储器是一个巨大的缓存可以很大程度上提高效率 那假设我是土豪我有钱我就用寄存器我所有的硬件都用寄存器硬件工程师你做是不做 老板大气这台计算机五百万卖你但又不是所有人都像你一样有钱 各个体系架构存在是必要的创新带来范围影响技术上突破传播上普及历史意义 做个简单的总结 在硬件流动角度 1.在数据层面CPU不和外设直接打交道只和内存打交道 2.外设输入和输出的数据不是直接给CPU的而是先放入内存中 那程序的运行为什么要加载到内存中 程序代码数据需要被CPU访问、执行而CPU只会从内存中读取代码和数据冯·诺依曼体系规定这么做 程序没有被加载到内存的时候在哪里呢 是磁盘外设上的一个普通二进制文件 还是来举个栗子吧 已知墨墨酱IP北京是一个超绝程序员她觉得通信是一件很神奇巧妙的事情某天她在QQ上认识了一位朋友凉白开IP湖北正所谓君子之交淡如水于是墨墨酱打招呼的第一句话是你好 那么在这个过程中消息是怎样流动的呢 既然对方用电脑我也用电脑那么我们两个本质就是两个冯·诺依曼体系软件玩的再怎么花硬件必须这样流动 操作系统 概念 首先操作系统是一款软件是一款进行软硬件资源管理的软件 广义操作系统内核操作系统外壳周边程序给用户提供使用操作系统的方式 狭义操作系统的内核 架构 既然操作系统可以管理硬件那一定是可以被操作系统访问的每一种硬件的物理特性肯定不同如果由操作系统直接访问硬件则一旦硬件发生变化操作系统就要响应的做出改变所以增加了操作系统与硬件层中的驱动层软件每一种硬件都有自己的驱动层大部分驱动层都是由厂商自己提供的 体系架构的层状划分 在我们外接设备的时候比如键盘鼠标但是当接入电脑的时候会显示驱动程序正在启动大约等个一两秒才能动 存在意义 操作系统对软硬件资源进行管理手段为用户提供一个良好的运行环境目的 以人为本工具 操作系统对下提供基本的管理工作让各种硬件工作在一个稳定的高效的安全的状态当中。(针对计算机手段) 操作系统对上要提供一个高效的稳定的安全运行环境(针对用户目的) 理解 操作系统中的“管理”是什么概念呢 拿简单的学校来举个例子墨墨酱是一所学校的校长校园中存在着很多角色校长、主任、老师、学生... 我们在完成一件事的时候离不开两个动作 1.决策 2.执行 管理者之所以被称作管理者是因为他的任务绝大多数和决策有关 学校里真正的管理者是校长被管理者是学生中间夹杂着一层角色辅导员可是灿灿人生是旷野~虽然校长是管理者但是我们平常基本上没机会见到他他不会早上一脚踹开我的房门叫我起床上早八 好管理不需要管理者和被管理者直接接触可是不直接接触又是怎样进行管理的呢 见面不是目的拿到数据才是目的 管理的本质不是对人的管理而是对人身上的数据进行管理 但是校长见不到学生又是怎样拿取数据的呢 当然是引进一个中间角色辅导员 校长关心的是学生而不是某个人 校长关心学生的成绩绩点参加竞赛情况...不关注学生爱吃啥最近谈恋爱了没有... 随着被管理同学的增多人的信息也变多校长难于管理 前文说过墨墨酱前身是程序员会敲代码给上面的问题作总结就是关心的属性类别是相同的属性值不同 struct stu {char name[16];char sex;int age;...int Math;int Chinesedouble English...double scorestruct stu* next; } 将表格转化成结构体这个过程叫面向对象 struct stu* zhangsan new struct stu{...}; 对于任何管理我们都先描述再组织上面的由日常校长对学生的管理工作变为对链表的增删查改是完成了对学生管理工作的计算机建模的过程 拿STL来举例本质是C的一种容器容器的本质就是数据结构对数据结构进行封装封装的本质描述对象是对STL的组织分析 Linux理念一切皆文件C理念一切皆对象 特定对象直接先描述再组织那操作系统对于硬件怎么管理捏 还是先描述再组织对设备的管理变成对链表的增删查改 讲个故事墨墨酱是一个大学牲她有一天去银行办理业务银行的职员很多有放贷的有存款的有和企业对接的有接待大用户的... 她想要建立自己的小金库她要存一百块银行肯定不允许墨墨酱自己存那像什么话银行不相信任何人群众里面也有坏人银行又必须执行它的任务发挥它的作用那银行怎样在保证自身系统安全的情况下为用户提供服务呢 可以用柜台实现人办理业务用户把身份证和银行卡递交交给银行的工作人员办理业务 操作系统内部涵盖属性结构如果用户非法入侵篡改对操作系统的影响是致命的操作系统也不相信任何人但要为用户提供业务所以它为用户提供软件层系统调用不能直接进入系统调用操作系统提供的函数保证用户调用接口传参操作系统自己进行操作再返回给用户会让操作系统处于稳定的状态进程状态就是处理大量的系统调用接口 因为操作系统不信任用户内核是用C写的所以就为用户提供了大量的系统调用接口用成员函数的方式访问类属性成员函数是类对外提供的接口 对于银行我想说银行是一个庞大的机构它不仅可以做到为普通用户提供业务还要为特殊用户提供业务比如老燃已经七老八十了不识字想给孙子暖暖存一千块压岁钱银行职员怎么应对这样的特殊用户呢 银行为了更好地给老燃这样的人提供服务银行不仅设置窗口柜台在大厅也会设有咨询工作人员 老燃去银行历险大厅工作人员直呼内行直接帮扶老燃完成所有业务暖暖也是有钱花了 其实是委托算命大堂经理直说老燃我帮你叫号你写啥资料我可以代写您歇着就行 大堂经理和算命说你去帮老燃弄后面的事情 算命接收了这个任务完成了这个任务帮助老燃这样的弱势群体也能进行存款取款业务办理 映射到操作系统这边就是操作系统调用是操作系统提供的接口有些难以理解需要会一些知识不适应大众使用于是用户操作接口应运而生为了方便老燃这样的特殊人士也能使用这些库我们也早就接触过C/C标准库 我们一直都在用之前已经说过链接有动态链接有静态链接这条命令可以查询某个可执行程序都用到了哪些库 ldd 文件名 /lib64/libc.so.6就是传说中的C语言的动态库 其实我和老燃也差不多历史上并没有直接使用过系统调用都在用用户操作接口所有动作都是用库来做的用C/C的动态标准库来做 如果要自己实现一门编程语言那这三剑客必不可少语法、标准库、编译器 这样以后就直接用库而不用系统接口的安装VS的时候一方面在安装编译器一方面在安装标准库、开发包 操作系统不同提供的接口不同函数名参数返回类型...在用户层若直接使用系统调用接口那在 Linux下所写的代码只能在Linux下编译运行无法在Windows下编译运行由于系统调用接口不同但是若使用用户操作接口就都能运行在Windows下打印用printfLinux下亦然底层差异上层看不到用起来就很方便跨平台性 这部分可以被称作比较完备的操作系统 进程 什么叫做进程呢打开Windows任务管理器CtrlShiftEsc这些都是进程 操作系统中进程可以同时存在非常多所以操作系统肯定要管理进程先描述再组织 进程 课本概念程序的一个执行实例正在执行的程序等 内核观点担当分配系统资源CPU时间、内存的实体 在这里processbar是一个二进制文件运行起来就可以被称作一个进程 那processbar在没有加载时在哪里呢 在磁盘里描述图解 每个进程创建时都会有一个对应的struct PCB struct PCB {//所有属性struct PCB* next;//内存指针指向自己的代码和数据//一个进程一个PCB//进程代码、数据PCB } 这样以后对进程的管理就变成了对链表的增删查改 PCB 概念 PCB江湖人称process control block进程控制块就是描述一个进程的结构体这个数据结构是操作系统内部管理进程的内核数据结构操作系统的数据结构 操作系统是软件使用开机的过程就是在加载操作系统操作系统在没开机的时候也是存在磁盘的二进制文件一枚开机是讲操作系统加载到内存中的过程操作系统是计算机启动时加载的第一个软件进程不仅需要讲可执行程序的代码和数据加载到内存中还要操作系统malloc结构体PCB出来一个进程有一个PCB对进程的管理变为对PCB的管理 学校管理学生那怎么证明我是邮专的学生呢门禁刷不进来只有赔笑脸才能刷进来我已经被邮专开除了 有人说那就看在没在校内呗在校内的肯定是学生啊保安大叔应如是保洁阿姨有话说宿管阿姨呼内行和人无关决定这个的是人的属性信息是否在学校的教务管理系统内学校内存 操作系统教务管理系统 怎么证明是一个进程呢 学生的属性信息存到教务系统中相当于PCB在操作系统内部使用指针将PCB连接起来将PCB管理好相当于将进程管理好了对进程的管理也就变成了对链表的增删查改并不是直接将可执行程序加载进来而是管理PCB 存在意义 为什么要有PCB捏 因为OS要对进程进行管理先描述再组织 进程内核task_struct结构体程序的代码和数据 Linux是一款操作系统而PCB是操作系统这个学科下的概念Linux下PCB进程控制块具体的结构是 struct task_struct {//Linux进程控制块} 举个栗子吧墨墨酱是一名大学生她今年已经大三了该去实习界闯荡一番了她去慢手、丑团、饱了么、字节跳动不了一点投递简历算命、暖暖、燃燃笙宝也要把简历投给这些大厂这投递的本质并不是把人交给公司而是将简历投了过去而每个人对应的简历就是描述每个人的task_struct简历放成一摞面试官一个一个看的过程本质上就是简历在排队简历在排队也就相当于人在排队 调度运行进程本质就是让进程控制块task_struct进行排队 对于进程进程的代码和数据相当于进程的实体管理是在管理进程的task_structtask_struct是进程的简历对应聘者的操作变成了对简历的增删查改这就是进程控制块存在的意义 理解 课本上常说进程是动态运行的怎么理解这个概念呢 应聘面试流程投简历 -- 笔试 -- 一面 -- 二面 -- 三面 持续周期可能2~3周并不是人在周转而是简历在被一二三轮面试官拿到这个过程叫动态面试而对于进程来讲进程一会被放到运行队列里被CPU运行、一会在等待显示器、键盘、磁盘、网络资源进程动态运行的特点主要体现在CPU或其他设备想要被进程访问执行时都是以PCB为代表被来回调度运行的只要进程的task_struct在不同的队列中进程就可以访问不同的资源PCB结点被放到不同地方了 PCB是进程的简历包含进程的诸多属性可以来学习下 task_struct属性 启动 ./xxxx运行某个程序本质就是让系统创建进程并运行 之前学过的命令也是可执行程序比如上面的这个find是x86-64位下的一个可执行程序  自己的程序本质上也是x86-64位下的一个可执行程序 我们自己写的可执行程序、系统的命令都属于可执行文件在Linux中运行的大部分执行操作本质都是运行进程 那该怎样查看进程呢 用这条命令 ps axj 这样是查所有进程如果想查询特定的某个进程那就 ps axj | grep myprocess 为什么这里还带了grep 通过管道和关键词检索的方式查出了指定进程grep本身也是一个进程所以也被检索出来了 那每一列都是什么含义呢 这样查将首行解释列出 ps ajx | head -1 两条命令的同时执行连接用 ps ajx | head -1 ps axj | grep myprocess 每一个进程都要有自己的唯一标识符叫做进程pid和学生学号一样进程PCB唯一区分用unsigned int pid 如果一个进程想要知道自己的pid该怎么办呢 struct task_struct被称为内核数据结构用户是不能直接访问操作系统内部内核数据结构的pid的那么用户该如何获得进程的pid呢 需要操作系统为我们提供系统调用 myprocess.c: #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hint main() {pid_t id getpid();while(1){printf(I am a process!,pid:%d\n,id);sleep(1);}return 0; } 运行一下可以看到进程的pid  这样可以查到确实是这个进程的pid  ps axj | head -1 ps axj | grep myprocess 在Windows中双击可以启动进程点开这个.exe文件我们中国人有自己的打金服别管我闲的没事养蛊玩 在Linux下启动一个进程就是./执行可执行程序既然进程已经启动那就当然可以用ps命令来查找进程那假如想要终止进程该怎么做呢 之前说过有事无事无脑CtrlC一下在用户层面终止进程乖乖停下哩 还有一计  每个进程pid唯一所以可以这样结束进程 kill -9 18318 进程创建的代码方式 来看这张图吧 getpid我知道是啥意思了那getppid是啥意思呢 第一个pparent第二个pprocess pid_t getppid(void); #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hint main() {pid_t id getpid();pid_t parent getppid();while(1){printf(I am a process!,pid:%d ,ppid:%d\n,id,parent);sleep(1);}return 0; } 所以它的意思就是获取父进程的id 这样查询  ps ajx | head -1 ps axj | grep myprocess 进程每次启动时pid都不同这正常吗  那很正常呀笙宝是一个热爱学习的小男孩他第一次高考完报了清华的通工专业但是念了半年感觉不太对劲于是去找道士switch算了一卦switch说他命中多水星盘为火遇土木则吉于是笙宝痛定思痛复读一年终于考入了梦寐以求的清华土木工程功德圆满那清华给他两次发的学号不一样不也很正常嘛进程每一次运行的时候pid不一样  我们同样可以看到每次运行的时候ppid是一样的父进程都是同一个那18262是谁呀 ps ajx | head -1 ps ajx | grep 18262 查一下捏  Bash就是父进程命令行解释器不知道的可以先看看这篇燃冬 Shell命令及运行原理-CSDN博客https://blog.csdn.net/chestnut_orenge/article/details/137106046实习生紫禁城子进程 创建一个进程是否代表着操作系统内多了一个进程 是这样的捏那多了一个进程就相当于多了一份PCB和一套该进程对应的代码和数据 创建一套进程会创建PCB内核数据结构可是用户是没有权限对内核数据结构进行增删查改的用户不能直接创建个task_struct操作系统需要为用户提供系统调用 浅查一下呢 man fork 可以发现它不仅有叉子的意思还有岔路分支的意思它作用的解释就是 fork - create a child process 创建一个紫禁城  #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hint main() {printf(process is running,only me!\n);sleep(3);fork();printf(hello world\n);sleep(5);return 0; } 这是一个监控小脚本 while :; do ps ajx | head -1 ps axj | grep myprocess | grep -v grep; sleep 1; done 这样可以实时监控进程咯  刚开始启动的进程19137一定是父进程 通过调用fork看到了两个执行流查到了两个不同的进程有两个不同的pid19156就是传说中的紫禁城在fork之后父子代码共享创建一个进程本质是系统中多了一个进程多了一个进程就是多了一个task_struct进程控制块多了的进程还要有自己的代码和数据那紫禁城的代码和数据从哪来呢父进程的代码和数据是从磁盘加载进来的在默认情况下紫禁城继承父进程的代码和数据紫禁城没有代码和数据只能继承只有自己的task_struct #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hint main() {printf(process is running,only me!,pid:%d\n,getpid());sleep(3);fork();printf(hello world,pid:%d,ppid:%d\n,getpid(),getppid());sleep(5);return 0; }可以看到执行进程一个是父一个是子  我们可以通过这样的的代码来查看进程运行状况 我们为何执着于创建紫禁城父进程一个人不足以吗 主要是因为我们想让紫禁城执行和父进程不一样的代码这方面还需要来学一下fork的返回值 pid_t fork(void); 如果fork函数成功了则它会返回紫禁城的pid给父进程返回0给紫禁城如果创建失败则返回-1错误码被设置也就是说fork会返回两次每次不同的返回值 #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hint main() {printf(process is running,only me!,pid:%d\n, getpid());sleep(3);pid_t id fork();if (id -1) return 1;else if (id 0){//childwhile (1){printf(id:%d,I am child process, pid: % d, ppid : % d\n,id,getpid(),getppid());sleep(1);}}else{//parentwhile (1){printf(id:%d,I am parent process,pid:%d,ppid:%d\n,id, getpid(), getppid());sleep(2);}}return 0; } 浅浅来解释下fork之后父子进程的代码都是共享的 对于id0是给紫禁城的id紫禁城pid是给父进程的因为是分支结构所以进入到两个分支实现父子进程同时跑但是你看代码在之前的学习中肯定是不可能出现两个while循环同时跑的情况的以前学的全部都是单进程多进程情况也是适用的再想想同一个id值为什么又0又0啊教练教教我 fork会有两个返回值返回两次怎么理解啊 首先fork()是一个函数只不过是由操作系统OS提供的会有自己的实现逻辑会有return id那当我们的函数执行到return的时候是否意味着函数的核心工作已经完成 对啊 我们今天要执行的函数是fork()紫禁城已经存在了而且已经可以被调度了 那return是代码么 肯定是啊 fork内部前半部分由父进程创建紫禁城执行到return的时候已经有两个进程了代码共享父进程执行一次return紫禁城执行一次return 孩子们这并不奇怪 tipskill掉紫禁城不会影响到父进程 那同一个id即0又0是怎么会事呢 紫禁城在创建的时候要有自己的PCB这个PCB在数据结构层面与父进程的PCB是并列的在逻辑上是存在父子关系的父进程的代码和数据都是从磁盘上加载进来的紫禁城继承父进程的代码和数据紫禁城肯定也要用父进程的数据对吧 进程一定要做到 进程具有独立性哪怕是父子的亲密关系 进程 内核数据结构task_struct 代码只读不可被修改和数据 数据在原则上要分开独立出于对效率的考量父子的id有独立的数据的只不过是共同用了id这个变量名内容是不一样的 一次创建多个进程 #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.hvoid RunChild() {while (1){printf(I am parent, pid :%d,ppid: %d\n, getpid(), getppid());sleep(1);} } int main() {const int num 5;int i 0;for (i 0; i num; i){pid_t id fork();if (id 0) //因为父进程的id不等于0所以直接跳过判断执行下次循环创建紫禁城{RunChild();}sleep(1);}while (1){sleep(1);printf(I am parent, pid :%d,ppid: %d\n, getpid(), getppid());}return 0; } 进程创建可以用代码的方式fork而不是每次都需要./来启动进程 task_struct内容 task_struct 标示符: 描述本进程的唯一标示符用来区别其他进程 状态: 任务状态退出代码退出信号等 优先级: 相对于其他进程的优先级 程序计数器: 程序中即将被执行的下一条指令的地址 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器] IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等 其他信息 优先级哪个进程先运行 食堂排队打饭就是在确定打饭的优先级确定进程的优先级是在给进程的task_struct排队 可以在内核源代码里找到组织进程所有运行在系统里的进程都以task_struct链表的形式存在内核里 查看进程 除了ps命令进程还可以通过/proc系统文件夹查看proc是根目录下的一个文件夹 #includestdio.h #includeunistd.h #includesys/types.h #includeunistd.h int main() {pid_t id getpid();pid_t parent getppid();while (1){printf(I am a process!,pid:%d ,ppid:%d\n, id, parent);sleep(1);}return 0; } 要获取PID为1的进程信息你需要查看/proc/1这个文件夹其中目录是以进程的pid命名的  ll /proc/29129 其中比较重要的一个属性是exe 也就是说这个exe是由绿色路径下的可执行程序加载出来的 我们假如把可执行程序干掉那程序也还能跑这是为什么捏 因为如果文件要被进程调度那在内存中已经有一份了所以把磁盘上的可执行程序删掉了进程也照样可以跑内存中有原则上能跑 万一程序非常大就够呛了电脑内存假设只有8G可执行程序有16G如果删掉了进程可能运行着运行着就出问题了事已至此就讲一下暖暖和劫的相爱相杀吧劫在早期出的时候是要花钱买的好像八十多暖暖作为一个游戏重度爱好者大收藏家肯定是不会错过这样一个炫酷的游戏于是激情购入可是他的电脑空间不太够于是他买了个固态硬盘以获取足够大的空间下载这个3A巨作但是他下好之后进入游戏发现逐帧播放游戏卡成PPT于是他又买了个内存条百事百不灵只好作罢为了一个八十块的游戏花了八百块暖暖暖暖的在暖群 进程的PCB会记录自己对应可执行程序的路径那这个cwd是什么呢 current work dir -- 进程的当前工作路径 每个进程在启动时会记录自己在哪个路径下启动  ---  进程的当前路径 在前面学C的时候文件操作那呜呜想鹏哥了 fopen(log.txt,w); 都是进程的代码在执行 cwd/log.txt  这样它会在当前路径下新建什么是“当前路径”看个例子 #includestdio.h int main() {FILE *fp fopen(log.txt,w);(void)fp; //ignore warnning return 0; } #includestdio.h #includesys/types.h #includeunistd.hint main() {chdir(/root/ice);FILE *fp fopen(log.txt,w);(void)fp; //ignore warnning fclose(fp);while(1){printf(I am a process,pid:%d\n,getpid());sleep(1);}return 0; } 可以发现路径发生改变了  也确实在我们指定的目录下新建文件了 进程状态 每个进程都要有自己的状态 Linux进程状态 进程状态是task_struct内部的一个属性 #define RUN 1 #define SLEEP 2 #define STOP 3struct task_struct {//内部属性int status;}struct task_struct process1; process1.status RUN; Linux改变一个进程的状态就是在改变task_struct的内部属性 定义出的标志位为了表示进程的状态 Linux内核中对于状态有什么定义呢 可以看看kernel的源码 /* * The task state array is a strange bitmap of * reasons to sleep. Thus running is zero, and * you can test for combinations of others with * simple bit tests. */ static const char * const task_state_array[] { R (running), /* 0 */ S (sleeping), /* 1 */ D (disk sleep), /* 2 */ T (stopped), /* 4 */ t (tracing stop), /* 8 */ X (dead), /* 16 */ Z (zombie), /* 32 */ }; 定义进程的显示为了方便采用数组的形式显示  R运行状态running: 并不意味着进程一定在运行中它表明进程要么是在运行中要么在运行队列里  S睡眠状态sleeping): 意味着进程在等待事件完成这里的睡眠有时候也叫做可中断睡眠 interruptible sleep D磁盘休眠状态Disk sleep有时候也叫不可中断睡眠状态uninterruptible sleep在这个状态的 进程通常会等待IO的结束 T停止状态stopped 可以通过发送 SIGSTOP 信号给进程来停止T进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行 X死亡状态dead这个状态只是一个返回状态你不会在任务列表里看到这个状态 怎么验证进程有着这样那样的状态呢 ps aux / ps axj 命令 首先先看一下关于makefile的骚操作 myprocess:myprocess.cgcc -o $ $^ .PHONY:clean clean:rm -f myprocess 这是一段已经写好的makefile怎样可以快速copy呢 在底行模式下我们可以这样干一键替换  %s/myprocess/testStatus/ 后者替换前者  再把依赖文件改一下就好哩 testStatus:testStatus.cgcc -o $ $^ .PHONY:clean clean:rm -f testStatus while :; do ps ajx | head -1 ps ajx | grep testStatus | grep -v grep; sleep 1; done 我们可以发现这个进程一直在狂刷 #includestdio.h #includesys/types.h #includeunistd.hint main() {while(1){printf(I am a process\n,pid:%d\n,getpid());}return 0; } 但是一看状态怎么他喵的是sleep啊 我把源码稍加改动 #includestdio.h #includesys/types.h #includeunistd.hint main() {while(1){// printf(I am a process\n,pid:%d\n,getpid());}return 0; } 现在检测可以发现是正常运行的哩 R表示进程正在运行可是打印又是什么很邪恶的操作吗凭什么说我在睡觉 S表示休眠状态即进程什么都没做 首先我们明确一点printf打印是往哪打 往显示器上打印对吧程序是在远隔万里的云服务器上跑的但是打印的结果却返回到了近在咫尺的显示器根据冯·诺依曼体系架构显示器是一个外设所以CPU在跑的时候一直要把数据写到内存里再刷新到外设上那我能保证每次打印的时候显示器都是就绪的么 程序是CPU在跑CPU的速度可比显示器快多了所以进程在被调度时需要访问显示器资源大部分时间都在等待设备资源就绪只要没就绪就处于S状态CPU执行ns打印ms所以我们在查询时可能查到的很多都是处于等待状态而并非运行状态这也是为什么把printf注释掉之后就一直是R状态可想而知差距有多大才会在刷屏的时候依旧查到很多S 休眠状态就是进程在等待资源就绪的过程 我们如何真正的看到一个资源在休眠呢 #includestdio.h #includesys/types.h #includeunistd.hint main() {while(1){sleep(10);printf(I am a process\n,pid:%d\n,getpid());}return 0; } 上面的进程就是在休眠使用CtrlC可以把进程终止 所以S是可以被中断的睡眠 这是让进程在后端运行 ./testStatus 在后端运行的进程休眠S则不带了 带不带就是区分进程在前台和后台运行在后台运行的进程是没法CtrlC的只好干掉哩 kill -9 2988 我们的进程有不同的状态有一个状态叫T即停止状态很有意思的点就在于我们可以通过一个进程控制其他进程 kill -l 这是很多信号我们曾经用过的信号9就是杀掉进程使用kill可以向指定信号发信号信号就是数字发信号时也有自己对应的名字大写的数字代号----宏可以看到成功将进程终止了 T让进程暂停等待被进一步唤醒 19是将进程暂停18则是继续 其实我们之前也做过让进程暂停的操作这个操作叫做调试在断点处不就停下来了吗悟了没 为了让进程可以被调试修改下makefile文档 myprocess:myprocess.cgcc -o $ $^ -g .PHONY:clean clean:rm -f myprocess 浅查一下吧 readelf -S myprocess | grep debug 我们开启监控会发现查不到 这个正在跑的是gdb并不是我的进程 看看怎么个事 ps ajx | grep myprocess 可恶明明查得到大骗子 奥原来我只是开启了调试并没有让进程跑起来啊 在第十行处打个断点再让进程跑起来 惊奇发现S爆改t t表示当前进程因被追踪而暂停遇到断点进程即暂停 D状态是Linux系统中比较特有的一种进程状态名为磁盘暂停状态 操作系统在开机时就在内存中存在着即开机时操作系统就被从磁盘加载到内存 假设这样的场景内存中1GB的数据要存到磁盘中把数据交给外设 进程在等外设写数据所以当前的进程就处于一个S状态休眠等待写入完毕 Linux操作系统有权利杀掉进程来释放空间内存严重不足杀鸡儆猴以儆效尤 磁盘忙完一圈回来想反馈发现进程被干掉了啊不是哥们 但又不止有一个进程等着磁盘帮忙写入就造成1GB的数据丢失问题如果这1GB数据是银行里记录的一天内用户的转账记录那事可就大发咯 那锅该甩给谁 操作系统、进程、磁盘。。。谁有问题 进程“老大呜呜呜我是受害者呜呜呜我在那正工作呢突然就有个比我官大的不分青红皂白就把我干掉了呜呜呜” 操作系统“进程你还放上洋屁装起可怜了我要是完蛋了我们大家伙都得玩完老大都说了我作为操作系统在极端条件下有资格杀掉进程要是我挂了丢10GB数据这个锅你背得起吗” 磁盘“老大说白了我就是个送外卖跑腿的人家让我干嘛我干嘛只是写入失败了是硬件出错误了这总不能怪我吧。。。” 为了防止后续问题再发生问题的根源就在于操作系统杀掉进程的时候是毫无类别的去杀想杀就杀但是这种在写入关键数据的进程是不可以被杀掉的 那也不能怪操作系统啊那长得都一样它还那么大块头不删留着过年吗 所以此后规定操作系统执行这样的法则凡是在进行数据IO的进程一律不允许删 在传数据的时候进程要变为D状态不可被杀 僵尸进程 进程的阻塞、挂起、运行
http://www.hkea.cn/news/14311951/

相关文章:

  • 怎么样才能做好网站建设怎样建设大型网站
  • 网站制作流程一般制作流程?app软件推广策略有哪些
  • 电商网站建设期末考试南宁网站建设报价
  • 建立学校网站做营销的有那么网站
  • 论坛网站模板免费下载提供商城网站制作
  • 国外做外汇网站交流沧州高端网站建设
  • 盐山做网站是一种特色的网络营销方式
  • 北京网站平台建设公司南昌中小企业网站制作
  • 官方网站开发方案网站开发工具 售价
  • 北京便宜做网站视频剪辑线下培训班
  • 网站详情页链接怎么做wordpress 选择用户
  • 结构设计网站推荐企业所得税的计算公式三种
  • 如何查公司网站开发时间wordpress插件doc
  • 网站链接优化怎么做空间网架
  • 郑州logo设计公司泰州整站优化
  • 加强机关网站内容建设电商平台设计公司
  • 做企业网站的尺寸是多少免费开源网站系统有哪些
  • 毕设做网站答辩会要求当场演示吗网络建设包括哪些内容
  • 徐州泉山建设局网站上海中国建设银行招聘信息网站
  • 建设部造价工程师考试网站设计坞官网
  • 乡村旅游网站建设中国建设银行理财网站
  • 网站设计实例教程一个公司怎么做网站都放些什么
  • 甘肃建设厅网站二级建造师报名时间免费的舆情网站不需下载
  • 网站营销目标怎么看网站空间
  • 韩都衣舍网站建设方案全国企业信息公示(全国)
  • 怎么请人做网站家装用什么软件设计
  • 二级域名网站建设规范杭州网站推广方式
  • otc场外交易网站开发邯郸信息港邯郸信息网
  • 本地网站环境搭建施工企业质量管理体系应按照我国
  • 迅睿cms建站教程wordpress不同语言