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

手机上做网站php网站样例

手机上做网站php,网站样例,建设信用中国网站的目的,eclipse jsp 网站开发文章目录 1.线程/协程/异步#xff1a;并发对应硬件资源是cpu#xff0c;线程是操作系统如何利用cpu资源的一种抽象2.并发#xff1a;cpu#xff0c;线程2.1 可见性#xff1a;volatile2.2 原子性#xff08;读写原子#xff09;#xff1a;AtomicInteger/synchronized… 文章目录 1.线程/协程/异步并发对应硬件资源是cpu线程是操作系统如何利用cpu资源的一种抽象2.并发cpu线程2.1 可见性volatile2.2 原子性读写原子AtomicInteger/synchronized2.3 CPU由控制器和运算器组成通过总线与其他设备连接 3.IO多路复用硬盘和网卡3.1 selectselect是系统调用函数system是一个C/C的库函数3.2 pollpollfds数组替代bitmap3.3 epollepfd是共享内存不需要用户态切换到内核态 4.操作系统内存管理与分类分页页大小位数偏移量4.1 内存条/总线/DMA硬件CPU和DMA是同级两者对总线控制是轮换隔离4.2 用户态和内核态程序运行过程中可能处于内核态也可能处于用户态某一时刻处于用户态下一时刻可能切换到用户态但必须有触发条件4.3 分页为了减少碎片问题4.4 分段程序内部的内存管理即分段对虚拟地址分成多个段堆区和栈区就是程序的段。text代码段存程序本身二进制字节码data数据段存程序中一些静态的变量4.5 brk用户无法操作硬件如内存条必须交给内核帮我们操作完了再把结果给我们4.6 mmappidstat缺页缺的是内存还是磁盘4.7 逃逸分析对象在声明后只有在当前运行的函数中调用那么将这个对象栈上申请空间而不是在堆上因为在栈上申请的对象函数执行完后会直接清理大大减轻了GC压力 1.线程/协程/异步并发对应硬件资源是cpu线程是操作系统如何利用cpu资源的一种抽象 线程操作系统级别概念是cpu调度的最小单位cpu并不在意是哪个进程cpu就是轮换着线程来运行并不需要知道这个线程是属于哪个进程的。左边单核cpu不是单线程3个线程任务都是读取文件交叉运行完。 通过以下两点大大提高了cpu利用率因而线程想提高效率和io密切相关。 1.DMA过程中cpu一段时间不被线程阻塞。2.DMA进行数据读取时可复用因为cpu的总线程具有多条线路所以DMA可充分利用这些线路实现并行读取这些文件。 多线程需调用系统底层API才能开辟在多线程开辟过程中浪费时间并且在线程运行中上下文切换部分左边切换多次右边切换三次有用户态和内核态转换耗效率浪费在cpu切换时间点上。所以服务端连接的客户端不活跃多(即io次数少)考虑单线程(io多路复用或nio)或协程。上面的123线程都有io所以多线程效率高。 如何利用cpu资源os给了我们两种抽象即进程和线程。进程是系统资源分配调度和管理的最小单位比如去任务管理器查看使用内存时是看的哪个进程或哪个程序使用了多少内存而不是哪个线程如果是哪个线程根本不知道是哪个程序里的线程没法管理。一个进程的内存空间是一套完整的虚拟内存地址空间这个进程中所有线程都共享这一套地址空间。如下线程的5种状态只有运行中是占用cpu资源的。 线程执行有性能损耗这些损耗来自线程的创建销毁和切换线程本质向cpu申请计算资源用户态转内核态。 协程是用户自定义线程但与os的线程不同协程不进入内核态。自己创建一套API协程利用线程资源。 2.并发cpu线程 2.1 可见性volatile 如下程序一直没结束即while(a)这线程没结束一个线程对a写了false但是对另一个线程并不可见。 如下第一个core为主线程第二个core为开辟的线程。 如上线程2不能立即读到线程1写后的最新变量值线程1写线程2读多线程不可见性。如何解决多线程不可见性加volatile关键字使a在主存和localcache间强制刷新一致。 2.2 原子性读写原子AtomicInteger/synchronized 如果线程1和2都进行基于读的变量再对读的变量再进行写最典型操作iT1和T2都进行i操作。 一开始i0经过两个线程两次i操作结果变成了1这显然是不对的并且这种情况下不能用volatile保证这样操作的正确性两个线程既有读操作又有基于读操作的写操作可见性只保证一个线程写另一个线程读是正确的这里可见性不适用。 现在想做的是将读操作和写操作合为一步要么同时发生要么同时不发生原子性。在保证原子性同时一定以保证可见性为前提(不是并列关系AtomicInteger类里本质上就是volatile本身不可见的话没办法保证原子性。 也可用synchronized同步关键字来保证原子性发生同步关键字同一时间只有一个线程进入代码段。 volatile可见性关键字最轻量级保证一个线程写一个线程读能读到最新的值AtomicInteger保证既有读操作又有写操作如i这种场景下能保证操作的原子性基于volatilesynchronized最重量级能保证整个代码块中所有操作都是原子性的。多线程情况下需要自增请使用Atomicxxx类来实现。 2.3 CPU由控制器和运算器组成通过总线与其他设备连接 内存cpuio是编程中三个最重要的点。南桥桥就是连接连接带宽要求低的设备如是一些鼠标键盘硬盘usb设备等。北桥集成到了cpu内部负责带宽比较高的设备如pcie显卡pcie硬盘内存RAM需高速访问。如下是cpu常见参数8核16线程超线程。 系统架构处理器指令集如下常见的6种指令集X86_64基于X86ARM不是其他嵌入式类cortex A系列等。 2个物理cpu1个物理cpu有38个逻辑核【76个线程/频率/处理单元processor】。CPU就intel和amd。CPUS所有cpu的总逻辑核数。socket物理cpu数量。top -d 1。 应对并发1.动静分离cdn加速资源。2.水平扩展nginx集群。3.微服务化多用多分配资源。4.缓存redis减少io寻找。5.队列秒杀系统采用。 3.IO多路复用硬盘和网卡 如下AB。。都是客户端方框是服务端。首先想到应对并发写一个多线程程序每个传上来的请求都是一个线程现在很多rpc框架用了这种方式多线程存在弊端cpu上下文切换因而多线程不是最好的解决方案转回单线程。如下while(1)…for…就是单线程。 3.1 selectselect是系统调用函数system是一个C/C的库函数 while(1)中FD_ZERO将rset初始化0用FD_SET将有数据的fd插个旗子并赋给reset。 3.2 pollpollfds数组替代bitmap 3.3 epollepfd是共享内存不需要用户态切换到内核态 epoll_wait和前面select和poll不一样有返回值。最后只遍历nfds不需要轮询时间复杂度为O(1)。epoll解决select的4个缺点。redisnginxjavaNIO/AIO都用的是epoll多路io复用借助了硬件上优势DMA。 IO模型BIO/NIO/AIO阻塞发起io读取数据的线程中函数不能返回。同步拿到io读取完的数据之后对数据的处理是在接收数据线程的上下文后紧接着处理。异步回调函数中进行数据处理 如上看出java比C语言系统调用多的多因为java要启动jvm虚拟机jvm要读jdk的lib库等很多操作。如上并没有发现open…xml操作因为java程序主要启动jvm进程jvm进程可能又起了很多线程去真正运行main函数所以加-f。 4.操作系统内存管理与分类分页页大小位数偏移量 4.1 内存条/总线/DMA硬件CPU和DMA是同级两者对总线控制是轮换隔离 io总线 包括PCIE总线最常见的USB通用串行总线南桥PCH里有一个DMA控制器南桥PCH接不太占用带宽的设备如USB/硬盘/网卡/声卡。 Nodejs是单线程但在读文件时文件还没读完却可以执行下面几行程序文件读完后触发一个回调。因为单线程按理来说cpu直接读磁盘中文件的话应该一直读取这文件读完前不能进行其他操作它怎么做到执行其他操作的呢需要有硬件支持即DMA读文件操作是非常机械劳动cpu资源宝贵不能干这种活下面xxx是内存地址。 cpu要想进行数据搬运用memcpy占用cpu资源。把要访问的源地址目的地址还有长度告诉DMA外设搬运搬运完成产生中断告诉cpu这样不占用cpu资源。内核怎么管理DMA呢dma内存申请部分dma硬件部分dma访问物理地址cpu访问虚地址需要一个函数实现物理地址和虚地址的转换还有一种函数如何申请一段既能被cpu访问又能被dma访问的内存这是内核需关注的问题内核提供一系列的内存申请函数在doc目录下查找。 问题dma访问的物理内存不经过cpu cache假设cpu写一段数据数据还缓存在cache中dma从内存中搬运此时数据不对所以要将cpu cache刷新到内存。同样假设网卡发了一段数据到内存dma去读此时不能将cpu cache刷新到内存在dma中断时将cpu cache无效掉。 4.2 用户态和内核态程序运行过程中可能处于内核态也可能处于用户态某一时刻处于用户态下一时刻可能切换到用户态但必须有触发条件 读写文件和申请内存是用户态转内核态的两个例子。malloc的两种实现方式brk和mmap两者只选一种。brk和mmap申请的都是虚拟内存不是物理内存想真拿到物理内存空间还要第一次访问时发现虚拟内存地址未映射到物理内存地址于是促发一个缺页中断也叫缺页异常os中异常和中断有很多类似地方。C语言是malloc而java和c中new对象申请内存空间也是经过这么过程。 查看linux内核中有多少系统调用man syscalls如下。第四类信息相关如获取cpu信息等。管道pipe是进程间通信。openreadwrite是文件相关同时也是对磁盘操作也可归到设备这类。mmap是文件和内存的映射mmap申请内存也是对磁盘设备操作也可属于第三类。 逻辑地址逻辑/虚拟/进程内存程序自身看到的内存地址空间是抽象地址。逻辑地址需映射到物理内存才能完成对内存操作那为什么程序操作是虚拟的逻辑地址不能直接操作物理地址即对内存条操作因为程序是写死的操作的地址是固定的而硬件内存条哪些地址被占用了一直变化因为os是多进程的当前进程需要操作的地址其他进程在使用这样不能使用这块地址了所以说除非是单进程机器否则为了进程安全必须做出逻辑地址和物理地址的映射。 所以必须要有逻辑地址必须要有映射。如何映射如下固定偏移量映射程序1的偏移量初始位置是0程序2的偏移量初始位置200如果程序1操作的逻辑地址是100那么映射的物理地址也100因为偏移量0如果程序2操作的逻辑地址是50映射到物理内存250因为偏移量200。 如上看上去简单高效但存在两个缺陷第一个缺陷程序使用的内存无法计算的随时间推移进程使用的内存不断变化。这里我们说程序1使用200的内存这种说法本身不太对的因为我们没法去限定一个程序使用的内存大小当然你可以说我估算了这程序使用的最大内存就是200但这也代表整个200的一段内存中程序使用的内存绝大多数时间都小于200。蓝色区域中内存使用率并不高其中存在很多没有利用起来的内存我们把没利用起来的内存叫内碎片。 第二个缺陷当程序运行完内存被释放比如程序1执行完后0-200这块地址被释放出来了此时程序3使用了内存大小是201这时程序3没法直接使用0-200这段内存了假设很长一段时间内都没有占用200以内的内存这样的程序被创建那么0-200一直被闲置称这段内存为外碎片。 4.3 分页为了减少碎片问题 将内存空间包括逻辑内存左页地址连续和物理内存右帧地址不连续都进行切分分成固定大小很多片每一片称它为页。页到帧的映射需要有个表来维系这个表就叫页表即pagetablepagetable不仅存了页号帧号还存了当前这一页读写权限等等。 页表是每个进程都需要维护的因为每个进程映射关系是互相独立的所以不能共用映射表每个进程有自己的pagetable。 32位os物理地址有2的32次方个即4000000000个地址内存的一个地址里住着一字节Byte数据即4GB。32位程序以为自己拥有4GB内存如两个32位程序一个使用了2GB内存另一个使用了3GB内存。但整个物理机只有4GB内存造成虚拟地址可能比物理地址大多出来部分可将虚拟地址的页映射到磁盘上。但映射到磁盘上导致下一次读映射到磁盘上这一页内存时会触发一个缺页中断进入到内核态整个会产生一个大major错误。linux下这磁盘部分又叫swapping与物理帧交换。 分页小结1.分页使得每个程序都有很大的逻辑地址空间通过映射磁盘和高效置换算法使得内存无限大。 2.分页使不同进程的内存隔离保证了安全不同进程各自维系了一个页表只要页表中value即帧号这一栏不互相冲突保证不同程序间内存隔离保证安全性。 3.分页降低了内存碎片问题。 4.缺点页表存在我们主存中即存在内存中如果我们要对某一个内存进行访问的话其实要读取两次内存。因为先读取页表从页表中拿到对应帧号再拿帧号去内存中再查询一遍对内存操作有两次读取【时间上要优化将页表集成到cpu中的mmu硬件中称为快表先查快表查不到查页表】。页表存在主存中占空间【空间上要优化多级页表】。 4.4 分段程序内部的内存管理即分段对虚拟地址分成多个段堆区和栈区就是程序的段。text代码段存程序本身二进制字节码data数据段存程序中一些静态的变量 不同程序共享内核kernel space这1G空间共享内存如Libraries函数库so/dll文件。 函数参数传递是复制传递即将实参复制一份给形参因而形参的改变不会影响实参但是如果参数是指针那么复制的就是地址的值通过星号下钻该地址就能修改地址内变量的值。我们把包括结构体在内的基础类型传参称为值传递而指针的传递称为引用传递。 如下从main函数开始。 像c、golang是有指针和地址概念而对于java、python、js等语言对象的变量名本身就是个指针因而传递对象就是引用传递。 父函数main()在子函数f()入栈之前会留出子函数f()返回值的内存空间子函数返回值与父函数的入参(这里父函数没有入参打比方)一样是复制传递。 但是返回值如果是指针可能会导致父函数调用该地址内变量时子函数已经出栈导致访问错误。同情况也会出现在全局变量属性赋值时。这些都属于变量逃逸像go、rust、java会自动进行逃逸分析将逃逸的变量创建到所有函数共享的全局空间中这就是堆heap。 堆内存的释放复杂像c语言需手动释放忘记或多次释放都会带来问题而像java、golang、js、python等是有gc机制能定期自动释放这会导致性能下降无法胜任系统级别和硬件编程。 上下文切换P1进程还没运行完其中一些信息如程序计数器、变量、程序运行到哪了即context执行环境上下文保存到内核的栈P2再加载进来运行。调度算法FIFOfirst in first out非抢占式谁先来谁先被调度缺点需等待长时间的进程执行完其他进程才能分到CPU。STFshort time first非抢占式谁的进程时间短谁先被调度需要同时到达不然缺点是长时间进程先到达后面进程也要等待。STCFshort time complete first抢占式谁时间短先被执行再切回去执行时间长的缺点是如1000ms的进程一直被抢占导致3000ms才执行完响应时间太长。RR轮询即cpu将1s分成很多时间片把这些时间片分给每一个进程1s多个进程是在并行的。 一个cpu多个进程这些进程放在哪用什么数据结构存储进程队列全局队列多个cpu一个队列和局部队列每个cpu有自己队列。进程优先级不是每一个进程都有相同优先级如下不是ps aux显示STAT列就是进程状态。 linux调度器O(n)调度器即遍历进程队列找到优先级最高的进程。O(1)调度器即优先级0-139映射成140个格子即0或1的bitmapcpu找到1的格子去执行进程队列链表或其他数据结构和hashmap一样。 如下free206M和available1.6G能用的是哪个是1.6G。used包含sharedfree是真正的空闲没有任何东西在使用的大小。文件磁盘缓存指读过的文件暂时帮我们缓存到内存中下次再读的时候直接从内存中拿出来就能加速对文件读写操作。比如说现在free的空间只有206M我有个程序要用1G内存能用吗能buffer/cache这边1.6G中有800M扔出去释放掉206M1G给程序。 buff/cache中间为什么有个/较早内核中free-h看分buffcache以磁盘扇区【硬件扇区】为单位直接对磁盘缓存和pagecache以页【文件系统】为单位对磁盘文件缓存两项。两项有重复的地方文件本质也是磁盘。 4.5 brk用户无法操作硬件如内存条必须交给内核帮我们操作完了再把结果给我们 C语言中有sbrk库函数是对brk的一个封装如下brk申请内存内存是连续的并不是说在堆空间随便找内存就把空间给你。 当前我们对第5678四个字节赋int值123。只有第一个字节通brk申请出却给第5-8字节赋值这样会不会报错呢不会主要原因是在上节讲到的操系内存的分页管理所导致的也就是说brk申请内存申请最小单位为1页一般系统中页大小4k所以brk看似申请1字节其实申请了一页4096个字节所以第5-8字节也属于4096字节里也是当前进程所能支配的内存所以不报错。 如下号相当于向后移动1024个int如下报段错误。 4.6 mmappidstat缺页缺的是内存还是磁盘 mmap还有直接将磁盘文件映射到内存作用类似read不是malloc。 如下触发大错误因为对文件的映射将文件映射到内存也是惰性的这文件没有直接读到内存里而是当真正需读文件里内容时才会映射到内存里。第一次触发是上面for循环里打印文件内容时到内存中读发现这一页在查页表时对应是磁盘就触发一个缺页错误对应是磁盘触发majflt将磁盘内容加载到内存中之后就是一些小错误了。-p指定进程号。-r显示各个进程的内存使用统计。grep -v grep过滤掉包含grep的行。最后1是输出1次信息。 read系统调用进入内核态内核态将文件内容加载到内核空间如下kernel space内核空间给它复制到用户空间再从内核态切换到用户态然后用户的程序就可读到文件的内容了有个文件-内核空间-用户空间周转过程。 mmap直接将文件进行了映射一开始在页表中填充的是磁盘disk即FILE文件一开始mmap是惰性的直接对应磁盘文件真正读取时触发缺页将文件加载到内存。 mmap这么牛干嘛还用read函数mmap虽减少了内核空间到用户空间拷贝0拷贝但mmap没法利用前面讲的buffer/cache对文件缓冲这么一块空间而且mmap第一次触发的缺页异常耗时不一定比read少。 4.7 逃逸分析对象在声明后只有在当前运行的函数中调用那么将这个对象栈上申请空间而不是在堆上因为在栈上申请的对象函数执行完后会直接清理大大减轻了GC压力 如下只有第一个线程安全。 Boolean、Byte的所有对象都是预先创建好的类加载的时候。Character、Short、Integer、Long是-128~127的对象是预先创建好的Character没有负数。 现象new Integer(1)则是从创建好的缓存中直接拿出因而是同一个错new的是新的对象原因为了节省内存这些数字使用概率很高早就创建好之后都用同一个是提高效率的做法。 如下是对象类型。func1结束后栈上清空了但是堆上怎么清空呢引出GC。main函数静态存方法区。java基础数据类型都是值类型指针也是值类型因而直接存到内存不是存地址去寻址。 如下引用类型传地址和上面形参a不同。
http://www.hkea.cn/news/14575112/

