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

建设网站包维护原生态旅游网站开发需求分析

建设网站包维护,原生态旅游网站开发需求分析,网站后台上传用户界面不显示,网站建设方案 前台 后台1.理解地址空间和页表 1.地址空间是进程能够看到的资源窗口 2.页表决定进程真正拥有的资源情况 3.合理的对地址空间和页表进行资源划分就可以对一个进程的所有资源进行划分#xff1a;过地址空间分为栈区、堆区…通过页表映射到不同的物理内存。 在32位平台下#xff0c;…1.理解地址空间和页表 1.地址空间是进程能够看到的资源窗口 2.页表决定进程真正拥有的资源情况 3.合理的对地址空间和页表进行资源划分就可以对一个进程的所有资源进行划分过地址空间分为栈区、堆区…通过页表映射到不同的物理内存。 在32位平台下一共有2^32个地址也就意味着有2^32个地址需要被映射。地址空间一共有2的32次方个地址每个地址单位都是1字节OS是如何做到从虚拟地址到物理地址做转换的呢 其中页目录项是一级页表页表项是二级页表。虚拟地址转成物理地址32位的虚拟地址以10,10,12的二进制构成页表不止一张页目录页目录中存放的是页表的地址根据虚拟地址的前十位确定所需页表的起始地址页表每一个页表的条目项为2的10次方个页表中存的是页框的起始物理地址根据中间的十位确定页框的起始位置剩下的12位虚拟地址是偏移量根据页框的起始位置开始往下偏移这个偏移量就找到了对应的物理内存。OS中把物理内存一块块的数据框称为页框磁盘上编译形成可执行程序的时候也被划分成一个个4KB的区域称为页帧。当内存和磁盘进行数据交换时也就是以4KB大小为单位进行加载和保存的这个偏移量刚好与页框的大小是等价的4KB等于2的12次方字节。 2.线程概念 在一个程序里的一个执行路线就叫做线程thread。更准确的定义是线程是“一个进程内部的控制序列 ”。一切进程至少都有一个执行线程;线程在进程内部运行本质是在进程地址空间内运行在Linux系统中CPU看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间可以看到进程的大部分资源将进程资源合理分配给每个执行流就形成了线程执行流。 1.线程在进程的内部运行线程在进程的地址空间内部运行拥有该进程的一部分资源我们可以通过地址空间页表的方式对进程进行资源划分。 2.站在CPU的角度每一个PCB都可以叫做轻量级进程3.Linux线程是CPU调度的基本单位进程是承担系统资源分配的基本单位进程是申请资源线程是向进程要资源4.Linux中没有真正意义上的线程是由PCB模拟实现的。OS无法直接创建线程而是只提供创建轻量级进程的窗口。5.PCB模拟线程为PCB编写的结构与算法都能进行复用不用单独为线程创建调度算法这样做的好处是维护成本低可靠性高。 3.创建线程 因为OS没有创建线程的接口,只能通过第三方的库pthread.h提供创建建轻量级进程的接口 因为只用的是第三方的库所以在编译的时候要指明链接的库 #includeiostream #includepthread.h #includeunistd.h #includestring using namespace std;void* start_routine(void* args) {string namestatic_castconst char*(args); //安全的类型转换while(true){couti am new thread, name: nameendl;sleep(1);}return nullptr; }int main() {pthread_t tid;pthread_create(tid,nullptr,start_routine,(void*)new thread);//线程id 新线程属性 线程执行的函数 传给线程执行函数的参数 while(true){cout我是主线程......endl;sleep(1);}return 0; } 结果可以看到主线程和新线程是交替执行的CPU是以什么为标识符来调度这两个执行流的呢 ps -aL  //查看轻量级进程 PID为9764的两个轻量级进程是进程的ID 与进程ID相同的LWP是主线程的IDLWP为9765的轻量级进程是我们创建出来的新线程的ID。-----CPU调度时是以LWP为标识符的  一个进程创建了线程几乎所有的资源都是线程共享的但是线程也是有自己的私有内部属性 什么资源是线程私有的呢 1.PCB的属性是私有的 2.私有的上下文结构               //每个线程都是要被调度和切换的如果时间片内线程的代码没有跑完此时线程的上下文就需要被保存 3.每个线程都有自己独立的栈结构         //线程内部的局部变量需要被保存保存在每个线程独立的栈结构里 总结之前的知识点 1.线程是进程内部的执行流 2.进程承担分配系统的资源创建线程知识创建了PCB 3.一个进程内部至少有一个执行流 4.CPU看到的PCB都是轻量级进程 4.线程的优缺点 优点 1.创建一个新线程的代价要比创建一个新进程小得多 2.与进程之间的切换相比线程之间的切换需要操作系统做的工作要少很多(进程间切换需要切换页表、虚拟空间、切换PCB、切换上下文而线程间切换页表和虚拟地址空间就不需要切换了只需要切换PCB和上下文成本较低) 3.线程占用的资源要比进程少很多 4.能充分利用多处理器的可并行数量 5.在等待慢速I/O操作结束的同时程序可执行其他的计算任务 6.计算密集型应用(CPU加密解密算法等)为了能在多处理器系统上运行将计算分解到多个线程中实现 7.I/O密集型应用(外设访问磁盘显示器网络)为了提高性能将I/O操作重叠。线程可以同时等待不同的I/O操作 缺点 性能损失一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多那么可能会有较大的性能损失这里的性能损失指的是增加了额外的同步和调度开销而可用的资源不变。 健壮性降低编写多线程需要更全面更深入的考虑在一个多线程程序里因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的换句话说线程之间是缺乏保护的。 缺乏访问控制进程是访问控制的基本粒度在一个线程中调用某些OS函数会对整个进程造成影响。 编程难度提高编写与调试一个多线程程序比单线程程序困难得多 5.线程终止 1.线程调用的函数return了这个线程就终止了 2.在线程的内部调用pthread_exit(nullptr),线程就终止了。 3.exit(0)不能终止线程是用来终止进程的任何一个执行流调用exit(0)这个进程就终止了进程终止了线程也就都退出了。 6.线程等待 线程也是需要被等待的如果不等待就会造成类似僵尸进程的问题----内存泄漏 等待是为了1.回收新线程对应的PCB等内核资源防止内存泄漏2.回收线程对应的退出信息 void* start_routine(void* args) {string namestatic_castconst char*(args);int cnt3;while(cnt--){couti am new thread, name: nameendl;sleep(1);}return (void*)10086; }int main() {pthread_t tid;pthread_create(tid,nullptr,start_routine,(void*)new thread);int c4;while(c--){cout我是主线程......endl;sleep(1);}void* retnullptr;pthread_join(tid,ret);coutmain join success exit number:(long long)retendl;return 0; } void** retval:输出型参数主要用来获取线程函数结束时返回的退出结果。之所以是void**,是因为如果想作为输出型结果返回因为线程函数的返回结果是void*,而要把结果带出去就必须是void** 没有看到线程退出时对应的退出信号这是因为线程出异常收到信号整个进程都会退出所以退出信号要由进程来关心所以pthread_join默认会认为函数会调用成功不考虑异常问题异常问题是进程该考虑的问题 7.线程分离 线程是可以等待的等待的时候是join的等待的阻塞式等待。而如果线程我们不想等待不要等待该去进行分离线程处理。 默认情况下新创建的线程是joinable的线程退出后需要对其进行pthread_join操作否则无法释放资源从而造成内存泄漏 而如果我们不关心线程的返回值join是一种负担这个时候我们可以告诉OS当线程退出时自动释放线程资源这种策略就是线程分离。 int pthread_detach(pthread_t thread); 线程分离函数可以由新线称和主线程来调用但是这里推荐分离操作由主线程来完成因为创建线程后主线程和新线程不确定谁先运行所以可能会有这样的场景当我们创建主线程之后还没有执行新线程的pthread_detach,而主线程直接去等待了也就是新线程还没来得及分离自己也就是分离的太慢了最后主线程直接去等待了。 void* start_routine(void* args) {//pthread_detach(pthread_self()); 线程得到自己的tid然后做分离string namestatic_castconst char*(args);int cnt3;while(cnt--){couti am new thread, name: nameendl;sleep(1);}return nullptr; }int main() {pthread_t tid;pthread_create(tid,nullptr,start_routine,(void*)new thread);// sleep(2);pthread_detach(tid);int c4;while(c--){cout我是主线程......endl;sleep(1);}return 0; } 8.理解线程id和地址空间的关系 pthread_create函数会产生一个线程id,存放在第一个参数指向的地址中 pthread.h库帮助我们建立线程这个库可以叫做原生线程库当我们创建一个新的线程后在pthread库中就创建了一个关于该线程属性集合的对象同时创建一个轻量级进程。pthread_t类型的线程ID本质 就是一个进程地址空间上的一个地址。通过这个地址就可以访问到对应轻量级进程的结构体结构体中包含线程的一些私有属性。 Linux用户级线程内核级轻量级进程 11
http://www.lakalapos1.cn/news/18573/

