精华内容
下载资源
问答
  • 线性或非线性:此特征描述数据项是按时间顺序排列(例如,以数组)还是以无序序列(例如,图)排列。 同构或非同构:此特征描述给定存储库中的所有数据项是相同类型还是各种类型。 静态或动态:此特征描述了如何...
  • 再次:先说一下这样实现的不足之处:回复列表是根据回复信息数组顺序来显示的,所以,时间顺序会打乱三个人之间的回复顺序,会显得上句不搭下句,还好加了,谁回复谁,才显得不那么吃力。有待改进。...

    首先,先贴一下效果图

     

     

     大概就是要做成这个样子。上面的实现完全靠js。数据是写在data中的死数据,这样我们就能先把前端需要的数据结构确定后,就只需要从后台取出数据,生成对应的格式就好了。

     

    再次:先说一下这样实现的不足之处:回复列表是根据回复信息数组顺序来显示的,所以,时间顺序会打乱三个人之间的回复顺序,会显得上句不搭下句,还好加了,谁回复谁,才显得不那么吃力。有待改进。

    还有,自己也可以回复自己,这个可以做一个评论限制,目前还没去优化。

    这里我提一下,使用的界面UI框架,是colorUI,一个非常不错的UI框架,使用简单,方便。

    这里贴一下他的GitHub地址:https://github.com/weilanwl/ColorUI

    我用的是:colorUI中的卡片部分作为前端评论的界面。

    具体操作:

    第一部分:思考评论的数据结构。根据你自己的需求,这里我贴上我的,因为是很常见的评论+回复+再回复

    首先:js中data数据分为两个表,一个评论表,和回复表(包括再回复),数据库中,评论和回复我是放在同一个表中,所以下面js中的评论和回复数据的comment_id是唯一的,

    实现原理:循环显示评论表,再在每条评论下筛选属于这条评论的回复以及再回复。

    js数据格式:

    //评论数据
    comment_list:[
          {
            comment_id:1,   //评论id
            comment_pr_id:1,  //评论所属文章id
            comment_user_name:'九月',  //评论人姓名
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg', //评论人头像
            comment_text:"做的不错嘛",  //评论内容
            comment_time:'2019年3月20日',  //评论时间
            reply_id: 0,  //回复谁的评论,评论表全部默认为0
            parent_id: 0, //评论所属哪个评论id下面的,评论表全部默认为0
            reply_name:'' //回复评论人的昵称 评论表全部默认为''
          },
          {
            comment_id: 4,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "可以可以",
            comment_time: '2019年3月20日',
            reply_id:0,
            parent_id: 0,
          },
          {
            comment_id: 5,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "学习学习",
            comment_time: '2019年3月20日',
            reply_id: 0,
            parent_id: 0,
          },
        ],
        //回复数据
        comment_list2: [
          {
            comment_id: 2,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "谢谢",
            comment_time: '2019年3月20日',
            reply_id: 1,   //
            parent_id:1,    //
            reply_name:''  //
          },
          {
            comment_id: 3,
            comment_pr_id: 1,
            comment_user_name: '四月天',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "我也想这么夸他",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: ''
          },
          {
            comment_id: 6,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "你也可以跟我学学",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '九月'
          },
          {
            comment_id: 7,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "不用谢,做的真是不错",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '九月时'
          },
          {
            comment_id: 8,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "你们也太会拍马屁了",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '四月天'
          },
          {
            comment_id: 9,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "那就跟我好好学",
            comment_time: '2019年3月20日',
            reply_id: 5,
            parent_id: 5,
            reply_name: ''
          },
          {
            comment_id: 10,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "是的,你是大佬啊",
            comment_time: '2019年3月20日',
            reply_id: 9,
            parent_id: 5,
            reply_name: '九月时',
          },
        ],

    第二部分:wxml页面实现数据显示:

    <view class="cu-list menu menu-avatar comment solids-top">
        <block wx:for="{{comment_list}}" wx:for-index="index" wx:for-item="clist" wx:key>
          <view class="cu-item" wx:if="{{clist.reply_id == 0}}"> //显示评论列表
            <view class="cu-avatar round" style="background-image:url({{clist.comment_user_avatar}});"></view>
            <view class='content'>
              <view class='text-grey'>{{clist.comment_user_name}}</view>
              <view class='text-gray text-content text-df margin-top-xs' bindtap='replyComment' data-name='{{clist.comment_user_name}}' data-cid='{{clist.comment_id}}' data-type="1" data-pid="{{clist.comment_id}}">
                {{clist.comment_text}}
              </view>
              <block wx:for="{{comment_list2}}" wx:key wx:for-index="c2" wx:for-item="clist2">  //循环回复列表
                <view class='bg-grey text-sm padding-as' wx:if="{{clist2.parent_id==clist.comment_id}}">  //判断回复列表的parent_id是不是跟回复列表的一致
                
                  <view class="flex" bindtap='replyComment' data-name='{{clist2.comment_user_name}}' data-cid='{{clist2.comment_id}}' data-type="2" data-pid="{{clist2.parent_id}}">
                    <view wx:if="{{clist2.reply_name.length>0}}">{{clist2.comment_user_name}} 回复 {{clist2.reply_name}}:</view>  //这里是回复的名字
                    <block wx:else>
                      <view>{{clist2.comment_user_name}}:</view>
                    </block>
                    <view class='flex-sub'>{{clist2.comment_text}}</view>
                  </view>
                 
                </view>
             </block>
              <view class='margin-top-sm flex justify-between'>
                <view class='text-gray text-df'>{{clist.comment_time}}</view>
              </view>
            </view>
          </view>
        </block>
      </view>

    js方法:replyComment:

    replyComment:function(e){
        var id = e.currentTarget.dataset.cid
        console.log(id)
        var name = e.currentTarget.dataset.name
        
        var type = e.currentTarget.dataset.type
        var parent_id = e.currentTarget.dataset.pid
        console.log(parent_id)
        this.setData({
          now_reply:id,
          now_reply_name: name,
          now_reply_type: type,
          now_parent_id:parent_id,
          focus:true,
          placeholder: '回复' + name+":"
        })
      },

    上面基本上就是评论的实现部分了。当然,完整的效果还离不开,下面那个发送按钮的操作,我这里也说一下。

    第三部分:发送评论,完整实现评论效果

    下面那个发送框加,发送按钮也是colorUI中的,你能找到的源码的,贴一下:

    <view class="cu-bar foot input">
        <view class="cu-avatar round" style="background-image:url({{userinfo.avatarUrl}});"></view>
        <view class='action'>
          <text class='icon-roundaddfill text-grey'></text>
        </view>
        <input class='solid-bottom' value="{{comment_text}}" placeholder='{{placeholder}}' maxlength="300" cursor-spacing="10" focus="{{focus}}" bindblur="onReplyBlur" bindinput='getCommentText'></input>
        <view class='action'>
          <text class='icon-emojifill text-grey'></text>
        </view>
        <button class='cu-btn bg-green shadow-blur' bindtap='sendComment'>发送</button>
      </view>

    js代码:onReplyBlur,onReplyBlur,getCommentText,sendComment

    getCommentText: function (e) {
        var val = e.detail.value;
        this.setData({
          comment_text: val
        });
      },
    onReplyBlur: function (e) {
        var that = this;
        const text = e.detail.value.trim();
        if (text === '') {
          that.setData({
            now_reply: 0,
            now_reply_name:null,
            now_reply_type:0,
            now_parent_id:0,
            placeholder: "就不说一句吗?",
            focus:false
          });
        }
      },
      
      sendComment:function(e){
        var that= this
        var comment_list = that.data.comment_list  //获取data中的评论列表
        var comment_list2 = that.data.comment_list2  //获取data中的回复列表
        var comment_text = that.data.comment_text  //获取当前的评论幸喜
        var userinfo = that.data.userinfo   //获取当前的用户信息
        var comment_user_name = userinfo.nickName  //用户昵称
        var comment_user_avatar = userinfo.avatarUrl //用户头像
        var timestamp = Date.parse(new Date()); //时间戳
        var create_time = common.timetrans(timestamp)  //格式化时间戳
        var reply_id = that.data.reply_id //获取回复的评论id
        console.log(timestamp)
        console.log(create_time)
        var comment_list_length = comment_list.length //获取当前评论数组的长度
        console.log("当前评论数组的长度" + comment_list_length)
        var last_id = comment_list[comment_list_length -1].comment_id //获取最后一个的id
        console.log("当前评论数组的最后一个的id" + last_id)
        var comment_list2_length = comment_list2.length //获取当前回复数组的长度
        console.log("当前评论数组的长度" + comment_list2_length)
        var last_id2 = comment_list2[comment_list2_length - 1].comment_id //获取回复一个的id
        console.log("当前评论数组的最后一个的id" + last_id2)
        var new_id = last_id > last_id2 ? last_id + 1 : last_id2 + 1
        console.log("新的id是"+new_id)
        var reply_name = null
        var parent_id = 0
        var reply_id = that.data.now_reply
        console.log("回复的id是" + reply_id)
        if (reply_id!=0){
          console.log("现在是回复")
          var reply_type = that.data.now_reply_type
          parent_id = that.data.now_parent_id
          console.log("回复的所属的parent_id是" + parent_id)
          console.log("回复的类型是" + reply_type)
          if (parent_id > 0) {
            if (reply_type == 1){
              parent_id = reply_id
              console.log("现在是回复评论")
            }else{
        
              reply_name = that.data.now_reply_name
              console.log("现在是再回复" + reply_name+"的回复")
            }
          }
        }else{
          console.log("现在是评论" )
        }
        var comment_detail = {}
        comment_detail.comment_id = new_id
        comment_detail.comment_user_name = comment_user_name
        comment_detail.comment_user_avatar = comment_user_avatar
        comment_detail.comment_text = comment_text
        comment_detail.comment_time = create_time
        comment_detail.reply_id = reply_id
        comment_detail.parent_id = parent_id
        comment_detail.reply_name = reply_name
        console.log(comment_detail)
        if (comment_detail.parent_id>0){
          comment_list2.push(comment_detail)
        }else{
          comment_list.unshift(comment_detail)
        }
        
        that.setData({
          comment_text:null,
          now_reply: 0,
          now_reply_name: null,
          now_reply_type: 0,
          now_parent_id: 0,
          placeholder: "就不说一句吗?",
          comment_list,
          comment_list2
        },()=>{
          //这里写你访问后台插入数据库的代码
        })
        
      },
    

     

    最后完整的贴一下js中data的数据:因为有些数据你不定义一个初始值,有时候会报undefined错误,最好在data中设置一下。

    data: {
        isCard: true,
        like_list:[
          {
            user_id:1,
            user_name:'随手一赞',
            user_avatar:'https://image.weilanwl.com/img/square-2.jpg'
          },
          {
            user_id: 2,
            user_name: '随手一赞',
            user_avatar: 'https://image.weilanwl.com/img/square-2.jpg'
          },
          {
            user_id: 3,
            user_name: '随手一赞',
            user_avatar: 'https://image.weilanwl.com/img/square-2.jpg'
          },
          {
            user_id: 4,
            user_name: '随手一赞',
            user_avatar: 'https://image.weilanwl.com/img/square-2.jpg'
          },
          {
            user_id: 5,
            user_name: '随手一赞',
            user_avatar: 'https://image.weilanwl.com/img/square-2.jpg'
          },
        ],
        comment_list:[
          {
            comment_id:1,
            comment_pr_id:1,
            comment_user_name:'九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text:"做的不错嘛",
            comment_time:'2019年3月20日',
            reply_id: 0,
            parent_id: 0,
          },
          {
            comment_id: 4,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "可以可以",
            comment_time: '2019年3月20日',
            reply_id:0,
            parent_id: 0,
          },
          {
            comment_id: 5,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "学习学习",
            comment_time: '2019年3月20日',
            reply_id: 0,
            parent_id: 0,
          },
        ],
        comment_list2: [
          {
            comment_id: 2,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "谢谢",
            comment_time: '2019年3月20日',
            reply_id: 1,
            parent_id:1,
            reply_name:''
          },
          {
            comment_id: 3,
            comment_pr_id: 1,
            comment_user_name: '四月天',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "我也想这么夸他",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: ''
          },
          {
            comment_id: 6,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "你也可以跟我学学",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '九月'
          },
          {
            comment_id: 7,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "不用谢,做的真是不错",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '九月时'
          },
          {
            comment_id: 8,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "你们也太会拍马屁了",
            comment_time: '2019年3月20日',
            reply_id: 2,
            parent_id: 1,
            reply_name: '四月天'
          },
          {
            comment_id: 9,
            comment_pr_id: 1,
            comment_user_name: '九月时',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "那就跟我好好学",
            comment_time: '2019年3月20日',
            reply_id: 5,
            parent_id: 5,
            reply_name: ''
          },
          {
            comment_id: 10,
            comment_pr_id: 1,
            comment_user_name: '九月',
            comment_user_avatar: 'https://image.weilanwl.com/img/square-2.jpg',
            comment_text: "是的,你是大佬啊",
            comment_time: '2019年3月20日',
            reply_id: 9,
            parent_id: 5,
            reply_name: '九月时',
          },
        ],
        comment_text: null,
        reply_id:0,
        placeholder:'就不说一句吗?',
        reply_id:0,
        now_reply_name:null,
        type:0,
        now_parent_id:0,
        now_reply:0
      },

    如果有不懂的,可下方留言询问。

    展开全文
  • C#数据结构

    2013-12-10 11:49:54
    数据的存储结构包括顺序存储结构和链式存储结构两种。顺序存储结构 (Sequence Storage Structure)是通过数据元素在计算机存储器中的相对位置来表 示出数据元素的逻辑关系,一般把逻辑上相邻的数据元素存储在物理位置...
  • 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 ...
  • VC 6.0 数据结构大作业:这个超市管理系统实现的功能十分简单,但...最后,我把要添加的货物信息都加去顺序表的最后,这样可以简化了“添加”操作,由于程序得到简化,就可以减少程序的运行时间,减少程序的出错几率。
  • 数据结构实验

    2012-04-13 09:55:47
    1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 二 、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 ...
  • 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 2.5 结构化程序设计方法 31 3 数据类型、运算符与表达式 3.1 C语言的数据类型 32 ...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    6.数据结构中评价算法的两个重要指标是(时间复杂度空间复杂度) 【北京理工大学 2001 七、1(2分)】 7. 数据结构是研讨数据的_(1)物理结构__(2)逻辑结构 _,以及它们之间的相互关系,并对与这种结构定义...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    <br>实验二 单链表结构及计算 实验目的: 通过实验掌握下列知识: 1、熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现; 2、继续熟悉VC编程、编译和调试环境; 内容及步骤:...
  • 何为数字货币呢?据小编了解数字货币就是基于区块链发行的货币,整个百网络由用户构成,整个去...据小编了解区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不

    何为数字货币呢?据小编了解数字货币就是基于区块链发行的货币,整个百网络由用户构成,整个去中心化,不受第三方管辖。且数字货币交易信息记录在区块链中,信息科度溯源不可篡改,因此大大减少了欺诈风险。具有公开性和匿名性,用数字货币交易也能很好的解决专信任问题。
    数字货币可购买和出售,可以用来交易,比较出名的数字货币就是比特币属了,要深入了解数字货币的话,可在 密码财经 上看相关信息。

    而又区块链又是什么呢?据小编了解区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。
    广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。
    区块链含义

    区块链本质上是一个去中心化的分布式账本数据库(程剑宇 指出:在与比特币相关的区块链应用中可使用这一术语,但区块链技术可能并不包含“账本”)。其本身是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次比特币网络交易有效确认的信息。
    在这里插入图片描述

    展开全文
  • 1.下述哪一条是顺序存储结构的优点?( )(A) A.存储密度大 B插入运算方便 C.删除运算方便 D可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是哪一个?( )(B) A.线性表采用顺序存储,...
  • 选择列的顺序至关重要,因为它将影响维度层次结构内成员的位置。(此概念引之于SQLServer2000联机帮助) 维度是有层次的,在大多数情况下维度的成员会按金字塔形布局排列。水平布局由维度层次结构中具有相同级别的列值...
  •  本书是一本关于oracle database 9i、10g 和11g 数据库体系结构的权威图书,涵盖了所有重要的oracle 体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,分区和并行,以及...
  • 关于ds18b20程序

    2009-05-05 18:01:55
    //读暂存器CRC值----------------------- if(Ds18b20_ReadEE(temp)) { TR1 = 1; TR0 = 1; return 1; } //------------------------------------- //CRC校验------------------------------ // //此处应加入...
  • 进程与程序的关系是:程序是存储在文件中的、带有结构和顺序信息(用于控制指令执行次序)的指令列表,进程是程序的运行实例。通俗来讲,程序描述了如何处理一个事务,进程按程序的描述实际执行之。相同的程序可以多次...

    1 基本概念

    进程与程序的关系是:程序是存储在文件中的、带有结构和顺序信息(用于控制指令执行次序)的指令列表,进程是程序的运行实例。通俗来讲,程序描述了如何处理一个事务,进程按程序的描述实际执行之。相同的程序可以多次执行,每次执行操作系统都将创建一个独立的进程,并开始读取指令列表。

    在这里插入图片描述

    图1

    进程更正式的定义是:计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的最小单位,是操作系统结构的基础。进程是线程的容器,同时包含了内存、句柄等计算机资源,如图1所示。

    数据集合包括指令在内存中的版本、程序中使用的变量以及其他相关元数据。其中变量和元数据是可变的,称为进程状态。进程主要的五种状态如图2所示。

    在这里插入图片描述

    图2

    重点辨析就绪和阻塞状态。

    就绪:进程分配的时间片已用完,或在中断机制下,有更高优先级的进程打入,此时进程进入就绪队列等待下一次被选中

    阻塞:进程所需要的资源或某些事件不满足要求,如暂时不能访问某一资源、操作系统尚未完成服务、系统正在初始化I/O设备、等待用户的输入信息等,当这些系统资源被满足后,进程从阻塞队列出队而进入就绪队列等待CPU资源。

    简言之,就绪状态等待CPU资源,而阻塞状态等待CPU以及所需的其他系统资源。

    进程状态区分了同一程序的多道进程,操作系统级别用唯一进程标识符(Process IDentifier, PID)识别不同的进程。

    2 进程调度

    进程的运行,是其指令在CPU中执行的行为。CPU是系统最主要的资源,而操作系统最基本的作用是管理系统资源,因此操作系统负责管理系统进程,以及在任意给定的时间选择哪一个进程运行(仅考虑单核系统)。现代操作系统中,执行上述职能的部件是调度器。调度器选中某道进程后,由其子部件分派器将该进程由就绪状态引入到运行状态。因此调度是通过一定算法选择某道进程,并将其从就绪状态切换到运行状态的过程

    2.1 时间片管理

    在抢占式调度器中,允许某个特定进程运行一段时间后,切换到就绪队列等待调度器下一次选中,而将另一个进程从就绪队列中引出,并设置为运行状态。这里的时间称为时间片

    在这里插入图片描述

    图3 时间片与调度开销

    由于调度器执行调度决策本身需要占用系统处理时间,这部分进程外的额外时间称为调度开销。调度开销中的最大成分是上下文切换,即CPU从执行一道进程或线程切换到执行另一道进程或线程的动作,如图3所示。上下文切换时要进行保护现场恢复现场,即保存某道进程被抢占或阻塞前最后一次运行时的执行环境,和在下一次运行时复现,这里的执行环境包括堆栈、程序计数器以及其他操作系统结构等。

    在这里插入图片描述

    图4 上下文切换

    若时间片太短,由于调度开销的存在,操作系统将频繁执行调度活动,使系统处理资源被浪费;若时间片太长,则就绪队列的其他进程不得不在轮转期间等待更长的时间,表现出应用程序的未响应或缺乏响应状态。

    时间片大小没有随看技术进步(主要指CPU处理速度)而大幅变化,原因在于:
    (1) 人类对响应性的感知能力没有改变,没有必要为此缩短时间片;
    (2) 系统的复杂性和在其上运行的应用程序的数量也在以高速率提升,以实现其丰富的功能,即相较原有系统多出的运算资源又被分配给了更多的进程,而非延长每一道进程的时间。

    现代系统中时间片大小一般在大概10~200ms的范围内(Windows操作系统为10ms), 在非常快速的平台上时间片更小(低至约1ms)

    时间片大小的范围设定能够用作实现进程优先级的一种手段:高优先级的进程应该获得较大份额的可用处理资源。一种特例是,如果进程是IO密集型的,它们执行IO时会被堵塞而无视其优先级(分配的时间片再长也会进入阻塞队列)。

    2.2 调度算法

    在这里插入图片描述

    图5 调度算法目标

    在这里插入图片描述

    图6 基础调度算法

    在基础算法上,进行了调度算法的改进。

    (1) 多级队列(MLQ, Multilevel Queue):按进程性质设置若干就绪队列,每个队列可执行不同调度算法。例如计算密集型进程队列中执行FCFS调度;系统进程队列执行RR调度等。根据系统的工作特点,为不同的进程队列分配不同的CPU处理时间。值得注意的是,每级队列执行的调度算法,不会影响到其他进程队列。

    (2) 多级反馈队列(MLFQ, Multilevel Feed-back Queue):以MLQ为基础,但与之不同在于:进程能够在不同队列中移动以允许调度过程达到一种平衡——短期调度获得任务响应性,长期调度确保公平性和系统效率;队列按优先级组织。

    进程移动的基本规则是:

    ①若进程用尽时间片仍未完成任务,则降到下一级进程队列;
    ②若进程在时间片内让出控制(如发生阻塞),则保留在该级队列;
    ③若进程因为执行IO而发生阻塞,则会提升到上一级进程队列。

    在这里插入图片描述

    图7 多级反馈队列

    以科学计算模拟为例,由于其计算时间较长以至于在若干个时间片内无法处理完毕,进程将逐次被降级,并留在较低级的进程队列中接受RR调度。当科学计算结束后,需要通过IO将结果反馈给用户,则该进程开始逐步回升到高优先级队列中。只有当最高优先级队列中进程临时用尽时,才有机会执行低级队列中的进程。由于进程的优先级根据其行为动态变化,因此该算法灵活性得到保证。

    在这里插入图片描述

    图8 不同OS的调度算法
    展开全文
  •  本书是一本关于Oracle 9i & 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,包括文件、内存结构和进程,锁和闩,事务、并发和多版本,表和索引,数据类型,以及分区和并行,并利用具体的...
  • 信息系统是一个人造系统,它由人、计算机硬件、软件数据资源组成,目的是及时、正确地收集、加工、存储、传递提供决策所需的信息,实现组织中各项活动的管理、调节控制。 35.原型法的基本思想是:开发者...
  • PHPMySQL Web开发第4版

    热门讨论 2014-08-13 15:32:15
    9.10.2 日期和时间类型 9.10.3 字符串类型 9.11 进一步学习 9.12 下一章 第10章 使用MySQL数据库 10.1 SQL是什么 10.2 在数据库中插入数据 10.3 从数据库中获取数据 10.3.1 获取满足特定条件的数据 10.3.2...
  • 9.10.2 日期和时间类型 9.10.3 字符串类型 9.11 进一步学习 9.12 下一章 第10章 使用MySQL数据库 10.1 SQL是什么 10.2 在数据库中插入数据 10.3 从数据库中获取数据 10.3.1 获取满足特定条件的数据 10.3.2...
  • 9.10.2 日期和时间类型 9.10.3 字符串类型 9.11 进一步学习 9.12 下一章 第10章 使用MySQL数据库 10.1 SQL是什么 10.2 在数据库中插入数据 10.3 从数据库中获取数据 10.3.1 获取满足特定条件的数据 10.3.2 从多个表...
  • 1.3 顺序结构程序设计 6 1.4 分支结构程序设计 9 1.5 小结与习题 13 1.5.1 数据类型实验 13 1.5.2 scanf输入格式实验 13 1.5.3 printf语句输出实验 13 1.5.4 测测你的实践能力 14 1.5.5 小结 14 1.5.6 上机练习 15 ...
  • shell编程unix命令

    2015-02-16 15:41:39
    2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 ...
  • 只要的信息结构爬去顺序为**关键词的搜索结果,拿到第一页上某个视频的标题,url,和时间,然后进入下级页面爬去该视频的对应的评论,回复,弹幕,点赞数等等数据,联合组成一个关于该视频的完整信息返回item进行...

     

    scrapy使用大坑---meta参数传递出现之重复问题

    问题描述:

        爬虫目标:

           实现哔哩哔哩网站的视频信息爬取,只要的信息结构爬去顺序为**关键词的搜索结果,拿到第一页上某个视频的标题,url,和时间,然后进入下级页面爬去该视频的对应的评论,回复,弹幕,点赞数等等数据,联合组成一个关于该视频的完整信息返回item进行后续处理和存储。

                  问题点   :

           通过meta参数传值时出现在被调用的函数中meta参数多次重复,废话不多说代码贴图:

     爬取结果:(meta传递过来的值一直在重复,而response.url的输出说明网页的访问正确,说明智能是meta传递值有错误)

    在网上查阅资料后原因为:(meta的参数传递是浅拷贝,并且scrapy是异步框架才会导致这样的问题)

    解决办法:(改用深拷贝)

    修改后效果:

     

    转载于:https://www.cnblogs.com/crawer-1/p/8017533.html

    展开全文
  • 狭义来讲,区块链是一种按照时间顺序和数据区块以顺序相连的方式组合成的一种链式数据结构,并使用密码学方式保证了不可篡改不可伪造的分布式账本。 广义来讲,区块链技术是利用块链式其数据结构来验证存储数据...
  • Node 将会把这些添加的定时器函数添加到 libuv 中的一个称为定时器堆(timer heap)的数据结构中。在 Node 的事件循环定时器阶段中,Node 将会检查定时器堆(timer heap)中是否有到期的定时器或 interval,...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 369
精华内容 147
关键字:

关于信息结构和时间顺序