オブジェクトの凍結(freeze)、clone、dup の複製の深さの違い、eql? と equal? の違い

fc9 [0] /root # irb
irb(main):001:0> self.class
=> Object
irb(main):002:0> "str".freeze
=> "str"
irb(main):003:0> a = "str"
=> "str"
irb(main):004:0> a << "b"
=> "strb"
irb(main):005:0> a.freeze
=> "strb"
irb(main):006:0> a << "c"
TypeError: can't modify frozen string
        from (irb):6:in `<<'
        from (irb):6
        from :0
irb(main):008:0> a.frozen?
=> true
irb(main):009:0> b = a.clone
=> "strb"
irb(main):010:0> b.frozen?
=> true
irb(main):012:0> b.object_id
=> -604618838
irb(main):013:0> a.object_id
=> -604562678
irb(main):014:0> c=a
=> "strb"
irb(main):015:0> c.frozen?
=> true
irb(main):016:0> c.object_id
=> -604562678
irb(main):017:0> a === b
=> true
irb(main):019:0> a.eql? b
=> true
irb(main):020:0> a.equal? b
=> false
irb(main):021:0> a.equal? c
=> true
irb(main):022:0> a == b
=> true
irb(main):023:0> a == c
=> true
irb(main):025:0> c = a.dup
=> "strb"
irb(main):026:0> c.frozen?
=> false
irb(main):027:0> c << "b"
=> "strbb"
irb(main):028:0> c << "b"
=> "strbbb"
irb(main):029:0> a << "b"
TypeError: can't modify frozen string
        from (irb):29:in `<<'
        from (irb):29
        from :0
irb(main):030:0>