相关文章:

  • 青岛网站建设公司 中小企业补贴flash网站源码模板
  • 网站域名格式网上找家装设计师
  • 网站优化seo方案西安微网站建设
  • 民宅挂在民宿网站上 保洁谁做合肥网站设计网址
  • 农家乐网站建设营销方案wordpress手机分享插件下载
  • 网站如何在百度搜索网站网页制作公司
  • wordpress 网站提速做ppt设计师哪个网站好
  • 建设银行网站打不开 显示停止工作南宁3及分销网站制作
  • 品牌网站的推广邢台市教育局
  • 未备案的网站可以百度推广吗app下载注册推广
  • 网站开发的例子重庆网站建设途锦科技
  • wordpress 站长工具源码做良心网站
  • 山东做网站建设的好公司申请自己的网站空间
  • 外贸网站平台都有哪些平台个人怎么做一个网站
  • 做网站本溪wordpress 精确搜索
  • 美的公司网站建设的目的公司注册地址租赁一般多少钱
  • 做猎头顾问 经常看哪些网站自己注册公司多少钱
  • 零基础源码建设网站沈阳网站网页
  • 高清做 视频在线观看网站网站备案 ip
  • 南城网站建设价格整站seo排名外包
  • 工程建设标准网站中国建筑装饰网图片
  • 深圳网站关键词优化公司哪家好竞价托管是啥意思
  • 网站设计制作公司大全外贸平台网站建设
  • 做房地产网站建设可以免费秒玩游戏的网站
  • 云主机做网站设计类培训机构
  • 如何进行网站建设的销售网站文字设计
  • 外贸网站模板建立做家政服务类网站的要求
  • 庆阳网站设计价格wordpress验证码注册
  • 帝国网站程序如何做一个购物网站页面
  • 建设部网站投诉核查网站换模板要怎么做