相关文章:

  • php个人网站怎么做双网建筑工程资质公司
  • 科技公司网站模板商城网站建设需求
  • 花店网站推广方案上海建设人才网站
  • 郑州 网站设计搜狗推广代理商查询
  • 网站开发包括网站设计企业网站关键词放几个
  • jsp做的网站效果wordpress的编辑器
  • 网站开发项目提成中天建设集团有限公司招聘
  • 青岛网站推电子商务毕业设计网站
  • 网站标题做参数正规的手机网站建设
  • 装修网站cms中国建设银行官网站电脑版
  • 门户网站建设的企业ftp网站地图怎么做
  • 适合个人网站网站开发设计需要什么证书
  • 弄淘宝招牌图什么网站可以做wordpress html调用php
  • 镇海建设银行网站wordpress新浪云平台
  • 建个短视频网站网站模板备份
  • 上海景泰建设股份有限公司网站四川建设考试培训网
  • 做2手物品通过网站去卖掉好做吗公司网站制作应该注意些什么
  • 企业网站制作哪些公司制作谷歌网站推广方案
  • 娄底网站建设报价佛山市锵美装饰有限公司网站建设案例
  • 攻击网站方法网站定制设计服务需要使用的技术
  • 曲靖市网站建设wordpress弹窗插件
  • 找人做仿网站wordpress开发西瓜
  • 网站换一个图片怎么做怎么搭建自己的博客网站
  • 上海建站资讯最专业的外贸网站建设公司
  • 建设银行泰安培训中心官方网站建设百度网站多少钱
  • 淘宝 网站开发 退货俄文网站建设
  • 如何建开发手机网站外贸网站推广公司
  • 古风网站的关于我们页面怎么做黑龙江两学一做网站
  • 武昌建设局网站移动电子商务网站建设研究
  • 北京创意网站建设幻灯片插件wordpress