• 面试和面试者如何保持心态


    我(面试官):你先自我介绍一下。

    面试者:我叫xxx。xxxx经验。。xxx上线项目经验。xxxxxxxxxxxxxxxxxxxxxxx目前在职状态,但是公司游戏研发服务器主程。

    我:那你讲一下,你们线程模型,线程控制,数据流向如何处理的。

    面试者:他不知道怎么讲。

    我:如果让你设计一个组队系统,你改如何考虑?

    面试者:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

    期间聊了很多,但是答案不满意,因为他的很多回答在提锁,锁,锁。

    我就问线程的串行和并行知道嘛?

    他不知道,然后就给我提并发,我就问一个线程能处理并发嘛?他直接说你这不叫并发只能叫多路复用。

    他一直问我,你知道并发嘛,你知道多路复用嘛,你和我扯;

    这两点观点居然和很大声的吵(可以理解争执吧)起来了;

    在我看来面对这样的面试者,我不敢录用。争执很正常,但是在合作中,这样的态度,工作恐怕开展也有点蛋疼吧。

    我只好草草结束面试。不是因为技术不行,而是我感觉在将来的工作合作中,很难愉快。

    我不知道他是否也逛博客园,是否能看到这篇文章吧。不过我确实需要说一声抱歉,我当时的情绪也不够稳定!


    我们先来了解一下几个概念

    串行

    在串行的概念中会有两个概念

    1.串行(serial)与并行(parallel)相对应,是指的我们从事某项工作时一个步骤一个步骤的去实施。

    2.指串行通信。串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。

     当中通信中串行和并行的话,又存在多路复用情况
    多路复用是指以同一传输媒质(线路)承载多路信号进行通信的方式。各路信号在送往传输媒质以前,需按一定的规则进行调制,以利于各路已调信号在媒质中传输,并不致混淆,从而在传到对方时使信号具有足够能量,且可用反调制的方法加以区分、恢复成原信号。多路复用常用的方法有频分多路复用和时分多路复用,码分多路复用的应用也在不断扩大。

     下图表示,线程串行情况,有n个任务或者你可以理解n个函数,由一个线程顺序执行,

     

    优点:由于任务,函数都在一个线程执行所以不存在线程不安全情况,也就不存在临界区的问题。
    缺点:不能很好的利用cpu(当代多核心,多cpu硬件情况)的资源提高处理优势。

     来看看一个断代码展示

     1     public static void main(String[] args) throws InterruptedException {
     2         //线程串行情况,顺序执行
     3         run1();
     4         run2();
     5         run3();
     6     }
     7 
     8     //任务1
     9     public static void run1() {
    10         System.out.println("run1()->" + System.currentTimeMillis());
    11     }
    12 
    13     //任务2
    14     public static void run2() {
    15         System.out.println("run2()->" + System.currentTimeMillis());
    16     }
    17 
    18     //任务3
    19     public static void run3() {
    20         System.out.println("run3()->" + System.currentTimeMillis());
    21     }

    由于只有主线程,没有其他线程情况下,这些任务/函数都是单线程执行的

    并行

    当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

    下图表示的并行情况,又N个线程,去分别执行N个任务。

     

    优点:由于任务,函数是在 N 个线程执行所以速度快,执行效率高CPU(当代多核心,多cpu硬件情况)的利用与也高。
    缺点:存在线程不安全情况,也就是存在临界区的问题会出现数据不准确,不安全,脏数据。

     代码展示

     1     public static void main(String[] args) throws InterruptedException {
     2         //线程并行情况,有多个线程执行多个任务/函数
     3         new Thread(new Run1()).start();
     4         new Thread(new Run2()).start();
     5     }
     6 
     7     //任务1
     8     static class Run1 implements Runnable {
     9 
    10         @Override
    11         public void run() {
    12             //执行任务1
    13             run1();
    14             //执行任务3
    15             run3();
    16         }
    17     }
    18     //任务2
    19 
    20     static class Run2 implements Runnable {
    21 
    22         @Override
    23         public void run() {
    24             //执行任务3
    25             run3();
    26             //执行任务1
    27             run1();
    28             //执行任务2
    29             run2();
    30         }
    31     }
    32 
    33     //任务1
    34     public static void run1() {
    35         System.out.println("run1()->" + System.currentTimeMillis());
    36     }
    37 
    38     //任务2
    39     public static void run2() {
    40         System.out.println("run2()->" + System.currentTimeMillis());
    41     }
    42 
    43     //任务3
    44     public static void run3() {
    45         System.out.println("run3()->" + System.currentTimeMillis());
    46     }

    并发

    并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

    并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。

     以上其实都是概念性问题。

    我面试从来都是,你应聘什么样的岗位,拿什么样的工资,我就关心你什么样的问题。

    比如线程模型你不是很擅长无所谓,本来我的底层架构已经处理好了,只是想听听你是如何分析如何处理,有助于你谈薪资问题;

    组队问题,其实我关心就是,如果做到全局的线程安全性,玩家跨地图了如何才能保证一个玩家不可能存在多个对我中。

    我的答案:再不加锁的情况下,数据线程串行执行组队情况。

    作为服务端开发,而已,往往更关心的是同一个客户的,或者多个客户端同时发起多个一样的请求,请求来了数据流向问题,如何处理,如何保证数据精准有效;

    比如你组队信息用什么存储,如何存储,其实关系并不是很大,

    但是大部分面试者给我的回答就是客户端发起请求,服务器验证,然后返回客户端就完了;

    有关我的线程模型和分析的话,可以参考我之前的文章,在接下来的文章里我会着重介绍java下,我的线程模型,处理情况。

  • 相关阅读:
    子元素如何不继承父元素透明度
    js深度复制对象
    webstorm快捷键
    js触屏滑动事件
    DOM学习笔记
    attribute & property --- jquery attr() & prop()
    javascript学习笔记(通用)-2015-08
    javascript学习笔记(数组)-2015-08
    mustache语法整理
    代码优化
  • 原文地址:https://www.cnblogs.com/shizuchengxuyuan/p/5801148.html
Copyright © 2020-2023  润新知